[gtk+] gsk: Add internal Renderer.create_cairo_surface()
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gsk: Add internal Renderer.create_cairo_surface()
- Date: Mon, 31 Oct 2016 16:31:41 +0000 (UTC)
commit 50a5deb8e382a4c116aa383e9c932d42a19efbfb
Author: Emmanuele Bassi <ebassi gnome org>
Date: Mon Oct 31 16:26:50 2016 +0000
gsk: Add internal Renderer.create_cairo_surface()
We need an overridable entry point for GskRenderer to create Cairo
surfaces.
Implementations of GskRenderer can override create_cairo_surface() to
create efficient surfaces, possibly with zero copies involved, depending
on the GDK backend.
gsk/gskrenderer.c | 31 +++++++++++++++++++++++++++++++
gsk/gskrendererprivate.h | 17 +++++++++++++----
2 files changed, 44 insertions(+), 4 deletions(-)
---
diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c
index 2d7cdec..21236cf 100644
--- a/gsk/gskrenderer.c
+++ b/gsk/gskrenderer.c
@@ -115,6 +115,24 @@ gsk_renderer_real_render (GskRenderer *self,
GSK_RENDERER_WARN_NOT_IMPLEMENTED_METHOD (self, render);
}
+static cairo_surface_t *
+gsk_renderer_real_create_cairo_surface (GskRenderer *self,
+ cairo_format_t format,
+ int width,
+ int height)
+{
+ GskRendererPrivate *priv = gsk_renderer_get_instance_private (self);
+ int scale_factor = priv->scale_factor > 0 ? priv->scale_factor : 1;
+ int real_width = width * scale_factor;
+ int real_height = height * scale_factor;
+
+ cairo_surface_t *res = cairo_image_surface_create (format, real_width, real_height);
+
+ cairo_surface_set_device_scale (res, scale_factor, scale_factor);
+
+ return res;
+}
+
static void
gsk_renderer_dispose (GObject *gobject)
{
@@ -220,6 +238,7 @@ gsk_renderer_class_init (GskRendererClass *klass)
klass->realize = gsk_renderer_real_realize;
klass->unrealize = gsk_renderer_real_unrealize;
klass->render = gsk_renderer_real_render;
+ klass->create_cairo_surface = gsk_renderer_real_create_cairo_surface;
gobject_class->constructed = gsk_renderer_constructed;
gobject_class->set_property = gsk_renderer_set_property;
@@ -733,6 +752,18 @@ gsk_renderer_get_for_display (GdkDisplay *display)
return g_object_new (renderer_type, "display", display, NULL);
}
+cairo_surface_t *
+gsk_renderer_create_cairo_surface (GskRenderer *renderer,
+ cairo_format_t format,
+ int width,
+ int height)
+{
+ g_return_val_if_fail (GSK_IS_RENDERER (renderer), NULL);
+ g_return_val_if_fail (width > 0 && height > 0, NULL);
+
+ return GSK_RENDERER_GET_CLASS (renderer)->create_cairo_surface (renderer, format, width, height);
+}
+
static void
gsk_renderer_set_cairo_context (GskRenderer *renderer,
cairo_t *cr)
diff --git a/gsk/gskrendererprivate.h b/gsk/gskrendererprivate.h
index d702ae5..57f7e86 100644
--- a/gsk/gskrendererprivate.h
+++ b/gsk/gskrendererprivate.h
@@ -42,15 +42,24 @@ struct _GskRendererClass
void (* render) (GskRenderer *renderer,
GskRenderNode *root);
+
+ cairo_surface_t * (* create_cairo_surface) (GskRenderer *renderer,
+ cairo_format_t,
+ int width,
+ int height);
};
gboolean gsk_renderer_is_realized (GskRenderer *renderer);
-GskRenderNode * gsk_renderer_get_root_node (GskRenderer *renderer);
-GdkDrawingContext * gsk_renderer_get_drawing_context (GskRenderer *renderer);
-cairo_t * gsk_renderer_get_cairo_context (GskRenderer *renderer);
+GskRenderNode * gsk_renderer_get_root_node (GskRenderer *renderer);
+GdkDrawingContext * gsk_renderer_get_drawing_context (GskRenderer *renderer);
+cairo_t * gsk_renderer_get_cairo_context (GskRenderer *renderer);
+cairo_surface_t * gsk_renderer_create_cairo_surface (GskRenderer *renderer,
+ cairo_format_t format,
+ int width,
+ int height);
-GskProfiler * gsk_renderer_get_profiler (GskRenderer *renderer);
+GskProfiler * gsk_renderer_get_profiler (GskRenderer *renderer);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]