BGR

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

BGR

Message par Anonyme2 »

Voici 2 petites procedures asm sans prétention pour transformer une couleur en BGR, c'est-à dire quelle inverse les composantes rouge et bleue

la procedure BGR(couleur) retourne la valeur convertie
la procedure BGR_Ex(Addcouleur) ne retourne pas de valeur mais modifie directement la variable en mémoire

On peut très bien le faire avec les fonctions rgb() et red(), blue() et green()
voici les 2 petites procedures et un petit exemple, n'oubliez pas d'activer l'assembleur en ligne



Procedure.l BGR(Couleur.l)
; Couleur est une couleur sur 24 bits (ColorRef)
; la fonction inverse les composantes rouge et bleue

MOV eax, Couleur
BSWAP eax
SHR eax, 8
MOV Couleur, eax
ProcedureReturn Couleur
EndProcedure

Procedure BGR_Ex(AddCouleur.l)
; AddCouleur est l'adresse de la variable contenant la couleur (couleur sur 24 bits (ColorRef))
; la fonction inverse les composantes rouge et bleue directement en mémoire
; elle ne retourne pas de valeur

MOV eax, AddCouleur
MOV edx, [eax]
BSWAP edx
SHR edx, 8
MOV [eax], edx
EndProcedure



Procedure essai()

color = $00FFAA11 ; BGR(color) doit retourner $0011AAFF

; BGR(color1) modifie directement color1 avec la valeur $0011AAFF

color1 = color
BGR_Ex(@color1)

MessageRequester ( "BGR et BGR_Ex" , "color = $" + Hex (color)+ Chr (10)+ Chr (10)+ "BGR(color) = $" + Hex (BGR(color))+ Chr (10)+ Chr (10)+ "BGR_Ex(@color1) : $" + Hex (color1),16)

EndProcedure

essai()
Dernière modification par Anonyme2 le dim. 13/nov./2005 14:58, modifié 2 fois.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'vais regarder ça.
L'ASM m'intéresse en ce moment...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le dim. 13/nov./2005 15:48, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

C'est juste une sécurité au cas ou l'on passe une valeur > à 24 bit (c'est le cas de l'API GetDIBits sous Win98 qui met l'octet de poids fort à FF dans certains cas alors que sous XP non :roll: )

SHR met bien les bit entrant à 0 mais le AND a lieu avant l'inversion BSWAP
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le dim. 13/nov./2005 15:49, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

T'as raison, Dri,
inutile dans le code pour BGR et BGR_Ex

je modifie l'original (c'est extrait de mon code ou j'utilisais la couleur avant de l'inverser et j'ai passé du temps pour trouver le problème)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

...
Dernière modification par Dr. Dri le dim. 13/nov./2005 15:49, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Oui oui
Répondre