diff options
author | Timm Bäder <mail@baedert.org> | 2019-05-21 08:38:11 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2019-05-21 08:38:11 +0200 |
commit | fcfc2ca51835a83f40d26038954a09b8f59bb5ce (patch) | |
tree | 6359abe80da7336f90f16169734ba3f51e3290b1 /gsk | |
parent | 3f1afd6040318b9099c2da2694c59cb53ae4a9f0 (diff) | |
download | gtk+-fcfc2ca51835a83f40d26038954a09b8f59bb5ce.tar.gz |
gl renderer: Render recording surface untransformed
Cairo can't handle the y flip apparently.
Fixes #1906
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/gl/gskglrenderer.c | 28 |
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); |