summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2014-08-30 19:26:38 -0700
committerCosimo Cecchi <cosimoc@gnome.org>2014-09-01 15:31:18 -0700
commitcbee96ac593dd35f4e10d88085e4feec2c569a9b (patch)
tree981deff0701df68f3ddffcac7a67140af60814a9
parent01bea94ea3b002de90c791a99d5e6894d4d512d1 (diff)
downloadnautilus-cbee96ac593dd35f4e10d88085e4feec2c569a9b.tar.gz
file: keep scaled thumbnail in cache
Or we'll constantly re-scale it every time a client asks for the icon.
-rw-r--r--libnautilus-private/nautilus-directory-async.c5
-rw-r--r--libnautilus-private/nautilus-file-private.h5
-rw-r--r--libnautilus-private/nautilus-file.c39
3 files changed, 34 insertions, 15 deletions
diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c
index 251081ff2..afc41b297 100644
--- a/libnautilus-private/nautilus-directory-async.c
+++ b/libnautilus-private/nautilus-directory-async.c
@@ -3467,6 +3467,11 @@ thumbnail_done (NautilusDirectory *directory,
g_object_unref (file->details->thumbnail);
file->details->thumbnail = NULL;
}
+ if (file->details->scaled_thumbnail) {
+ g_object_unref (file->details->scaled_thumbnail);
+ file->details->scaled_thumbnail = NULL;
+ }
+
if (pixbuf) {
if (tried_original) {
thumb_mtime = file->details->mtime;
diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h
index 28a460101..5dd41baed 100644
--- a/libnautilus-private/nautilus-file-private.h
+++ b/libnautilus-private/nautilus-file-private.h
@@ -91,7 +91,10 @@ struct NautilusFileDetails
char *thumbnail_path;
GdkPixbuf *thumbnail;
time_t thumbnail_mtime;
-
+
+ GdkPixbuf *scaled_thumbnail;
+ double thumbnail_scale;
+
GList *mime_list; /* If this is a directory, the list of MIME types in it. */
/* Info you might get from a link (.desktop, .directory or nautilus link) */
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 80137beb9..466023ef5 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -804,6 +804,10 @@ finalize (GObject *object)
if (file->details->thumbnail) {
g_object_unref (file->details->thumbnail);
}
+ if (file->details->scaled_thumbnail) {
+ g_object_unref (file->details->scaled_thumbnail);
+ }
+
if (file->details->mount) {
g_signal_handlers_disconnect_by_func (file->details->mount, file_mount_unmounted, file);
g_object_unref (file->details->mount);
@@ -4297,17 +4301,26 @@ nautilus_file_get_icon (NautilusFile *file,
thumb_scale = (double) NAUTILUS_ICON_SIZE_SMALLEST / s;
}
- scaled_pixbuf = gdk_pixbuf_scale_simple (raw_pixbuf,
- MAX (w * thumb_scale, 1),
- MAX (h * thumb_scale, 1),
- GDK_INTERP_BILINEAR);
-
- /* We don't want frames around small icons */
- if (!gdk_pixbuf_get_has_alpha (raw_pixbuf) || s >= 128 * scale) {
- if (nautilus_is_video_file (file))
- nautilus_ui_frame_video (&scaled_pixbuf);
- else
- nautilus_ui_frame_image (&scaled_pixbuf);
+ if (file->details->thumbnail_scale == thumb_scale &&
+ file->details->scaled_thumbnail != NULL) {
+ scaled_pixbuf = file->details->scaled_thumbnail;
+ } else {
+ scaled_pixbuf = gdk_pixbuf_scale_simple (raw_pixbuf,
+ MAX (w * thumb_scale, 1),
+ MAX (h * thumb_scale, 1),
+ GDK_INTERP_BILINEAR);
+
+ /* We don't want frames around small icons */
+ if (!gdk_pixbuf_get_has_alpha (raw_pixbuf) || s >= 128 * scale) {
+ if (nautilus_is_video_file (file))
+ nautilus_ui_frame_video (&scaled_pixbuf);
+ else
+ nautilus_ui_frame_image (&scaled_pixbuf);
+ }
+
+ g_clear_object (&file->details->scaled_thumbnail);
+ file->details->scaled_thumbnail = scaled_pixbuf;
+ file->details->thumbnail_scale = thumb_scale;
}
g_object_unref (raw_pixbuf);
@@ -4327,9 +4340,7 @@ nautilus_file_get_icon (NautilusFile *file,
DEBUG ("Returning thumbnailed image, at size %d %d",
(int) (w * thumb_scale), (int) (h * thumb_scale));
- icon = nautilus_icon_info_new_for_pixbuf (scaled_pixbuf, scale);
- g_object_unref (scaled_pixbuf);
- return icon;
+ return nautilus_icon_info_new_for_pixbuf (scaled_pixbuf, scale);
} else if (file->details->thumbnail_path == NULL &&
file->details->can_read &&
!file->details->is_thumbnailing &&