Написал такой код:
#define SML_COL_B(COLOR) (unsigned char)(((uint32_t)(COLOR) & 0x000000FF) >> 0)
#define SML_COL_G(COLOR) (unsigned char)(((uint32_t)(COLOR) & 0x0000FF00) >> 8)
#define SML_COL_R(COLOR) (unsigned char)(((uint32_t)(COLOR) & 0x00FF0000) >> 16)
#define SML_COL_A(COLOR) (unsigned char)(((uint32_t)(COLOR) & 0xFF000000) >> 24)
#define SML_COL_RGB(R, G, B) (uint32_t)(((unsigned char)(R) << 16) |\
((unsigned char)(G) << 8 ) |\
((unsigned char)(B)))
#define SML_COL_RGBA(A, R, G, B) (uint32_t)(((unsigned char)(A) << 24) |\
((unsigned char)(R) << 16) |\
((unsigned char)(G) << 8 ) |\
((unsigned char)(B)))
/// @todo get rid of floats
#define SML_COL_MIX(START, TARGET, INTENSITY) \
SML_COL_RGBA( \
SML_COL_A(START) + (SML_COL_A(TARGET) - SML_COL_A(START)) / 255.0 * INTENSITY, \
SML_COL_R(START) + (SML_COL_R(TARGET) - SML_COL_R(START)) / 255.0 * INTENSITY, \
SML_COL_G(START) + (SML_COL_G(TARGET) - SML_COL_G(START)) / 255.0 * INTENSITY, \
SML_COL_B(START) + (SML_COL_B(TARGET) - SML_COL_B(START)) / 255.0 * INTENSITY)
Теперь хочу оптимизировать SML_COL_MIX, ибо разворачивается оно в бешеную простыню:
(uint32_t)(((unsigned char)((unsigned char)(((uint32_t)(startcolor) & 0xFF000000) >> 24) + ((unsigned char)(((uint32_t)(color) & 0xFF000000) >> 24) - (unsigned char)(((uint32_t)(startcolor) & 0xFF000000) >> 24)) / 255.0 * value) << 24) | ((unsigned char)((unsigned char)(((uint32_t)(startcolor) & 0x00FF0000) >> 16) + ((unsigned char)(((uint32_t)(color) & 0x00FF0000) >> 16) - (unsigned char)(((uint32_t)(startcolor) & 0x00FF0000) >> 16)) / 255.0 * value) << 16) | ((unsigned char)((unsigned char)(((uint32_t)(startcolor) & 0x0000FF00) >> 8) + ((unsigned char)(((uint32_t)(color) & 0x0000FF00) >> 8) - (unsigned char)(((uint32_t)(startcolor) & 0x0000FF00) >> 8)) / 255.0 * value) << 8 ) | ((unsigned char)((unsigned char)(((uint32_t)(startcolor) & 0x000000FF) >> 0) + ((unsigned char)(((uint32_t)(color) & 0x000000FF) >> 0) - (unsigned char)(((uint32_t)(startcolor) & 0x000000FF) >> 0)) / 255.0 * value))),
Хочу оптимизировать по скорости.
Что эта фиговина делает: смешивает два цвета, используя START как начальный цвет, TARGET - цвет, который накладывается сверху, INTENSITY - степень прозрачности наложения TARGET цвета в рамках от 0 (нет наложения) до 255 (полная закраска).
По какому принципу работает:
FFFFFF FFFFFF
.... ---------- TARGET
.... ....
START ---------- ....
.... ....
.... ....
000000 000000
Берется разница между каждым каналом цветов, делится на 255, умножается на INTENSITY, плюсуется к START.