1 From 52cba71be7d226b628731ea92c2064bf41f08b54 Mon Sep 17 00:00:00 2001
2 From: Carlos Garnacho <carlosg@gnome.org>
3 Date: Tue, 12 Feb 2013 14:04:09 +0100
4 Subject: [PATCH 62/68] cellrendererpixbuf: Use scaled icons on windows with a
8 gtk/gtkcellrendererpixbuf.c | 115 ++++++++++++++++++++++++++++++++++++++-----
9 1 file changed, 102 insertions(+), 13 deletions(-)
11 diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c
12 index f689784..7c767b6 100644
13 --- a/gtk/gtkcellrendererpixbuf.c
14 +++ b/gtk/gtkcellrendererpixbuf.c
15 @@ -63,7 +63,8 @@ enum {
25 @@ -78,6 +79,8 @@ struct _GtkCellRendererPixbufPrivate
26 gboolean follow_state;
29 + GtkIconSet *icon_set;
30 + gdouble render_scale;
33 G_DEFINE_TYPE (GtkCellRendererPixbuf, gtk_cell_renderer_pixbuf, GTK_TYPE_CELL_RENDERER)
34 @@ -173,6 +176,14 @@ gtk_cell_renderer_pixbuf_class_init (GtkCellRendererPixbufClass *class)
36 GTK_PARAM_READWRITE));
38 + g_object_class_install_property (object_class,
40 + g_param_spec_boxed ("icon-set",
42 + P_("Icon set to render the image from"),
44 + GTK_PARAM_READWRITE));
47 * GtkCellRendererPixbuf:follow-state:
49 @@ -277,6 +288,9 @@ gtk_cell_renderer_pixbuf_get_property (GObject *object,
51 g_value_set_object (value, priv->gicon);
54 + g_value_set_boxed (value, priv->icon_set);
57 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
59 @@ -300,6 +314,7 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object,
60 if (cellpixbuf->pixbuf)
61 g_object_unref (cellpixbuf->pixbuf);
62 cellpixbuf->pixbuf = (GdkPixbuf*) g_value_dup_object (value);
63 + priv->render_scale = 1;
64 if (cellpixbuf->pixbuf)
67 @@ -422,6 +437,7 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object,
68 g_object_unref (priv->gicon);
70 priv->gicon = (GIcon *) g_value_dup_object (value);
71 + priv->render_scale = 1;
74 if (cellpixbuf->pixbuf)
75 @@ -444,6 +460,49 @@ gtk_cell_renderer_pixbuf_set_property (GObject *object,
82 + if (cellpixbuf->pixbuf)
84 + g_object_unref (cellpixbuf->pixbuf);
85 + cellpixbuf->pixbuf = NULL;
86 + g_object_notify (object, "pixbuf");
89 + gtk_icon_set_unref (priv->icon_set);
92 + priv->icon_set = g_value_dup_boxed (value);
96 + if (cellpixbuf->pixbuf)
98 + g_object_unref (cellpixbuf->pixbuf);
99 + cellpixbuf->pixbuf = NULL;
100 + g_object_notify (object, "pixbuf");
102 + if (priv->stock_id)
104 + g_free (priv->stock_id);
105 + priv->stock_id = NULL;
106 + g_object_notify (object, "stock-id");
108 + if (priv->icon_name)
110 + g_free (priv->icon_name);
111 + priv->icon_name = NULL;
112 + g_object_notify (object, "icon-name");
116 + g_object_unref (priv->gicon);
117 + priv->gicon = NULL;
118 + g_object_notify (object, "gicon");
123 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
125 @@ -474,16 +533,19 @@ gtk_cell_renderer_pixbuf_create_stock_pixbuf (GtkCellRendererPixbuf *cellpixbuf,
128 GtkCellRendererPixbufPrivate *priv;
129 + GtkIconSet *icon_set;
131 priv = GTK_CELL_RENDERER_PIXBUF_GET_PRIVATE (cellpixbuf);
133 if (cellpixbuf->pixbuf)
134 g_object_unref (cellpixbuf->pixbuf);
136 - cellpixbuf->pixbuf = gtk_widget_render_icon (widget,
139 - priv->stock_detail);
140 + priv->render_scale = gtk_widget_get_scale_factor (widget);
141 + cellpixbuf->pixbuf = gtk_widget_render_icon_scaled (widget,
144 + priv->stock_detail,
145 + &priv->render_scale);
147 g_object_notify (G_OBJECT (cellpixbuf), "pixbuf");
149 @@ -510,15 +572,24 @@ gtk_cell_renderer_pixbuf_create_themed_pixbuf (GtkCellRendererPixbuf *cellpixbuf
150 icon_theme = gtk_icon_theme_get_for_screen (screen);
151 settings = gtk_settings_get_for_screen (screen);
153 - if (!gtk_icon_size_lookup_for_settings (settings,
156 + if (!gtk_icon_size_lookup_scaled (settings,
158 + gdk_window_get_scale_factor (GTK_WIDGET (widget)->window),
161 g_warning ("Invalid icon size %u\n", priv->stock_size);
165 - if (priv->icon_name)
166 + if (priv->icon_set)
167 + cellpixbuf->pixbuf =
168 + gtk_icon_set_render_icon_scaled (priv->icon_set,
170 + gtk_widget_get_direction (widget),
171 + gtk_widget_get_state (widget),
172 + priv->stock_size, widget,
173 + NULL, &priv->render_scale);
174 + else if (priv->icon_name)
175 cellpixbuf->pixbuf = gtk_icon_theme_load_icon (icon_theme,
178 @@ -611,14 +682,28 @@ gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell,
181 gtk_cell_renderer_pixbuf_create_stock_pixbuf (cellpixbuf, widget);
182 + else if (priv->icon_set)
186 + scale = gtk_widget_get_scale_factor (widget);
187 + cellpixbuf->pixbuf =
188 + gtk_icon_set_render_icon_scaled (priv->icon_set,
190 + gtk_widget_get_direction (widget),
191 + gtk_widget_get_state (widget),
193 + widget, priv->stock_detail,
196 else if (priv->icon_name || priv->gicon)
197 gtk_cell_renderer_pixbuf_create_themed_pixbuf (cellpixbuf, widget);
200 if (cellpixbuf->pixbuf)
202 - pixbuf_width = gdk_pixbuf_get_width (cellpixbuf->pixbuf);
203 - pixbuf_height = gdk_pixbuf_get_height (cellpixbuf->pixbuf);
204 + pixbuf_width = gdk_pixbuf_get_width (cellpixbuf->pixbuf) / priv->render_scale;
205 + pixbuf_height = gdk_pixbuf_get_height (cellpixbuf->pixbuf) / priv->render_scale;
207 if (cellpixbuf->pixbuf_expander_open)
209 @@ -761,10 +846,14 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
213 + draw_rect.x -= pix_rect.x;
214 + draw_rect.y -= pix_rect.y;
216 cr = gdk_cairo_create (window);
218 - gdk_cairo_set_source_pixbuf (cr, pixbuf, pix_rect.x, pix_rect.y);
219 + cairo_translate (cr, pix_rect.x, pix_rect.y);
220 gdk_cairo_rectangle (cr, &draw_rect);
221 + cairo_scale (cr, 1 / priv->render_scale, 1 / priv->render_scale);
222 + gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
227 1.7.10.2 (Apple Git-33)