Use pre-multiplied colors by default

wlr_scene_rects expect their color to be pre-multiplied
while cairo_set_source_rgba() expects them to not be
pre-multiplied. With this patch we now use premultiplied
colors internally by default and then reverse it when
setting cairo colors.

This ensures the titlebar uses a consistent color in case
it was defined with some transparency by the user.

Fixes: #1684
This commit is contained in:
Consolatis 2024-04-06 17:46:30 +02:00
parent 33859138cf
commit c35ba02ffa
3 changed files with 20 additions and 4 deletions

View file

@ -135,8 +135,8 @@ create_hover_fallback(struct theme *theme, const char *icon_name,
(width - icon_width) / 2, (height - icon_height) / 2);
cairo_paint(cairo);
/* Overlay (non-multiplied alpha) */
float overlay_color[4] = { 0.5f, 0.5f, 0.5f, 0.3f};
/* Overlay (pre-multiplied alpha) */
float overlay_color[4] = { 0.15f, 0.15f, 0.15f, 0.3f};
enum corner corner = corner_from_icon_name(icon_name);
if (corner == LAB_CORNER_UNKNOWN) {
@ -406,6 +406,10 @@ parse_hexstr(const char *hex, float *rgba)
rgba[2] = (hex_to_dec(hex[5]) * 16 + hex_to_dec(hex[6])) / 255.0;
if (strlen(hex) > 7) {
rgba[3] = atoi(hex + 7) / 100.0;
/* Pre-multiply everything as expected by wlr_scene */
rgba[0] *= rgba[3];
rgba[1] *= rgba[3];
rgba[2] *= rgba[3];
} else {
rgba[3] = 1.0;
}