diff options
author | Benjamin Otte <otte@redhat.com> | 2021-09-14 18:17:58 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2021-09-17 02:12:07 +0200 |
commit | b5da07f0e1a61be22d8290c871670633f77c6e7b (patch) | |
tree | 78777c2bb6d92a329aadd55b79407525cbe4a3a0 | |
parent | a85f4ec6c2347fd91049d47ea8af538a3acedcce (diff) | |
download | gtk+-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.c | 86 |
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) |