MineOS/lib/colorlib.lua
Igor Timofeev ff8257f94d Ну ты и жирный, ебать! Вот это обновка
Крч, формат пикч новый, парочка багфиксов, формат .app чутка изменен, и
ваще прям мяу. Но багов может быть дохуя
2017-04-22 01:34:18 +03:00

164 lines
7.2 KiB
Lua
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local bit32 = require("bit32")
local colorlib = {}
local function isNan(x)
return x~=x
end
function colorlib.HEXtoRGB(color)
return bit32.rshift(color, 16), bit32.band(bit32.rshift(color, 8), 0xFF), bit32.band(color, 0xFF)
end
function colorlib.RGBtoHEX(rr, gg, bb)
return bit32.lshift(rr, 16) + bit32.lshift(gg, 8) + bb
end
--HSB model
function colorlib.RGBtoHSB(rr, gg, bb)
local max = math.max(rr, math.max(gg, bb))
local min = math.min(rr, math.min(gg, bb))
local delta = max - min
local h = 0
if ( max == rr and gg >= bb) then h = 60*(gg-bb)/delta end
if ( max == rr and gg <= bb ) then h = 60*(gg-bb)/delta + 360 end
if ( max == gg ) then h = 60*(bb-rr)/delta + 120 end
if ( max == bb ) then h = 60*(rr-gg)/delta + 240 end
local s = 0
if ( max ~= 0 ) then s = 1 - (min / max) end
local b = max * 100 / 255
if isNan(h) then h = 0 end
return h, s * 100, b
end
function colorlib.HSBtoRGB(h, s, v)
if h > 359 then h = 0 end
local rr, gg, bb = 0, 0, 0
local const = 255
s = s/100
v = v/100
local i = math.floor(h/60)
local f = h/60 - i
local p = v*(1-s)
local q = v*(1-s*f)
local t = v*(1-(1-f)*s)
if ( i == 0 ) then rr, gg, bb = v, t, p end
if ( i == 1 ) then rr, gg, bb = q, v, p end
if ( i == 2 ) then rr, gg, bb = p, v, t end
if ( i == 3 ) then rr, gg, bb = p, q, v end
if ( i == 4 ) then rr, gg, bb = t, p, v end
if ( i == 5 ) then rr, gg, bb = v, p, q end
return math.floor(rr * const), math.floor(gg * const), math.floor(bb * const)
end
function colorlib.HEXtoHSB(color)
local rr, gg, bb = colorlib.HEXtoRGB(color)
local h, s, b = colorlib.RGBtoHSB( rr, gg, bb )
return h, s, b
end
function colorlib.HSBtoHEX(h, s, b)
local rr, gg, bb = colorlib.HSBtoRGB(h, s, b)
local color = colorlib.RGBtoHEX(rr, gg, bb)
return color
end
--Смешивание двух цветов на основе альфа-канала второго
function colorlib.alphaBlend(firstColor, secondColor, alphaChannel)
local invertedAlphaChannel = 1 - alphaChannel
local firstColorRed, firstColorGreen, firstColorBlue = colorlib.HEXtoRGB(firstColor)
local secondColorRed, secondColorGreen, secondColorBlue = colorlib.HEXtoRGB(secondColor)
return colorlib.RGBtoHEX(
secondColorRed * invertedAlphaChannel + firstColorRed * alphaChannel,
secondColorGreen * invertedAlphaChannel + firstColorGreen * alphaChannel,
secondColorBlue * invertedAlphaChannel + firstColorBlue * alphaChannel
)
end
--Получение среднего цвета между перечисленными. К примеру, между черным и белым выдаст серый.
function colorlib.getAverageColor(colors)
local sColors = #colors
local averageRed, averageGreen, averageBlue = 0, 0, 0
for i = 1, sColors do
local r, g, b = colorlib.HEXtoRGB(colors[i])
averageRed, averageGreen, averageBlue = averageRed + r, averageGreen + g, averageBlue + b
end
return colorlib.RGBtoHEX(math.floor(averageRed / sColors), math.floor(averageGreen / sColors), math.floor(averageBlue / sColors))
end
-----------------------------------------------------------------------------------------------------------------------
local palette = {
0x000000, 0x000040, 0x000080, 0x0000BF, 0x0000FF, 0x002400, 0x002440, 0x002480, 0x0024BF, 0x0024FF, 0x004900, 0x004940, 0x004980, 0x0049BF, 0x0049FF, 0x006D00,
0x006D40, 0x006D80, 0x006DBF, 0x006DFF, 0x009200, 0x009240, 0x009280, 0x0092BF, 0x0092FF, 0x00B600, 0x00B640, 0x00B680, 0x00B6BF, 0x00B6FF, 0x00DB00, 0x00DB40,
0x00DB80, 0x00DBBF, 0x00DBFF, 0x00FF00, 0x00FF40, 0x00FF80, 0x00FFBF, 0x00FFFF, 0x0F0F0F, 0x1E1E1E, 0x2D2D2D, 0x330000, 0x330040, 0x330080, 0x3300BF, 0x3300FF,
0x332400, 0x332440, 0x332480, 0x3324BF, 0x3324FF, 0x334900, 0x334940, 0x334980, 0x3349BF, 0x3349FF, 0x336D00, 0x336D40, 0x336D80, 0x336DBF, 0x336DFF, 0x339200,
0x339240, 0x339280, 0x3392BF, 0x3392FF, 0x33B600, 0x33B640, 0x33B680, 0x33B6BF, 0x33B6FF, 0x33DB00, 0x33DB40, 0x33DB80, 0x33DBBF, 0x33DBFF, 0x33FF00, 0x33FF40,
0x33FF80, 0x33FFBF, 0x33FFFF, 0x3C3C3C, 0x4B4B4B, 0x5A5A5A, 0x660000, 0x660040, 0x660080, 0x6600BF, 0x6600FF, 0x662400, 0x662440, 0x662480, 0x6624BF, 0x6624FF,
0x664900, 0x664940, 0x664980, 0x6649BF, 0x6649FF, 0x666D00, 0x666D40, 0x666D80, 0x666DBF, 0x666DFF, 0x669200, 0x669240, 0x669280, 0x6692BF, 0x6692FF, 0x66B600,
0x66B640, 0x66B680, 0x66B6BF, 0x66B6FF, 0x66DB00, 0x66DB40, 0x66DB80, 0x66DBBF, 0x66DBFF, 0x66FF00, 0x66FF40, 0x66FF80, 0x66FFBF, 0x66FFFF, 0x696969, 0x787878,
0x878787, 0x969696, 0x990000, 0x990040, 0x990080, 0x9900BF, 0x9900FF, 0x992400, 0x992440, 0x992480, 0x9924BF, 0x9924FF, 0x994900, 0x994940, 0x994980, 0x9949BF,
0x9949FF, 0x996D00, 0x996D40, 0x996D80, 0x996DBF, 0x996DFF, 0x999200, 0x999240, 0x999280, 0x9992BF, 0x9992FF, 0x99B600, 0x99B640, 0x99B680, 0x99B6BF, 0x99B6FF,
0x99DB00, 0x99DB40, 0x99DB80, 0x99DBBF, 0x99DBFF, 0x99FF00, 0x99FF40, 0x99FF80, 0x99FFBF, 0x99FFFF, 0xA5A5A5, 0xB4B4B4, 0xC3C3C3, 0xCC0000, 0xCC0040, 0xCC0080,
0xCC00BF, 0xCC00FF, 0xCC2400, 0xCC2440, 0xCC2480, 0xCC24BF, 0xCC24FF, 0xCC4900, 0xCC4940, 0xCC4980, 0xCC49BF, 0xCC49FF, 0xCC6D00, 0xCC6D40, 0xCC6D80, 0xCC6DBF,
0xCC6DFF, 0xCC9200, 0xCC9240, 0xCC9280, 0xCC92BF, 0xCC92FF, 0xCCB600, 0xCCB640, 0xCCB680, 0xCCB6BF, 0xCCB6FF, 0xCCDB00, 0xCCDB40, 0xCCDB80, 0xCCDBBF, 0xCCDBFF,
0xCCFF00, 0xCCFF40, 0xCCFF80, 0xCCFFBF, 0xCCFFFF, 0xD2D2D2, 0xE1E1E1, 0xF0F0F0, 0xFF0000, 0xFF0040, 0xFF0080, 0xFF00BF, 0xFF00FF, 0xFF2400, 0xFF2440, 0xFF2480,
0xFF24BF, 0xFF24FF, 0xFF4900, 0xFF4940, 0xFF4980, 0xFF49BF, 0xFF49FF, 0xFF6D00, 0xFF6D40, 0xFF6D80, 0xFF6DBF, 0xFF6DFF, 0xFF9200, 0xFF9240, 0xFF9280, 0xFF92BF,
0xFF92FF, 0xFFB600, 0xFFB640, 0xFFB680, 0xFFB6BF, 0xFFB6FF, 0xFFDB00, 0xFFDB40, 0xFFDB80, 0xFFDBBF, 0xFFDBFF, 0xFFFF00, 0xFFFF40, 0xFFFF80, 0xFFFFBF, 0xFFFFFF,
}
function colorlib.convert24BitTo8Bit(hex24)
local encodedIndex = nil
local colorMatchFactor = nil
local colorMatchFactor_min = math.huge
local red24, green24, blue24 = colorlib.HEXtoRGB(hex24)
for colorIndex, colorPalette in ipairs(palette) do
local redPalette, greenPalette, bluePalette = colorlib.HEXtoRGB(colorPalette)
colorMatchFactor = (redPalette-red24)^2 + (greenPalette-green24)^2 + (bluePalette-blue24)^2
if (colorMatchFactor < colorMatchFactor_min) then
encodedIndex = colorIndex
colorMatchFactor_min = colorMatchFactor
end
end
return encodedIndex - 1
-- return searchClosestColor(1, #palette, hex24)
end
function colorlib.convert8BitTo24Bit(hex8)
return palette[hex8 + 1]
end
function colorlib.debugColorCompression(color)
local compressedColor = colorlib.convert24BitTo8Bit(color)
local decompressedColor = colorlib.convert8BitTo24Bit(compressedColor)
print("Исходный цвет: " .. string.format("0x%06X", color))
print("Сжатый цвет: " .. string.format("0x%02X", compressedColor))
print("Расжатый цвет: " .. string.format("0x%06X", decompressedColor))
end
-----------------------------------------------------------------------------------------------------------------------
return colorlib