hi,

During the development of canola, we had the requirement of generating
thumbnails in any size, different from those specified at
freedesktop's spec.
At that moment we kept some internal ugly patches to do so, but I
think this could be an interesting use case for various apps.

Attached is an initial patch of an api for setting a custom geometry
and dir path for the thumbs. This patch can be improved (now it is
checking the dir path every time, etc),
but I just want to know if this is of interest to be included upstream
in epsilon. In this api one of the orientations (w or h) can be
negative, indicating that there is no maximum
size restriction (for example, fixed height thumbnails that keep the
aspect ratio, we use this in canola :).

Another point I wanted to note, is that now epsilon is just generating
PNG thumbnails and this is ~3 times slower than JPG in mobile devices
(N800, maemo).
It would be interesting to maintain the option of generating JPG thumbs.

Should epsilon just generate thumbs in freedesktop's spec?
I think that it would not hurt to provide these extra features for
applications outside the desktop context.

Any comments are appreciated.

BR,
-- 
// leo

-------------------------------------------------------
Leonardo Sobral Cunha
OpenBossa Labs
INdT - Instituto Nokia de Tecnologia
PGP: 0x5751676C @ wwwkeys.pgp.net
-------------------------------------------------------
From de2f3edd669f00160c3584149f4ba871970704e3 Mon Sep 17 00:00:00 2001
From: Leonardo Sobral Cunha <[EMAIL PROTECTED]>
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_SIZE_NORMAL 128
 #define THUMB_SIZE_LARGE 256
+#define THUMB_SIZE_CUSTOM 0
 #define THUMB_SIZE_FAIL -1
 #include "exiftags/exif.h"
 
@@ -38,9 +39,11 @@
 
 static char *PATH_DIR_LARGE = NULL;
 static char *PATH_DIR_NORMAL = 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_CUSTOM = 0;
 static unsigned LEN_DIR_FAIL = 0;
 
 
@@ -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_CUSTOM)
+     {
+	dir = PATH_DIR_CUSTOM;
+	dir_len = LEN_DIR_CUSTOM;
+     }
    else
      {
 	dir = PATH_DIR_FAIL;
@@ -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 (_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:
 	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;
-     }   
+     }
 }
 
+void
+epsilon_custom_thumb_size (Epsilon * e, int w, int h, const char *dir)
+{
+  char buf[PATH_MAX];
+  int base_len;
+  char *home;
+
+  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);
+    }
+}
 
 #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

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to