Использую библиотеку pixman. Обнаружилась какая-то странность с операцией OVER, как-то не так она смешивает цвета.
Допустим, есть изображение, закрашенное в красный цвет полностью:
pixman_image_t *img = pixman_image_create_bits(PIXMAN_a8r8g8b8, 100, 100, NULL, 0);
pixman_color_t red = { 0xffff, 0x0000, 0x0000, 0xffff };
pixman_image_fill_rectangles(PIXMAN_OP_SRC, img, &red, 1, &(pixman_rectangle16_t) { .x = 0, .y = 0, .width = 100, .height = 100 });
Дальше сверху рисую квадрат, у которого альфа = 0, а компонент синего = 255:
pixman_color_t color = { 0x0000, 0x0000, 0xffff, 0x0000 };
pixman_image_fill_rectangles(PIXMAN_OP_OVER, img, &color, 1, &(pixman_rectangle16_t) { .x = 50, .y = 50, .width = 10, .height = 10 });
Я ожидаю, что изображение не изменится ввиду полной прозрачности, но в результате появляется квадрат 10x10 с фиолетовым оттенком. Почему так?
Нужно такое смешивание:
dst = src_alpha * src + (1 - src_alpha) * dst