X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/90e25247d8aaecef70a0bb6d6717867a7d0462e2..c2cf03332f51a9fa992220124635f737399fba91:/src/thumbnails.c diff --git a/src/thumbnails.c b/src/thumbnails.c index 5b06f625..40914049 100644 --- a/src/thumbnails.c +++ b/src/thumbnails.c @@ -26,13 +26,21 @@ * */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include -#include +#ifdef HAVE_UNISTD_H +#include +#endif #include #include +#include +#include #include "viking.h" #include "thumbnails.h" -#include "thumbnails_pixbuf.h" +#include "icons/icons.h" #ifdef __CYGWIN__ #ifdef __CYGWIN_USE_BIG_TYPES__ @@ -47,21 +55,17 @@ #undef MIN /* quit yer whining, gcc */ #undef MAX -#include /* for realpath() */ #ifndef MAX /* We need MAX macro and some system does not offer it */ #define MAX(a,b) (((a)>(b))?(a):(b)) #endif +#define HOME_DIR g_get_home_dir() + #ifdef WINDOWS -#define HOME_DIR "C:\\VIKING" #define THUMB_DIR "\\THUMBNAILS\\" /* viking maps default viking\maps */ #define THUMB_SUB_DIR "normal\\" -#define mkdir(a,b) mkdir(a) -#define realpath(X,Y) _fullpath(Y,X,MAX_PATH) - #else -#define HOME_DIR g_get_home_dir() #define THUMB_DIR "/.thumbnails/" #define THUMB_SUB_DIR "normal/" #endif @@ -69,7 +73,6 @@ #define PIXMAP_THUMB_SIZE 128 static char *md5_hash(const char *message); -static char *pathdup(const char *path); static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full); static GdkPixbuf *child_create_thumbnail(const gchar *path); @@ -86,7 +89,7 @@ gboolean a_thumbnails_exists ( const gchar *filename ) GdkPixbuf *a_thumbnails_get_default () { - return gdk_pixbuf_from_pixdata ( &tnnyl_pixbuf, FALSE, NULL ); + return gdk_pixbuf_from_pixdata ( &thumbnails_pixbuf, FALSE, NULL ); } /* filename must be absolute. you could have a function to make sure it exists and absolutize it */ @@ -111,7 +114,7 @@ GdkPixbuf *a_thumbnails_scale_pixbuf(GdkPixbuf *src, int max_w, int max_h) if (w <= max_w && h <= max_h) { - gdk_pixbuf_ref(src); + g_object_ref ( G_OBJECT ( src ) ); return src; } else @@ -131,14 +134,20 @@ GdkPixbuf *a_thumbnails_scale_pixbuf(GdkPixbuf *src, int max_w, int max_h) static GdkPixbuf *child_create_thumbnail(const gchar *path) { - GdkPixbuf *image; + GdkPixbuf *image, *tmpbuf; image = gdk_pixbuf_new_from_file(path, NULL); + if (!image) + return NULL; + + tmpbuf = gdk_pixbuf_apply_embedded_orientation(image); + g_object_unref(G_OBJECT(image)); + image = tmpbuf; if (image) { GdkPixbuf *thumb = save_thumbnail(path, image); - gdk_pixbuf_unref ( image ); + g_object_unref ( G_OBJECT ( image ) ); return thumb; } @@ -150,6 +159,7 @@ static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full) struct stat info; gchar *path; int original_width, original_height; + const gchar* orientation; GString *to; char *md5, *swidth, *sheight, *ssize, *smtime, *uri; mode_t old_mask; @@ -161,6 +171,8 @@ static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full) thumb = a_thumbnails_scale_pixbuf(full, PIXMAP_THUMB_SIZE, PIXMAP_THUMB_SIZE); + orientation = gdk_pixbuf_get_option (full, "orientation"); + original_width = gdk_pixbuf_get_width(full); original_height = gdk_pixbuf_get_height(full); @@ -170,19 +182,15 @@ static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full) ssize = g_strdup_printf(ST_SIZE_FMT, info.st_size); smtime = g_strdup_printf("%ld", (long) info.st_mtime); - path = pathdup(pathname); + path = file_realpath_dup(pathname); uri = g_strconcat("file://", path, NULL); md5 = md5_hash(uri); g_free(path); to = g_string_new(HOME_DIR); -#ifndef WINDOWS - mkdir(to->str, 0700); -#endif g_string_append(to, THUMB_DIR); - mkdir(to->str, 0700); g_string_append(to, THUMB_SUB_DIR); - mkdir(to->str, 0700); + g_mkdir_with_parents(to->str, 0700); g_string_append(to, md5); name_len = to->len + 4; /* Truncate to this length when renaming */ #ifdef WINDOWS @@ -201,6 +209,7 @@ static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full) "tEXt::Thumb::MTime", smtime, "tEXt::Thumb::URI", uri, "tEXt::Software", PROJECT, + "tEXt::Software::Orientation", orientation ? orientation : "0", NULL); umask(old_mask); @@ -241,7 +250,7 @@ GdkPixbuf *a_thumbnails_get(const gchar *pathname) const char *ssize, *smtime; struct stat info; - path = pathdup(pathname); + path = file_realpath_dup(pathname); uri = g_strconcat("file://", path, NULL); md5 = md5_hash(uri); g_free(uri); @@ -272,7 +281,7 @@ GdkPixbuf *a_thumbnails_get(const gchar *pathname) goto out; err: if (thumb) - gdk_pixbuf_unref(thumb); + g_object_unref ( G_OBJECT ( thumb ) ); thumb = NULL; out: g_free(path); @@ -280,20 +289,6 @@ out: return thumb; } -/* pathdup() stuff */ - -static char *pathdup(const char *path) -{ - char real[MAXPATHLEN]; - - g_return_val_if_fail(path != NULL, NULL); - - if (realpath(path, real)) - return g_strdup(real); - - return g_strdup(path); -} - /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. The original code was @@ -542,6 +537,6 @@ static char *md5_hash(const char *message) MD5Context ctx; MD5Init(&ctx); - MD5Update(&ctx, message, strlen(message)); + MD5Update(&ctx, (md5byte *) message, strlen(message)); return MD5Final(&ctx); }