summaryrefslogtreecommitdiff
path: root/gsk/gskcairorenderer.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-12-21 20:23:46 +0100
committerBenjamin Otte <otte@redhat.com>2016-12-23 08:11:01 +0100
commit373e08d6d4ea35dbc937a012ef864fd36bb6e42d (patch)
tree9bca39da5924d122a3bac7fa50a1c754ce5fecd5 /gsk/gskcairorenderer.c
parent98086014d85ea60862c3cb0598e7b6c8cf7fb072 (diff)
downloadgtk+-373e08d6d4ea35dbc937a012ef864fd36bb6e42d.tar.gz
gsk: Add gsk_renderer_render_texture()
... and implement it for the Cairo renderer. It's an API that instructs a renderer to render to a texture. So far this is mostly meant to be used for testing, but I could imagine it being useful for rendering DND icons.
Diffstat (limited to 'gsk/gskcairorenderer.c')
-rw-r--r--gsk/gskcairorenderer.c70
1 files changed, 52 insertions, 18 deletions
diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c
index d112e4fca0..af23d610f6 100644
--- a/gsk/gskcairorenderer.c
+++ b/gsk/gskcairorenderer.c
@@ -45,17 +45,62 @@ gsk_cairo_renderer_unrealize (GskRenderer *renderer)
}
static void
-gsk_cairo_renderer_render (GskRenderer *renderer,
- GskRenderNode *root)
+gsk_cairo_renderer_do_render (GskRenderer *renderer,
+ cairo_t *cr,
+ GskRenderNode *root)
{
- GskCairoRenderer *self = GSK_CAIRO_RENDERER (renderer);
- GdkDrawingContext *context = gsk_renderer_get_drawing_context (renderer);
- graphene_rect_t viewport;
#ifdef G_ENABLE_DEBUG
+ GskCairoRenderer *self = GSK_CAIRO_RENDERER (renderer);
GskProfiler *profiler;
gint64 cpu_time;
#endif
+#ifdef G_ENABLE_DEBUG
+ profiler = gsk_renderer_get_profiler (renderer);
+ gsk_profiler_timer_begin (profiler, self->profile_timers.cpu_time);
+#endif
+
+ gsk_render_node_draw (root, cr);
+
+#ifdef G_ENABLE_DEBUG
+ cpu_time = gsk_profiler_timer_end (profiler, self->profile_timers.cpu_time);
+ gsk_profiler_timer_set (profiler, self->profile_timers.cpu_time, cpu_time);
+
+ gsk_profiler_push_samples (profiler);
+#endif
+}
+
+static GskTexture *
+gsk_cairo_renderer_render_texture (GskRenderer *renderer,
+ GskRenderNode *root,
+ const graphene_rect_t *viewport)
+{
+ GskTexture *texture;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, ceil (viewport->size.width), ceil (viewport->size.height));
+ cr = cairo_create (surface);
+
+ cairo_translate (cr, - viewport->origin.x, - viewport->origin.y);
+
+ gsk_cairo_renderer_do_render (renderer, cr, root);
+
+ cairo_destroy (cr);
+
+ texture = gsk_texture_new_for_surface (surface);
+ cairo_surface_destroy (surface);
+
+ return texture;
+}
+
+static void
+gsk_cairo_renderer_render (GskRenderer *renderer,
+ GskRenderNode *root)
+{
+ GdkDrawingContext *context = gsk_renderer_get_drawing_context (renderer);
+ graphene_rect_t viewport;
+
cairo_t *cr;
cr = gdk_drawing_context_get_cairo_context (context);
@@ -78,19 +123,7 @@ gsk_cairo_renderer_render (GskRenderer *renderer,
cairo_restore (cr);
}
-#ifdef G_ENABLE_DEBUG
- profiler = gsk_renderer_get_profiler (renderer);
- gsk_profiler_timer_begin (profiler, self->profile_timers.cpu_time);
-#endif
-
- gsk_render_node_draw (root, cr);
-
-#ifdef G_ENABLE_DEBUG
- cpu_time = gsk_profiler_timer_end (profiler, self->profile_timers.cpu_time);
- gsk_profiler_timer_set (profiler, self->profile_timers.cpu_time, cpu_time);
-
- gsk_profiler_push_samples (profiler);
-#endif
+ gsk_cairo_renderer_do_render (renderer, cr, root);
}
static void
@@ -101,6 +134,7 @@ gsk_cairo_renderer_class_init (GskCairoRendererClass *klass)
renderer_class->realize = gsk_cairo_renderer_realize;
renderer_class->unrealize = gsk_cairo_renderer_unrealize;
renderer_class->render = gsk_cairo_renderer_render;
+ renderer_class->render_texture = gsk_cairo_renderer_render_texture;
}
static void