void
set_cairo_color(cairo_t *cairo, const float *c)
{
- cairo_set_source_rgba(cairo, c[0], c[1], c[2], c[3]);
+ /*
+ * We are dealing with pre-multiplied colors
+ * but cairo expects unmultiplied colors here
+ */
+ float alpha = c[3];
+
+ if (alpha == 0.0f) {
+ cairo_set_source_rgba(cairo, 0, 0, 0, 0);
+ return;
+ }
+
+ cairo_set_source_rgba(cairo, c[0] / alpha, c[1] / alpha,
+ c[2] / alpha, alpha);
}
struct surface_context
seat->overlay.tree = parent;
wlr_scene_node_set_enabled(&parent->node, false);
if (!wlr_renderer_is_pixman(server->renderer)) {
- /* Hardware assisted rendering: Half transparent overlay */
+ /* Hardware assisted rendering: Half transparent overlay, pre-multiplied */
float color[4] = { 0.25, 0.25, 0.35, 0.5 };
seat->overlay.rect = wlr_scene_rect_create(parent, 0, 0, color);
} else {
(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) {
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;
}