summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2017-03-29 19:26:18 +0200
committerTimm Bäder <mail@baedert.org>2017-03-30 17:46:11 +0200
commitdf0dcbe9392c494e2cf9a7c547a6e56a3cda7a3d (patch)
tree05d1996b50996a7cbcffef3678caa7efedc95a99
parentffd1579a93e747e1eaf271c317196f1675520c43 (diff)
downloadgtk+-df0dcbe9392c494e2cf9a7c547a6e56a3cda7a3d.tar.gz
cssimageicontheme: Cache size + texturewip/baedert/widget-templates
-rw-r--r--gtk/gtkcssimageicontheme.c77
-rw-r--r--gtk/gtkcssimageiconthemeprivate.h3
2 files changed, 50 insertions, 30 deletions
diff --git a/gtk/gtkcssimageicontheme.c b/gtk/gtkcssimageicontheme.c
index da6d9fa536..7d9667b3b2 100644
--- a/gtk/gtkcssimageicontheme.c
+++ b/gtk/gtkcssimageicontheme.c
@@ -46,10 +46,7 @@ gtk_css_image_icon_theme_snapshot (GtkCssImage *image,
double height)
{
GtkCssImageIconTheme *icon_theme = GTK_CSS_IMAGE_ICON_THEME (image);
- GError *error = NULL;
- GtkIconInfo *icon_info;
GskTexture *texture;
- GdkPixbuf *pixbuf;
double texture_width, texture_height;
gint size;
@@ -57,34 +54,54 @@ gtk_css_image_icon_theme_snapshot (GtkCssImage *image,
if (size <= 0)
return;
- icon_info = gtk_icon_theme_lookup_icon_for_scale (icon_theme->icon_theme,
- icon_theme->name,
- size,
- icon_theme->scale,
- GTK_ICON_LOOKUP_USE_BUILTIN);
- if (icon_info == NULL)
+ if (size == icon_theme->cached_size &&
+ icon_theme->cached_texture != NULL)
{
- /* XXX: render missing icon image here? */
- return;
+ texture = icon_theme->cached_texture;
}
-
- pixbuf = gtk_icon_info_load_symbolic (icon_info,
- &icon_theme->color,
- &icon_theme->success,
- &icon_theme->warning,
- &icon_theme->error,
- NULL,
- &error);
- if (pixbuf == NULL)
+ else
{
- /* XXX: render missing icon image here? */
- g_error_free (error);
- return;
+ GError *error = NULL;
+ GtkIconInfo *icon_info;
+ GdkPixbuf *pixbuf;
+
+ icon_info = gtk_icon_theme_lookup_icon_for_scale (icon_theme->icon_theme,
+ icon_theme->name,
+ size,
+ icon_theme->scale,
+ GTK_ICON_LOOKUP_USE_BUILTIN);
+ if (icon_info == NULL)
+ {
+ /* XXX: render missing icon image here? */
+ return;
+ }
+
+ pixbuf = gtk_icon_info_load_symbolic (icon_info,
+ &icon_theme->color,
+ &icon_theme->success,
+ &icon_theme->warning,
+ &icon_theme->error,
+ NULL,
+ &error);
+ if (pixbuf == NULL)
+ {
+ /* XXX: render missing icon image here? */
+ g_error_free (error);
+ return;
+ }
+
+ texture = gsk_texture_new_for_pixbuf (pixbuf);
+
+ g_clear_object (&icon_theme->cached_texture);
+ icon_theme->cached_size = size;
+ icon_theme->cached_texture = texture;
+
+ g_object_unref (pixbuf);
+ g_object_unref (icon_info);
}
- texture = gsk_texture_new_for_pixbuf (pixbuf);
- texture_width = (double) gdk_pixbuf_get_width (pixbuf) / icon_theme->scale;
- texture_height = (double) gdk_pixbuf_get_height (pixbuf) / icon_theme->scale;
+ texture_width = (double) gsk_texture_get_width (texture) / icon_theme->scale;
+ texture_height = (double) gsk_texture_get_height (texture) / icon_theme->scale;
gtk_snapshot_append_texture (snapshot,
texture,
@@ -95,10 +112,6 @@ gtk_css_image_icon_theme_snapshot (GtkCssImage *image,
texture_height
),
"CssImageIconTheme<%s@%d>", icon_theme->name, icon_theme->scale);
-
- g_object_unref (texture);
- g_object_unref (pixbuf);
- g_object_unref (icon_info);
}
@@ -175,6 +188,8 @@ gtk_css_image_icon_theme_dispose (GObject *object)
g_free (icon_theme->name);
icon_theme->name = NULL;
+ g_clear_object (&icon_theme->cached_texture);
+
G_OBJECT_CLASS (_gtk_css_image_icon_theme_parent_class)->dispose (object);
}
@@ -199,5 +214,7 @@ _gtk_css_image_icon_theme_init (GtkCssImageIconTheme *icon_theme)
{
icon_theme->icon_theme = gtk_icon_theme_get_default ();
icon_theme->scale = 1;
+ icon_theme->cached_size = -1;
+ icon_theme->cached_texture = NULL;
}
diff --git a/gtk/gtkcssimageiconthemeprivate.h b/gtk/gtkcssimageiconthemeprivate.h
index 07d1f8e4ff..9131272195 100644
--- a/gtk/gtkcssimageiconthemeprivate.h
+++ b/gtk/gtkcssimageiconthemeprivate.h
@@ -46,6 +46,9 @@ struct _GtkCssImageIconTheme
GdkRGBA error;
gint scale;
char *name;
+
+ int cached_size;
+ GskTexture *cached_texture;
};
struct _GtkCssImageIconThemeClass