From: Benjamin Otte Date: Tue, 14 Sep 2021 16:17:58 +0000 (+0200) Subject: icontheme: Use textures more X-Git-Tag: archive/raspbian/4.6.5+ds-1+rpi1~1^2~19^2~5^2~340^2~8 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b5da07f0e1a61be22d8290c871670633f77c6e7b;p=gtk4.git 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. --- 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)