[TUTO] Utiliser une couleur sans alpha avec vector

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

[TUTO] Utiliser une couleur sans alpha avec vector

Message 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
Dernière modification par microdevweb le mar. 31/janv./2017 11:38, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Merci pour ce partage vraiment génial
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

On sent du vécu, on dirait
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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.
;)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

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

Message 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 ? ;)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

Aaaah !!! parce que RGB et BGR ça dépend de l'OS ?? 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre