website logo
Auteur
avatar
thellier

Forum » » Création-Développement » » Langage C : les unions et l'optimisation


Posté : 19-01-2017 00:41 icone du post

Soir'

Je vais vous parler d'un truc qui peut servir pour des optimisations en langage C ... que ni Crisot ni Hunoppc ne connaissait.

Imaginons que vous voulez lire des pixels ARGB 32 bits puis les manipuler
Donc vous voudriez voir cette donnée "comme" un ULONG 32bits ou comme 4 UBYTE 8 bits
C'est ce que permet un union : c'est comme une double définition d'une structure

union rgba3D {
struct rgba3DL{
ULONG ARGB32;
} L;
struct rgba3DB{
UBYTE ARGB[4];
} B;
};

si vous avez une variable nommée pix
alors pix.L.ARGB32 donnera accès "comme" un ULONG
et pix.B.ARGB[0] pix.B.ARGB[1] pix.B.ARGB[2] pix.B.ARGB[3] donneront accès aux composantes "comme" un UBYTE

On peut aussi créer un pointeur de ce type et accéder aux pixels en mémoire
union rgba3D *pt;

et faire des trucs du genre avec des registres pour faire comme un pseudo assembleur en C

register union rgba3D *pt;
register union rgba3D pix;
register union rgba3D color;

color.B.ARGB[1]=50;
color.B.ARGB[2]=80;
color.B.ARGB[3]=100 ;

for(n=0;n!=nbre;n++)
{
pix.L.ARGB32=pt[n].L.ARGB32;
pix.B.ARG B[1]=((UWORD)pix.B.ARGB[1]+(UWORD)color.B.ARGB[1])>1;
pix.B.ARGB[2]=((UWO RD)pix.B.ARGB[2]+(UWORD)color.B.ARGB[2])>1;
pix.B.ARGB[3]=((UWORD)pix.B.A RGB[3]+(UWORD)color.B.ARGB[3])>1;
pt[n].L.ARGB32=pix.L.ARGB32;
}
r>PatchCompositeTags fait un usage intensif de ce genre de manip. encapsulée dans des macros

Bonne Nuit 
Message édité par : thellier / 19-01-2017 00:47

Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=2391&forum=14