Page 1 sur 2

[TUTO] Utiliser une couleur sans alpha avec vector

Publié : lun. 30/janv./2017 15:26
par microdevweb
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

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
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

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
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é

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
Voici un petit exemple avec une couleur rouge R(255)G(48)B(48)

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

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : lun. 30/janv./2017 17:21
par Kwai chang caine
Comme dab, ça me dépasse :oops:

Mais par contre ça m'a rappellé les whattmilles fois ou ça marchait pas parce que j'avais pas fait la difference entre une couleur RGBA() et RGB() ou bien parce que certaines couleurs etaient en RGB et avant quie je comprenne le schmilb .... :?
D'ailleurs, je vais surement encore dire une connerie, mais FRED il aurait pas pu mettre une sécurité ou un truc du genre qui permette quand même de voir la couleur si on entre un RGB() ou bien c'est ridicule ?

En tout cas....merci de la combine 8)

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : lun. 30/janv./2017 18:31
par microdevweb
@Kwai chang caine,

Ce n'est vraiment que cela ne fonctionne pas, mais une couleur sans le canal alpha (RGB) est codé sur 24 bits (8 pour le R 8 pour le G et 8 pour le B) 3 x 8 nous donne bien 24. Les dites données sont stockées dans une variable de 32 bits :!: . Alors comment sont les 8 bits restants :?: :?: :?: Et bien il sont à zéro.

Donc si on utilise une couleur RGB avec la librairie vector (qui gère le canal alpha) le canal alpha est à 0 soit totalement transparent et donc on ne voie rien.

Donc voila la petite astuce qui permet de remédier à cela, à noter que l'on peut tout à fait utilisé un couleur RGBA avec les fonction 2dDrawing, le canal alpha sera juste ignoré puisque cette librairie ne le gère pas.

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : lun. 30/janv./2017 20:26
par Micoute
Merci pour ce partage vraiment génial

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : mer. 01/févr./2017 14:14
par Kwai chang caine
Aaaah d'accord.
Merci Microdevweb pour l'explication 8)
C'est sur que quand on comprend, on souffre moins :lol:

C'est dommage que le paramètre alpha soit, pourrait on dire, optionnel
Si la lib vector nous engueulait quand on lui envoi pas l'alpha, comme une procedure quand on oublie un paramètre, ça éviterait noir de temps recherche de bug.

Bon c'est sur que l'idéal serait de ne pas se tromper, me dirait on... mais tout le monde sait que nous vivons dans un monde imparfait :mrgreen:

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : mer. 01/févr./2017 18:04
par Micoute
On sent du vécu, on dirait

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : mer. 01/févr./2017 20:36
par Ar-S
Enfin dans l'aide pour VectorSourceColor(Couleur) c'est tout de même ecrit :
La couleur RGBA 32 bits comprenant la transparence alpha.
;)

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 10:16
par Kwai chang caine
Oui, oui je dit pas le contraire, ce n'est pas la faute de FRED :wink:
Dans l'aide, c'est écrit noir de choses, comme les parametres optionels, et ça ne nous empeche pas de nous gourer tous les jours...enfin surtout moi.

Et à chaque fois, on dit :
"Oh put...de mer.... "j'm'ai" encore fait niq.... la salo.... de NTM de fonctions :? "
Certes, nous usitons à cet occasion emplie d'aversion et d'éréthisme exacerbé, un language qu'il me plairait à qualifier de ...comment dirais-jeeeee ......charretier peut être !!! :mrgreen:

Un exemple parmis tant d'autre qui me vient à l'esprit tellement je souffre encore du nombre de fois ou je me suis fait..... :oops:

Code : Tout sélectionner

FindString(Chaine$, ChaineCherchee$ [, PositionDepart] [, Mode]]) 
Et bien, ça a beau être dans la doc, mais si je me fais pas avoir au moins une fois par cette fonction par programme....
Je te rassure, je suis pas le seul, y'a même une tonne de POSTS sur le US sur ce sujet :
http://www.purebasic.fr/english/viewtop ... FindString
http://www.purebasic.fr/english/viewtop ... FindString
http://www.purebasic.fr/english/viewtop ... FindString
http://www.purebasic.fr/english/viewtop ... 02#p464402
etc ......

Et le miens, bien sûr..parce que quand y'a une merde sur le trottoir, et que KCC passe, il a étonnement les pompes qui puent :mrgreen:
http://www.purebasic.fr/english/viewtop ... 43#p452643

Combien de fois je met :

Code : Tout sélectionner

