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' Sappiamo quanto è veloce, ma è tutto intero. Funziona girando alpha (e inv_alpha) in rappresentazioni 8.8 in virgola fissa. Non preoccuparti del fatto che il valore minimo di alfa è 1. In questo caso, fg [3] era 0, il che significa che il primo piano è trasparente. Le miscele saranno 1 * fg + 256 * bg, il che significa che tutti i bit di fg saranno spostati fuori dal risultato.
Si potrebbe fare molto velocemente, in effetti, se avete impacchettato i vostri RGBA in interi a 64 bit. È quindi possibile calcolare tutti e tre i colori dei risultati in parallelo con una singola espressione.
Questo collegamento non aiuta – PerracoLabs
Puoi aiutarci a capire la differenza tra la tua domanda e quella? Sembra che molti di noi siano confusi. – sblom
Non un duplicato. Questo chiede di miscelare alfa nella semplice vecchia 'C'. La presunta domanda che duplica pone una domanda simile, ma riguardo a 'C++'. Due lingue simili, ma molto diverse. –