Merge branch 'wip/otte/for-main' into 'main'

gl: gradients should transition in unpremultiplied space

See merge request GNOME/gtk!6406
This commit is contained in:
Benjamin Otte
2023-09-18 06:20:32 +00:00
7 changed files with 29 additions and 24 deletions

View File

@@ -75,10 +75,10 @@ void main() {
if (offset < next_offset) {
float f = (offset - curr_offset) / (next_offset - curr_offset);
vec4 curr_color = gsk_premultiply(get_color(i));
vec4 next_color = gsk_premultiply(get_color(i + 1));
vec4 curr_color = get_color(i);
vec4 next_color = get_color(i + 1);
vec4 color = mix(curr_color, next_color, f);
gskSetScaledOutputColor(color, u_alpha);
gskSetScaledOutputColor(gsk_premultiply(color), u_alpha);
return;
}
}

View File

@@ -97,10 +97,10 @@ void main() {
if (offset < next_offset) {
float f = (offset - curr_offset) / (next_offset - curr_offset);
vec4 curr_color = gsk_premultiply(get_color(i));
vec4 next_color = gsk_premultiply(get_color(i + 1));
vec4 curr_color = get_color(i);
vec4 next_color = get_color(i + 1);
vec4 color = mix(curr_color, next_color, f);
gskSetScaledOutputColor(color, u_alpha);
gskSetScaledOutputColor(gsk_premultiply (color), u_alpha);
return;
}
}

View File

@@ -77,10 +77,10 @@ void main() {
if (offset < next_offset) {
float f = (offset - curr_offset) / (next_offset - curr_offset);
vec4 curr_color = gsk_premultiply(get_color(i));
vec4 next_color = gsk_premultiply(get_color(i + 1));
vec4 curr_color = get_color(i);
vec4 next_color = get_color(i + 1);
vec4 color = mix(curr_color, next_color, f);
gskSetScaledOutputColor(color, u_alpha);
gskSetScaledOutputColor(gsk_premultiply(color), u_alpha);
return;
}
}

View File

@@ -4852,18 +4852,8 @@ gsk_shadow_node_draw (GskRenderNode *node,
cairo_t *cr)
{
GskShadowNode *self = (GskShadowNode *) node;
cairo_pattern_t *pattern;
gsize i;
cairo_save (cr);
/* clip so the push_group() creates a small surface */
gsk_cairo_rectangle (cr, &self->child->bounds);
cairo_clip (cr);
cairo_push_group (cr);
gsk_render_node_draw (self->child, cr);
pattern = cairo_pop_group (cr);
cairo_restore (cr);
cairo_save (cr);
/* clip so the blur area stays small */
gsk_cairo_rectangle (cr, &node->bounds);
@@ -4872,27 +4862,31 @@ gsk_shadow_node_draw (GskRenderNode *node,
for (i = 0; i < self->n_shadows; i++)
{
GskShadow *shadow = &self->shadows[i];
cairo_pattern_t *pattern;
/* We don't need to draw invisible shadows */
if (gdk_rgba_is_clear (&shadow->color))
continue;
cairo_save (cr);
gdk_cairo_set_source_rgba (cr, &shadow->color);
cr = gsk_cairo_blur_start_drawing (cr, shadow->radius, GSK_BLUR_X | GSK_BLUR_Y);
cairo_save (cr);
cairo_translate (cr, shadow->dx, shadow->dy);
cairo_push_group (cr);
gsk_render_node_draw (self->child, cr);
pattern = cairo_pop_group (cr);
gdk_cairo_set_source_rgba (cr, &shadow->color);
cairo_mask (cr, pattern);
cairo_restore (cr);
cr = gsk_cairo_blur_finish_drawing (cr, shadow->radius, &shadow->color, GSK_BLUR_X | GSK_BLUR_Y);
cairo_restore (cr);
}
cairo_set_source (cr, pattern);
cairo_paint (cr);
cairo_restore (cr);
gsk_render_node_draw (self->child, cr);
cairo_pattern_destroy (pattern);
cairo_restore (cr);
}
static void

View File

@@ -0,0 +1,10 @@
clip {
clip: 0 0 50 50;
child: shadow {
shadows: rgb(0,0,0) -20 -20;
child: color {
bounds: 40 40 50 50;
color: rgb(255,0,204);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

View File

@@ -92,6 +92,7 @@ compare_render_tests = [
'scaled-cairo',
'scaled-texture',
'shadow-behind',
'shadow-clip-contents',
'shadow-in-opacity',
'shadow-opacity',
'shrink-rounded-border',