summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (TreviƱo) <mail@3v1n0.net>2017-12-23 04:32:26 +0100
committerMarco Trevisan <mail@3v1n0.net>2019-03-01 17:46:49 +0000
commit4be4d85f845da71c6228e9e8b10778b076269bb9 (patch)
treebc563f2165f88cfbcf3de524dd6703e14ddb5315
parentc69547147547471e50df28aee20c5320570f6099 (diff)
downloadmutter-4be4d85f845da71c6228e9e8b10778b076269bb9.tar.gz
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
-rw-r--r--clutter/clutter/clutter-stage.c73
-rw-r--r--clutter/clutter/clutter-stage.h7
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
@@ -262,6 +262,13 @@ void clutter_stage_skip_sync_delay (ClutterStage
#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,
cairo_rectangle_int_t *rect,