Fix 'mono' package typo
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0061-image-Use-scaled-icons-on-windows-with-a-scaling-fac.patch
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
5  factor
6
7 ---
8  gtk/gtkimage.c |  112 ++++++++++++++++++++++++++++++++++----------------------
9  1 file changed, 68 insertions(+), 44 deletions(-)
10
11 diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c
12 index c35d962..b492d73 100644
13 --- a/gtk/gtkimage.c
14 +++ b/gtk/gtkimage.c
15 @@ -1717,9 +1717,11 @@ ensure_pixbuf_for_icon_name (GtkImage *image)
16             }
17         }
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)),
26 +                                            flags, &error);
27        if (image->data.name.pixbuf == NULL)
28         {
29           g_error_free (error);
30 @@ -1757,9 +1759,10 @@ ensure_pixbuf_for_gicon (GtkImage *image)
31           width = height = priv->pixel_size;
32            flags |= GTK_ICON_LOOKUP_FORCE_SIZE;
33         }
34 -      else if (!gtk_icon_size_lookup_for_settings (settings,
35 -                                                  image->icon_size,
36 -                                                  &width, &height))
37 +      else if (!gtk_icon_size_lookup_scaled (settings,
38 +                                             image->icon_size,
39 +                                             gtk_widget_get_scale_factor (GTK_WIDGET (image)),
40 +                                             &width, &height))
41         {
42           if (image->icon_size == -1)
43             width = height = 48;
44 @@ -1848,11 +1851,11 @@ gtk_image_expose (GtkWidget      *widget,
45        GdkBitmap *mask;
46        GdkPixbuf *pixbuf;
47        gboolean needs_state_transform;
48 +      gdouble render_scale = 1.0;
49
50        image = GTK_IMAGE (widget);
51        misc = GTK_MISC (widget);
52        priv = GTK_IMAGE_GET_PRIVATE (image);
53 -
54        area = event->area;
55
56        /* For stock items and icon sets, we lazily calculate
57 @@ -1954,12 +1957,13 @@ gtk_image_expose (GtkWidget      *widget,
58            break;
59
60          case GTK_IMAGE_STOCK:
61 -          pixbuf = gtk_widget_render_icon (widget,
62 -                                           image->data.stock.stock_id,
63 -                                           image->icon_size,
64 -                                           NULL);
65 +          render_scale = gtk_widget_get_scale_factor (widget);
66 +          pixbuf = gtk_widget_render_icon_scaled (widget,
67 +                                                  image->data.stock.stock_id,
68 +                                                  image->icon_size,
69 +                                                  NULL, &render_scale);
70            if (pixbuf)
71 -            {
72 +            {
73                image_bound.width = gdk_pixbuf_get_width (pixbuf);
74                image_bound.height = gdk_pixbuf_get_height (pixbuf);
75              }
76 @@ -1969,14 +1973,15 @@ gtk_image_expose (GtkWidget      *widget,
77            break;
78
79          case GTK_IMAGE_ICON_SET:
80 +          render_scale = gtk_widget_get_scale_factor (widget);
81            pixbuf =
82 -            gtk_icon_set_render_icon (image->data.icon_set.icon_set,
83 -                                      widget->style,
84 -                                      gtk_widget_get_direction (widget),
85 -                                      gtk_widget_get_state (widget),
86 -                                      image->icon_size,
87 -                                      widget,
88 -                                      NULL);
89 +            gtk_icon_set_render_icon_scaled (image->data.icon_set.icon_set,
90 +                                             widget->style,
91 +                                             gtk_widget_get_direction (widget),
92 +                                             gtk_widget_get_state (widget),
93 +                                             image->icon_size,
94 +                                             widget,
95 +                                             NULL, &render_scale);
96
97            if (pixbuf)
98              {
99 @@ -2082,17 +2087,35 @@ gtk_image_expose (GtkWidget      *widget,
100
101                if (pixbuf)
102                  {
103 -                  gdk_draw_pixbuf (widget->window,
104 -                                  widget->style->black_gc,
105 -                                  pixbuf,
106 -                                  image_bound.x - x,
107 -                                  image_bound.y - y,
108 -                                  image_bound.x,
109 -                                  image_bound.y,
110 -                                  image_bound.width,
111 -                                  image_bound.height,
112 -                                  GDK_RGB_DITHER_NORMAL,
113 -                                  0, 0);
114 +                  if (render_scale == 1)
115 +                    {
116 +                      gdk_draw_pixbuf (widget->window,
117 +                                       widget->style->black_gc,
118 +                                       pixbuf,
119 +                                       image_bound.x - x,
120 +                                       image_bound.y - y,
121 +                                       image_bound.x,
122 +                                       image_bound.y,
123 +                                       image_bound.width,
124 +                                       image_bound.height,
125 +                                       GDK_RGB_DITHER_NORMAL,
126 +                                       0, 0);
127 +                    }
128 +                  else
129 +                    {
130 +                      cairo_t *cr = gdk_cairo_create (widget->window);
131 +
132 +                      gdk_cairo_region (cr, event->region);
133 +                      cairo_clip (cr);
134 +
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);
139 +
140 +                      cairo_paint (cr);
141 +                      cairo_destroy (cr);
142 +                    }
143                  }
144              }
145            else
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;
151
152    priv = GTK_IMAGE_GET_PRIVATE (image);
153 +  render_scale = gtk_widget_get_scale_factor (widget);
154
155    priv->need_calc_size = 0;
156
157 @@ -2311,20 +2336,20 @@ gtk_image_calc_size (GtkImage *image)
158    switch (image->storage_type)
159      {
160      case GTK_IMAGE_STOCK:
161 -      pixbuf = gtk_widget_render_icon (widget,
162 -                                      image->data.stock.stock_id,
163 -                                       image->icon_size,
164 -                                       NULL);
165 +      pixbuf = gtk_widget_render_icon_scaled (widget,
166 +                                              image->data.stock.stock_id,
167 +                                              image->icon_size,
168 +                                              NULL, &render_scale);
169        break;
170
171      case GTK_IMAGE_ICON_SET:
172 -      pixbuf = gtk_icon_set_render_icon (image->data.icon_set.icon_set,
173 -                                         widget->style,
174 -                                         gtk_widget_get_direction (widget),
175 -                                         gtk_widget_get_state (widget),
176 -                                         image->icon_size,
177 -                                         widget,
178 -                                         NULL);
179 +      pixbuf = gtk_icon_set_render_icon_scaled (image->data.icon_set.icon_set,
180 +                                                widget->style,
181 +                                                gtk_widget_get_direction (widget),
182 +                                                gtk_widget_get_state (widget),
183 +                                                image->icon_size,
184 +                                                widget,
185 +                                                NULL, &render_scale);
186        break;
187      case GTK_IMAGE_ICON_NAME:
188        ensure_pixbuf_for_icon_name (image);
189 @@ -2343,9 +2368,8 @@ gtk_image_calc_size (GtkImage *image)
190
191    if (pixbuf)
192      {
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;
195 -
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);
199      }
200  }
201 --
202 1.7.10.2 (Apple Git-33)