/** * gimp_thumbnail_save_thumb_local: * @thumbnail: a #GimpThumbnail object * @pixbuf: a #GdkPixbuf representing the preview thumbnail * @software: a string describing the software saving the thumbnail * @error: return location for possible errors * * Saves a preview thumbnail for the image associated with @thumbnail * to the local thumbnail repository. Local thumbnails have been added * with version 0.7 of the spec. * * Please see also gimp_thumbnail_save_thumb(). The notes made there * apply here as well. * * Return value: %TRUE if a thumbnail was successfully written, * %FALSE otherwise * * Since: 2.2 **/ gboolean gimp_thumbnail_save_thumb_local (GimpThumbnail *thumbnail, GdkPixbuf *pixbuf, const gchar *software, GError **error) { GimpThumbSize size; gchar *name; gchar *filename; gchar *dirname; gboolean success; g_return_val_if_fail (GIMP_IS_THUMBNAIL (thumbnail), FALSE); g_return_val_if_fail (thumbnail->image_uri != NULL, FALSE); g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), FALSE); g_return_val_if_fail (software != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); GIMP_THUMB_DEBUG_CALL (thumbnail); size = MAX (gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf)); if (size < 1) return TRUE; filename = _gimp_thumb_filename_from_uri (thumbnail->image_uri); if (! filename) return TRUE; dirname = g_path_get_dirname (filename); g_free (filename); name = gimp_thumb_name_from_uri_local (thumbnail->image_uri, size); if (! name) { g_free (dirname); return TRUE; } if (! gimp_thumb_ensure_thumb_dir_local (dirname, size, error)) { g_free (name); g_free (dirname); return FALSE; } g_free (dirname); success = gimp_thumbnail_save (thumbnail, size, name, pixbuf, software, error); g_free (name); return success; }
/** * gimp_thumb_name_from_uri_local: * @uri: an escaped URI * @size: a #GimpThumbSize * * Creates the name of a local thumbnail file of the specified @size * that belongs to an image file located at the given @uri. Local * thumbnails have been introduced with version 0.7 of the spec. * * Return value: a newly allocated filename in the encoding of the * filesystem or %NULL if @uri is a remote file or * points to the user's thumbnail repository. * * Since: GIMP 2.2 **/ gchar * gimp_thumb_name_from_uri_local (const gchar *uri, GimpThumbSize size) { gchar *filename; gchar *result = NULL; g_return_val_if_fail (gimp_thumb_initialized, NULL); g_return_val_if_fail (uri != NULL, NULL); g_return_val_if_fail (size > GIMP_THUMB_SIZE_FAIL, NULL); if (strstr (uri, thumb_dir)) return NULL; filename = _gimp_thumb_filename_from_uri (uri); if (filename) { const gchar *baseuri = strrchr (uri, '/'); if (baseuri && baseuri[0] && baseuri[1]) { gchar *dirname = g_path_get_dirname (filename); gint i = gimp_thumb_size (size); result = g_build_filename (dirname, ".thumblocal", thumb_sizenames[i], gimp_thumb_png_name (uri), NULL); g_free (dirname); } g_free (filename); } return result; }
/** * gimp_thumb_find_thumb: * @uri: an escaped URI * @size: pointer to a #GimpThumbSize * * This function attempts to locate a thumbnail for the given * @uri. First it tries the size that is stored at @size. If no * thumbnail of that size is found, it will look for a larger * thumbnail, then falling back to a smaller size. * * If the user's thumbnail repository doesn't provide a thumbnail but * a local thumbnail repository exists for the folder the image is * located in, the same search is done among the local thumbnails (if * there are any). * * If a thumbnail is found, it's size is written to the variable * pointer to by @size and the file location is returned. * * Return value: a newly allocated string in the encoding of the * filesystem or %NULL if no thumbnail for @uri was found **/ gchar * gimp_thumb_find_thumb (const gchar *uri, GimpThumbSize *size) { gchar *result; g_return_val_if_fail (gimp_thumb_initialized, NULL); g_return_val_if_fail (uri != NULL, NULL); g_return_val_if_fail (size != NULL, NULL); g_return_val_if_fail (*size > GIMP_THUMB_SIZE_FAIL, NULL); result = gimp_thumb_png_lookup (gimp_thumb_png_name (uri), NULL, size); if (! result) { gchar *filename = _gimp_thumb_filename_from_uri (uri); if (filename) { const gchar *baseuri = strrchr (uri, '/'); if (baseuri && baseuri[0] && baseuri[1]) { gchar *dirname = g_path_get_dirname (filename); result = gimp_thumb_png_lookup (gimp_thumb_png_name (baseuri + 1), dirname, size); g_free (dirname); } g_free (filename); } } return result; }
static void gimp_thumbnail_update_image (GimpThumbnail *thumbnail) { GimpThumbState state; gint64 mtime = 0; gint64 filesize = 0; if (! thumbnail->image_uri) return; state = thumbnail->image_state; switch (state) { case GIMP_THUMB_STATE_UNKNOWN: g_return_if_fail (thumbnail->image_filename == NULL); thumbnail->image_filename = _gimp_thumb_filename_from_uri (thumbnail->image_uri); if (! thumbnail->image_filename) state = GIMP_THUMB_STATE_REMOTE; break; case GIMP_THUMB_STATE_REMOTE: break; default: g_return_if_fail (thumbnail->image_filename != NULL); break; } switch (state) { case GIMP_THUMB_STATE_REMOTE: break; default: switch (gimp_thumb_file_test (thumbnail->image_filename, &mtime, &filesize, &thumbnail->image_not_found_errno)) { case GIMP_THUMB_FILE_TYPE_REGULAR: state = GIMP_THUMB_STATE_EXISTS; break; case GIMP_THUMB_FILE_TYPE_FOLDER: state = GIMP_THUMB_STATE_FOLDER; break; case GIMP_THUMB_FILE_TYPE_SPECIAL: state = GIMP_THUMB_STATE_SPECIAL; break; default: state = GIMP_THUMB_STATE_NOT_FOUND; break; } break; } if (state != thumbnail->image_state) { g_object_set (thumbnail, "image-state", state, NULL); } if (mtime != thumbnail->image_mtime || filesize != thumbnail->image_filesize) { g_object_set (thumbnail, "image-mtime", mtime, "image-filesize", filesize, NULL); if (thumbnail->thumb_state == GIMP_THUMB_STATE_OK) g_object_set (thumbnail, "thumb-state", GIMP_THUMB_STATE_OLD, NULL); } }