MLX: Acceder aux différents octets d'un unsigned long [C] - C - Programmation
Marsh Posté le 10-01-2012 à 11:13:24
Bonjour,
Utilise les opérateur de bits :
& pour appliquer un masque et isoler l'octet qui t'intéresse, et >> pour le ramener sur l'octet de poids faible :
exemple :
Code :
|
etc...
Marsh Posté le 10-01-2012 à 11:41:26
Merci,
apparement cela fonctionne, mais mal ...
Code :
|
Donc la j'envoie a get_color_value : 0xf8f8ff qui est equivalent à { "ghostwhite" , 0xf8f8ff }, dans le fichier RGB de la mlx, donc en théorie sa doit me sortir du blanc mais avec ce code sa me sort du vert fluo... ? :s
Marsh Posté le 10-01-2012 à 11:49:16
Ligne 13 : je crois qu'il manque un 0 dans ton 0xFF00000 (le nombre de 0 devrait être pair)
Lignes 14 et 15 : tu as oublié de décaler le FF, parce que là tu extrais toujours la même couleur (boiteuse, en plus, car à cheval sur deux octets).
Marsh Posté le 10-01-2012 à 11:54:16
Je comprend pas pour les lignes 14 et 15, comment je peut extraire la meme couleurs alors que j'y soustrais des octets differents ?
Marsh Posté le 10-01-2012 à 12:10:54
Bon, je reprends : mettons que img_color contienne 0xAABBCCDD.
AA est la couleur 1, BB est la couleur 2, CC est la couleur 3.
Pour extraire une couleur, il faut masquer le reste de la variable, puis décaler la couleur vers l'octet de poids faible pour le stocker dans un unsigned char.
L'opération (img_color & 0xFF000000) a pour résultat 0xAA000000. On décale ensuite de 24 bits pour ramener l'octet AA sur l'octet de poids faible.
Pour extraire BB, on doit utiliser le masque 0xFF0000, car c'est le 3eme octet qui nous intéresse. Puis on décale de 16 bits.
Pour CC, on utilise le masque 0xFF00, et on décale de 8 bits.
C'est plus clair ?
Marsh Posté le 10-01-2012 à 13:12:49
Hum, j'ai toujours le même main, j'essaye de lui passer la couleur snow (0xfffafa)
et voila ma fonction pixel_put_to_image():
Code :
|
Et ceci m'affiche un bleu un peu turquoise.
J'ai donc surement mal compris ce que tu a voulu me faire comprendre en faite ^^.
Marsh Posté le 10-01-2012 à 13:24:43
OK, je vois... Les exemples que je t'ai donné partaient du principe que les codes RGB étaient dans les octets de poids fort, et que l'octet de poids faible était réservé au canal alpha. Il fallait naturellement adapter à ton cas de figure.
A voir ton exemple, il faut que tu modifies tes masques et le nombre de bits de décalage :
R => 0xFF0000 et décalage de 16
G => 0xFF00 et décalage de 8
B => 0xFF et pas de décalage
Marsh Posté le 10-01-2012 à 16:37:30
Et pourquoi pas
Code :
|
Marsh Posté le 10-01-2012 à 18:04:05
jlnh a écrit : Et pourquoi pas
|
http://fr.wikipedia.org/wiki/Endianness
Ton code ne donnera pas le même résultat suivant le CPU utilisé.
En plus de ça, tu forces "img_color" a être stocké en mémoire, là où la méthode avec masque et décalage permet de l'avoir dans un registre.
Marsh Posté le 10-01-2012 à 22:48:07
Tu peux l'envoyer dans data directement sans passer
par r, g, b!
Plus élégant encore union/structure.
Marsh Posté le 11-01-2012 à 09:59:03
jlnh a écrit : Tu peux l'envoyer dans data directement sans passer |
Ça résout pas le problème d'endianness.
Marsh Posté le 10-01-2012 à 10:48:39
Salut, je taff en ce moment sur la MLX et j'utilise mlx_get_color_value pour récupérer un unsigned long img_color (qui est codé sur 4 octets) et qui correspond a ma couleur.
Pour donner cette couleurs a mon image, je dois copier le contenu de l'octet 1 de l'unsigned long dans le 1er octet de l'image, le contenu de l'octet 2 dans le 2e octet de l'image, l'octet 3 de l'unsigned long dans l'octet 3 de l'image. et ainsi de suite pour donner la couleur voulue à mes pixels.
Sauf que j'aimerais bien savoir comment accéder à chaque octets de l'unsigned long pour copier son contenu dans les octets de mon image ???
Merci d'avance