1From 67197e562dbdfdbd518d1e8ffb4746af41c3f731 Mon Sep 17 00:00:00 2001 2From: Carlos Garnacho <carlosg@gnome.org> 3Date: Fri, 17 May 2013 15:58:15 +0200 4Subject: [PATCH 64/68] gdk: Lookup double scaled variants on pixbufs 5 6if the pixbuf contains its @2x variant as gobject data and 7the display has a doubled scale factor, use such pixbuf 8for rendering 9--- 10 gdk/gdkcairo.c | 36 ++++++++++++++++++++++++++++++++++-- 11 gdk/gdkdraw.c | 18 ++++++++++++++++++ 12 2 files changed, 52 insertions(+), 2 deletions(-) 13 14diff --git a/gdk/gdkcairo.c b/gdk/gdkcairo.c 15index c423871..9aab5e1 100644 16--- a/gdk/gdkcairo.c 17+++ b/gdk/gdkcairo.c 18@@ -23,6 +23,8 @@ 19 #include "gdkregion-generic.h" 20 #include "gdkalias.h" 21 22+static const cairo_user_data_key_t gdk_cairo_drawable_pointer; 23+ 24 static void 25 gdk_ensure_surface_flush (gpointer surface) 26 { 27@@ -58,6 +60,7 @@ gdk_cairo_create (GdkDrawable *drawable) 28 29 surface = _gdk_drawable_ref_cairo_surface (drawable); 30 cr = cairo_create (surface); 31+ cairo_set_user_data (cr, &gdk_cairo_drawable_pointer, drawable, NULL); 32 33 if (GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_clip) 34 GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_clip (drawable, cr); 35@@ -202,7 +205,32 @@ gdk_cairo_set_source_pixbuf (cairo_t *cr, 36 cairo_format_t format; 37 cairo_surface_t *surface; 38 static const cairo_user_data_key_t key; 39- int j; 40+ GdkWindow *window; 41+ cairo_pattern_t *pattern; 42+ cairo_matrix_t matrix; 43+ int j, scale = 1; 44+ 45+ window = cairo_get_user_data (cr, &gdk_cairo_drawable_pointer); 46+ 47+ if (window && 48+ (int) gdk_window_get_scale_factor (window) == 2) 49+ { 50+ GdkPixbuf *scaled_pixbuf; 51+ 52+ scaled_pixbuf = g_object_get_data (G_OBJECT (pixbuf), 53+ "gdk-pixbuf-2x-variant"); 54+ if (scaled_pixbuf) 55+ { 56+ scale = 2; 57+ pixbuf = scaled_pixbuf; 58+ } 59+ } 60+ 61+ width = gdk_pixbuf_get_width (pixbuf); 62+ height = gdk_pixbuf_get_height (pixbuf); 63+ gdk_pixels = gdk_pixbuf_get_pixels (pixbuf); 64+ gdk_rowstride = gdk_pixbuf_get_rowstride (pixbuf); 65+ n_channels = gdk_pixbuf_get_n_channels (pixbuf); 66 67 if (n_channels == 3) 68 format = CAIRO_FORMAT_RGB24; 69@@ -274,7 +302,11 @@ gdk_cairo_set_source_pixbuf (cairo_t *cr, 70 cairo_pixels += cairo_stride; 71 } 72 73- cairo_set_source_surface (cr, surface, pixbuf_x, pixbuf_y); 74+ cairo_set_source_surface (cr, surface, 0, 0); 75+ pattern = cairo_get_source (cr); 76+ cairo_matrix_init_scale (&matrix, scale, scale); 77+ cairo_matrix_translate (&matrix, -pixbuf_x, -pixbuf_y); 78+ cairo_pattern_set_matrix (pattern, &matrix); 79 cairo_surface_destroy (surface); 80 } 81 82diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c 83index 932de97..6ebd8c7 100644 84--- a/gdk/gdkdraw.c 85+++ b/gdk/gdkdraw.c 86@@ -819,6 +819,8 @@ gdk_draw_pixbuf (GdkDrawable *drawable, 87 gint x_dither, 88 gint y_dither) 89 { 90+ GdkPixbuf *scaled_pixbuf; 91+ 92 g_return_if_fail (GDK_IS_DRAWABLE (drawable)); 93 g_return_if_fail (gc == NULL || GDK_IS_GC (gc)); 94 g_return_if_fail (GDK_IS_PIXBUF (pixbuf)); 95@@ -826,6 +828,22 @@ gdk_draw_pixbuf (GdkDrawable *drawable, 96 if (width == 0 || height == 0) 97 return; 98 99+ scaled_pixbuf = g_object_get_data (G_OBJECT (pixbuf), 100+ "gdk-pixbuf-2x-variant"); 101+ 102+ if (scaled_pixbuf && GDK_IS_WINDOW (drawable) && 103+ (int) gdk_window_get_scale_factor (GDK_WINDOW (drawable)) == 2) 104+ { 105+ cairo_t *cr; 106+ 107+ cr = gdk_cairo_create (GDK_WINDOW (drawable)); 108+ gdk_cairo_set_source_pixbuf (cr, pixbuf, dest_x, dest_y); 109+ cairo_paint (cr); 110+ 111+ cairo_destroy (cr); 112+ return; 113+ } 114+ 115 if (width == -1) 116 width = gdk_pixbuf_get_width (pixbuf); 117 if (height == -1) 118-- 1191.7.10.2 (Apple Git-33) 120