[TUTO] Utiliser une couleur sans alpha avec vector
Publié : lun. 30/janv./2017 15:26
Vous l'aurez sans doute constaté, mais si vous utilisez une couleur sans alpha avec la librairie vector cela ne fonctionne pas. Enfin cela n'est pas tout à fait vrai car cela fonctionne mais le canal alpha est à 0 soit 100% transparent.
Petite explication:
Une couleur RGB est codée sur 24 bits dans une variable de 32 bits comme suit
Vous remarquerez que le codage ce fait de la droite vers la gauche, du bits de poids faible vers le bit de poids fort et que les 8 bits les plus à gauche (les bits de poids fort) sont à 0 car non utilisés.
Voici maintenant la même couleur en RGBA
Vous remarquerez que les 8 bits de poids fort (à gauche) sont tous à 1 pour une valeur de 255 soit 100% opaque.
L'astuce consiste donc juste à modifier les 8 bits de poids fort (à gauche) avec la valeur alpha de son choix sans modifié les autres bits.Pour cela on utilise un opérateur OR | et une masque logique en hexadécimal par soucis de facilité
Voici un petit exemple avec une couleur rouge R(255)G(48)B(48)
Petite explication:
Une couleur RGB est codée sur 24 bits dans une variable de 32 bits comme suit
Code : Tout sélectionner
; Exemple du'une couleur R(255)G(32)B(64)
; 00000000 01000000 00100000 11111111
; Non utilisé Blue(64) Green(32) Red(255)
;
; Soit en hexadécimal
; $4020FF
Voici maintenant la même couleur en RGBA
Code : Tout sélectionner
; Exemple du'une couleur A(255) R(255)G(32)B(64)
; 11111111 01000000 00100000 11111111
; Alpha(255) Blue(64) Green(32) Red(255)
;
; Soit en hexadécimal
; $FF4020FF
L'astuce consiste donc juste à modifier les 8 bits de poids fort (à gauche) avec la valeur alpha de son choix sans modifié les autres bits.Pour cela on utilise un opérateur OR | et une masque logique en hexadécimal par soucis de facilité
Code : Tout sélectionner
$ValeurAlpha000000 ; Masque logique
; La valeur du canal alpha souhaitée sur 8 bits ex: $FF 255,$80 128 etc
; suivie de six zéros pour ne pas modifiée les 24 bits de couleur
Code : Tout sélectionner
Define Color.l=$3030FF ; couleur sans la valeur alpha
OpenWindow(0,0,0,800,600,"teste",$cb0001)
CanvasGadget(0,0,0,800,600)
StartVectorDrawing(CanvasVectorOutput(0))
; Ici cela ne fonctionera pas car pas de canal alpha
VectorSourceColor(Color)
AddPathBox(0,0,200,600)
FillPath()
; Ici je place la valeur 255 dans les 8 bits de poids fort (Valeur Alpha)
; je ne modifie par contre pas les 24 bits suivants
VectorSourceColor(Color|$FF000000)
AddPathBox(200,0,200,600)
FillPath()
; Ici je place la valeur 128 dans les 8 bits de poids fort (Valeur Alpha)
; je ne modifie par contre pas les 24 bits suivants
VectorSourceColor(Color|$80000000)
AddPathBox(400,0,200,600)
FillPath()
; Ici je place la valeur 64 dans les 8 bits de poids fort (Valeur Alpha)
; je ne modifie par contre pas les 24 bits suivants
VectorSourceColor(Color|$40000000)
AddPathBox(600,0,200,600)
FillPath()
StopVectorDrawing()
Repeat:WaitWindowEvent():Until Event()=#PB_Event_CloseWindow