Pre-multiply alpha for non-textures

This commit is contained in:
Brian Ashworth 2018-05-20 09:33:48 -04:00
parent 1afbfc94f4
commit 750a497a8b

View file

@ -310,6 +310,13 @@ damage_finish:
pixman_region32_fini(&damage);
}
static void premultiply_alpha(float color[4], float opacity) {
color[3] *= opacity;
color[0] *= color[3];
color[1] *= color[3];
color[2] *= color[3];
}
/**
* Render decorations for a view with "border normal".
*
@ -328,7 +335,7 @@ static void render_container_simple_border_normal(struct sway_output *output,
if (view->border_left) {
// Child border - left edge
memcpy(&color, colors->child_border, sizeof(float) * 4);
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x;
box.y = con->y + 1;
box.width = view->border_thickness;
@ -346,7 +353,7 @@ static void render_container_simple_border_normal(struct sway_output *output,
} else {
memcpy(&color, colors->child_border, sizeof(float) * 4);
}
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x + con->width - view->border_thickness;
box.y = con->y + 1;
box.width = view->border_thickness;
@ -364,7 +371,7 @@ static void render_container_simple_border_normal(struct sway_output *output,
} else {
memcpy(&color, colors->child_border, sizeof(float) * 4);
}
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x;
box.y = con->y + con->height - view->border_thickness;
box.width = con->width;
@ -375,7 +382,7 @@ static void render_container_simple_border_normal(struct sway_output *output,
// Single pixel bar above title
memcpy(&color, colors->border, sizeof(float) * 4);
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x;
box.y = con->y;
box.width = con->width;
@ -390,7 +397,7 @@ static void render_container_simple_border_normal(struct sway_output *output,
// Single pixel bar below title
memcpy(&color, colors->border, sizeof(float) * 4);
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = inner_x;
box.y = view->y - 1;
box.width = inner_width;
@ -441,7 +448,7 @@ static void render_container_simple_border_normal(struct sway_output *output,
// Title background - above the text
memcpy(&color, colors->background, sizeof(float) * 4);
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = inner_x;
box.y = con->y + 1;
box.width = inner_width;
@ -481,7 +488,7 @@ static void render_container_simple_border_pixel(struct sway_output *output,
if (view->border_left) {
// Child border - left edge
memcpy(&color, colors->child_border, sizeof(float) * 4);
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x;
box.y = con->y + view->border_thickness * view->border_top;
box.width = view->border_thickness;
@ -499,7 +506,7 @@ static void render_container_simple_border_pixel(struct sway_output *output,
} else {
memcpy(&color, colors->child_border, sizeof(float) * 4);
}
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x + con->width - view->border_thickness;
box.y = con->y + view->border_thickness * view->border_top;
box.width = view->border_thickness;
@ -512,7 +519,7 @@ static void render_container_simple_border_pixel(struct sway_output *output,
if (view->border_top) {
// Child border - top edge
memcpy(&color, colors->child_border, sizeof(float) * 4);
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x;
box.y = con->y;
box.width = con->width;
@ -529,7 +536,7 @@ static void render_container_simple_border_pixel(struct sway_output *output,
} else {
memcpy(&color, colors->child_border, sizeof(float) * 4);
}
color[3] *= con->alpha;
premultiply_alpha(color, con->alpha);
box.x = con->x;
box.y = con->y + con->height - view->border_thickness;
box.width = con->width;