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;
}
I don' Saber qué tan rápido es, pero todo es un número entero. Funciona al convertir alfa (e inv_alpha) en 8.8 representaciones de punto fijo. No se preocupe por el hecho de que el valor mínimo de alfa es 1. En ese caso, fg [3] era 0, lo que significa que el primer plano es transparente. Las mezclas serán 1 * fg + 256 * bg, lo que significa que todos los bits de fg se desplazarán fuera del resultado.
Podría hacerlo muy rápido, de hecho, si empacó sus RGBA en enteros de 64 bits. Luego puede calcular los tres colores de resultados en paralelo con una sola expresión.
Este enlace no ayuda – PerracoLabs
¿Puede ayudarnos a entender la diferencia entre su pregunta y esa? Parece que muchos de nosotros estamos confundidos. – sblom
No es un duplicado. Esto pregunta acerca de la mezcla alfa en simple antigua 'C'. La supuesta pregunta que este duplica hace una pregunta similar, pero con respecto a 'C++'. Dos idiomas similares, pero muy diferentes. –