Files
coa-elvui/ElvUI/Core/PixelPerfect.lua
T
Andrew6810 60ef8a38af init
2022-10-21 07:09:01 -07:00

91 lines
3.2 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
--Lua functions
local min, max, abs, floor = min, max, abs, floor
--WoW API / Variables
local UIParent = UIParent
function E:IsEyefinity(width, height)
if E.global.general.eyefinity and width >= 3840 then
--HQ resolution
if width >= 9840 then return 3280 end --WQSXGA
if width >= 7680 and width < 9840 then return 2560 end --WQXGA
if width >= 5760 and width < 7680 then return 1920 end --WUXGA & HDTV
if width >= 5040 and width < 5760 then return 1680 end --WSXGA+
--adding height condition here to be sure it work with bezel compensation because WSXGA+ and UXGA/HD+ got approx same width
if width >= 4800 and width < 5760 and height == 900 then return 1600 end --UXGA & HD+
--low resolution screen
if width >= 4320 and width < 4800 then return 1440 end --WSXGA
if width >= 4080 and width < 4320 then return 1360 end --WXGA
if width >= 3840 and width < 4080 then return 1224 end --SXGA & SXGA (UVGA) & WXGA & HDTV
end
end
function E:UIScale(init)
local scale = E.global.general.UIScale
if init then --E.OnInitialize
--Set variables for pixel scaling
local pixel, ratio = 1, 768 / E.screenheight
E.mult = (pixel / scale) - ((pixel - ratio) / scale)
E.Spacing = (E.PixelMode and 0) or E.mult
E.Border = ((not E.twoPixelsPlease) and E.PixelMode and E.mult) or E.mult*2
else --E.Initialize
UIParent:SetScale(scale)
--Check if we are using `E.eyefinity`
local width, height = E.screenwidth, E.screenheight
E.eyefinity = E:IsEyefinity(width, height)
--Resize E.UIParent if Eyefinity is on.
local testingEyefinity = false
if testingEyefinity then
--Eyefinity Test: Resize the E.UIParent to be smaller than it should be, all objects inside should relocate.
--Dragging moveable frames outside the box and reloading the UI ensures that they are saving position correctly.
local uiWidth, uiHeight = UIParent:GetSize()
width, height = uiWidth - 250, uiHeight - 250
elseif E.eyefinity then
--find a new width value of E.UIParent for screen #1.
local uiHeight = UIParent:GetHeight()
width, height = E.eyefinity / (height / uiHeight), uiHeight
else
width, height = UIParent:GetSize()
end
E.UIParent:SetSize(width, height)
E.UIParent.origHeight = E.UIParent:GetHeight()
--Calculate potential coordinate differences
E.diffGetLeft = E:Round(abs(UIParent:GetLeft() - E.UIParent:GetLeft()))
E.diffGetRight = E:Round(abs(UIParent:GetRight() - E.UIParent:GetRight()))
E.diffGetBottom = E:Round(abs(UIParent:GetBottom() - E.UIParent:GetBottom()))
E.diffGetTop = E:Round(abs(UIParent:GetTop() - E.UIParent:GetTop()))
end
end
function E:PixelBestSize()
return max(0.4, min(1.15, 768 / E.screenheight))
end
function E:PixelScaleChanged(event, skip)
E:UIScale(true) -- repopulate variables
E:UIScale() -- setup the scale
E:UpdateConfigSize(true) -- reposition config
if skip or E.global.general.ignoreScalePopup then return end
if event == "UPDATE_FLOATING_CHAT_WINDOWS" then return end
if event == "UISCALE_CHANGE" then
E:Delay(0.5, E.StaticPopup_Show, E, event)
else
E:StaticPopup_Show("UISCALE_CHANGE")
end
end
function E:Scale(x)
local mult = E.mult
return mult * floor(x / mult + 0.5)
end