Advertisement
Shiranuit

Colorsys

Oct 22nd, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.99 KB | None | 0 0
  1. -------------------------------------------------------------------------
  2. --                         API de Shiranuit                            --
  3. --   Copyright © 2016 Propriétés intellectuelles de Shiranuit          --
  4. -------------------------------------------------------------------------
  5.  
  6. white = 1
  7. orange = 2
  8. magenta = 4
  9. lightBlue = 8
  10. yellow = 16
  11. lime = 32
  12. pink = 64
  13. gray = 128
  14. lightGray = 256
  15. cyan = 512
  16. purple = 1024
  17. blue = 2048
  18. brown = 4096
  19. green = 8192
  20. red = 16384
  21. black = 32768
  22.  
  23. colorsHex = {white="F0F0F0",orange="F2B233",magenta="E57FD8",lightBlue="99B2F2",yellow="DEDE6C",lime="7FCC19",pink="F2B2CC",gray="4C4C4C",lightGray="999999",cyan="4C99B2",purple="B266E5",blue="3366CC",brown="7F664C",green="57A64E",red="CC4C4C",black="000000"}
  24.  
  25. function combine( ... )
  26.     local r = 0
  27.     for n,c in ipairs( { ... } ) do
  28.         r = bit.bor(r,c)
  29.     end
  30.     return r
  31. end
  32.  
  33. function subtract( colors, ... )
  34.     local r = colors
  35.     for n,c in ipairs( { ... } ) do
  36.         r = bit.band(r, bit.bnot(c))
  37.     end
  38.     return r
  39. end
  40.  
  41. function test( colors, color )
  42.     return ((bit.band(colors, color)) == color)
  43. end
  44.  
  45. local function round(num, idp)
  46.   local mult = 10^(idp or 0)
  47.   return math.floor(num * mult + 0.5) / mult
  48. end
  49.  
  50. local function decToHex(num)
  51.     if num > 0 then
  52.     local b,k,out,i,d=16,"0123456789abcdef","",0
  53.         while num>0 do
  54.             i=i+1
  55.             num,d=math.floor(num/b),(num%b)+1
  56.             out=string.sub(k,d,d)..out
  57.         end
  58.         return string.rep("0",2-#tostring(out))..out
  59.     elseif num == 0 then
  60.         return "00"
  61.     end
  62.     return ""
  63. end
  64.  
  65. function getPaintChar(color)
  66.     if type(color) == "number" then
  67.         return decToHex(math.floor(math.log(color)/math.log(2)))
  68.     end
  69. end
  70.  
  71. function RGBToHSL(r, g, b, a)
  72.   r, g, b = r / 255, g / 255, b / 255
  73.   local max, min = math.max(r, g, b), math.min(r, g, b)
  74.   local h, s, l
  75.   l = (max + min) / 2
  76.   if max == min then
  77.     h, s = 0, 0
  78.   else
  79.     local d = max - min
  80.     if l > 0.5 then s = d / (2 - max - min) else s = d / (max + min) end
  81.     if max == r then h = (g - b) / d
  82.     elseif max == g then h = (b - r) / d + 2
  83.     elseif max == b then h = (r - g) / d + 4
  84.     end
  85.   end
  86.   h = h*60
  87.   if h < 0 then h=h+360 end
  88.   return round(h,0), round(s*100,0), round(l*100,0), a or 255
  89. end
  90.  
  91. function HSLToRGB(h, s, l, a)
  92.     local t_1,t_2,t_R,t_G,t_B,r,g,b
  93.     h,s,l=h/360,s/100,l/100
  94.     if l < 0.5 then t_1=l*(1+s)
  95.     else t_1=l+s-l*s
  96.     end
  97.     t_2=2*l-t_1
  98.     t_R=h+0.333
  99.     t_G=h
  100.     t_B=h-0.333
  101.     if t_R < 0 then t_R=t_R+1 end
  102.     if t_G < 0 then t_G=t_G+1 end
  103.     if t_B < 0 then t_B=t_B+1 end
  104.     if t_R > 1 then t_R=t_R-1 end
  105.     if t_G > 1 then t_G=t_G-1 end
  106.     if t_B > 1 then t_B=t_B-1 end
  107.     function t_n(v)
  108.         local r
  109.         if 6*v < 1 then r=t_2+(t_1-t_2)*6*v
  110.         elseif 2*v < 1 then r=t_1
  111.         elseif 3*v < 2 then r=t_2+(t_1-t_2)*(0.666-v)*6*v
  112.         else r=t_2
  113.         end
  114.         return r
  115.     end
  116.     r = t_n(t_R)
  117.     g = t_n(t_G)
  118.     b = t_n(t_B)
  119.     return round(r*255,0),round(g*255,0),round(b*255,0),a or 255
  120. end
  121.  
  122. function HEXToRGB(hex)
  123.     hex = hex:gsub("#","")
  124.     hex = string.rep("0",8-#hex)..hex
  125.     return tonumber("0x"..hex:sub(1,2))==0 and 255 or tonumber("0x"..hex:sub(1,2)), tonumber("0x"..hex:sub(3,4)), tonumber("0x"..hex:sub(5,6)),tonumber("0x"..hex:sub(7,8))
  126. end
  127.  
  128. function RGBToHex(r,g,b,a)
  129.     return decToHex(a or 255)..decToHex(r)..decToHex(g)..decToHex(b)
  130. end
  131.  
  132. function hue_offset(h,s,l,delta)
  133.    return (h + delta) % 360, s, l
  134. end
  135.  
  136. function RGBToXYZ(r,g,b)
  137.     local var_R,var_G,var_B=r/255,g/255,b/255
  138.     if var_R > 0.04045 then var_R=((var_R+0.055)/1.055)^2.4
  139.     else var_R=var_R/12.92 end
  140.     if var_G > 0.04045 then var_G=((var_G+0.055)/1.055)^2.4
  141.     else var_G=var_G/12.92 end
  142.     if var_B > 0.04045 then var_B=((var_B+0.055)/1.055)^2.4
  143.     else var_B=var_B/12.92 end
  144.     var_R,var_G,var_B=var_R*100,var_G*100,var_B*100
  145.     local X=var_R*0.4124+var_G*0.3576+var_B*0.1805
  146.     local Y=var_R*0.2126+var_G*0.7152+var_B*0.0722
  147.     local Z=var_R*0.0193+var_G*0.1192+var_B*0.9505
  148.     return X, Y, Z
  149. end
  150.  
  151. function XYZToRGB(X,Y,Z)
  152.     local var_X,var_Y,var_Z=X/100,Y/100,Z/100
  153.     local var_R=var_X*3.2406+var_Y*-1.5372+var_Z*-0.4986
  154.     local var_G=var_X*-0.9689+var_Y*1.8758+var_Z*0.0415
  155.     local var_B=var_X*0.0557+var_Y*-0.2040+var_Z*1.0570
  156.     if var_R > 0.0031308 then var_R=1.055*(var_R^(1/2.4))-0.055
  157.     else var_R=12.92*var_R end
  158.     if var_G > 0.0031308 then var_G=1.055*(var_G^(1/2.4))-0.055
  159.     else var_G=12.92*var_G end
  160.     if var_B > 0.0031308 then var_B=1.055*(var_B^(1/2.4))-0.055
  161.     else var_B=12.92*var_B end
  162.     local r,g,b=var_R*255,var_G*255,var_B*255
  163.     return round(r,0),round(g,0),round(b,0)
  164. end
  165.  
  166. function XYZToHLab(X,Y,Z)
  167.     local HL,Ha,Hb=10*math.sqrt(Y),17.5*(((1.02*X)-Y)/math.sqrt(Y)),7*((Y-(0.847*Z))/math.sqrt(Y))
  168.     return HL,Ha,Hb
  169. end
  170.  
  171. function HLabToXYZ(HL,Ha,Hb)
  172.     local var_Y,var_X,var_Z=HL/10,Ha/17.5*HL/10,Hb/7*HL/10
  173.     local Y = var_Y^2
  174.     local X = (var_X+Y)/1.02
  175.     local Z = -(var_Z-Y)/0.847
  176.     return X, Y, Z
  177. end
  178.  
  179. function XYZToCIELab(X,Y,Z)
  180.     local var_X,var_Y,var_Z=X/95.047,Y/100,Z/108.833
  181.     if var_X > 0.008856 then var_X=var_X^(1/3)
  182.     else var_X=(7.787*var_X)+(16/116) end
  183.     if var_Y > 0.008856 then var_Y=var_Y^(1/3)
  184.     else var_Y=(7.787*var_Y)+(16/116) end
  185.     if var_Z > 0.008856 then var_Z=var_Z^(1/3)
  186.     else var_Z=(7.787*var_Z)+(16/116) end
  187.     local CIEL,CIEa,CIEb=(116*var_Y)-16,500*(var_X-var_Y),200*(var_Y-var_Z)
  188.     return CIEL,CIEa,CIEb
  189. end
  190.  
  191. function CIELabToXYZ(CIEL,CIEa,CIEb)
  192.     local var_Y=(CIEL+16)/116
  193.     local var_X=CIEa/500+var_Y
  194.     local var_Z=var_Y-CIEb/200
  195.     if var_Y^3 > 0.008856 then var_Y=var_Y^3
  196.     else var_Y=(var_Y-16/116)/7.787 end
  197.     if var_X^3 > 0.008856 then var_X=var_X^3
  198.     else var_X=(var_X-16/116)/7.787 end
  199.     if var_Z^3 > 0.008856 then var_Z=var_Z^3
  200.     else var_Z=(var_Z-16/116)/7.787 end
  201.     local X,Y,Z=95.047*var_X,100*var_Y,108.883*var_Z
  202.     return X,Y,Z
  203. end
  204.  
  205. function CIELabToCIELCH(CIEL,CIEa,CIEb)
  206.     local var_H=math.atan(CIEb/CIEa)
  207.     if var_H>0 then var_H=(var_H/math.pi)*180
  208.     else var_H=360-(math.abs(var_H)/math.pi)*180 end
  209.     local CIEC,CIEH=math.sqrt(CIEa^2+CIEb^2),var_H
  210.     return CIEL,CIEC,CIEH
  211. end
  212.  
  213. function CIELCHToCIELab(CIEL,CIEC,CIEH)
  214.     local CIEa,CIEb=math.cos(math.rad(CIEH))*CIEC,math.sin(math.rad(CIEH))*CIEC
  215.     return CIEL,CIEa,CIEb
  216. end
  217.  
  218. function XYZToCIELuv(X,Y,Z)
  219.     local var_U,var_V,var_Y=(4*X)/(X+(15*Y)+(3*Z)),(9*Y)/(X+(15*Y)+(3*Z)),Y/100
  220.     if var_Y > 0.008856 then var_Y=var_Y^(1/3)
  221.     else var_Y=(7.787*var_Y)+(16/116) end
  222.     local ref_X,ref_Y,ref_Z=95.047,100,108.883
  223.     local ref_U,ref_V=(9*ref_X)/(ref_X+(15*ref_Y)+(3*ref_Z)),(9*ref_Y)/(ref_X+(15*ref_Y)+(3*ref_Z))
  224.     local CIEL=(116*var_Y)-16
  225.     local CIEu=13*CIEL*(var_U-ref_U)
  226.     local CIEv=13*CIEL*(var_V-ref_V)
  227.     return CIEL,CIEu,CIEv
  228. end
  229.  
  230. function CIELuvToXYZ(CIEL,CIEu,CIEv)
  231.     local var_Y=(CIEL+16)/116
  232.     if var_Y^3 > 0.008856 then var_Y=var_Y^3
  233.     else var_Y=(var_Y-16/16)/7.787 end
  234.     local ref_X,ref_Y,ref_Z=95.047,100,108.883
  235.     local ref_U,ref_V=(9*ref_X)/(ref_X+(15*ref_Y)+(3*ref_Z)),(9*ref_Y)/(ref_X+(15*ref_Y)+(3*ref_Z))
  236.     local var_U,var_V=CIEu/(13*CIEL)+ref_U,CIEv/(13*CIEL)+ref_V
  237.     local Y=var_Y*100
  238.     local X=-(9*Y*var_U)/((var_U-4)*var_V-var_U*var_V)
  239.     local Z=(9*Y-(15*var_V*Y)-(var_V*X))/(3*var_V)
  240.     return X, Y, Z
  241. end
  242.  
  243. function RGBToCMY(r,g,b)
  244.     local C,M,Y=1-(r/255),1-(g/255),1-(b/255)
  245.     return C,M,Y
  246. end
  247.  
  248. function CMYToRGB(C,M,Y)
  249.     local r,g,b=(1-C)*255,(1-M)*255,(1-Y)*255
  250.     return r,g,b
  251. end
  252.  
  253. function CMYToCMYK(C,M,Y)
  254.     local var_K=1
  255.     if C < var_K then var_K=C end
  256.     if M < var_K then var_K=M end
  257.     if Y < var_K then var_K=Y end
  258.     if var_K==1 then C,M,Y=0,0,0
  259.     else C,M,Y=(C-var_K)/(1-var_K),(M-var_K)/(1-var_K),(C-var_K)/(1-var_K) end
  260.     local K=var_K
  261.     return C,M,Y,K
  262. end
  263.  
  264. function CMYKToCMY(C,M,Y,K)
  265.     local C,M,Y=(C*(1-K)+K),(M*(1-K)+K),(Y*(1-K)+K)
  266.     return C,M,Y
  267. end
  268.  
  269. function RGBToHSV(r,g,b)
  270.     local var_R,var_G,var_B=r/255,g/255,b/255
  271.     local var_Min,var_Max=math.min(var_R,var_G,var_B),math.max(var_R,var_G,var_B)
  272.     local del_Max=var_Max-var_Min
  273.     local V=var_Max
  274.     local H,S
  275.     if del_Max == 0 then H,S=0,0
  276.     else
  277.         S=del_Max/var_Max
  278.         local del_R=(((var_Max-var_R)/6)+(del_Max/2))/del_Max
  279.         local del_G=(((var_Max-var_G)/6)+(del_Max/2))/del_Max
  280.         local del_B=(((var_Max-var_B)/6)+(del_Max/2))/del_Max
  281.         if var_R==var_Max then H=del_B-del_G
  282.         elseif var_G==var_Max then H=(1/3)+del_R-del_B
  283.         elseif var_B==var_Max then H=(2/3)+del_G-del_R end
  284.         if H<0 then H=H+1 end
  285.         if H>1 then H=H-1 end
  286.     end
  287.     return H,S,V
  288. end
  289.  
  290. function HSVToRGB(H,S,V)
  291.     local r,g,b
  292.     if S==0 then
  293.         r=V*255
  294.         g=V*255
  295.         b=V*255
  296.     else
  297.         local var_H=H*6
  298.         if var_H==6 then var_H=0 end
  299.         local var_I=math.floor(var_H)
  300.         local var_1=V*(1-S)
  301.         local var_2=V*(1-S*(var_H-var_I))
  302.         local var_3=V*(1-S*(1-(var_H-var_I)))
  303.         local var_R,var_G,var_B
  304.         if var_I==0 then var_R,var_G,var_B=V,var_3,var_1
  305.         elseif var_I==1 then var_R,var_G,var_B=var_2,V,var_1
  306.         elseif var_I==2 then var_R,var_G,var_B=var_1,V,var_3
  307.         elseif var_I==3 then var_R,var_G,var_B=var_1,var_2,V
  308.         elseif var_I==4 then var_R,var_G,var_B=var_3,var_1,V
  309.         else var_R,var_G,var_B=V,var_1,var_2 end
  310.         r,g,b=var_R*255,var_G*255,var_B*255
  311.     end
  312.     return r,g,b
  313. end
  314.  
  315. function XYZToYxy(X,Y,Z)
  316.     local x,y=Y,X/(X+Y+Z),Y/(X+Y+Z)
  317.     return Y,x,y
  318. end
  319.  
  320. function YxyToXYZ(Y,x,y)
  321.     local X,Z=x*(Y/y),(1-x-y)*(Y/y)
  322.     return X,Y,Z
  323. end
  324.  
  325. function DeltaC(CIEa1,CIEb1,CIEa2,CIEb2)
  326.     return math.sqrt((CIEa2^2)+(CIEb2^2))-math.sqrt((CIEa1^2)+(CIEb1^2))
  327. end
  328.  
  329. function DeltaH(CIEa1,CIEb1,CIEa2,CIEb2)
  330.     local xDE=DeltaC(CIEa1,CIEb1,CIEa2,CIEb2)
  331.     return math.sqrt((CIEa2^2-CIEa1)^2+(CIEb2-CIEb1)^2-(xDE^2))
  332. end
  333.  
  334. function DeltaCIE76(CIEL1,CIEa1,CIEb1,CIEL2,CIEa2,CIEb2)
  335.     return math.sqrt((CIEL1-CIEL2)^2+(CIEa1-CIEa2)^2+(CIEb1-CIEb2)^2)
  336. end
  337.  
  338. function DeltaCIE94(CIEL1,CIEa1,CIEb1,CIEL2,CIEa2,CIEb2,app)
  339.     local WHTL,WHTC,WHTH=1,0.045,0.015
  340.     app = app or 1
  341.     if app == 1 then WHTL,WHTC,WHTH=1,0.045,0.015
  342.     elseif app == 2 then WHTL,WHTC,WHTH=2,0.048,0.014 end
  343.     local xC1,xC2,xDL=math.sqrt(CIEa1^2+CIEb1^2),math.sqrt(CIEa2^2+CIEb2^2),CIEL2-CIEL1
  344.     local xDC=xC2-xC1
  345.     local xDE=DeltaCIE76(CIEL1,CIEa1,CIEb1,CIEL2,CIEa2,CIEb2)
  346.     local xDH
  347.     if math.sqrt(xDE) > math.sqrt(math.abs(xDL))+math.sqrt(math.abs(xDC)) then xDH=math.sqrt(xDE^2-xDL^2-xDC^2)
  348.     else xDH=0 end
  349.     local xSC,xSH=1+(0.045*xC1),1+(0.015*xC1)
  350.     local xDL=xDL/WHTL
  351.     local xDC=xDC/(WHTC*xSC)
  352.     local xDH=xDH/(WHTH*xSH)
  353.     return math.sqrt(xDL^2+xDC^2+xDH^2)
  354. end
  355.  
  356. function CIELabToHue(var_A,var_B)
  357.     local var_bias=0
  358.     if var_A>=0 and var_B==0 then return 0 end
  359.     if var_A<0 and var_B==0 then return 180 end
  360.     if var_A==0 and var_B>0 then return 90 end
  361.     if var_A==0 and var_B<0 then return 270 end
  362.     if var_A>0 and var_B>0 then var_bias=0 end
  363.     if var_A<0 then var_bias=180 end
  364.     if var_A>0 and var_B<0 then var_bias=360 end
  365.     return math.deg(math.atan(var_B/var_A)+var_bias)
  366. end
  367.  
  368. function DeltaCIEDE2000(CIEL1,CIEa1,CIEb1,CIEL2,CIEa2,CIEb2,app)
  369.     local WHTL,WHTC,WHTH=1,0.045,0.015
  370.     app = app or 1
  371.     if app == 1 then WHTL,WHTC,WHTH=1,0.045,0.015
  372.     elseif app == 2 then WHTL,WHTC,WHTH=2,0.048,0.014 end
  373.     local xC1,xC2=math.sqrt(CIEa1^2+CIEb1^2),math.sqrt(CIEa2^2+CIEb2^2)
  374.     local xCX=(xC1+xC2)/2
  375.     local xGX=0.5*(1-math.sqrt((xCX^7)/((xCX^7) + (25^7))))
  376.     local xNN=(1+xGX)*CIEa1
  377.     xC1=math.sqrt(xNN^2+CIEb1^2)
  378.     local xH1=CIELabToHue(xNN,CIEb1)
  379.     xNN=(1+xGX)*CIEa2
  380.     xC2=math.sqrt(xNN^2+CIEb2^2)
  381.     local xH2=CIELabToHue(xNN,CIEb2)
  382.     local xDL=CIEL2-CIEL1
  383.     local xDC=xC2-xC1
  384.     if xC1*xC2 == 0 then
  385.         xDH=0
  386.     else
  387.         xNN=round(xH2-xH1,12)
  388.         if math.abs(xNN) <= 180 then
  389.             xDH=xH2-xH1
  390.         else
  391.             if xNN>180 then xDH=xH2-xH1-360
  392.             else xDH=xH2-xH1+360 end
  393.         end
  394.     end
  395.     xDH=2*math.sqrt(xC1*xC2)*math.sin(math.rad(xDH/2))
  396.     local xLX=(CIEL1+CIEL2)/2
  397.     local xCY=(xC1+xC2)/2
  398.     local xHX
  399.     if xC1*xC2 == 0 then
  400.         xHX=xH1+xH2
  401.     else
  402.         xNN=math.abs(round(xH1-xH2,12))
  403.         if xNN > 180 then
  404.             if xH2+xH1 < 360 then xHX=xH1+xH2+360
  405.             else xHX=xH1+xH2-360 end
  406.         else
  407.             xHX=xH1+xH2
  408.         end
  409.         xHX=xHX/2
  410.     end
  411.     local xTX=1-0.17*math.cos(math.rad(xHX-30))+0.24*math.cos(math.rad(2*xHX))+0.32*math.cos(math.rad(3*xHX+6))-0.20*math.cos(math.rad(4*xHX-63))
  412.     local xPH=30*math.exp(-((xHX-275)/25)*((xHX-275)/25))
  413.     local xRC=2*math.sqrt((xCY^7)/((xCY^7)+(25^7)))
  414.     local xSL=1+(0.015*((xLX-50)^2)/math.sqrt(20+((xLX-50)^2)))
  415.     local xSC=1+0.045*xCY
  416.     local xSH=1+0.015*xCY*xTX
  417.     local xRT=-math.sin(math.rad(2*xPH))*xRC
  418.     xDL=xDC/(WHTL*xSL)
  419.     xDC=xDC/(WHTC*xSC)
  420.     xDH=xDH/(WHTH*xSH)
  421.     return math.sqrt(xDL^2+xDC^2+xDH^2+xRT*xDC*xDH)
  422. end
  423.  
  424. function DeltaCMC(CIEL1,CIEa1,CIEb1,CIEL2,CIEa2,CIEb2,app)
  425.     local WHTL,WHTC,WHTH=1,0.045,0.015
  426.     app = app or 1
  427.     if app == 1 then WHTL,WHTC,WHTH=1,0.045,0.015
  428.     elseif app == 2 then WHTL,WHTC,WHTH=2,0.048,0.014 end
  429.     local xC1=math.sqrt(CIEa1^2+CIEb1^2)
  430.     local xC2=math.sqrt(CIEa2^2+CIEb2^2)
  431.     local xff=math.sqrt((xC1^4)/(xC1^4)+1900)
  432.     local xH1=CIELabToHue(CIEa1,CIEb1)
  433.     local xTT,xSL,xSC,xSH,xDH
  434.     if xH1 < 164 or xH1 > 345 then xTT=0.36+math.abs(0.4*math.cos(math.rad(35+xH1)))
  435.     else xTT=0.56+math.abs(0.2*math.cos(math.rad(168+xH1))) end
  436.     if CIEL1 < 16 then xSL=0.511
  437.     else xSL=(0.040975*CIEL1)/(1+(0.01765*CIEL1)) end
  438.     xSC=((0.0638*xC1)/(1+(0.0131*xC1)))+0.638
  439.     xSH=((xff*xTT)+1-xff)*xSC
  440.     xDH=math.sqrt((CIEa2-CIEa1)^2+(CIEb2-CIEb1)^2-(xC2-xC1)^2)
  441.     xSL=(CIEL2-CIEL1)/WHTL*xSL
  442.     xSC=(xC2-xC1)/WHTC*xSC
  443.     xSH=xDH/xSH
  444.     return math.sqrt(xSL^2+xSC^2+xSH^2)
  445. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement