summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2021-09-14 18:17:58 +0200
committerBenjamin Otte <otte@redhat.com>2021-09-17 02:12:07 +0200
commitb5da07f0e1a61be22d8290c871670633f77c6e7b (patch)
tree78777c2bb6d92a329aadd55b79407525cbe4a3a0
parenta85f4ec6c2347fd91049d47ea8af538a3acedcce (diff)
downloadgtk+-b5da07f0e1a61be22d8290c871670633f77c6e7b.tar.gz
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.
-rw-r--r--gtk/gtkicontheme.c86
1 files changed, 46 insertions, 40 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index c171a573ff..a48dfb433d 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,57 @@ 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
+ {
+ icon->texture = gdk_texture_new_from_filename (icon->filename, &load_error);
+ }
+ }
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 +3859,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 +3876,6 @@ icon_ensure_texture__locked (GtkIconPaintable *icon,
g_object_unref (source_pixbuf);
}
}
-
}
if (!icon->texture)