Смешайте альфа-цвет, используя побитовые операции - PullRequest
0 голосов
/ 22 января 2011

У меня есть код ниже для смешивания альфа-цвета в формате ARGB:

a, b, o являются целыми числами, но всегда должны попадать в [0x00ffffff, 0xffffffff]

o = (((a >> 24) * (b >> 24)) >> 8) << 24; </p>

Есть ли способ его оптимизировать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 22 января 2011

Это не выполняет альфа-смешивание. Это просто объединяет альфа-компонент из двух пикселей. Это также, вероятно, примерно так же эффективно, как вы собираетесь получить, не переходя непосредственно к сборке. Если вы можете использовать указатели, вы можете получить немного быстрее, но:

byte* pa = (byte*)&a;
byte* pb = (byte*)&b;
byte* po = (byte*)&o;

po[3] = pa[3] * pb[3] >> 8;

Это экономит большую часть смены. Обратите внимание, что это подразумевает порядок байтов. Если вы работаете на процессоре с прямым порядком байтов, он становится еще лучше с:

*po = *pa * *pb >> 8;

В любом случае вы можете превратить это в однострочник, выполнив все операции приведения указателя в строке, но его становится немного трудно читать.

((byte*)&o)[3] = ((byte*)&a)[3] * ((byte*)&b)[3] >> 8;

или

*((byte*)&o) = *((byte*)&a) * *((byte*)&b) >> 8;
0 голосов
/ 22 января 2011
unsigned int blend(unsigned int a, unsigned int b)
{
  return (((a >> 24) * (b >> 24)) << 16) & 0xFF000000;
}

Это то, что вы пытаетесь сделать?Я не думаю, что это немного быстрее, но точнее в соответствии с тем, что вы заявили.

Если вам не нужно использовать побитовые операторы, вы также можете использовать указатели, как показали другие решения.

...