diff --git a/lib/colorlib.lua b/lib/colorlib.lua new file mode 100644 index 00000000..e3c75495 --- /dev/null +++ b/lib/colorlib.lua @@ -0,0 +1,88 @@ +local colorlib = {} + +--utils +local function check(tVal, tMaxVal, tMinVal, tType) + +end + +local function isNan(x) + return x~=x +end + +--RGB model +function colorlib.HEXtoRGB(color) + color = math.ceil(color) + + local rr = bit32.rshift( color, 16 ) + local gg = bit32.rshift( bit32.band(color, 0x00ff00), 8 ) + local bb = bit32.band(color, 0x0000ff) + + return rr, gg, bb +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 rr*const, gg*const, 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 + +return colorlib