From a7d250bd2126a146d0e5d77c1083a47285d5dfb7 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho 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)