summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2014-09-09 14:52:38 -0700
committerCosimo Cecchi <cosimoc@gnome.org>2014-09-09 15:49:12 -0700
commite25858da5f5e257717dcde0d0f3716b26180740a (patch)
treecb7962b0757131de029b825c01e5e238b100b9b0
parent9f49a745fa1097ddddae9c9fbcdbb0c73925d108 (diff)
downloadnautilus-e25858da5f5e257717dcde0d0f3716b26180740a.tar.gz
file: move icon thumbnailing code to a separate function
This will help to finally clean up nautilus_file_get_icon()
-rw-r--r--libnautilus-private/nautilus-file.c206
1 files changed, 113 insertions, 93 deletions
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 9d313eb33..eefc28cd7 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -4420,6 +4420,106 @@ nautilus_file_get_thumbnail_path (NautilusFile *file)
return g_strdup (file->details->thumbnail_path);
}
+static NautilusIconInfo *
+nautilus_file_get_thumbnail_icon (NautilusFile *file,
+ int size,
+ int scale,
+ NautilusFileIconFlags flags)
+{
+ int modified_size;
+ GdkPixbuf *raw_pixbuf, *scaled_pixbuf;
+ int w, h, s;
+ double thumb_scale;
+ GIcon *gicon;
+ NautilusIconInfo *icon;
+
+ icon = NULL;
+
+ if (flags & NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE) {
+ modified_size = size * scale;
+ } else {
+ modified_size = size * scale * cached_thumbnail_size / NAUTILUS_ICON_SIZE_STANDARD;
+ DEBUG ("Modifying icon size to %d, as our cached thumbnail size is %d",
+ modified_size, cached_thumbnail_size);
+ }
+
+ if (file->details->thumbnail) {
+ raw_pixbuf = g_object_ref (file->details->thumbnail);
+
+ w = gdk_pixbuf_get_width (raw_pixbuf);
+ h = gdk_pixbuf_get_height (raw_pixbuf);
+
+ s = MAX (w, h);
+ /* Don't scale up small thumbnails in the standard view */
+ if (s <= cached_thumbnail_size) {
+ thumb_scale = (double) size / NAUTILUS_ICON_SIZE_STANDARD;
+ } else {
+ thumb_scale = (double) modified_size / s;
+ }
+
+ /* Make sure that icons don't get smaller than NAUTILUS_ICON_SIZE_SMALLEST */
+ if (s * thumb_scale <= NAUTILUS_ICON_SIZE_SMALLEST) {
+ thumb_scale = (double) NAUTILUS_ICON_SIZE_SMALLEST / s;
+ }
+
+ 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);
+
+ /* Don't scale up if more than 25%, then read the original
+ image instead. We don't want to compare to exactly 100%,
+ since the zoom level 150% gives thumbnails at 144, which is
+ ok to scale up from 128. */
+ if (modified_size > 128 * 1.25 * scale &&
+ !file->details->thumbnail_wants_original &&
+ nautilus_can_thumbnail_internally (file)) {
+ /* Invalidate if we resize upward */
+ file->details->thumbnail_wants_original = TRUE;
+ nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL);
+ }
+
+ 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);
+ } else if (file->details->thumbnail_path == NULL &&
+ file->details->can_read &&
+ !file->details->is_thumbnailing &&
+ !file->details->thumbnailing_failed &&
+ nautilus_can_thumbnail (file)) {
+ nautilus_create_thumbnail (file);
+ }
+
+ if (icon == NULL && file->details->is_thumbnailing) {
+ gicon = g_themed_icon_new (ICON_NAME_THUMBNAIL_LOADING);
+ icon = nautilus_icon_info_lookup (gicon, size, scale);
+ g_object_unref (gicon);
+ }
+
+ return icon;
+}
+
NautilusIconInfo *
nautilus_file_get_icon (NautilusFile *file,
int size,
@@ -4428,14 +4528,15 @@ nautilus_file_get_icon (NautilusFile *file,
{
NautilusIconInfo *icon;
GIcon *gicon;
- GdkPixbuf *raw_pixbuf, *scaled_pixbuf;
- int modified_size;
+
+ icon = NULL;
if (file == NULL) {
- return NULL;
+ goto out;
}
gicon = get_custom_icon (file);
+
if (gicon == NULL) {
gicon = get_link_icon (file);
}
@@ -4444,111 +4545,30 @@ nautilus_file_get_icon (NautilusFile *file,
icon = nautilus_icon_info_lookup (gicon, size, scale);
g_object_unref (gicon);
- return icon;
+ goto out;
}
DEBUG ("Called file_get_icon(), at size %d, force thumbnail %d", size,
flags & NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE);
-
- if (flags & NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE) {
- modified_size = size * scale;
- } else {
- modified_size = size * scale * cached_thumbnail_size / NAUTILUS_ICON_SIZE_STANDARD;
- DEBUG ("Modifying icon size to %d, as our cached thumbnail size is %d",
- modified_size, cached_thumbnail_size);
- }
if (flags & NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS &&
nautilus_file_should_show_thumbnail (file)) {
- if (file->details->thumbnail) {
- int w, h, s;
- double thumb_scale;
-
- raw_pixbuf = g_object_ref (file->details->thumbnail);
-
- w = gdk_pixbuf_get_width (raw_pixbuf);
- h = gdk_pixbuf_get_height (raw_pixbuf);
-
- s = MAX (w, h);
- /* Don't scale up small thumbnails in the standard view */
- if (s <= cached_thumbnail_size) {
- thumb_scale = (double)size / NAUTILUS_ICON_SIZE_STANDARD;
- }
- else {
- thumb_scale = (double)modified_size / s;
- }
- /* Make sure that icons don't get smaller than NAUTILUS_ICON_SIZE_SMALLEST */
- if (s*thumb_scale <= NAUTILUS_ICON_SIZE_SMALLEST) {
- thumb_scale = (double) NAUTILUS_ICON_SIZE_SMALLEST / s;
- }
-
- 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);
-
- /* Don't scale up if more than 25%, then read the original
- image instead. We don't want to compare to exactly 100%,
- since the zoom level 150% gives thumbnails at 144, which is
- ok to scale up from 128. */
- if (modified_size > 128 * 1.25 * scale &&
- !file->details->thumbnail_wants_original &&
- nautilus_can_thumbnail_internally (file)) {
- /* Invalidate if we resize upward */
- file->details->thumbnail_wants_original = TRUE;
- nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL);
- }
-
- DEBUG ("Returning thumbnailed image, at size %d %d",
- (int) (w * thumb_scale), (int) (h * thumb_scale));
-
- 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 &&
- !file->details->thumbnailing_failed) {
- if (nautilus_can_thumbnail (file)) {
- nautilus_create_thumbnail (file);
- }
- }
+ icon = nautilus_file_get_thumbnail_icon (file, size, scale, flags);
}
- if (file->details->is_thumbnailing &&
- flags & NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS)
- gicon = g_themed_icon_new (ICON_NAME_THUMBNAIL_LOADING);
- else
+ if (icon == NULL) {
gicon = nautilus_file_get_gicon (file, flags);
-
- if (gicon) {
icon = nautilus_icon_info_lookup (gicon, size, scale);
+ g_object_unref (gicon);
+
if (nautilus_icon_info_is_fallback (icon)) {
g_object_unref (icon);
- icon = nautilus_icon_info_lookup (get_default_file_icon (flags), size, scale);
+ icon = nautilus_icon_info_lookup (get_default_file_icon (), size, scale);
}
- g_object_unref (gicon);
- return icon;
- } else {
- return nautilus_icon_info_lookup (get_default_file_icon (flags), size, scale);
}
+
+ out:
+ return icon;
}
GdkPixbuf *