shaped-texture: Fix the logic when the blended region is empty
When the blended region was empty, meaning we didn't have to paint anything blended -- the case for an app update -- was drawing the entire window blended, because of a think-o in the complex and complicated logic. Fix this so that we don't draw anything for the blended region when empty.
This commit is contained in:
parent
e1acb69cf1
commit
c15b3b4a09
@ -430,53 +430,65 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now, go ahead and paint the blended parts. */
|
/* Now, go ahead and paint the blended parts. */
|
||||||
{
|
|
||||||
CoglPipeline *blended_pipeline;
|
|
||||||
|
|
||||||
if (priv->mask_texture == NULL)
|
/* We have three cases:
|
||||||
{
|
* 1) blended_region has rectangles - paint the rectangles.
|
||||||
blended_pipeline = get_unmasked_pipeline (ctx);
|
* 2) blended_region is empty - don't paint anything
|
||||||
}
|
* 3) blended_region is NULL - paint fully-blended.
|
||||||
else
|
*
|
||||||
{
|
* 1) and 3) are the times where we have to paint stuff. This tests
|
||||||
blended_pipeline = get_masked_pipeline (ctx);
|
* for 1) and 3).
|
||||||
cogl_pipeline_set_layer_texture (blended_pipeline, 1, priv->mask_texture);
|
*/
|
||||||
cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
|
if (blended_region == NULL || !cairo_region_is_empty (blended_region))
|
||||||
}
|
{
|
||||||
|
CoglPipeline *blended_pipeline;
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (blended_pipeline, 0, paint_tex);
|
if (priv->mask_texture == NULL)
|
||||||
cogl_pipeline_set_layer_filters (blended_pipeline, 0, filter, filter);
|
{
|
||||||
|
blended_pipeline = get_unmasked_pipeline (ctx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blended_pipeline = get_masked_pipeline (ctx);
|
||||||
|
cogl_pipeline_set_layer_texture (blended_pipeline, 1, priv->mask_texture);
|
||||||
|
cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
|
||||||
|
}
|
||||||
|
|
||||||
CoglColor color;
|
cogl_pipeline_set_layer_texture (blended_pipeline, 0, paint_tex);
|
||||||
cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
|
cogl_pipeline_set_layer_filters (blended_pipeline, 0, filter, filter);
|
||||||
cogl_pipeline_set_color (blended_pipeline, &color);
|
|
||||||
|
|
||||||
if (blended_region != NULL && !cairo_region_is_empty (blended_region))
|
CoglColor color;
|
||||||
{
|
cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
|
||||||
int i;
|
cogl_pipeline_set_color (blended_pipeline, &color);
|
||||||
int n_rects = cairo_region_num_rectangles (blended_region);
|
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
if (blended_region != NULL)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t rect;
|
/* 1) blended_region is NULL and not empty. Paint the rectangles. */
|
||||||
cairo_region_get_rectangle (blended_region, i, &rect);
|
int i;
|
||||||
|
int n_rects = cairo_region_num_rectangles (blended_region);
|
||||||
|
|
||||||
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
for (i = 0; i < n_rects; i++)
|
||||||
continue;
|
{
|
||||||
|
cairo_rectangle_int_t rect;
|
||||||
|
cairo_region_get_rectangle (blended_region, i, &rect);
|
||||||
|
|
||||||
paint_clipped_rectangle (fb, blended_pipeline, &rect, &alloc);
|
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
||||||
}
|
continue;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cogl_framebuffer_draw_rectangle (fb, blended_pipeline,
|
|
||||||
0, 0,
|
|
||||||
alloc.x2 - alloc.x1,
|
|
||||||
alloc.y2 - alloc.y1);
|
|
||||||
}
|
|
||||||
|
|
||||||
cogl_object_unref (blended_pipeline);
|
paint_clipped_rectangle (fb, blended_pipeline, &rect, &alloc);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* 3) blended_region is NULL. Do a full paint. */
|
||||||
|
cogl_framebuffer_draw_rectangle (fb, blended_pipeline,
|
||||||
|
0, 0,
|
||||||
|
alloc.x2 - alloc.x1,
|
||||||
|
alloc.y2 - alloc.y1);
|
||||||
|
}
|
||||||
|
|
||||||
|
cogl_object_unref (blended_pipeline);
|
||||||
|
}
|
||||||
|
|
||||||
if (blended_region != NULL)
|
if (blended_region != NULL)
|
||||||
cairo_region_destroy (blended_region);
|
cairo_region_destroy (blended_region);
|
||||||
|
Loading…
Reference in New Issue
Block a user