FindString(Chaine$, ChaineCherchee$ , #PB_String_NoCase) 
Et tu peux attendre whatmilles heures que le résultat tombe.....
Même FRED a demandé une idée pour empecher ce probleme, mais personne n'en a :cry:
http://www.purebasic.fr/english/viewtop ... 21#p453321

Tout ça pour dire, que y'a beau avoir une bonne DOC, y'a beau le savoir, et ben on a certaines choses qui ne doivent pas être dans nos gênes, et on se refait avoir, un million de fois. :oops:
Alors une protection, qui "glinegue" quand on met un truc qui faut pas au mauvais endroit...n'est jamais de trop, pour éviter aux "petits nenfants" de ne pas mettre leurs doigts dans les charnieres de portes, ou faire un bain de minuit éternel :cry:
FRED est un grand "Frere", voir même pour certains "notre maitre"....il se doit de protéger ses ouailles de tous les danger de la programmation, afin qu'elle n'aille pas reposer dans de noirs paturages : Psaumes PB - chapitre 10 - verset 1 de la doc : EnseigneMoi :mrgreen:

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 11:26
par microdevweb
Il ne faut pas oublier que même si Pb est un langage complet il reste dans la philosophie d'une language bas niveau et performant. Contrairement à d'autres il ne nécessite pas de frameworks, donne des exécutables autonomes légers et performants.

Quel que soit le language, l'informatique fait appel à un système binaire et no processeur on un nombre minimum de bit pouvant être géré (8bits) et suivant le type de variable gère une taille de byte spécifique. Elle cela est régis par les commandes assembleur qui dépendent du type de processeur.

Les différentes tailles dans notre cas sont, 8,16,32,64 bits qui normalement peuvent être déclarée signées (par défaut) ou non signées.

Tient cela change quoi une variable non signée :?:
:arrow: Signée le bit le plus à gauche donne le signe 0 positif, 1 négatif raison d’ailler pour l’a-quel un dépassement de capacité donne une valeur négative (non vérifié avec Pb).
:arrow: non-signée on augmente la capacité de 1 bit, cela ne semble rien mais dans le cas d'une variable 8 bits 2 puissance 7 donne 128 on passe donc de 127 à 255.
Alors qu'avec une 32 bit 2 puissance 31 donne 2147483648 en plus.

Même si cela reste transparent pour nous, les fonctions Pb doivent se plier aux exigences du système et cela demande certain protocoles.

Donc comme le fait remarquer Ars, il est bien spécifié dans la doc que vector gère le canal alpha d'ou la petite astuce (que certains connaissaient surement). Mais le forum étant un site d'échanges je trouvais utile ce petit tuto.

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 14:36
par Zorro
au lieu de se prendre le choux avec la logique booleene

on peut aussi le faire en utilisant les fonctions Purebasic

comme ça :

Code : Tout sélectionner

Define Color.l=$3030FF ; couleur sans la valeur alpha
color2=rgbA(red(Color),green(Color),blue(Color),255) ; couleur AVEC Alpha
VectorSourceColor(Color2)
avantage, c'est quand meme plus lisible non ? ;)

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 14:51
par djes
Zorro a écrit :au lieu de se prendre le choux avec la logique booleene

on peut aussi le faire en utilisant les fonctions Purebasic

comme ça :

Code : Tout sélectionner

Define Color.l=$3030FF ; couleur sans la valeur alpha
color2=rgbA(red(Color),green(Color),blue(Color),255) ; couleur AVEC Alpha
VectorSourceColor(Color2)
avantage, c'est quand meme plus lisible non ? ;)
Totalement d'accord avec toi, en plus ça évite les éventuels problèmes de compatibilité entre plateformes, entre les BGR/RGB etc.

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 16:11
par Kwai chang caine
Zorro a écrit :on peut aussi le faire en utilisant les fonctions Purebasic
Donc si j'ai bien compris, c'est exactement pareil du moment qu'on met à fond la transparence 8)
Djes a écrit :Totalement d'accord avec toi, en plus ça évite les éventuels problèmes de compatibilité entre plateformes, entre les BGR/RGB etc.
Alors là, ça m'interpelle "somewhere"..... car je suis justement en train d'essayer de comprendre les couleurs
En RGBA on peut mettre l'ordre des couleurs, BGR et RGB c'est pareil ?? 8O

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 16:15
par djes
Kwai chang caine a écrit :
Zorro a écrit :on peut aussi le faire en utilisant les fonctions Purebasic
Donc si j'ai bien compris, c'est exactement pareil du moment qu'on met à fond la transparence 8)
Djes a écrit :Totalement d'accord avec toi, en plus ça évite les éventuels problèmes de compatibilité entre plateformes, entre les BGR/RGB etc.
Alors là, ça m'interpelle "somewhere"..... car je suis justement en train d'essayer de comprendre les couleurs
En RGBA on peut mettre l'ordre des couleurs, BGR et RGB c'est pareil ?? 8O
Non, mais les fonctions PB vont renvoyer le format correspondant à la plateforme, tandis qu'un code perso qui ne ferait aucun test pourrait renvoyer une valeur inadaptée.

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 16:29
par Kwai chang caine
Aaaah !!! parce que RGB et BGR ça dépend de l'OS ?? 8O

Re: [TUTO] Utiliser une couleur sans alpha avec vector

Publié : jeu. 02/févr./2017 16:34
par falsam
Kwai chang caine a écrit :Aaaah !!! parce que RGB et BGR ça dépend de l'OS ?? 8O
Non je pense que ça dépend de la notation.

Plot(0, 0, $FF0000)) c'est de la notation BGR
Plot(0, 0, RGB($00,$00,$FF)) c'est de la notation RGB (of course)

Source : https://www.purebasic.com/french/docume ... table.html (Généralités)