Mélange alpha 2 couleurs RGBA en C

Dupliquer possible:
Comment faire un mélange alpha rapide?

Quel est le moyen le plus rapide de mélanger alpha 2 couleurs RGBA (Integer)?

En tant que note, la couleur cible à mélanger est toujours opaque, seule la deuxième couleur peut avoir différents niveaux de transparence.

J’essaie de trouver le moyen le plus rapide en C, en tenant compte du fait que la couleur finale résultant du mélange doit se terminer sans transparence, totalement opaque (alpha = 0xff)

 int blend(unsigned char result[4], unsigned char fg[4], unsigned char bg[4]) { unsigned int alpha = fg[3] + 1; unsigned int inv_alpha = 256 - fg[3]; result[0] = (unsigned char)((alpha * fg[0] + inv_alpha * bg[0]) >> 8); result[1] = (unsigned char)((alpha * fg[1] + inv_alpha * bg[1]) >> 8); result[2] = (unsigned char)((alpha * fg[2] + inv_alpha * bg[2]) >> 8); result[3] = 0xff; } 

Je ne sais pas à quelle vitesse c’est, mais c’est tout entier. Cela fonctionne en transformant alpha (et inv_alpha) en représentations à point fixe 8.8. Ne vous inquiétez pas du fait que la valeur minimale de alpha soit 1. Dans ce cas, fg [3] valait 0, ce qui signifie que le premier plan est transparent. Les mélanges seront 1 * fg + 256 * bg, ce qui signifie que tous les bits de fg seront décalés du résultat.

Vous pourriez le faire très rapidement, en effet, si vous compiliez vos RGBA dans des entiers 64 bits. Vous pouvez ensuite calculer les trois couleurs de résultat en parallèle avec une seule expression.