]> Pileus Git - ~andy/gtk/commitdiff
icon-theme: support pixbufs implementing the GIcon interface
authorCosimo Cecchi <cosimoc@gnome.org>
Fri, 5 Nov 2010 09:33:16 +0000 (10:33 +0100)
committerTristan Van Berkom <tristan.van.berkom@gmail.com>
Mon, 8 Nov 2010 02:31:01 +0000 (11:31 +0900)
https://bugzilla.gnome.org/show_bug.cgi?id=634060

gtk/gtkicontheme.c

index f4821d6d0fdbbdc2ea4ad15dbbbfdcf372ed85ed..199f8468baaa9b1e95317fe175227209098e4037 100644 (file)
@@ -137,6 +137,7 @@ struct _GtkIconInfo
   GdkPixbuf *pixbuf;
   GError *load_error;
   gdouble scale;
+  gboolean emblems_applied;
 
   guint ref_count;
 };
@@ -2757,6 +2758,9 @@ apply_emblems (GtkIconInfo *info)
   if (info->emblem_infos == NULL)
     return;
 
+  if (info->emblems_applied)
+    return;
+
   w = gdk_pixbuf_get_width (info->pixbuf);
   h = gdk_pixbuf_get_height (info->pixbuf);
 
@@ -2819,6 +2823,8 @@ apply_emblems (GtkIconInfo *info)
       g_object_unref (info->pixbuf);
       info->pixbuf = icon;
     }
+
+  info->emblems_applied = TRUE;
 }
 
 /* This function contains the complicated logic for deciding
@@ -2840,7 +2846,10 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
     return TRUE;
 
   if (icon_info->pixbuf)
-    return TRUE;
+    {
+      apply_emblems (icon_info);
+      return TRUE;
+    }
 
   if (icon_info->load_error)
     return FALSE;
@@ -3721,6 +3730,39 @@ gtk_icon_theme_lookup_by_gicon (GtkIconTheme       *icon_theme,
 
       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;
 }