Code: Select all
Global hue.f,sat.f,lum.f
Procedure RGB2HSL(color)
Protected r.f,g.f,b.f,cmax.f,cmin.f,c.f
r = Red(color) / 255
g = Green(color) / 255
b = Blue(color) / 255
Dim a.f(2)
a(0) = r : a(1) = g : a(2) = b
SortArray(a.f(),#PB_Sort_Ascending )
cmax = a(2)
cmin = a(0)
lum = (cmax + cmin) / 2
If cmax = cmin
hue = 0
sat = 0
Else
c = cmax - cmin
sat = c / (1 - Abs(2 * lum - 1))
If r = cmax
hue = (g - b) / c
ElseIf g = cmax
hue = (b - r) / c + 2
ElseIf b = cmax
hue = (r - g) / c + 4
EndIf
EndIf
EndProcedure
Procedure.f Hue2RGB(v1.f, v2.f, vH.f)
If vH < 0 : vH + 1 : EndIf
If vH > 1 : vH - 1 : EndIf
If (6 * vH) < 1 : ProcedureReturn (v1 + (v2 - v1) * 6 * vH) : EndIf
If (2 * vH) < 1 : ProcedureReturn v2 : EndIf
If (3 * vh) < 2 : ProcedureReturn (v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6) : EndIf
ProcedureReturn v1
EndProcedure
Procedure.l HSL2RGB(H.f, S.f, L.f)
Protected.i R, G, B
Protected.f var_1, var_2
If S = 0
R = L * 255
G = L * 255
B = L * 255
Else
If L < 0.5
var_2 = L * (1 + S)
Else
var_2 = (L + S) - (S * L)
EndIf
var_1 = 2 * L - var_2
R = 255 * Hue2RGB(var_1, var_2, H + (1.0 / 3.0))
G = 255 * Hue2RGB(var_1, var_2, H)
B = 255 * Hue2RGB(var_1, var_2, H - (1.0 / 3.0))
EndIf
ProcedureReturn (R | G<<8 | B<<16)
EndProcedure
LoadFont(0,"Tahoma",12,#PB_Font_Bold)
SetGadgetFont(#PB_Default,FontID(0))
OpenWindow(0,0,0,275,145,"",#PB_Window_SystemMenu |#PB_Window_Tool|#PB_Window_ScreenCentered)
SetWindowTitle(0,Space(20)+"RGB <--> HSL")
SpinGadget(0,40,10,80,24,0,255, #PB_Spin_Numeric)
SetGadgetState(0,0)
text = TextGadget(#PB_Any,10,10,24,24,"")
SpinGadget(1,40,40,80,24,0,255, #PB_Spin_Numeric)
SetGadgetState(1,0)
text1 = TextGadget(#PB_Any,10,40,24,24,"")
SpinGadget(2,40,70,80,24,0,255, #PB_Spin_Numeric)
SetGadgetState(2,0)
text2 = TextGadget(#PB_Any,10,70,24,24,"")
SpinGadget(3,150,10,80,24,0,360, #PB_Spin_Numeric)
SetGadgetState(3,0)
text3 = TextGadget(#PB_Any,240,10,24,24,Chr(176),#PB_Text_Center)
SpinGadget(4,150,40,80,24,0,255, #PB_Spin_Numeric)
SetGadgetState(4,0)
text4 = TextGadget(#PB_Any,240,40,24,24,"%",#PB_Text_Center)
SpinGadget(5,150,70,80,24,0,255, #PB_Spin_Numeric)
SetGadgetState(5,0)
text5 = TextGadget(#PB_Any,240,70,24,24,"%",#PB_Text_Center)
SetGadgetColor(text,#PB_Gadget_BackColor,$CCCCCD)
SetGadgetColor(text1,#PB_Gadget_BackColor,$CCCCCD)
SetGadgetColor(text2,#PB_Gadget_BackColor,$CCCCCD)
ButtonGadget(10,10,110,80,26,"►")
ButtonGadget(20,185,110,80,26,"◄")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 0,1,2
red = GetGadgetState(0)
green = GetGadgetState(1)
blue = GetGadgetState(2)
SetGadgetColor(text,#PB_Gadget_BackColor,RGB(red,0,0))
SetGadgetColor(text1,#PB_Gadget_BackColor,RGB(0,green,0))
SetGadgetColor(text2,#PB_Gadget_BackColor,RGB(0,0,blue))
Case 10
red = GetGadgetState(0)
green = GetGadgetState(1)
blue = GetGadgetState(2)
color = RGB(red,green,blue)
RGB2HSL(color)
hue = Round(hue * 60,#PB_Round_Nearest) ; °
If hue < 0
hue = 360 + hue
EndIf
sat = Round(sat * 100,#PB_Round_Nearest) ; %
lum = Round(lum * 100,#PB_Round_Nearest) ; %
SetGadgetState(3,hue)
SetGadgetState(4,sat)
SetGadgetState(5,lum)
hue = 0:sat = 0:lum = 0
Case 20
hue.f = GetGadgetState(3)/360
sat.f = GetGadgetState(4)/100
lum.f = GetGadgetState(5)/100
color.i = HSL2RGB(hue.f, sat.f, lum.f)
SetGadgetState(0,Red(color))
SetGadgetColor(text,#PB_Gadget_BackColor,RGB(Red(color),0,0))
SetGadgetState(1,Green(color))
SetGadgetColor(text1,#PB_Gadget_BackColor,RGB(0,Green(color),0))
SetGadgetState(2,Blue(color))
SetGadgetColor(text2,#PB_Gadget_BackColor,RGB(0,0,Blue(color)))
hue = 0:sat = 0:lum = 0
EndSelect
EndSelect
Until Quit = 1