1 From a7d250bd2126a146d0e5d77c1083a47285d5dfb7 Mon Sep 17 00:00:00 2001
2 From: Carlos Garnacho <carlosg@gnome.org>
3 Date: Tue, 12 Feb 2013 14:03:40 +0100
4 Subject: [PATCH 61/68] image: Use scaled icons on windows with a scaling
8 gtk/gtkimage.c | 112 ++++++++++++++++++++++++++++++++++----------------------
9 1 file changed, 68 insertions(+), 44 deletions(-)
11 diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c
12 index c35d962..b492d73 100644
15 @@ -1717,9 +1717,11 @@ ensure_pixbuf_for_icon_name (GtkImage *image)
18 image->data.name.pixbuf =
19 - gtk_icon_theme_load_icon (icon_theme,
20 - image->data.name.icon_name,
21 - MIN (width, height), flags, &error);
22 + gtk_icon_theme_load_icon_for_scale (icon_theme,
23 + image->data.name.icon_name,
24 + MIN (width, height),
25 + gtk_widget_get_scale_factor (GTK_WIDGET (image)),
27 if (image->data.name.pixbuf == NULL)
30 @@ -1757,9 +1759,10 @@ ensure_pixbuf_for_gicon (GtkImage *image)
31 width = height = priv->pixel_size;
32 flags |= GTK_ICON_LOOKUP_FORCE_SIZE;
34 - else if (!gtk_icon_size_lookup_for_settings (settings,
37 + else if (!gtk_icon_size_lookup_scaled (settings,
39 + gtk_widget_get_scale_factor (GTK_WIDGET (image)),
42 if (image->icon_size == -1)
44 @@ -1848,11 +1851,11 @@ gtk_image_expose (GtkWidget *widget,
47 gboolean needs_state_transform;
48 + gdouble render_scale = 1.0;
50 image = GTK_IMAGE (widget);
51 misc = GTK_MISC (widget);
52 priv = GTK_IMAGE_GET_PRIVATE (image);
56 /* For stock items and icon sets, we lazily calculate
57 @@ -1954,12 +1957,13 @@ gtk_image_expose (GtkWidget *widget,
61 - pixbuf = gtk_widget_render_icon (widget,
62 - image->data.stock.stock_id,
65 + render_scale = gtk_widget_get_scale_factor (widget);
66 + pixbuf = gtk_widget_render_icon_scaled (widget,
67 + image->data.stock.stock_id,
69 + NULL, &render_scale);
73 image_bound.width = gdk_pixbuf_get_width (pixbuf);
74 image_bound.height = gdk_pixbuf_get_height (pixbuf);
76 @@ -1969,14 +1973,15 @@ gtk_image_expose (GtkWidget *widget,
79 case GTK_IMAGE_ICON_SET:
80 + render_scale = gtk_widget_get_scale_factor (widget);
82 - gtk_icon_set_render_icon (image->data.icon_set.icon_set,
84 - gtk_widget_get_direction (widget),
85 - gtk_widget_get_state (widget),
89 + gtk_icon_set_render_icon_scaled (image->data.icon_set.icon_set,
91 + gtk_widget_get_direction (widget),
92 + gtk_widget_get_state (widget),
95 + NULL, &render_scale);
99 @@ -2082,17 +2087,35 @@ gtk_image_expose (GtkWidget *widget,
103 - gdk_draw_pixbuf (widget->window,
104 - widget->style->black_gc,
111 - image_bound.height,
112 - GDK_RGB_DITHER_NORMAL,
114 + if (render_scale == 1)
116 + gdk_draw_pixbuf (widget->window,
117 + widget->style->black_gc,
124 + image_bound.height,
125 + GDK_RGB_DITHER_NORMAL,
130 + cairo_t *cr = gdk_cairo_create (widget->window);
132 + gdk_cairo_region (cr, event->region);
135 + cairo_scale (cr, 1.0 / render_scale, 1.0 / render_scale);
136 + gdk_cairo_set_source_pixbuf (cr, pixbuf,
137 + image_bound.x * render_scale,
138 + image_bound.y * render_scale);
141 + cairo_destroy (cr);
146 @@ -2298,8 +2321,10 @@ gtk_image_calc_size (GtkImage *image)
147 GtkWidget *widget = GTK_WIDGET (image);
148 GdkPixbuf *pixbuf = NULL;
149 GtkImagePrivate *priv;
150 + gdouble render_scale;
152 priv = GTK_IMAGE_GET_PRIVATE (image);
153 + render_scale = gtk_widget_get_scale_factor (widget);
155 priv->need_calc_size = 0;
157 @@ -2311,20 +2336,20 @@ gtk_image_calc_size (GtkImage *image)
158 switch (image->storage_type)
160 case GTK_IMAGE_STOCK:
161 - pixbuf = gtk_widget_render_icon (widget,
162 - image->data.stock.stock_id,
165 + pixbuf = gtk_widget_render_icon_scaled (widget,
166 + image->data.stock.stock_id,
168 + NULL, &render_scale);
171 case GTK_IMAGE_ICON_SET:
172 - pixbuf = gtk_icon_set_render_icon (image->data.icon_set.icon_set,
174 - gtk_widget_get_direction (widget),
175 - gtk_widget_get_state (widget),
179 + pixbuf = gtk_icon_set_render_icon_scaled (image->data.icon_set.icon_set,
181 + gtk_widget_get_direction (widget),
182 + gtk_widget_get_state (widget),
185 + NULL, &render_scale);
187 case GTK_IMAGE_ICON_NAME:
188 ensure_pixbuf_for_icon_name (image);
189 @@ -2343,9 +2368,8 @@ gtk_image_calc_size (GtkImage *image)
193 - widget->requisition.width = gdk_pixbuf_get_width (pixbuf) + GTK_MISC (image)->xpad * 2;
194 - widget->requisition.height = gdk_pixbuf_get_height (pixbuf) + GTK_MISC (image)->ypad * 2;
196 + widget->requisition.width = (gdk_pixbuf_get_width (pixbuf) / render_scale) + GTK_MISC (image)->xpad * 2;
197 + widget->requisition.height = (gdk_pixbuf_get_height (pixbuf) / render_scale) + GTK_MISC (image)->ypad * 2;
198 g_object_unref (pixbuf);
202 1.7.10.2 (Apple Git-33)