diff --git a/clutter/clutter/clutter-mutter.h b/clutter/clutter/clutter-mutter.h index 95011aadde9d56f48e8ebfbf733df559f3efe975..818a48bb91bd67d900cfdab3632c91faf46fbfea 100644 --- a/clutter/clutter/clutter-mutter.h +++ b/clutter/clutter/clutter-mutter.h @@ -51,13 +51,6 @@ void clutter_set_custom_backend_func (ClutterBackend *(* func) (void)); CLUTTER_EXPORT int64_t clutter_stage_get_frame_counter (ClutterStage *stage); -CLUTTER_EXPORT -void clutter_stage_capture_into (ClutterStage *stage, - cairo_rectangle_int_t *rect, - float scale, - uint8_t *data, - int stride); - CLUTTER_EXPORT void clutter_stage_capture_view_into (ClutterStage *stage, ClutterStageView *view, diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 658a3156a53a468763ab71f235b241db79399212..b784a4502331d4cbdd6ae24f642999e9707d4051 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -3370,44 +3370,6 @@ clutter_stage_capture_view_into (ClutterStage *stage, cogl_object_unref (bitmap); } -void -clutter_stage_capture_into (ClutterStage *stage, - cairo_rectangle_int_t *rect, - float scale, - uint8_t *data, - int stride) -{ - ClutterStagePrivate *priv = stage->priv; - GList *l; - int bpp = 4; - - for (l = _clutter_stage_window_get_views (priv->impl); l; l = l->next) - { - ClutterStageView *view = l->data; - cairo_rectangle_int_t view_layout; - cairo_region_t *region; - cairo_rectangle_int_t capture_rect; - int x_offset, y_offset; - - clutter_stage_view_get_layout (view, &view_layout); - region = cairo_region_create_rectangle (&view_layout); - cairo_region_intersect_rectangle (region, rect); - - cairo_region_get_extents (region, &capture_rect); - cairo_region_destroy (region); - - x_offset = roundf ((capture_rect.x - rect->x) * scale); - y_offset = roundf ((capture_rect.y - rect->y) * scale); - - clutter_stage_capture_view_into (stage, view, - &capture_rect, - (data + - (x_offset * bpp) + - (y_offset * stride)), - stride); - } -} - /** * clutter_stage_peek_stage_views: (skip) */ diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c index 3353b17d3da05b19b6ef446dafa430e84ba45302..5ed0fb8fcd8ebdab34b8c205e639e35110cc801d 100644 --- a/src/backends/meta-cursor-renderer.c +++ b/src/backends/meta-cursor-renderer.c @@ -470,18 +470,6 @@ meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer) return priv->overlay_cursor; } -gboolean -meta_cursor_renderer_is_overlay_visible (MetaCursorRenderer *renderer) -{ - MetaCursorRendererPrivate *priv = - meta_cursor_renderer_get_instance_private (renderer); - - if (!priv->stage_overlay) - return FALSE; - - return meta_overlay_is_visible (priv->stage_overlay); -} - ClutterInputDevice * meta_cursor_renderer_get_input_device (MetaCursorRenderer *renderer) { diff --git a/src/backends/meta-cursor-renderer.h b/src/backends/meta-cursor-renderer.h index f6de01bfbc9b2a4f011feb968d56e8f74a096bbd..89a73aef114181d53de63c4a9f594f228996f242 100644 --- a/src/backends/meta-cursor-renderer.h +++ b/src/backends/meta-cursor-renderer.h @@ -66,8 +66,6 @@ void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer); MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer); -gboolean meta_cursor_renderer_is_overlay_visible (MetaCursorRenderer *renderer); - graphene_rect_t meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer, MetaCursorSprite *cursor_sprite); diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c index b85c44fe121f0df5797a6e6c71bcc53ec576707c..82d3862c9a02aee640fc70d60adbc8a8204b46c1 100644 --- a/src/backends/meta-screen-cast-monitor-stream-src.c +++ b/src/backends/meta-screen-cast-monitor-stream-src.c @@ -48,6 +48,8 @@ struct _MetaScreenCastMonitorStreamSrc gulong position_invalidated_handler_id; gulong cursor_changed_handler_id; + + guint maybe_record_idle_id; }; static void @@ -116,17 +118,39 @@ meta_screen_cast_monitor_stream_src_get_specs (MetaScreenCastStreamSrc *src, return TRUE; } +static gboolean +maybe_record_frame_on_idle (gpointer user_data) +{ + MetaScreenCastMonitorStreamSrc *monitor_src = + META_SCREEN_CAST_MONITOR_STREAM_SRC (user_data); + MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src); + MetaScreenCastRecordFlag flags; + + monitor_src->maybe_record_idle_id = 0; + + flags = META_SCREEN_CAST_RECORD_FLAG_NONE; + meta_screen_cast_stream_src_maybe_record_frame (src, flags); + + return G_SOURCE_REMOVE; +} + static void stage_painted (MetaStage *stage, ClutterStageView *view, ClutterPaintContext *paint_context, gpointer user_data) { - MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (user_data); - MetaScreenCastRecordFlag flags; + MetaScreenCastMonitorStreamSrc *monitor_src = + META_SCREEN_CAST_MONITOR_STREAM_SRC (user_data); + MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src); - flags = META_SCREEN_CAST_RECORD_FLAG_NONE; - meta_screen_cast_stream_src_maybe_record_frame (src, flags); + if (monitor_src->maybe_record_idle_id) + return; + + monitor_src->maybe_record_idle_id = g_idle_add (maybe_record_frame_on_idle, + src); + g_source_set_name_by_id (monitor_src->maybe_record_idle_id, + "[mutter] maybe_record_frame_on_idle [monitor-src]"); } static void @@ -135,17 +159,20 @@ before_stage_painted (MetaStage *stage, ClutterPaintContext *paint_context, gpointer user_data) { - MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (user_data); - CoglScanout *scanout; + MetaScreenCastMonitorStreamSrc *monitor_src = + META_SCREEN_CAST_MONITOR_STREAM_SRC (user_data); + MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src); - scanout = clutter_stage_view_peek_scanout (view); - if (scanout) - { - MetaScreenCastRecordFlag flags; + if (monitor_src->maybe_record_idle_id) + return; - flags = META_SCREEN_CAST_RECORD_FLAG_NONE; - meta_screen_cast_stream_src_maybe_record_frame (src, flags); - } + if (!clutter_stage_view_peek_scanout (view)) + return; + + monitor_src->maybe_record_idle_id = g_idle_add (maybe_record_frame_on_idle, + src); + g_source_set_name_by_id (monitor_src->maybe_record_idle_id, + "[mutter] maybe_record_frame_on_idle [monitor-src]"); } static MetaBackend * @@ -340,13 +367,14 @@ reattach_watches (MetaScreenCastMonitorStreamSrc *monitor_src) meta_stage_remove_watch (META_STAGE (stage), l->data); g_clear_pointer (&monitor_src->watches, g_list_free); + add_view_watches (monitor_src, + META_STAGE_WATCH_BEFORE_PAINT, + before_stage_painted); + switch (meta_screen_cast_stream_get_cursor_mode (stream)) { case META_SCREEN_CAST_CURSOR_MODE_METADATA: case META_SCREEN_CAST_CURSOR_MODE_HIDDEN: - add_view_watches (monitor_src, - META_STAGE_WATCH_BEFORE_PAINT, - before_stage_painted); add_view_watches (monitor_src, META_STAGE_WATCH_AFTER_ACTOR_PAINT, stage_painted); @@ -439,6 +467,8 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src) g_clear_signal_handler (&monitor_src->cursor_changed_handler_id, cursor_tracker); + g_clear_handle_id (&monitor_src->maybe_record_idle_id, g_source_remove); + switch (meta_screen_cast_stream_get_cursor_mode (stream)) { case META_SCREEN_CAST_CURSOR_MODE_METADATA: @@ -450,70 +480,6 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src) } } -static void -maybe_paint_cursor_sprite (MetaScreenCastMonitorStreamSrc *monitor_src, - int width, - int height, - int stride, - uint8_t *data) -{ - MetaBackend *backend = get_backend (monitor_src); - MetaCursorRenderer *cursor_renderer = - meta_backend_get_cursor_renderer (backend); - MetaCursorSprite *cursor_sprite; - CoglTexture *sprite_texture; - int sprite_width, sprite_height, sprite_stride; - float sprite_scale; - uint8_t *sprite_data; - cairo_surface_t *sprite_surface; - graphene_rect_t sprite_rect; - cairo_surface_t *surface; - cairo_t *cr; - - if (!is_cursor_in_stream (monitor_src)) - return; - - cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer); - if (!cursor_sprite) - return; - - if (meta_cursor_renderer_is_overlay_visible (cursor_renderer)) - return; - - sprite_rect = meta_cursor_renderer_calculate_rect (cursor_renderer, - cursor_sprite); - sprite_texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); - sprite_width = cogl_texture_get_width (sprite_texture); - sprite_height = cogl_texture_get_height (sprite_texture); - sprite_stride = sprite_width * 4; - sprite_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite); - sprite_data = g_new0 (uint8_t, sprite_stride * sprite_height); - cogl_texture_get_data (sprite_texture, - CLUTTER_CAIRO_FORMAT_ARGB32, - sprite_stride, - sprite_data); - sprite_surface = cairo_image_surface_create_for_data (sprite_data, - CAIRO_FORMAT_ARGB32, - sprite_width, - sprite_height, - sprite_stride); - cairo_surface_set_device_scale (sprite_surface, sprite_scale, sprite_scale); - - surface = cairo_image_surface_create_for_data (data, - CAIRO_FORMAT_ARGB32, - width, height, stride); - - cr = cairo_create (surface); - cairo_set_source_surface (cr, sprite_surface, - sprite_rect.origin.x, - sprite_rect.origin.y); - cairo_paint (cr); - cairo_destroy (cr); - cairo_surface_destroy (sprite_surface); - cairo_surface_destroy (surface); - g_free (sprite_data); -} - static gboolean meta_screen_cast_monitor_stream_src_record_to_buffer (MetaScreenCastStreamSrc *src, int width, @@ -529,6 +495,7 @@ meta_screen_cast_monitor_stream_src_record_to_buffer (MetaScreenCastStreamSrc * MetaMonitor *monitor; MetaLogicalMonitor *logical_monitor; float scale; + ClutterPaintFlag paint_flags = CLUTTER_PAINT_FLAG_CLEAR; monitor = get_monitor (monitor_src); logical_monitor = meta_monitor_get_logical_monitor (monitor); @@ -539,18 +506,25 @@ meta_screen_cast_monitor_stream_src_record_to_buffer (MetaScreenCastStreamSrc * else scale = 1.0; - clutter_stage_capture_into (stage, &logical_monitor->rect, scale, data, stride); - switch (meta_screen_cast_stream_get_cursor_mode (stream)) { - case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: - maybe_paint_cursor_sprite (monitor_src, width, height, stride, data); - break; case META_SCREEN_CAST_CURSOR_MODE_METADATA: case META_SCREEN_CAST_CURSOR_MODE_HIDDEN: + paint_flags |= CLUTTER_PAINT_FLAG_NO_CURSORS; + break; + case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: + paint_flags |= CLUTTER_PAINT_FLAG_FORCE_CURSORS; break; } + if (!clutter_stage_paint_to_buffer (stage, &logical_monitor->rect, scale, + data, + stride, + CLUTTER_CAIRO_FORMAT_ARGB32, + paint_flags, + error)) + return FALSE; + return TRUE; } @@ -635,6 +609,8 @@ meta_screen_cast_monitor_stream_record_follow_up (MetaScreenCastStreamSrc *src) MetaRectangle logical_monitor_layout; GList *l; + g_clear_handle_id (&monitor_src->maybe_record_idle_id, g_source_remove); + monitor = get_monitor (monitor_src); logical_monitor = meta_monitor_get_logical_monitor (monitor); logical_monitor_layout = meta_logical_monitor_get_layout (logical_monitor);