mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 19:19:21 +01:00
85 lines
3.2 KiB
Lua
85 lines
3.2 KiB
Lua
local component = require("component")
|
||
local gpu, screen = component.gpu, component.screen
|
||
|
||
local scale = {}
|
||
|
||
------------------------------------------------------------------------------------------
|
||
|
||
--Изменить масштаб монитора
|
||
function scale.set(scale, debug)
|
||
--Базовая коррекция масштаба, чтобы всякие умники не писали своими погаными ручонками, чего не следует
|
||
if scale > 1 then
|
||
scale = 1
|
||
elseif scale < 0.1 then
|
||
scale = 0.1
|
||
end
|
||
|
||
--Просчет монитора в псевдопикселях - забей, даже объяснять не буду, работает как часы
|
||
local function calculateAspect(screens)
|
||
local abc = 12
|
||
|
||
if screens == 2 then
|
||
abc = 28
|
||
elseif screens > 2 then
|
||
abc = 28 + (screens - 2) * 16
|
||
end
|
||
|
||
return abc
|
||
end
|
||
|
||
--Рассчитываем пропорцию монитора в псевдопикселях
|
||
local xScreens, yScreens = component.screen.getAspectRatio()
|
||
local xPixels, yPixels = calculateAspect(xScreens), calculateAspect(yScreens)
|
||
local proportion = xPixels / yPixels
|
||
|
||
--Получаем максимально возможное разрешение данной видеокарты
|
||
local xMax, yMax = gpu.maxResolution()
|
||
|
||
--Получаем теоретическое максимальное разрешение монитора с учетом его пропорции, но без учета лимита видеокарты
|
||
local newWidth, newHeight
|
||
if proportion >= 1 then
|
||
newWidth = math.floor(xMax)
|
||
newHeight = math.floor(newWidth / proportion / 2)
|
||
else
|
||
newHeight = math.floor(yMax)
|
||
newWidth = math.floor(newHeight * proportion * 2)
|
||
end
|
||
|
||
--Получаем оптимальное разрешение для данного монитора с поддержкой видеокарты
|
||
local optimalNewWidth, optimalNewHeight = newWidth, newHeight
|
||
|
||
if optimalNewWidth > xMax then
|
||
local difference = optimalNewWidth - xMax
|
||
optimalNewWidth = xMax
|
||
optimalNewHeight = optimalNewHeight - math.ceil(difference / 2 )
|
||
end
|
||
|
||
if optimalNewHeight > yMax then
|
||
local difference = optimalNewHeight - yMax
|
||
optimalNewHeight = yMax
|
||
optimalNewWidth = optimalNewWidth - difference * 2 - math.ceil(difference / 2)
|
||
end
|
||
|
||
--Корректируем идеальное разрешение по заданному масштабу
|
||
local finalNewWidth, finalNewHeight = math.floor(optimalNewWidth * scale), math.floor(optimalNewHeight * scale)
|
||
|
||
--Выводим инфу, если нужно
|
||
if debug then
|
||
print(" ")
|
||
print("Максимальное разрешение: "..xMax.."x"..yMax)
|
||
print("Пропорция монитора: "..xPixels.."x"..yPixels)
|
||
print("Коэффициент пропорции: "..proportion)
|
||
print(" ")
|
||
print("Теоретическое разрешение: "..newWidth.."x"..newHeight)
|
||
print("Оптимизированное разрешение: "..optimalNewWidth.."x"..optimalNewHeight)
|
||
print(" ")
|
||
print("Новое разрешение: "..finalNewWidth.."x"..finalNewHeight)
|
||
print(" ")
|
||
end
|
||
|
||
--Устанавливаем выбранное разрешение
|
||
gpu.setResolution(finalNewWidth, finalNewHeight)
|
||
end
|
||
|
||
--scale.set(1, true)
|