summaryrefslogtreecommitdiff
path: root/libnautilus-extensions/nautilus-icon-factory.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnautilus-extensions/nautilus-icon-factory.c')
-rw-r--r--libnautilus-extensions/nautilus-icon-factory.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/libnautilus-extensions/nautilus-icon-factory.c b/libnautilus-extensions/nautilus-icon-factory.c
index 2d29c58d6..5db4b6f20 100644
--- a/libnautilus-extensions/nautilus-icon-factory.c
+++ b/libnautilus-extensions/nautilus-icon-factory.c
@@ -1389,7 +1389,6 @@ load_specific_image_svg (const char *path, guint size_in_pixels)
if (f == NULL) {
return NULL;
}
- /* nominal vector icon is twice the size of nominal bitmap, so scale it down here */
result = rsvg_render_file (f, size_in_pixels *
(1.0 / NAUTILUS_ICON_SIZE_STANDARD));
fclose (f);
@@ -1427,6 +1426,8 @@ load_specific_image (NautilusScalableIcon *scalable_icon,
ArtIRect *text_rect)
{
char *image_path;
+ GdkPixbuf *pixbuf;
+
g_assert (text_rect != NULL);
if (custom) {
@@ -1434,21 +1435,20 @@ load_specific_image (NautilusScalableIcon *scalable_icon,
memset (text_rect, 0, sizeof (*text_rect));
- /* FIXME bugzilla.eazel.com 643: This works only with
- * file:// images, because there's no convenience
- * function for loading an image with gnome-vfs and
- * gdk-pixbuf. And there's the same problem with the
- * rsvg_render_file library.
+ /* FIXME bugzilla.eazel.com 643: we can't load svgs asynchronously, so this
+ * only works for local files
*/
- image_path = nautilus_get_local_path_from_uri (scalable_icon->uri);
- if (image_path != NULL) {
- if (path_represents_svg_image (image_path)) {
- return load_specific_image_svg (image_path, size_in_pixels);
- }
- if (size_in_pixels == NAUTILUS_ICON_SIZE_STANDARD) {
- return gdk_pixbuf_new_from_file (image_path);
- }
- g_free(image_path);
+
+ /* we use the suffix instead of mime-type here since it may be non-local */
+ if (nautilus_str_has_suffix (scalable_icon->uri, ".svg")) {
+ image_path = nautilus_get_local_path_from_uri (scalable_icon->uri);
+ pixbuf = load_specific_image_svg (image_path, size_in_pixels);
+ g_free (image_path);
+ return pixbuf;
+ }
+
+ if (size_in_pixels == NAUTILUS_ICON_SIZE_STANDARD && scalable_icon->uri != NULL) {
+ return nautilus_gdk_pixbuf_load (scalable_icon->uri);
}
return NULL;
@@ -2348,7 +2348,6 @@ nautilus_icon_factory_make_thumbnails (gpointer data)
GList *next_thumbnail = factory->thumbnails;
/* if the queue is empty, there's nothing more to do */
-
if (next_thumbnail == NULL) {
gtk_timeout_remove (factory->timeout_task_id);
factory->timeout_task_id = 0;
@@ -2374,11 +2373,26 @@ nautilus_icon_factory_make_thumbnails (gpointer data)
/* fork a task to make the thumbnail, using gdk-pixbuf to do the scaling */
if (!(thumbnail_pid = fork())) {
GdkPixbuf* full_size_image;
+ NautilusFile *file;
char *thumbnail_path;
- thumbnail_path = nautilus_get_local_path_from_uri (info->thumbnail_uri);
- full_size_image = gdk_pixbuf_new_from_file (thumbnail_path);
- g_free (thumbnail_path);
+ file = nautilus_file_get (info->thumbnail_uri);
+ full_size_image = NULL;
+
+ if (nautilus_file_is_mime_type (file, "image/svg")) {
+ thumbnail_path = nautilus_get_local_path_from_uri (info->thumbnail_uri);
+ if (thumbnail_path != NULL) {
+ FILE *f = fopen (thumbnail_path, "rb");
+ if (f != NULL) {
+ full_size_image = rsvg_render_file (f, 1.0);
+ fclose (f);
+ }
+ }
+ } else {
+ if (info->thumbnail_uri != NULL)
+ full_size_image = nautilus_gdk_pixbuf_load (info->thumbnail_uri);
+ }
+ nautilus_file_unref (file);
if (full_size_image != NULL) {
GdkPixbuf *scaled_image, *framed_image;