[gtk/image-loading: 53/59] icontheme: Use textures more




commit da1e5bf8e37bb7c274cb5ec89a9995ddda2c8b8c
Author: Benjamin Otte <otte redhat com>
Date:   Tue Sep 14 18:17:58 2021 +0200

    icontheme: Use textures more
    
    We were going via GLoadablieIcon/GInputStream for everything previously
    and we have no API for that with GdkTexture.
    
    With this commit, gdk-pixbuf isn't used anymore when starting
    widget-factory for anything but SVG.

 gtk/gtkicontheme.c | 88 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 48 insertions(+), 40 deletions(-)
---
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index c171a573ff..947f0d22e0 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -3742,31 +3742,6 @@ gtk_icon_paintable_is_symbolic (GtkIconPaintable *icon)
   return icon->is_symbolic;
 }
 
-static GLoadableIcon *
-icon_get_loadable (GtkIconPaintable *icon)
-{
-  GFile *file;
-  GLoadableIcon *loadable;
-
-  if (icon->loadable)
-    return g_object_ref (icon->loadable);
-
-  if (icon->is_resource)
-    {
-      char *uri = g_strconcat ("resource://", icon->filename, NULL);
-      file = g_file_new_for_uri (uri);
-      g_free (uri);
-    }
-  else
-    file = g_file_new_for_path (icon->filename);
-
-  loadable = G_LOADABLE_ICON (g_file_icon_new (file));
-
-  g_object_unref (file);
-
-  return loadable;
-}
-
 /* This function contains the complicated logic for deciding
  * on the size at which to load the icon and loading it at
  * that size.
@@ -3826,19 +3801,59 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
       else
         icon->texture = gdk_texture_new_from_resource (icon->filename);
     }
+  else if (icon->filename)
+    {
+      if (icon->is_svg)
+        {
+          GdkPixbuf *source_pixbuf;
+
+          if (gtk_icon_paintable_is_symbolic (icon))
+            source_pixbuf = gtk_make_symbolic_pixbuf_from_path (icon->filename,
+                                                                pixel_size, pixel_size,
+                                                                icon->desired_scale,
+                                                                &load_error);
+          else
+            {
+              GFile *file = g_file_new_for_path (icon->filename);
+              GInputStream *stream = G_INPUT_STREAM (g_file_read (file, NULL, &load_error));
+
+              g_object_unref (file);
+              if (stream)
+                {
+                  source_pixbuf = _gdk_pixbuf_new_from_stream_at_scale (stream,
+                                                                        "svg",
+                                                                        pixel_size, pixel_size,
+                                                                        TRUE, NULL,
+                                                                        &load_error);
+                  g_object_unref (stream);
+                }
+              else
+                source_pixbuf = NULL;
+            }
+          if (source_pixbuf)
+            {
+              icon->texture = gdk_texture_new_for_pixbuf (source_pixbuf);
+              g_object_unref (source_pixbuf);
+            }
+        }
+      else
+        {
+          GFile *file = g_file_new_for_path (icon->filename);
+          icon->texture = gdk_texture_new_from_file (file, &load_error);
+          g_object_unref (file);
+        }
+    }
   else
     {
-      GLoadableIcon *loadable;
       GInputStream *stream;
       GdkPixbuf *source_pixbuf;
 
-      loadable = icon_get_loadable (icon);
-      stream = g_loadable_icon_load (loadable,
+      g_assert (icon->loadable);
+
+      stream = g_loadable_icon_load (icon->loadable,
                                      pixel_size,
                                      NULL, NULL,
                                      &load_error);
-      g_object_unref (loadable);
-
       if (stream)
         {
           /* SVG icons are a special case - we just immediately scale them
@@ -3846,17 +3861,11 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
            */
           if (icon->is_svg)
             {
-              if (gtk_icon_paintable_is_symbolic (icon))
-                source_pixbuf = gtk_make_symbolic_pixbuf_from_path (icon->filename,
+              source_pixbuf = _gdk_pixbuf_new_from_stream_at_scale (stream,
+                                                                    "svg",
                                                                     pixel_size, pixel_size,
-                                                                    icon->desired_scale,
+                                                                    TRUE, NULL,
                                                                     &load_error);
-              else
-                source_pixbuf = _gdk_pixbuf_new_from_stream_at_scale (stream,
-                                                                      "svg",
-                                                                      pixel_size, pixel_size,
-                                                                      TRUE, NULL,
-                                                                      &load_error);
             }
           else
             source_pixbuf = _gdk_pixbuf_new_from_stream (stream,
@@ -3869,7 +3878,6 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
               g_object_unref (source_pixbuf);
             }
         }
-
     }
 
   if (!icon->texture)


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