summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2019-05-21 08:38:11 +0200
committerTimm Bäder <mail@baedert.org>2019-05-21 08:38:11 +0200
commitfcfc2ca51835a83f40d26038954a09b8f59bb5ce (patch)
tree6359abe80da7336f90f16169734ba3f51e3290b1
parent3f1afd6040318b9099c2da2694c59cb53ae4a9f0 (diff)
downloadgtk+-fcfc2ca51835a83f40d26038954a09b8f59bb5ce.tar.gz
gl renderer: Render recording surface untransformed
Cairo can't handle the y flip apparently. Fixes #1906
-rw-r--r--gsk/gl/gskglrenderer.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 99e1cacfbe..fbc2c0a4e2 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -440,6 +440,7 @@ render_fallback_node (GskGLRenderer *self,
const int surface_width = ceilf (node->bounds.size.width) * scale;
const int surface_height = ceilf (node->bounds.size.height) * scale;
cairo_surface_t *surface;
+ cairo_surface_t *rendered_surface;
cairo_t *cr;
int cached_id;
int texture_id;
@@ -468,6 +469,25 @@ render_fallback_node (GskGLRenderer *self,
return;
}
+
+ /* We first draw the recording surface on an image surface,
+ * just because the scaleY(-1) later otherwise screws up the
+ * rendering... */
+ {
+ rendered_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+ surface_width,
+ surface_height);
+
+ cairo_surface_set_device_scale (rendered_surface, scale, scale);
+ cr = cairo_create (rendered_surface);
+
+ cairo_save (cr);
+ cairo_translate (cr, -node->bounds.origin.x, -node->bounds.origin.y);
+ gsk_render_node_draw (node, cr);
+ cairo_restore (cr);
+ cairo_destroy (cr);
+ }
+
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
surface_width,
surface_height);
@@ -477,8 +497,10 @@ render_fallback_node (GskGLRenderer *self,
/* We draw upside down here, so it matches what GL does. */
cairo_save (cr);
cairo_scale (cr, 1, -1);
- cairo_translate (cr, -node->bounds.origin.x, ceilf (-node->bounds.origin.y - node->bounds.size.height));
- gsk_render_node_draw (node, cr);
+ cairo_translate (cr, 0, -surface_height);
+ cairo_set_source_surface (cr, rendered_surface, 0, 0);
+ cairo_rectangle (cr, 0, 0, surface_width, surface_height);
+ cairo_fill (cr);
cairo_restore (cr);
#if HIGHLIGHT_FALLBACK
@@ -504,8 +526,8 @@ render_fallback_node (GskGLRenderer *self,
gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id,
"Fallback %s %d", node->node_class->type_name, texture_id);
-
cairo_surface_destroy (surface);
+ cairo_surface_destroy (rendered_surface);
gsk_gl_driver_set_texture_for_pointer (self->gl_driver, node, texture_id);