diff options
author | Carlos Garnacho <carlos@lanedo.com> | 2013-05-10 18:31:54 +0200 |
---|---|---|
committer | Carlos Garnacho <carlos@lanedo.com> | 2013-05-14 12:53:37 +0200 |
commit | f90b8404c5405efa29556523b9aa25a742eca9ed (patch) | |
tree | b9ca6e82548e78f4f0c28e445cc764f772916a4b | |
parent | 9f31b055315b4a414d1111c7fd1a02704b313f81 (diff) | |
download | gtk+-f90b8404c5405efa29556523b9aa25a742eca9ed.tar.gz |
iconhelper: Use GtkIconSet and gtk_cairo_set_source_icon_set() to render high-res icons
Now GtkIconSets are preferred over GdkPixbufs if the storage type goes through
these.
An scale argument has been added to _gtk_icon_helper_draw() to let callers tell
the output scale factor, as those typically have a GdkWindow around to fetch it
from, all callers were updated too.
-rw-r--r-- | gtk/gtkcellrendererpixbuf.c | 1 | ||||
-rw-r--r-- | gtk/gtkentry.c | 1 | ||||
-rw-r--r-- | gtk/gtkiconhelper.c | 65 | ||||
-rw-r--r-- | gtk/gtkiconhelperprivate.h | 1 | ||||
-rw-r--r-- | gtk/gtkimage.c | 3 | ||||
-rw-r--r-- | gtk/gtkspinbutton.c | 1 |
6 files changed, 41 insertions, 31 deletions
diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c index 90fc9fece0..62f6f65e0c 100644 --- a/gtk/gtkcellrendererpixbuf.c +++ b/gtk/gtkcellrendererpixbuf.c @@ -549,6 +549,7 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell, _gtk_icon_helper_draw (icon_helper, context, cr, + gtk_widget_get_scale_factor (widget), pix_rect.x, pix_rect.y); g_object_unref (icon_helper); diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 3fefc249ae..c139184ab6 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -3641,6 +3641,7 @@ draw_icon (GtkWidget *widget, _gtk_icon_helper_draw (icon_info->icon_helper, context, cr, + gtk_widget_get_scale_factor (widget), x, y); gtk_style_context_restore (context); diff --git a/gtk/gtkiconhelper.c b/gtk/gtkiconhelper.c index 58ae8a15db..29e9de023c 100644 --- a/gtk/gtkiconhelper.c +++ b/gtk/gtkiconhelper.c @@ -267,18 +267,6 @@ ensure_pixbuf_for_icon_name_or_gicon (GtkIconHelper *self, } static void -ensure_pixbuf_for_icon_set (GtkIconHelper *self, - GtkStyleContext *context, - GtkIconSet *icon_set) -{ - if (!check_invalidate_pixbuf (self, context)) - return; - - self->priv->rendered_pixbuf = - gtk_icon_set_render_icon_pixbuf (icon_set, context, self->priv->icon_size); -} - -static void ensure_pixbuf_at_size (GtkIconHelper *self, GtkStyleContext *context) { @@ -307,12 +295,26 @@ ensure_pixbuf_at_size (GtkIconHelper *self, self->priv->rendered_pixbuf = g_object_ref (self->priv->orig_pixbuf); } +GtkIconSet * +_gtk_icon_helper_ensure_icon_set (GtkIconHelper *self, + GtkStyleContext *context) +{ + switch (self->priv->storage_type) + { + case GTK_IMAGE_ICON_SET: + return self->priv->icon_set; + case GTK_IMAGE_STOCK: + return gtk_style_context_lookup_icon_set (context, self->priv->stock_id); + default: + return NULL; + } +} + GdkPixbuf * _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self, GtkStyleContext *context) { GdkPixbuf *pixbuf = NULL; - GtkIconSet *icon_set; switch (self->priv->storage_type) { @@ -323,19 +325,6 @@ _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self, pixbuf = g_object_ref (self->priv->orig_pixbuf); break; - case GTK_IMAGE_STOCK: - icon_set = gtk_style_context_lookup_icon_set (context, self->priv->stock_id); - if (icon_set != NULL) - ensure_pixbuf_for_icon_set (self, context, icon_set); - else - pixbuf = NULL; - break; - - case GTK_IMAGE_ICON_SET: - icon_set = self->priv->icon_set; - ensure_pixbuf_for_icon_set (self, context, icon_set); - break; - case GTK_IMAGE_ICON_NAME: case GTK_IMAGE_GICON: ensure_pixbuf_for_icon_name_or_gicon (self, context); @@ -581,17 +570,33 @@ void _gtk_icon_helper_draw (GtkIconHelper *self, GtkStyleContext *context, cairo_t *cr, + gdouble scale, gdouble x, gdouble y) { + GtkIconSet *icon_set; GdkPixbuf *pixbuf; - pixbuf = _gtk_icon_helper_ensure_pixbuf (self, context); + icon_set = _gtk_icon_helper_ensure_icon_set (self, context); - if (pixbuf != NULL) + if (icon_set) + { + cairo_save (cr); + gtk_cairo_set_source_icon_set (cr, context, + icon_set, self->priv->icon_size, + scale, x, y); + cairo_paint (cr); + cairo_restore (cr); + } + else { - gtk_render_icon (context, cr, pixbuf, x, y); - g_object_unref (pixbuf); + pixbuf = _gtk_icon_helper_ensure_pixbuf (self, context); + + if (pixbuf != NULL) + { + gtk_render_icon (context, cr, pixbuf, x, y); + g_object_unref (pixbuf); + } } } diff --git a/gtk/gtkiconhelperprivate.h b/gtk/gtkiconhelperprivate.h index c2b9f0804f..9a63bc3ac8 100644 --- a/gtk/gtkiconhelperprivate.h +++ b/gtk/gtkiconhelperprivate.h @@ -121,6 +121,7 @@ void _gtk_icon_helper_get_size (GtkIconHelper *self, void _gtk_icon_helper_draw (GtkIconHelper *self, GtkStyleContext *context, cairo_t *cr, + gdouble scale, gdouble x, gdouble y); diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index 61c41b97ee..677500f2bc 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -1477,8 +1477,9 @@ gtk_image_draw (GtkWidget *widget, } else { - _gtk_icon_helper_draw (priv->icon_helper, + _gtk_icon_helper_draw (priv->icon_helper, context, cr, + gtk_widget_get_scale_factor (widget), x, y); } diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 0f97078024..b675dae8a3 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -1020,6 +1020,7 @@ gtk_spin_button_panel_draw (GtkSpinButton *spin_button, y = floor ((height - icon_height) / 2.0); _gtk_icon_helper_draw (icon_helper, context, cr, + gtk_widget_get_scale_factor (widget), x, y); cairo_restore (cr); |