Commit 4239e499 authored by Cosimo Cecchi's avatar Cosimo Cecchi Committed by Tristan Van Berkom

icon-theme: support pixbufs implementing the GIcon interface

https://bugzilla.gnome.org/show_bug.cgi?id=634060
parent cb51ad60
...@@ -137,6 +137,7 @@ struct _GtkIconInfo ...@@ -137,6 +137,7 @@ struct _GtkIconInfo
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GError *load_error; GError *load_error;
gdouble scale; gdouble scale;
gboolean emblems_applied;
guint ref_count; guint ref_count;
}; };
...@@ -2757,6 +2758,9 @@ apply_emblems (GtkIconInfo *info) ...@@ -2757,6 +2758,9 @@ apply_emblems (GtkIconInfo *info)
if (info->emblem_infos == NULL) if (info->emblem_infos == NULL)
return; return;
if (info->emblems_applied)
return;
w = gdk_pixbuf_get_width (info->pixbuf); w = gdk_pixbuf_get_width (info->pixbuf);
h = gdk_pixbuf_get_height (info->pixbuf); h = gdk_pixbuf_get_height (info->pixbuf);
...@@ -2819,6 +2823,8 @@ apply_emblems (GtkIconInfo *info) ...@@ -2819,6 +2823,8 @@ apply_emblems (GtkIconInfo *info)
g_object_unref (info->pixbuf); g_object_unref (info->pixbuf);
info->pixbuf = icon; info->pixbuf = icon;
} }
info->emblems_applied = TRUE;
} }
/* This function contains the complicated logic for deciding /* This function contains the complicated logic for deciding
...@@ -2840,7 +2846,10 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info, ...@@ -2840,7 +2846,10 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
return TRUE; return TRUE;
if (icon_info->pixbuf) if (icon_info->pixbuf)
return TRUE; {
apply_emblems (icon_info);
return TRUE;
}
if (icon_info->load_error) if (icon_info->load_error)
return FALSE; return FALSE;
...@@ -3721,6 +3730,39 @@ gtk_icon_theme_lookup_by_gicon (GtkIconTheme *icon_theme, ...@@ -3721,6 +3730,39 @@ gtk_icon_theme_lookup_by_gicon (GtkIconTheme *icon_theme,
return info; return info;
} }
else if (GDK_IS_PIXBUF (icon))
{
GdkPixbuf *pixbuf;
pixbuf = GDK_PIXBUF (icon);
if ((flags & GTK_ICON_LOOKUP_FORCE_SIZE) != 0)
{
gint width, height, max;
gdouble scale;
GdkPixbuf *scaled;
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
max = MAX (width, height);
scale = (gdouble) size / (gdouble) max;
scaled = gdk_pixbuf_scale_simple (pixbuf,
0.5 + width * scale,
0.5 + height * scale,
GDK_INTERP_BILINEAR);
info = gtk_icon_info_new_for_pixbuf (icon_theme, scaled);
g_object_unref (scaled);
}
else
{
info = gtk_icon_info_new_for_pixbuf (icon_theme, pixbuf);
}
return info;
}
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment