-diff -upNr epsilon.orig/src/lib/Epsilon.c epsilon/src/lib/Epsilon.c
---- epsilon.orig/src/lib/Epsilon.c 2007-12-05 20:26:23.000000000 -0200
-+++ epsilon/src/lib/Epsilon.c 2007-12-09 12:15:21.000000000 -0200
-@@ -23,6 +23,9 @@
- #ifdef HAVE_EPEG_H
- #include <Epeg.h>
+From de2f3edd669f00160c3584149f4ba871970704e3 Mon Sep 17 00:00:00 2001
+From: Leonardo Sobral Cunha <leonardo.cunha@openbossa.org>
+Date: Wed, 28 May 2008 18:30:52 -0300
+Subject: [PATCH] Add support for custom size thumbnails
+
+The width or height of the custom size may be negative,
+indicating that this orientation has no size limit.
+You must also set the dir name relative to $HOME/.thumbnails .
+---
+ src/lib/Epsilon.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--------
+ src/lib/Epsilon.h | 6 +++++
+ 2 files changed, 56 insertions(+), 9 deletions(-)
+
+diff --git a/src/lib/Epsilon.c b/src/lib/Epsilon.c
+index e293a9e..cf1969e 100644
+--- a/src/lib/Epsilon.c
++++ b/src/lib/Epsilon.c
+@@ -25,6 +25,7 @@
#endif
-+#define THUMB_HEIGHT_CANOLA 96
-+#define THUMB_WIDTH_CANOLA 192
-+#define THUMB_SIZE_CANOLA 192
#define THUMB_SIZE_NORMAL 128
#define THUMB_SIZE_LARGE 256
++#define THUMB_SIZE_CUSTOM 0
#define THUMB_SIZE_FAIL -1
-@@ -38,9 +41,11 @@
+ #include "exiftags/exif.h"
+
+@@ -38,9 +39,11 @@
static char *PATH_DIR_LARGE = NULL;
static char *PATH_DIR_NORMAL = NULL;
-+static char *PATH_DIR_CANOLA = NULL;
++static char *PATH_DIR_CUSTOM = NULL;
static char *PATH_DIR_FAIL = NULL;
static unsigned LEN_DIR_LARGE = 0;
static unsigned LEN_DIR_NORMAL = 0;
-+static unsigned LEN_DIR_CANOLA = 0;
++static unsigned LEN_DIR_CUSTOM = 0;
static unsigned LEN_DIR_FAIL = 0;
-@@ -153,6 +158,11 @@ epsilon_init (void)
- PATH_DIR_NORMAL = strdup(buf);
- LEN_DIR_NORMAL = strlen(buf);
- }
-+ if (!PATH_DIR_CANOLA) {
-+ strncpy(buf + base_len, "/canola", PATH_MAX - base_len);
-+ PATH_DIR_CANOLA = strdup(buf);
-+ LEN_DIR_CANOLA = strlen(buf);
-+ }
- if (!PATH_DIR_FAIL) {
- strncpy(buf + base_len, "/fail/epsilon", PATH_MAX - base_len);
- PATH_DIR_FAIL = strdup(buf);
-@@ -161,6 +171,7 @@ epsilon_init (void)
-
- ecore_file_mkpath(PATH_DIR_LARGE);
- ecore_file_mkpath(PATH_DIR_NORMAL);
-+ ecore_file_mkpath(PATH_DIR_CANOLA);
- ecore_file_mkpath(PATH_DIR_FAIL);
-
- plugins_mime = ecore_hash_new(ecore_str_hash, ecore_str_compare);
-@@ -446,6 +457,11 @@ _epsilon_file_name(unsigned thumb_size,
+@@ -446,6 +449,11 @@ _epsilon_file_name(unsigned thumb_size, const char *hash, const char *ext, char
dir = PATH_DIR_NORMAL;
dir_len = LEN_DIR_NORMAL;
}
-+ else if (thumb_size == THUMB_SIZE_CANOLA)
++ else if (thumb_size == THUMB_SIZE_CUSTOM)
+ {
-+ dir = PATH_DIR_CANOLA;
-+ dir_len = LEN_DIR_CANOLA;
++ dir = PATH_DIR_CUSTOM;
++ dir_len = LEN_DIR_CUSTOM;
+ }
else
{
dir = PATH_DIR_FAIL;
-@@ -563,10 +579,10 @@ epsilon_generate (Epsilon * e)
-
- if (!e || !e->src || !e->hash)
- return (EPSILON_FAIL);
--
-+
- tw = e->tw;
- th = e->th;
--
-+
- #ifdef HAVE_EPEG_H
- len = strlen (e->src);
- if ((len > 4) &&
-@@ -575,15 +591,16 @@ epsilon_generate (Epsilon * e)
- _epsilon_file_name(e->tw, e->hash, "jpg", outfile, sizeof(outfile));
- epeg_thumbnail_comments_get (im, &info);
- epeg_size_get (im, &iw, &ih);
-- if (iw > ih)
-+ /* XXX - hack to force fixed height in case of tw != th (canola) */
-+ if (iw > ih && tw == th)
- {
-- th = e->th * ((double) ih / (double) iw);
-- if (th < 1) th = 1;
-+ th = ((unsigned long) e->tw * ih) / iw;
-+ if (th < 1) th = 1;
- }
- else
- {
-- tw = e->tw * ((double) iw / (double) ih);
-- if (tw < 1) tw = 1;
-+ tw = ((unsigned long) e->th * iw) / ih;
-+ if (tw < 1) tw = 1;
- }
- epeg_decode_size_set (im, tw, th);
- epeg_quality_set (im, 100);
-@@ -738,7 +755,7 @@ void
- epsilon_thumb_size(Epsilon *e, Epsilon_Thumb_Size size)
+@@ -474,7 +482,7 @@ _epsilon_exists_ext_int(unsigned thumb_size, const char *hash, const char *ext,
+ static int
+ _epsilon_exists_ext(Epsilon *e, const char *ext, char *path, int path_size, time_t *mtime)
{
- if (!e) return;
--
-+
- switch (size)
- {
+- if (_epsilon_exists_ext_int(e->tw, e->hash, ext, path, path_size, mtime))
++ if (_epsilon_exists_ext_int(e->tsize, e->hash, ext, path, path_size, mtime))
+ return 1;
+
+ return _epsilon_exists_ext_int(THUMB_SIZE_FAIL, e->hash, ext, path, path_size, mtime);
+@@ -601,9 +609,12 @@ epsilon_generate (Epsilon * e)
+ evas_object_image_data_update_add(im, 0, 0, iw, ih);
+ if ((iw > 0) && (ih > 0))
+ {
+- ww = e->tw;
+- hh = (e->tw * ih) / iw;
+- if (hh > e->th)
++ if ((iw > ih && e->tw > 0) || e->th <= 0)
++ {
++ ww = e->tw;
++ hh = (e->tw * ih) / iw;
++ }
++ else
+ {
+ hh = e->th;
+ ww = (e->th * iw) / ih;
+@@ -647,9 +658,12 @@ epsilon_generate (Epsilon * e)
+ alpha = evas_object_image_alpha_get(im);
+ if ((iw > 0) && (ih > 0))
+ {
+- ww = e->tw;
+- hh = (e->tw * ih) / iw;
+- if (hh > e->th)
++ if ((iw > ih && e->tw > 0) || e->th <= 0)
++ {
++ ww = e->tw;
++ hh = (e->tw * ih) / iw;
++ }
++ else
+ {
+ hh = e->th;
+ ww = (e->th * iw) / ih;
+@@ -667,7 +681,7 @@ epsilon_generate (Epsilon * e)
+ if (data)
+ {
+ snprintf(buf, sizeof(buf), "file://%s", e->src);
+- _epsilon_file_name(e->tw, e->hash, "png", buf2, sizeof(buf2));
++ _epsilon_file_name(e->tsize, e->hash, "png", buf2, sizeof(buf2));
+ /* this is wrong - but hey! good enough? */
+ if (ext) snprintf(buf3, sizeof(buf3), "image/%s", ext);
+ else snprintf(buf3, sizeof(buf3), "image/png");
+@@ -706,14 +720,41 @@ epsilon_thumb_size(Epsilon *e, Epsilon_Thumb_Size size)
case EPSILON_THUMB_NORMAL:
-@@ -749,7 +766,11 @@ epsilon_thumb_size(Epsilon *e, Epsilon_T
+ e->tw = THUMB_SIZE_NORMAL;
+ e->th = THUMB_SIZE_NORMAL;
++ e->tsize = THUMB_SIZE_NORMAL;
+ break;
+ case EPSILON_THUMB_LARGE:
e->tw = THUMB_SIZE_LARGE;
e->th = THUMB_SIZE_LARGE;
++ e->tsize = THUMB_SIZE_LARGE;
break;
- }
-+ case EPSILON_THUMB_CANOLA:
-+ e->tw = THUMB_WIDTH_CANOLA;
-+ e->th = THUMB_HEIGHT_CANOLA;
-+ break;
+ }
}
-
-diff -upNr epsilon.orig/src/lib/Epsilon.h epsilon/src/lib/Epsilon.h
---- epsilon.orig/src/lib/Epsilon.h 2007-12-05 20:26:23.000000000 -0200
-+++ epsilon/src/lib/Epsilon.h 2007-12-09 12:15:21.000000000 -0200
-@@ -58,7 +58,8 @@ typedef struct _Epsilon_Info Epsilon_Inf
- enum _Epsilon_Thumb_Size
- {
- EPSILON_THUMB_NORMAL,
-- EPSILON_THUMB_LARGE
-+ EPSILON_THUMB_LARGE,
-+ EPSILON_THUMB_CANOLA
- };
-
- typedef enum _Epsilon_Thumb_Size Epsilon_Thumb_Size;
-diff -upNr epsilon.orig/src/lib/epsilon_thumb.c epsilon/src/lib/epsilon_thumb.c
---- epsilon.orig/src/lib/epsilon_thumb.c 2007-12-05 20:26:23.000000000 -0200
-+++ epsilon/src/lib/epsilon_thumb.c 2007-12-09 12:15:21.000000000 -0200
-@@ -218,6 +218,9 @@ epsilon_cb_server_data(void *data, int t
- if (e->server != epsilon_server)
- return 1;
-
-+ if (!(e && e->data))
-+ return 1;
++void
++epsilon_custom_thumb_size (Epsilon * e, int w, int h, const char *dir)
++{
++ char buf[PATH_MAX];
++ int base_len;
++ char *home;
+
- msg = e->data;
- Epsilon_Request *thumb;
++ if (e && (w > 0 || h > 0))
++ {
++ e->tw = w;
++ e->th = h;
++ e->tsize = THUMB_SIZE_CUSTOM;
++
++ home = getenv("HOME");
++ base_len = snprintf(buf, sizeof(buf), "%s/.thumbnails/", home);
++ strncpy(buf + base_len, dir, PATH_MAX - base_len);
++
++ if (PATH_DIR_CUSTOM)
++ free(PATH_DIR_CUSTOM);
++
++ PATH_DIR_CUSTOM = strdup(buf);
++ LEN_DIR_CUSTOM = strlen(buf);
++ ecore_file_mkpath(PATH_DIR_CUSTOM);
++ }
++}
-diff -upNr epsilon.orig/src/lib/exiftags/canon.c epsilon/src/lib/exiftags/canon.c
---- epsilon.orig/src/lib/exiftags/canon.c 2007-12-05 20:26:23.000000000 -0200
-+++ epsilon/src/lib/exiftags/canon.c 2007-12-09 12:15:21.000000000 -0200
-@@ -52,7 +52,7 @@
- struct ccstm {
- int32_t val;
- struct descrip *table;
-- const char descr[];
-+ const char *descr;
+ #ifdef HAVE_PNG_H
+ static FILE *
+diff --git a/src/lib/Epsilon.h b/src/lib/Epsilon.h
+index 90a51b3..166f78c 100644
+--- a/src/lib/Epsilon.h
++++ b/src/lib/Epsilon.h
+@@ -42,6 +42,7 @@ struct _Epsilon
+ char *key;
+ int w, h;
+ int tw, th;
++ int tsize;
};
+ typedef struct _Epsilon Epsilon;
+@@ -96,6 +97,11 @@ EAPI int epsilon_generate (Epsilon * e);
+ EAPI void epsilon_thumb_size(Epsilon *e, Epsilon_Thumb_Size size);
+ /*
++ * set a custom thumb size
++ */
++EAPI void epsilon_custom_thumb_size(Epsilon *e, int w, int h, const char *dir);
++
++/*
+ * get the meta information associated with the epsilon
+ */
+ EAPI Epsilon_Info *epsilon_info_get (Epsilon * e);
+--
+1.5.4.3
+