blur-effect: Don't use stage view when drawing off-stage
When we're painting off-stage, for example because we're screencasting or taking a screenshot, there won't be a stage-view associated with the paint context. The BlurEffect previously didn't handle that case and would crash. Fix that and handle that case by assuming the scale is 1 and not offsetting the rectangle we blit from the draw framebuffer. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1673>
This commit is contained in:
parent
c592a06911
commit
09602ae2ae
@ -327,7 +327,6 @@ update_actor_box (ShellBlurEffect *self,
|
|||||||
float box_scale_factor = 1.0f;
|
float box_scale_factor = 1.0f;
|
||||||
float origin_x, origin_y;
|
float origin_x, origin_y;
|
||||||
float width, height;
|
float width, height;
|
||||||
cairo_rectangle_int_t stage_view_layout;
|
|
||||||
|
|
||||||
switch (self->mode)
|
switch (self->mode)
|
||||||
{
|
{
|
||||||
@ -337,14 +336,26 @@ update_actor_box (ShellBlurEffect *self,
|
|||||||
|
|
||||||
case SHELL_BLUR_MODE_BACKGROUND:
|
case SHELL_BLUR_MODE_BACKGROUND:
|
||||||
stage_view = clutter_paint_context_get_stage_view (paint_context);
|
stage_view = clutter_paint_context_get_stage_view (paint_context);
|
||||||
box_scale_factor = clutter_stage_view_get_scale (stage_view);
|
|
||||||
clutter_stage_view_get_layout (stage_view, &stage_view_layout);
|
|
||||||
|
|
||||||
clutter_actor_get_transformed_position (self->actor, &origin_x, &origin_y);
|
clutter_actor_get_transformed_position (self->actor, &origin_x, &origin_y);
|
||||||
clutter_actor_get_transformed_size (self->actor, &width, &height);
|
clutter_actor_get_transformed_size (self->actor, &width, &height);
|
||||||
|
|
||||||
|
if (stage_view)
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t stage_view_layout;
|
||||||
|
|
||||||
|
box_scale_factor = clutter_stage_view_get_scale (stage_view);
|
||||||
|
clutter_stage_view_get_layout (stage_view, &stage_view_layout);
|
||||||
|
|
||||||
origin_x -= stage_view_layout.x;
|
origin_x -= stage_view_layout.x;
|
||||||
origin_y -= stage_view_layout.y;
|
origin_y -= stage_view_layout.y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If we're drawing off stage, just assume scale = 1, this won't work
|
||||||
|
* with stage-view scaling though.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
clutter_actor_box_set_origin (source_actor_box, origin_x, origin_y);
|
clutter_actor_box_set_origin (source_actor_box, origin_x, origin_y);
|
||||||
clutter_actor_box_set_size (source_actor_box, width, height);
|
clutter_actor_box_set_size (source_actor_box, width, height);
|
||||||
|
Loading…
Reference in New Issue
Block a user