Pirnogion

colorlib

Jun 12th, 2015
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.50 KB | None | 0 0
  1. local colorlib = {}
  2.  
  3. --utils
  4. local function isNan(x)
  5.   return x~=x
  6. end
  7.  
  8. --RGB model
  9. function colorlib.HEXtoRGB(color)
  10.   local rr = bit32.rshift( color, 16 )
  11.   local gg = bit32.rshift( bit32.band(color, 0x00ff00), 8 )
  12.   local bb = bit32.band(color, 0x0000ff)
  13.  
  14.   return rr, gg, bb
  15. end
  16.  
  17. function colorlib.RGBtoHEX(rr, gg, bb)
  18.   return bit32.lshift(rr, 16) + bit32.lshift(gg, 8) + bb
  19. end
  20.  
  21. --HSB model
  22. function colorlib.RGBtoHSB(rr, gg, bb)
  23.   local max = math.max(rr, math.max(gg, bb))
  24.   local min = math.min(rr, math.min(gg, bb))
  25.   local delta = max - min
  26.  
  27.   local h = 0
  28.   if ( max == rr and gg >= bb) then h = 60*(gg-bb)/delta end
  29.   if ( max == rr and gg <= bb ) then h = 60*(gg-bb)/delta + 360 end
  30.   if ( max == gg ) then h = 60*(bb-rr)/delta + 120 end
  31.   if ( max == bb ) then h = 60*(rr-gg)/delta + 240 end
  32.  
  33.   local s = 0
  34.   if ( max ~= 0 ) then s = 1-(min/max) end
  35.  
  36.   local b = max*100/255
  37.  
  38.   if isNan(h) then h = 0 end
  39.  
  40.   return h, s*100, b
  41. end
  42.  
  43. function colorlib.HSBtoRGB(h, s, v)
  44.   if h > 359 then h = 0 end
  45.  
  46.   local rr, gg, bb = 0, 0, 0
  47.   local const = 255
  48.  
  49.   s = s/100
  50.   v = v/100
  51.  
  52.   local i = math.floor(h/60)
  53.   local f = h/60 - i
  54.  
  55.   local p = v*(1-s)
  56.   local q = v*(1-s*f)
  57.   local t = v*(1-(1-f)*s)
  58.  
  59.   if ( i == 0 ) then rr, gg, bb = v, t, p end
  60.   if ( i == 1 ) then rr, gg, bb = q, v, p end
  61.   if ( i == 2 ) then rr, gg, bb = p, v, t end
  62.   if ( i == 3 ) then rr, gg, bb = p, q, v end
  63.   if ( i == 4 ) then rr, gg, bb = t, p, v end
  64.   if ( i == 5 ) then rr, gg, bb = v, p, q end
  65.  
  66.   return rr*const, gg*const, bb*const
  67. end
  68.  
  69. function colorlib.HEXtoHSB(color)
  70.   local rr, gg, bb = colorlib.HEXtoRGB(color)
  71.   local h, s, b = colorlib.RGBtoHSB( rr, gg, bb )
  72.  
  73.   return h, s, b
  74. end
  75.  
  76. function colorlib.HSBtoHEX(h, s, b)
  77.   local rr, gg, bb = colorlib.HSBtoRGB(h, s, b)
  78.   local color = colorlib.RGBtoHEX(rr, gg, bb)
  79.  
  80.   return color
  81. end
  82.  
  83. --WEBSAFE
  84. function colorlib.HEXtoWEBSAFE(color)
  85.   return bit32.rshift( bit32.band(color, 0xf00000), 12) + bit32.rshift( bit32.band(color, 0x00f000), 8) + bit32.rshift( bit32.band(color, 0x0000f0), 4)
  86. end
  87.  
  88. function colorlib.WEBSAFEtoHEX(color)
  89.   return bit32.lshift( bit32.band(color, 0xf00), 12) + bit32.lshift( bit32.band(color, 0x0f0), 8) + bit32.lshift( bit32.band(color, 0x00f), 4)
  90. end
  91.  
  92. --Convert 24bit palette to 8bit
  93. local function HEX_color24to8( hexcolor24 )
  94.   local rr, gg, bb = HEXtoRGB( hexcolor24 )
  95.  
  96.   return bit32.lshift( bit32.rshift(rr, 5), 5 ) + bit32.lshift( bit32.rshift(gg, 5), 2 ) + bit32.rshift(bb, 6)
  97. end
  98.  
  99. --Convert 8bit palette to 24bit
  100. local function HEX_color8to24( hexcolor8 )
  101.   local rr = bit32.lshift( bit32.rshift( hexcolor8, 5 ), 5 )
  102.   local gg = bit32.lshift( bit32.rshift( bit32.band( hexcolor8, 28 ), 2 ), 5 )
  103.   local bb = bit32.lshift( bit32.band( hexcolor8, 3 ), 6 )
  104.  
  105.   return RGBtoHEX( rr, gg, bb )
  106. end
  107.  
  108. --Alpha blending
  109. local function alpha_blend(back_color, front_color, alpha_channel)
  110.   local INVERTED_ALPHA_CHANNEL = 255-alpha_channel
  111.  
  112.   local back_color_rr, back_color_gg, back_color_bb    = HEXtoRGB(back_color)
  113.   local front_color_rr, front_color_gg, front_color_bb = HEXtoRGB(front_color)
  114.  
  115.   local blended_rr = front_color_rr * INVERTED_ALPHA_CHANNEL / 255 + back_color_rr * alpha_channel / 255
  116.   local blended_gg = front_color_gg * INVERTED_ALPHA_CHANNEL / 255 + back_color_gg * alpha_channel / 255
  117.   local blended_bb = front_color_bb * INVERTED_ALPHA_CHANNEL / 255 + back_color_bb * alpha_channel / 255
  118.  
  119.   return RGBtoHEX( blended_rr, blended_gg, blended_bb )
  120. end
  121.  
  122. return colorlib
Advertisement
Add Comment
Please, Sign In to add comment