diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-09-14 14:55:59 -0400 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2021-09-17 02:02:51 +0200 |
commit | dcd873a6d8158326cfd17d72e8b2902c0a77f27a (patch) | |
tree | 0370be88e73d403d248b8af3e239dc5733fb0e5e /gtk/gtkbuilder.c | |
parent | 679c93e843d26551a7210679b3466d6edffc5eb6 (diff) | |
download | gtk+-dcd873a6d8158326cfd17d72e8b2902c0a77f27a.tar.gz |
builder: create textures without pixbufs
Load textures using the GdkTexture apis, without
going through a pixbuf first.
Diffstat (limited to 'gtk/gtkbuilder.c')
-rw-r--r-- | gtk/gtkbuilder.c | 77 |
1 files changed, 58 insertions, 19 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index 9d85e6f2ed..14d03298d7 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -2296,10 +2296,64 @@ gtk_builder_value_from_string_type (GtkBuilder *builder, break; case G_TYPE_OBJECT: case G_TYPE_INTERFACE: - if (G_VALUE_HOLDS (value, GDK_TYPE_PIXBUF) || - G_VALUE_HOLDS (value, GDK_TYPE_PAINTABLE) || + if (G_VALUE_HOLDS (value, GDK_TYPE_PAINTABLE) || G_VALUE_HOLDS (value, GDK_TYPE_TEXTURE)) { + GObject *object = g_hash_table_lookup (priv->objects, string); + char *filename; + GError *tmp_error = NULL; + GdkTexture *texture = NULL; + + if (object) + { + if (g_type_is_a (G_OBJECT_TYPE (object), G_VALUE_TYPE (value))) + { + g_value_set_object (value, object); + return TRUE; + } + else + { + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_VALUE, + "Could not load image '%s': " + " '%s' is already used as object id for a %s", + string, string, G_OBJECT_TYPE_NAME (object)); + return FALSE; + } + } + + filename = _gtk_builder_get_resource_path (builder, string); + if (filename != NULL) + { + texture = gdk_texture_new_from_resource (filename); + } + else + { + GFile *file; + + filename = _gtk_builder_get_absolute_filename (builder, string); + file = g_file_new_for_path (filename); + texture = gdk_texture_new_from_file (file, &tmp_error); + g_object_unref (file); + } + + g_free (filename); + + if (!texture) + { + g_warning ("Could not load image '%s': %s", string, tmp_error->message); + g_error_free (tmp_error); + + texture = gdk_texture_new_from_resource (IMAGE_MISSING_RESOURCE_PATH); + } + + g_value_take_object (value, texture); + + ret = TRUE; + } + else if (G_VALUE_HOLDS (value, GDK_TYPE_PIXBUF)) + { char *filename; GError *tmp_error = NULL; GdkPixbuf *pixbuf = NULL; @@ -2344,28 +2398,13 @@ gtk_builder_value_from_string_type (GtkBuilder *builder, if (pixbuf == NULL) { - g_warning ("Could not load image '%s': %s", - string, tmp_error->message); + g_warning ("Could not load image '%s': %s", string, tmp_error->message); g_error_free (tmp_error); pixbuf = _gdk_pixbuf_new_from_resource (IMAGE_MISSING_RESOURCE_PATH, "png", NULL); } - if (pixbuf) - { - if (G_VALUE_HOLDS (value, GDK_TYPE_TEXTURE) || - G_VALUE_HOLDS (value, GDK_TYPE_PAINTABLE)) - { - GdkTexture *texture = gdk_texture_new_for_pixbuf (pixbuf); - g_value_set_object (value, texture); - g_object_unref (texture); - } - else - { - g_value_set_object (value, pixbuf); - } - g_object_unref (G_OBJECT (pixbuf)); - } + g_value_take_object (value, pixbuf); g_free (filename); |