summaryrefslogtreecommitdiff
path: root/gtk/gtkicontheme.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimo@endlessm.com>2015-06-08 16:35:31 -0700
committerCosimo Cecchi <cosimoc@gnome.org>2015-06-12 08:55:23 -0700
commit06df94ff7bf8fe924226c5a5f3223c2fcf27ee10 (patch)
treef9f8e747485787de5a3749066b891b07e20a10c0 /gtk/gtkicontheme.c
parente847c27aac17feed799ae14aeac90d68165a322e (diff)
downloadgtk+-06df94ff7bf8fe924226c5a5f3223c2fcf27ee10.tar.gz
icontheme: don't modify symbolic SVG dimensions when recoloring
When recoloring symbolic SVG, do not modify the original width and height of the passed-in file; the function later will scale the image through gdk_pixbuf_new_from_stream_at_scale(), but we should still use the original size to create the proxy SVG, or the image will possibly be doubly-resized or blurry. https://bugzilla.gnome.org/show_bug.cgi?id=750605
Diffstat (limited to 'gtk/gtkicontheme.c')
-rw-r--r--gtk/gtkicontheme.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index c2ca2da1b8..eebe954798 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -264,7 +264,8 @@ struct _GtkIconInfo
SymbolicPixbufCache *symbolic_pixbuf_cache;
- gint symbolic_size;
+ gint symbolic_width;
+ gint symbolic_height;
};
typedef struct
@@ -3468,7 +3469,8 @@ icon_info_dup (GtkIconInfo *icon_info)
dup->is_resource = icon_info->is_resource;
dup->min_size = icon_info->min_size;
dup->max_size = icon_info->max_size;
- dup->symbolic_size = icon_info->symbolic_size;
+ dup->symbolic_width = icon_info->symbolic_width;
+ dup->symbolic_height = icon_info->symbolic_height;
return dup;
}
@@ -4407,9 +4409,11 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo *icon_info,
gchar *css_warning;
gchar *css_error;
gchar *data;
- gchar *size;
+ gchar *width;
+ gchar *height;
gchar *file_data, *escaped_file_data;
gsize file_len;
+ gint symbolic_size;
double alpha;
gchar alphastr[G_ASCII_DTOSTR_BUF_SIZE];
@@ -4440,7 +4444,8 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo *icon_info,
if (!icon_info_ensure_scale_and_pixbuf (icon_info))
return NULL;
- if (icon_info->symbolic_size == 0)
+ if (icon_info->symbolic_width == 0 ||
+ icon_info->symbolic_height == 0)
{
/* Fetch size from the original icon */
stream = g_memory_input_stream_new_from_data (file_data, file_len, NULL);
@@ -4450,22 +4455,26 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo *icon_info,
if (!pixbuf)
return NULL;
- icon_info->symbolic_size = MAX (gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf));
+ icon_info->symbolic_width = gdk_pixbuf_get_width (pixbuf);
+ icon_info->symbolic_height = gdk_pixbuf_get_height (pixbuf);
g_object_unref (pixbuf);
}
+ symbolic_size = MAX (icon_info->symbolic_width, icon_info->symbolic_height);
+
GTK_NOTE (ICONTHEME,
if (icon_info->dir_type == ICON_THEME_DIR_UNTHEMED)
g_print ("Symbolic icon %s is not in an icon theme directory",
icon_info->key.icon_names ? icon_info->key.icon_names[0] : icon_info->filename);
- else if (icon_info->dir_size * icon_info->dir_scale != icon_info->symbolic_size)
+ else if (icon_info->dir_size * icon_info->dir_scale != symbolic_size)
g_print ("Symbolic icon %s of size %d is in an icon theme directory of size %d",
icon_info->key.icon_names ? icon_info->key.icon_names[0] : icon_info->filename,
- icon_info->symbolic_size,
+ symbolic_size,
icon_info->dir_size * icon_info->dir_scale)
);
- size = g_strdup_printf ("%d", icon_info->symbolic_size);
+ width = g_strdup_printf ("%d", icon_info->symbolic_width);
+ height = g_strdup_printf ("%d", icon_info->symbolic_height);
escaped_file_data = g_markup_escape_text (file_data, file_len);
g_free (file_data);
@@ -4476,8 +4485,8 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo *icon_info,
"<svg version=\"1.1\"\n"
" xmlns=\"http://www.w3.org/2000/svg\"\n"
" xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n"
- " width=\"", size, "\"\n"
- " height=\"", size, "\">\n"
+ " width=\"", width, "\"\n"
+ " height=\"", height, "\">\n"
" <style type=\"text/css\">\n"
" rect,path {\n"
" fill: ", css_fg," !important;\n"
@@ -4500,7 +4509,8 @@ gtk_icon_info_load_symbolic_svg (GtkIconInfo *icon_info,
g_free (css_warning);
g_free (css_error);
g_free (css_success);
- g_free (size);
+ g_free (width);
+ g_free (height);
stream = g_memory_input_stream_new_from_data (data, -1, g_free);
pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,