Я ищу более эффективный способ конвертировать из RGBA, который хранится как удвоение в премультиплексированном цветовом пространстве, до 8-битного целочисленного/канального RGBA непремультивированного цветового пространства. Это значительная стоимость обработки изображений.
Для одного канала, скажем R, код выглядит примерно так:
double temp = alpha > 0 ? src_r / alpha : 0
uint8_t out_r = (uint8_t)min( 255, max( 0, int(temp * 255 + 0.5) ) )
Это связано с тремя условностями, которые, как я думаю, не позволяют компилятору/ЦП оптимизировать это, а также могут. Я думаю, что некоторые чипы, в частности x86_64, имеют специализированные операции двойного зажима, поэтому теоретически вышеупомянутое может выполняться без условностей.
Есть ли какой-то метод или специальные функции, которые могут сделать это преобразование быстрее?
Я использую GCC и буду удовлетворен решением на C или С++ или с встроенным ASM, если это необходимо.