screen-cast/area-src: Clear framebuffer before painting stage

We'll be painting to a framebuffer that may not be completely covered by
the painted areas, meaning the not painted areas would end up undefined,
thus potentially contain garbage or old content.

Avoid this by clearing the framebuffer before painting the stage.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1442

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1459
This commit is contained in:
Jonas Ådahl 2020-09-30 17:40:10 +02:00 committed by Florian Müllner
parent 67cc60cbda
commit df228e8945
3 changed files with 11 additions and 2 deletions

View File

@ -34,6 +34,7 @@ typedef enum _ClutterPaintFlag
CLUTTER_PAINT_FLAG_NONE = 0, CLUTTER_PAINT_FLAG_NONE = 0,
CLUTTER_PAINT_FLAG_NO_CURSORS = 1 << 0, CLUTTER_PAINT_FLAG_NO_CURSORS = 1 << 0,
CLUTTER_PAINT_FLAG_FORCE_CURSORS = 1 << 1, CLUTTER_PAINT_FLAG_FORCE_CURSORS = 1 << 1,
CLUTTER_PAINT_FLAG_CLEAR = 1 << 2,
} ClutterPaintFlag; } ClutterPaintFlag;
#define CLUTTER_TYPE_PAINT_CONTEXT (clutter_paint_context_get_type ()) #define CLUTTER_TYPE_PAINT_CONTEXT (clutter_paint_context_get_type ())

View File

@ -3614,6 +3614,14 @@ clutter_stage_paint_to_framebuffer (ClutterStage *stage,
ClutterPaintContext *paint_context; ClutterPaintContext *paint_context;
cairo_region_t *redraw_clip; cairo_region_t *redraw_clip;
if (paint_flags & CLUTTER_PAINT_FLAG_CLEAR)
{
CoglColor clear_color;
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_framebuffer_clear (framebuffer, COGL_BUFFER_BIT_COLOR, &clear_color);
}
redraw_clip = cairo_region_create_rectangle (rect); redraw_clip = cairo_region_create_rectangle (rect);
paint_context = paint_context =
clutter_paint_context_new_for_framebuffer (framebuffer, clutter_paint_context_new_for_framebuffer (framebuffer,

View File

@ -414,7 +414,7 @@ meta_screen_cast_area_stream_src_record_to_buffer (MetaScreenCastStreamSrc *src
MetaRectangle *area; MetaRectangle *area;
float scale; float scale;
int stride; int stride;
ClutterPaintFlag paint_flags = CLUTTER_PAINT_FLAG_NONE; ClutterPaintFlag paint_flags = CLUTTER_PAINT_FLAG_CLEAR;
stage = get_stage (area_src); stage = get_stage (area_src);
area = meta_screen_cast_area_stream_get_area (area_stream); area = meta_screen_cast_area_stream_get_area (area_stream);
@ -456,7 +456,7 @@ meta_screen_cast_area_stream_src_record_to_framebuffer (MetaScreenCastStreamSrc
ClutterStage *stage; ClutterStage *stage;
MetaRectangle *area; MetaRectangle *area;
float scale; float scale;
ClutterPaintFlag paint_flags = CLUTTER_PAINT_FLAG_NONE; ClutterPaintFlag paint_flags = CLUTTER_PAINT_FLAG_CLEAR;
stage = CLUTTER_STAGE (meta_backend_get_stage (backend)); stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
area = meta_screen_cast_area_stream_get_area (area_stream); area = meta_screen_cast_area_stream_get_area (area_stream);