]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkiconhelper.c
appchooserdialog: remove redundant checks
[~andy/gtk] / gtk / gtkiconhelper.c
index 46724f9197b79f0342c719c93a6e3c99afdb735e..58ae8a15db776402e7195525b871e10672a5192e 100644 (file)
@@ -14,9 +14,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
@@ -38,7 +36,8 @@ struct _GtkIconHelperPrivate {
   GtkIconSize icon_size;
   gint pixel_size;
 
-  gboolean use_fallback;
+  guint use_fallback : 1;
+  guint force_scale_pixbuf : 1;
 
   GdkPixbuf *rendered_pixbuf;
   GtkStateFlags last_rendered_state;
@@ -128,8 +127,15 @@ ensure_icon_size (GtkIconHelper *self,
                                               self->priv->icon_size,
                                               &width, &height))
     {
-      g_warning ("Invalid icon size %d\n", self->priv->icon_size);
-      width = height = 24;
+      if (self->priv->icon_size == GTK_ICON_SIZE_INVALID)
+        {
+          width = height = 0;
+        }
+      else
+        {
+          g_warning ("Invalid icon size %d\n", self->priv->icon_size);
+          width = height = 24;
+        }
     }
 
   *width_out = width;
@@ -257,7 +263,7 @@ ensure_pixbuf_for_icon_name_or_gicon (GtkIconHelper *self,
   self->priv->rendered_pixbuf = ensure_stated_icon_from_info (self, context, info);
 
   if (info)
-    gtk_icon_info_free (info);
+    g_object_unref (info);
 }
 
 static void
@@ -272,6 +278,35 @@ ensure_pixbuf_for_icon_set (GtkIconHelper *self,
     gtk_icon_set_render_icon_pixbuf (icon_set, context, self->priv->icon_size);
 }
 
+static void
+ensure_pixbuf_at_size (GtkIconHelper   *self,
+                       GtkStyleContext *context)
+{
+  gint width, height;
+
+  if (!check_invalidate_pixbuf (self, context))
+    return;
+
+  if (self->priv->rendered_pixbuf)
+    return;
+
+  if (self->priv->pixel_size != -1 ||
+      self->priv->icon_size != GTK_ICON_SIZE_INVALID)
+    {
+      ensure_icon_size (self, context, &width, &height);
+
+      if (width < gdk_pixbuf_get_width (self->priv->orig_pixbuf) ||
+          height < gdk_pixbuf_get_height (self->priv->orig_pixbuf))
+        self->priv->rendered_pixbuf =
+          gdk_pixbuf_scale_simple (self->priv->orig_pixbuf,
+                                   width, height,
+                                   GDK_INTERP_BILINEAR);
+    }
+
+  if (!self->priv->rendered_pixbuf)
+    self->priv->rendered_pixbuf = g_object_ref (self->priv->orig_pixbuf);
+}
+
 GdkPixbuf *
 _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self,
                                 GtkStyleContext *context)
@@ -282,12 +317,18 @@ _gtk_icon_helper_ensure_pixbuf (GtkIconHelper *self,
   switch (self->priv->storage_type)
     {
     case GTK_IMAGE_PIXBUF:
-      pixbuf = g_object_ref (self->priv->orig_pixbuf);
+      if (self->priv->force_scale_pixbuf)
+        ensure_pixbuf_at_size (self, context);
+      else
+        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);
-      ensure_pixbuf_for_icon_set (self, context, icon_set);
+      if (icon_set != NULL)
+       ensure_pixbuf_for_icon_set (self, context, icon_set);
+      else
+       pixbuf = NULL;
       break;
 
     case GTK_IMAGE_ICON_SET:
@@ -371,7 +412,8 @@ _gtk_icon_helper_set_icon_name (GtkIconHelper *self,
 {
   _gtk_icon_helper_clear (self);
 
-  if (icon_name != NULL)
+  if (icon_name != NULL &&
+      icon_name[0] != '\0')
     {
       self->priv->storage_type = GTK_IMAGE_ICON_NAME;
       self->priv->icon_name = g_strdup (icon_name);
@@ -427,7 +469,8 @@ _gtk_icon_helper_set_stock_id (GtkIconHelper *self,
 {
   _gtk_icon_helper_clear (self);
 
-  if (stock_id != NULL)
+  if (stock_id != NULL &&
+      stock_id[0] != '\0')
     {
       self->priv->storage_type = GTK_IMAGE_STOCK;
       self->priv->stock_id = g_strdup (stock_id);
@@ -495,54 +538,36 @@ _gtk_icon_helper_get_pixel_size (GtkIconHelper *self)
 GdkPixbuf *
 _gtk_icon_helper_peek_pixbuf (GtkIconHelper *self)
 {
-  g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_PIXBUF ||
-                        self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
   return self->priv->orig_pixbuf;
 }
 
 GIcon *
 _gtk_icon_helper_peek_gicon (GtkIconHelper *self)
 {
-  g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_GICON ||
-                        self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
   return self->priv->gicon;
 }
 
 GdkPixbufAnimation *
 _gtk_icon_helper_peek_animation (GtkIconHelper *self)
 {
-  g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_ANIMATION ||
-                        self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
   return self->priv->animation;
 }
 
 GtkIconSet *
 _gtk_icon_helper_peek_icon_set (GtkIconHelper *self)
 {
-  g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_ICON_SET ||
-                        self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
   return self->priv->icon_set;
 }
 
 const gchar *
 _gtk_icon_helper_get_stock_id (GtkIconHelper *self)
 {
-  g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_STOCK ||
-                        self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
   return self->priv->stock_id;
 }
 
 const gchar *
 _gtk_icon_helper_get_icon_name (GtkIconHelper *self)
 {
-  g_return_val_if_fail (self->priv->storage_type == GTK_IMAGE_ICON_NAME ||
-                        self->priv->storage_type == GTK_IMAGE_EMPTY, NULL);
-
   return self->priv->icon_name;
 }
 
@@ -575,3 +600,20 @@ _gtk_icon_helper_get_is_empty (GtkIconHelper *self)
 {
   return (self->priv->storage_type == GTK_IMAGE_EMPTY);
 }
+
+gboolean
+_gtk_icon_helper_get_force_scale_pixbuf (GtkIconHelper *self)
+{
+  return self->priv->force_scale_pixbuf;
+}
+
+void
+_gtk_icon_helper_set_force_scale_pixbuf (GtkIconHelper *self,
+                                         gboolean       force_scale)
+{
+  if (self->priv->force_scale_pixbuf != force_scale)
+    {
+      self->priv->force_scale_pixbuf = force_scale;
+      _gtk_icon_helper_invalidate (self);
+    }
+}