From 4be4d85f845da71c6228e9e8b10778b076269bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 23 Dec 2017 04:32:26 +0100 Subject: [PATCH] clutter/stage: Cleanup the capture_view code Reuse capture's rect parameter instead of passing a new one, and support the case where there are no returned areas. https://gitlab.gnome.org/GNOME/mutter/merge_requests/3 --- clutter/clutter/clutter-stage.c | 73 +++++++++++++++++++++++++++++---- clutter/clutter/clutter-stage.h | 7 ++++ 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 7ed83184a..41fa82ed9 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -4757,7 +4757,6 @@ static void capture_view (ClutterStage *stage, gboolean paint, ClutterStageView *view, - cairo_rectangle_int_t *rect, ClutterCapture *capture) { CoglFramebuffer *framebuffer; @@ -4768,10 +4767,12 @@ capture_view (ClutterStage *stage, int stride; CoglBitmap *bitmap; cairo_rectangle_int_t view_layout; + cairo_rectangle_int_t *rect; float view_scale; float texture_width; float texture_height; + rect = &capture->rect; framebuffer = clutter_stage_view_get_framebuffer (view); if (paint) @@ -4809,7 +4810,6 @@ capture_view (ClutterStage *stage, if (paint) cogl_pop_framebuffer (); - capture->rect = *rect; capture->image = image; cairo_surface_mark_dirty (capture->image); @@ -4829,34 +4829,91 @@ clutter_stage_capture (ClutterStage *stage, ClutterCapture *captures; int n_captures; + g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE); + captures = g_new0 (ClutterCapture, g_list_length (views)); n_captures = 0; for (l = views; l; l = l->next) { ClutterStageView *view = l->data; + ClutterCapture *capture; cairo_rectangle_int_t view_layout; cairo_region_t *region; - cairo_rectangle_int_t view_capture_rect; 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, &view_capture_rect); + + capture = &captures[n_captures]; + cairo_region_get_extents (region, &capture->rect); cairo_region_destroy (region); - if (view_capture_rect.width == 0 || view_capture_rect.height == 0) + if (capture->rect.width == 0 || capture->rect.height == 0) continue; - capture_view (stage, paint, view, &view_capture_rect, - &captures[n_captures]); + capture_view (stage, paint, view, capture); n_captures++; } + if (n_captures == 0) + g_clear_pointer (&captures, g_free); + *out_captures = captures; *out_n_captures = n_captures; + return n_captures > 0; +} + +gboolean +clutter_stage_get_capture_final_size (ClutterStage *stage, + cairo_rectangle_int_t *rect, + int *out_width, + int *out_height, + float *out_scale) +{ + float max_scale; + + g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE); + + if (rect) + { + ClutterRect capture_rect; + + _clutter_util_rect_from_rectangle (rect, &capture_rect); + if (!_clutter_stage_get_max_view_scale_factor_for_rect (stage, + &capture_rect, + &max_scale)) + return FALSE; + + if (out_width) + *out_width = (gint) roundf (rect->width * max_scale); + + if (out_height) + *out_height = (gint) roundf (rect->height * max_scale); + } + else + { + ClutterActorBox alloc; + float stage_width, stage_height; + + clutter_actor_get_allocation_box (CLUTTER_ACTOR (stage), &alloc); + clutter_actor_box_get_size (&alloc, &stage_width, &stage_height); + if (!_clutter_actor_get_real_resource_scale (CLUTTER_ACTOR (stage), + &max_scale)) + return FALSE; + + if (out_width) + *out_width = (gint) roundf (stage_width * max_scale); + + if (out_height) + *out_height = (gint) roundf (stage_height * max_scale); + } + + if (out_scale) + *out_scale = max_scale; + return TRUE; } @@ -4874,6 +4931,8 @@ capture_view_into (ClutterStage *stage, CoglBitmap *bitmap; cairo_rectangle_int_t view_layout; + g_return_if_fail (CLUTTER_IS_STAGE (stage)); + framebuffer = clutter_stage_view_get_framebuffer (view); if (paint) diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h index ab1ab92fa..5730af7bd 100644 --- a/clutter/clutter/clutter-stage.h +++ b/clutter/clutter/clutter-stage.h @@ -261,6 +261,13 @@ CLUTTER_EXPORT void clutter_stage_skip_sync_delay (ClutterStage *stage); #endif +CLUTTER_EXPORT +gboolean clutter_stage_get_capture_final_size (ClutterStage *stage, + cairo_rectangle_int_t *rect, + int *width, + int *height, + float *scale); + CLUTTER_EXPORT gboolean clutter_stage_capture (ClutterStage *stage, gboolean paint,