[gtk/image-loading: 53/59] icontheme: Use textures more
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/image-loading: 53/59] icontheme: Use textures more
- Date: Thu, 16 Sep 2021 22:25:38 +0000 (UTC)
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]