6bdd276d05
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
203 lines
8.3 KiB
Diff
203 lines
8.3 KiB
Diff
From a7d250bd2126a146d0e5d77c1083a47285d5dfb7 Mon Sep 17 00:00:00 2001
|
|
From: Carlos Garnacho <carlosg@gnome.org>
|
|
Date: Tue, 12 Feb 2013 14:03:40 +0100
|
|
Subject: [PATCH 61/68] image: Use scaled icons on windows with a scaling
|
|
factor
|
|
|
|
---
|
|
gtk/gtkimage.c | 112 ++++++++++++++++++++++++++++++++++----------------------
|
|
1 file changed, 68 insertions(+), 44 deletions(-)
|
|
|
|
diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c
|
|
index c35d962..b492d73 100644
|
|
--- a/gtk/gtkimage.c
|
|
+++ b/gtk/gtkimage.c
|
|
@@ -1717,9 +1717,11 @@ ensure_pixbuf_for_icon_name (GtkImage *image)
|
|
}
|
|
}
|
|
image->data.name.pixbuf =
|
|
- gtk_icon_theme_load_icon (icon_theme,
|
|
- image->data.name.icon_name,
|
|
- MIN (width, height), flags, &error);
|
|
+ gtk_icon_theme_load_icon_for_scale (icon_theme,
|
|
+ image->data.name.icon_name,
|
|
+ MIN (width, height),
|
|
+ gtk_widget_get_scale_factor (GTK_WIDGET (image)),
|
|
+ flags, &error);
|
|
if (image->data.name.pixbuf == NULL)
|
|
{
|
|
g_error_free (error);
|
|
@@ -1757,9 +1759,10 @@ ensure_pixbuf_for_gicon (GtkImage *image)
|
|
width = height = priv->pixel_size;
|
|
flags |= GTK_ICON_LOOKUP_FORCE_SIZE;
|
|
}
|
|
- else if (!gtk_icon_size_lookup_for_settings (settings,
|
|
- image->icon_size,
|
|
- &width, &height))
|
|
+ else if (!gtk_icon_size_lookup_scaled (settings,
|
|
+ image->icon_size,
|
|
+ gtk_widget_get_scale_factor (GTK_WIDGET (image)),
|
|
+ &width, &height))
|
|
{
|
|
if (image->icon_size == -1)
|
|
width = height = 48;
|
|
@@ -1848,11 +1851,11 @@ gtk_image_expose (GtkWidget *widget,
|
|
GdkBitmap *mask;
|
|
GdkPixbuf *pixbuf;
|
|
gboolean needs_state_transform;
|
|
+ gdouble render_scale = 1.0;
|
|
|
|
image = GTK_IMAGE (widget);
|
|
misc = GTK_MISC (widget);
|
|
priv = GTK_IMAGE_GET_PRIVATE (image);
|
|
-
|
|
area = event->area;
|
|
|
|
/* For stock items and icon sets, we lazily calculate
|
|
@@ -1954,12 +1957,13 @@ gtk_image_expose (GtkWidget *widget,
|
|
break;
|
|
|
|
case GTK_IMAGE_STOCK:
|
|
- pixbuf = gtk_widget_render_icon (widget,
|
|
- image->data.stock.stock_id,
|
|
- image->icon_size,
|
|
- NULL);
|
|
+ render_scale = gtk_widget_get_scale_factor (widget);
|
|
+ pixbuf = gtk_widget_render_icon_scaled (widget,
|
|
+ image->data.stock.stock_id,
|
|
+ image->icon_size,
|
|
+ NULL, &render_scale);
|
|
if (pixbuf)
|
|
- {
|
|
+ {
|
|
image_bound.width = gdk_pixbuf_get_width (pixbuf);
|
|
image_bound.height = gdk_pixbuf_get_height (pixbuf);
|
|
}
|
|
@@ -1969,14 +1973,15 @@ gtk_image_expose (GtkWidget *widget,
|
|
break;
|
|
|
|
case GTK_IMAGE_ICON_SET:
|
|
+ render_scale = gtk_widget_get_scale_factor (widget);
|
|
pixbuf =
|
|
- gtk_icon_set_render_icon (image->data.icon_set.icon_set,
|
|
- widget->style,
|
|
- gtk_widget_get_direction (widget),
|
|
- gtk_widget_get_state (widget),
|
|
- image->icon_size,
|
|
- widget,
|
|
- NULL);
|
|
+ gtk_icon_set_render_icon_scaled (image->data.icon_set.icon_set,
|
|
+ widget->style,
|
|
+ gtk_widget_get_direction (widget),
|
|
+ gtk_widget_get_state (widget),
|
|
+ image->icon_size,
|
|
+ widget,
|
|
+ NULL, &render_scale);
|
|
|
|
if (pixbuf)
|
|
{
|
|
@@ -2082,17 +2087,35 @@ gtk_image_expose (GtkWidget *widget,
|
|
|
|
if (pixbuf)
|
|
{
|
|
- gdk_draw_pixbuf (widget->window,
|
|
- widget->style->black_gc,
|
|
- pixbuf,
|
|
- image_bound.x - x,
|
|
- image_bound.y - y,
|
|
- image_bound.x,
|
|
- image_bound.y,
|
|
- image_bound.width,
|
|
- image_bound.height,
|
|
- GDK_RGB_DITHER_NORMAL,
|
|
- 0, 0);
|
|
+ if (render_scale == 1)
|
|
+ {
|
|
+ gdk_draw_pixbuf (widget->window,
|
|
+ widget->style->black_gc,
|
|
+ pixbuf,
|
|
+ image_bound.x - x,
|
|
+ image_bound.y - y,
|
|
+ image_bound.x,
|
|
+ image_bound.y,
|
|
+ image_bound.width,
|
|
+ image_bound.height,
|
|
+ GDK_RGB_DITHER_NORMAL,
|
|
+ 0, 0);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ cairo_t *cr = gdk_cairo_create (widget->window);
|
|
+
|
|
+ gdk_cairo_region (cr, event->region);
|
|
+ cairo_clip (cr);
|
|
+
|
|
+ cairo_scale (cr, 1.0 / render_scale, 1.0 / render_scale);
|
|
+ gdk_cairo_set_source_pixbuf (cr, pixbuf,
|
|
+ image_bound.x * render_scale,
|
|
+ image_bound.y * render_scale);
|
|
+
|
|
+ cairo_paint (cr);
|
|
+ cairo_destroy (cr);
|
|
+ }
|
|
}
|
|
}
|
|
else
|
|
@@ -2298,8 +2321,10 @@ gtk_image_calc_size (GtkImage *image)
|
|
GtkWidget *widget = GTK_WIDGET (image);
|
|
GdkPixbuf *pixbuf = NULL;
|
|
GtkImagePrivate *priv;
|
|
+ gdouble render_scale;
|
|
|
|
priv = GTK_IMAGE_GET_PRIVATE (image);
|
|
+ render_scale = gtk_widget_get_scale_factor (widget);
|
|
|
|
priv->need_calc_size = 0;
|
|
|
|
@@ -2311,20 +2336,20 @@ gtk_image_calc_size (GtkImage *image)
|
|
switch (image->storage_type)
|
|
{
|
|
case GTK_IMAGE_STOCK:
|
|
- pixbuf = gtk_widget_render_icon (widget,
|
|
- image->data.stock.stock_id,
|
|
- image->icon_size,
|
|
- NULL);
|
|
+ pixbuf = gtk_widget_render_icon_scaled (widget,
|
|
+ image->data.stock.stock_id,
|
|
+ image->icon_size,
|
|
+ NULL, &render_scale);
|
|
break;
|
|
|
|
case GTK_IMAGE_ICON_SET:
|
|
- pixbuf = gtk_icon_set_render_icon (image->data.icon_set.icon_set,
|
|
- widget->style,
|
|
- gtk_widget_get_direction (widget),
|
|
- gtk_widget_get_state (widget),
|
|
- image->icon_size,
|
|
- widget,
|
|
- NULL);
|
|
+ pixbuf = gtk_icon_set_render_icon_scaled (image->data.icon_set.icon_set,
|
|
+ widget->style,
|
|
+ gtk_widget_get_direction (widget),
|
|
+ gtk_widget_get_state (widget),
|
|
+ image->icon_size,
|
|
+ widget,
|
|
+ NULL, &render_scale);
|
|
break;
|
|
case GTK_IMAGE_ICON_NAME:
|
|
ensure_pixbuf_for_icon_name (image);
|
|
@@ -2343,9 +2368,8 @@ gtk_image_calc_size (GtkImage *image)
|
|
|
|
if (pixbuf)
|
|
{
|
|
- widget->requisition.width = gdk_pixbuf_get_width (pixbuf) + GTK_MISC (image)->xpad * 2;
|
|
- widget->requisition.height = gdk_pixbuf_get_height (pixbuf) + GTK_MISC (image)->ypad * 2;
|
|
-
|
|
+ widget->requisition.width = (gdk_pixbuf_get_width (pixbuf) / render_scale) + GTK_MISC (image)->xpad * 2;
|
|
+ widget->requisition.height = (gdk_pixbuf_get_height (pixbuf) / render_scale) + GTK_MISC (image)->ypad * 2;
|
|
g_object_unref (pixbuf);
|
|
}
|
|
}
|
|
--
|
|
1.7.10.2 (Apple Git-33)
|