From 15d7d5b31fc7c6e8efe58e4ba101cd85d42e3849 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 11 Dec 2013 15:41:08 +0100 Subject: [PATCH] pixelcache: check whether cached surface and cairo_t scales match --- gtk/gtkpixelcache.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/gtk/gtkpixelcache.c b/gtk/gtkpixelcache.c index 71c78330d8..4cc07171d7 100644 --- a/gtk/gtkpixelcache.c +++ b/gtk/gtkpixelcache.c @@ -396,6 +396,19 @@ blow_cache_cb (gpointer user_data) return G_SOURCE_REMOVE; } +static gboolean +context_is_unscaled (cairo_t *cr) +{ + cairo_matrix_t matrix; + gdouble x, y; + + x = y = 1; + cairo_get_matrix (cr, &matrix); + cairo_matrix_transform_distance (&matrix, &x, &y); + + return x == 1 && y == 1; +} + void _gtk_pixel_cache_draw (GtkPixelCache *cache, @@ -420,7 +433,7 @@ _gtk_pixel_cache_draw (GtkPixelCache *cache, _gtk_pixel_cache_set_position (cache, view_rect, canvas_rect); _gtk_pixel_cache_repaint (cache, draw, view_rect, canvas_rect, user_data); - if (cache->surface && + if (cache->surface && context_is_unscaled (cr) && /* Don't use backing surface if rendering elsewhere */ cairo_surface_get_type (cache->surface) == cairo_surface_get_type (cairo_get_target (cr))) {