LINUX.ORG.RU

Pixman. То ли лыжи не едут, то ли что

 


0

2

Использую библиотеку 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

Ответ на: комментарий от eve

И ведь ни документации, ничего нет, где это было бы упомянуто.

Что ни проект связанный с иксами, то говённая или отсутствующая документация, пора бы уж привыкнуть к этому. Яркий пример – xcb.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Нашёл ещё такую переписку: https://pixman.freedesktop.narkive.com/XPE4yvMY/op-when-compositing.

Thanks so much. It works perfectly now. May I suggest the following modification in pixman.h so that it is clear for all users ?

В последнем сообщении страдалец даже предлагает добавить комментарий в pixman.h, но его предложение осталось без реакции.

eve
() автор топика
Ответ на: комментарий от EXL

Яркий пример – xcb

вы заблуждаетесь, XCB сгенерированное API, все что нужно есть в базовой документации xproto по модулям

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)