forked from AuroraMiddleware/gtk
GtkIconTheme: Don't treat svg icons specially
This changes makes svg icons go through the same scale calculation code as png icons. As a consequence, an svg that is put into the 32x32 directory will actually be loaded at size 32, even if it gets requested at a bigger size. This will let us avoid giant spinners. https://bugzilla.gnome.org/show_bug.cgi?id=731658
This commit is contained in:
parent
84cf748eae
commit
fea939b3d7
@ -3895,39 +3895,6 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_svg)
|
|
||||||
{
|
|
||||||
GInputStream *stream;
|
|
||||||
|
|
||||||
icon_info->scale = scaled_desired_size / 1000.;
|
|
||||||
|
|
||||||
if (scale_only)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
/* TODO: We should have a load_at_scale */
|
|
||||||
stream = g_loadable_icon_load (icon_info->loadable,
|
|
||||||
scaled_desired_size,
|
|
||||||
NULL, NULL,
|
|
||||||
&icon_info->load_error);
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
icon_info->pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
|
|
||||||
scaled_desired_size,
|
|
||||||
scaled_desired_size,
|
|
||||||
TRUE,
|
|
||||||
NULL,
|
|
||||||
&icon_info->load_error);
|
|
||||||
g_object_unref (stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!icon_info->pixbuf)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
apply_emblems (icon_info);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* In many cases, the scale can be determined without actual access
|
/* In many cases, the scale can be determined without actual access
|
||||||
* to the icon file. This is generally true when we have a size
|
* to the icon file. This is generally true when we have a size
|
||||||
* for the directory where the icon is; the image size doesn't
|
* for the directory where the icon is; the image size doesn't
|
||||||
@ -3951,7 +3918,7 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
|
|||||||
icon_info->scale = (gdouble) scaled_desired_size / (icon_info->dir_size * icon_info->dir_scale);
|
icon_info->scale = (gdouble) scaled_desired_size / (icon_info->dir_size * icon_info->dir_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (icon_info->scale >= 0. && scale_only)
|
if (icon_info->scale >= 0. && scale_only && !is_svg)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* At this point, we need to actually get the icon; either from the
|
/* At this point, we need to actually get the icon; either from the
|
||||||
@ -3971,9 +3938,20 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
|
|||||||
&icon_info->load_error);
|
&icon_info->load_error);
|
||||||
if (stream)
|
if (stream)
|
||||||
{
|
{
|
||||||
source_pixbuf = gdk_pixbuf_new_from_stream (stream,
|
if (is_svg)
|
||||||
NULL,
|
{
|
||||||
&icon_info->load_error);
|
gint size = icon_info->dir_size * icon_info->dir_scale * icon_info->scale;
|
||||||
|
source_pixbuf = gdk_pixbuf_new_from_stream_at_scale (stream,
|
||||||
|
size,
|
||||||
|
size,
|
||||||
|
TRUE,
|
||||||
|
NULL,
|
||||||
|
&icon_info->load_error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
source_pixbuf = gdk_pixbuf_new_from_stream (stream,
|
||||||
|
NULL,
|
||||||
|
&icon_info->load_error);
|
||||||
g_object_unref (stream);
|
g_object_unref (stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3986,7 +3964,12 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
|
|||||||
image_width = gdk_pixbuf_get_width (source_pixbuf);
|
image_width = gdk_pixbuf_get_width (source_pixbuf);
|
||||||
image_height = gdk_pixbuf_get_height (source_pixbuf);
|
image_height = gdk_pixbuf_get_height (source_pixbuf);
|
||||||
|
|
||||||
if (icon_info->scale < 0.0)
|
if (is_svg)
|
||||||
|
{
|
||||||
|
gint image_size = MAX (image_width, image_height);
|
||||||
|
icon_info->scale = image_size / 1000.;
|
||||||
|
}
|
||||||
|
else if (icon_info->scale < 0.0)
|
||||||
{
|
{
|
||||||
gint image_size = MAX (image_width, image_height);
|
gint image_size = MAX (image_width, image_height);
|
||||||
if (image_size > 0)
|
if (image_size > 0)
|
||||||
@ -4006,7 +3989,9 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
|
|||||||
* extra complexity, we could keep the source pixbuf around
|
* extra complexity, we could keep the source pixbuf around
|
||||||
* but not actually scale it until needed.
|
* but not actually scale it until needed.
|
||||||
*/
|
*/
|
||||||
if (icon_info->scale == 1.0)
|
if (is_svg)
|
||||||
|
icon_info->pixbuf = source_pixbuf;
|
||||||
|
else if (icon_info->scale == 1.0)
|
||||||
icon_info->pixbuf = source_pixbuf;
|
icon_info->pixbuf = source_pixbuf;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user