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
This commit is contained in:
Cosimo Cecchi 2015-06-08 16:35:31 -07:00 committed by Cosimo Cecchi
parent e847c27aac
commit 06df94ff7b

View File

@ -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,