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