3 petites fonctions toutes bête, mais que je trouve indispensables pour la gestion des couleurs
- ColorBlend : retourne la couleur resultant du mélange de 2 couleurs (composant alpha inclus)
le paramétré blend [0->1] permet d'ajuster les proportions
(plus pratique que alphablend a mon avis. perso, je vois pas trop son intérêt, en tous cas pour mes besoins)
- HSLToRGB : retourne une couleur (RGB) definit par les parametres hue, saturation, lightness (valeurs comprises entre 0 et 255)
(je me suis aperçu que j'étais pas le premier à la proposer... )
c'est à mon avis la façon la plus pratique et intuitive pour definir une couleur
(surtout pour avoir une liste de couleur bien separé (couleur des joueurs...))
- RGBToHSL : la fonction réciproque (moins utile à mon avis, peut-etre pour le traitement d'image...)
Code : Tout sélectionner
Procedure.l HSLToRGB(hue.a, saturation.a, lightness.a, alpha=0)
Protected.f h=hue *6/256
Protected.f s=saturation/255
Protected.f l=lightness/255
Protected.f c,x,r_,v_,b_,m
c=(1-Abs(2*l-1))*s
x=c*(1-Abs(Mod(h, 2) -1))
Select Int(h)
Case 0:r_=c:v_=x
Case 1:r_=x:v_=c
Case 2:v_=c:b_=x
Case 3:v_=x:b_=c
Case 4:r_=x:b_=c
Case 5:r_=c:b_=x
EndSelect
m=l-c/2
Protected r,v,b
r=Int((r_+m)*255)
v=Int((v_+m)*255)
b=Int((b_+m)*255)
ProcedureReturn RGBA(r,v,b,alpha)
EndProcedure
Procedure.l RGBToHSL(red.a, green.a, blue.a, alpha=0)
Protected.f r=red/255
Protected.f g=green/255
Protected.f b=blue/255
Protected.f cmax, cmin, h_,c,m,h,s,l
Protected.l imax,imin
If r>=g And r>=b:imax=1:cmax=r:EndIf
If g>=r And g>=b:imax=2:cmax=g:EndIf
If b>=r And b>=g:imax=3:cmax=b:EndIf
If r<=g And r<=b:imin=1:cmin=r:EndIf
If g<=r And g<=b:imin=2:cmin=g:EndIf
If b<=r And b<=g:imin=3:cmin=b:EndIf
c=cmax-cmin
Select imax
Case 1:h_=Mod((g-b)/c+6,6)
Case 2:h_=(b-r)/c+2
Case 3:h_=(r-g)/c+4
EndSelect
h=h_/6
l=(cmax+cmin)/2
If l<>1:s=c/(1-Abs(2*l-1)):Else:s=0:EndIf
ProcedureReturn RGBA(h*255,s*255,l *255,alpha)
EndProcedure
Procedure ColorBlend(color1.l, color2.l, blend.f)
Protected r.w,g.w,b.w,a.w
r= Red(color1) + (Red(color2) - Red(color1)) * blend
g=Green(color1) + (Green(color2) - Green(color1)) * blend
b= Blue(color1) + (Blue(color2) - Blue(color1)) * blend
a=Alpha(color1) + (Alpha(color2) - Alpha(color1)) * blend
ProcedureReturn RGBA(r,g,b,a)
EndProcedure
; ============= exemple ==============
Define.l i,j,n,x,y,r,h,c
OpenWindow(0, 0, 0, 512, 256, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateImage(0, 512, 256,24,$888888)
StartDrawing(ImageOutput(0))
Box(0, 0, 256, 256, $ffffff)
For j=0 To 255
For i = 0 To 255
Plot(i,j, HSLToRGB(i,j,128))
Next
Next
DrawingMode(#PB_2DDrawing_Gradient)
Macro sphere
ResetGradientColors()
GradientColor(0.0,HSLToRGB(h,64,200))
GradientColor(0.3,HSLToRGB(h,64,128))
GradientColor(1.0,HSLToRGB(h,64,64))
CircularGradient(x-r*0.3, y+r*1.2+r*0.5,r)
Circle(x,y+r*1.2,r)
ResetGradientColors()
GradientColor(0.0,HSLToRGB(h,255,255))
GradientColor(0.3,HSLToRGB(h,255,128))
GradientColor(1.0,HSLToRGB(h,255,64))
CircularGradient(x-r*0.3, y-r*0.3,r)
Circle(x,y,r)
EndMacro
For j=1 To 4
n=1<<j
For i=0 To n-1
h=(0.5+i)/n*256
r=50/Sqr(n)
r=120/n
x=256+h
y=16*(i & 1)+330-420/Sqr(n)
sphere
Next
Next
StopDrawing()
ImageGadget(0, 0, 0, 200, 200, ImageID(0))
c=HSLToRGB(128,186,137)
Debug ""+Red(c)+" "+Green(c)+" "+Blue(c)+" "+Alpha(c)
c=RGBToHSL(Red(c),Green(c),Blue(c))
Debug ""+Red(c)+" "+Green(c)+" "+Blue(c)+" "+Alpha(c)
c=ColorBlend($ff0000,$0000ff,0.5)
Debug ""+Red(c)+" "+Green(c)+" "+Blue(c)+" "+Alpha(c)
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow