[gtk+] GtkIconTheme: Don't treat svg icons specially



commit fea939b3d75a97ded2e631235644500fcc2301cf
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jun 14 11:19:12 2014 -0400

    GtkIconTheme: Don't treat svg icons specially
    
    This changes makes svg icons go through the same scale calculation
    code as png icons. As a consequence, an svg that is put into the
    32x32 directory will actually be loaded at size 32, even if it
    gets requested at a bigger size. This will let us avoid giant
    spinners.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=731658

 gtk/gtkicontheme.c |   63 +++++++++++++++++++--------------------------------
 1 files changed, 24 insertions(+), 39 deletions(-)
---
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 8f2cc73..8385d41 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -3895,39 +3895,6 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
        }
     }
 
-  if (is_svg)
-    {
-      GInputStream *stream;
-
-      icon_info->scale = scaled_desired_size / 1000.;
-
-      if (scale_only)
-       return TRUE;
-
-      /* TODO: We should have a load_at_scale */
-      stream = g_loadable_icon_load (icon_info->loadable,
-                                     scaled_desired_size,
-                                     NULL, NULL,
-                                     &icon_info->load_error);
-      if (stream)
-        {
-          icon_info->pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
-                                                                   scaled_desired_size,
-                                                                   scaled_desired_size,
-                                                                   TRUE,
-                                                                   NULL,
-                                                                   &icon_info->load_error);
-          g_object_unref (stream);
-        }
-
-      if (!icon_info->pixbuf)
-        return FALSE;
-
-      apply_emblems (icon_info);
-        
-      return TRUE;
-    }
-
   /* In many cases, the scale can be determined without actual access
    * to the icon file. This is generally true when we have a size
    * for the directory where the icon is; the image size doesn't
@@ -3951,7 +3918,7 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
        icon_info->scale = (gdouble) scaled_desired_size / (icon_info->dir_size * icon_info->dir_scale);
     }
 
-  if (icon_info->scale >= 0. && scale_only)
+  if (icon_info->scale >= 0. && scale_only && !is_svg)
     return TRUE;
 
   /* At this point, we need to actually get the icon; either from the
@@ -3971,9 +3938,20 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
                                      &icon_info->load_error);
       if (stream)
         {
-          source_pixbuf = gdk_pixbuf_new_from_stream (stream,
-                                                      NULL,
-                                                      &icon_info->load_error);
+          if (is_svg)
+            {
+              gint size = icon_info->dir_size * icon_info->dir_scale * icon_info->scale;
+              source_pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
+                                                                   size,
+                                                                   size,
+                                                                   TRUE,
+                                                                   NULL,
+                                                                   &icon_info->load_error);
+            }
+          else
+            source_pixbuf = gdk_pixbuf_new_from_stream (stream,
+                                                        NULL,
+                                                        &icon_info->load_error);
           g_object_unref (stream);
         }
     }
@@ -3986,7 +3964,12 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
   image_width = gdk_pixbuf_get_width (source_pixbuf);
   image_height = gdk_pixbuf_get_height (source_pixbuf);
 
-  if (icon_info->scale < 0.0)
+  if (is_svg)
+    { 
+      gint image_size = MAX (image_width, image_height);
+      icon_info->scale = image_size / 1000.;
+    }
+  else if (icon_info->scale < 0.0)
     {
       gint image_size = MAX (image_width, image_height);
       if (image_size > 0)
@@ -4006,7 +3989,9 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo  *icon_info,
    * extra complexity, we could keep the source pixbuf around
    * but not actually scale it until needed.
    */
-  if (icon_info->scale == 1.0)
+  if (is_svg)
+    icon_info->pixbuf = source_pixbuf;
+  else if (icon_info->scale == 1.0)
     icon_info->pixbuf = source_pixbuf;
   else
     {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]