X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/90e25247d8aaecef70a0bb6d6717867a7d0462e2..245f17ebc313ef7b309775c5f00e87de3f4772f1:/src/thumbnails.c?ds=inline diff --git a/src/thumbnails.c b/src/thumbnails.c index 5b06f625..bd97f312 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,27 +55,27 @@ #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 #define PIXMAP_THUMB_SIZE 128 +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + static char *md5_hash(const char *message); static char *pathdup(const char *path); static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full); @@ -86,7 +94,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 +119,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 +139,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 +164,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 +176,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); @@ -176,13 +193,9 @@ static GdkPixbuf *save_thumbnail(const char *pathname, GdkPixbuf *full) 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 +214,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); @@ -272,7 +286,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); @@ -288,7 +302,7 @@ static char *pathdup(const char *path) g_return_val_if_fail(path != NULL, NULL); - if (realpath(path, real)) + if (file_realpath(path, real)) return g_strdup(real); return g_strdup(path); @@ -542,6 +556,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); }