summaryrefslogtreecommitdiff
path: root/src/bin/ethumb/ethumb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/ethumb/ethumb.c')
-rw-r--r--src/bin/ethumb/ethumb.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/src/bin/ethumb/ethumb.c b/src/bin/ethumb/ethumb.c
new file mode 100644
index 0000000000..27d50df69e
--- /dev/null
+++ b/src/bin/ethumb/ethumb.c
@@ -0,0 +1,281 @@
+/**
+ * @file
+ *
+ * Copyright (C) 2009 by ProFUSION embedded systems
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;
+ * if not, see <http://www.gnu.org/licenses/>.
+ *
+ * @author Rafael Antognolli <antognolli@profusion.mobi>
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include <Eina.h>
+#include <Ecore.h>
+#include <Ecore_Getopt.h>
+#include <Ethumb.h>
+
+const char *aspect_opt[] = { "keep", "ignore", "crop", NULL };
+const char *format_opt[] = { "png", "jpg", "eet", NULL };
+struct frame
+{
+ const char *file;
+ const char *group;
+ const char *swallow;
+};
+
+static unsigned char
+_ethumb_getopt_callback_frame_parse(const Ecore_Getopt *parser EINA_UNUSED, const Ecore_Getopt_Desc *desc EINA_UNUSED, const char *str, void *data EINA_UNUSED, Ecore_Getopt_Value *storage)
+{
+ struct frame *f = (struct frame *)storage->ptrp;
+ const char *tfile, *tgroup, *tswallow, *base, *sep;
+
+ base = str;
+ sep = strchr(base, ':');
+ if (!sep)
+ goto error;
+ tfile = eina_stringshare_add_length(base, sep - base);
+ base = sep + 1;
+
+ sep = strchr(base, ':');
+ if (!sep)
+ {
+ eina_stringshare_del(tfile);
+ goto error;
+ }
+ tgroup = eina_stringshare_add_length(base, sep - base);
+ base = sep + 1;
+ if (base[0] == '\0')
+ {
+ eina_stringshare_del(tfile);
+ eina_stringshare_del(tgroup);
+ goto error;
+ }
+ tswallow = eina_stringshare_add(base);
+
+ f->file = tfile;
+ f->group = tgroup;
+ f->swallow = tswallow;
+ return 1;
+
+ error:
+ fprintf(stderr,
+ "ERROR: invalid theme, not in format "
+ "'file:group:swallow_part': '%s'\n",
+ str);
+ return 0;
+}
+
+const Ecore_Getopt optdesc = {
+ "ethumb",
+ NULL,
+ PACKAGE_VERSION,
+ "(C) 2009 - ProFUSION embedded systems",
+ "LGPL v2.1 - GNU Lesser General Public License",
+ "Thumbnails generator.\n"
+ "\n"
+ "This program uses ethumb to create thumbnails from pictures. "
+ "It's an example of use and a test for ethumb.\n",
+ 0,
+ {
+ ECORE_GETOPT_CALLBACK_ARGS
+ ('s', "size", "thumbnail size expected.",
+ "WxH", ecore_getopt_callback_size_parse, NULL),
+ ECORE_GETOPT_CHOICE
+ ('f', "format", "file format to save.", format_opt),
+ ECORE_GETOPT_CHOICE
+ ('a', "aspect", "original image aspect ratio.", aspect_opt),
+ ECORE_GETOPT_STORE_STR
+ ('d', "directory", "directory to save thumbnails."),
+ ECORE_GETOPT_STORE_STR
+ ('c', "category", "thumbnails category."),
+ ECORE_GETOPT_CALLBACK_ARGS
+ ('t', "theme", "path to theme file, group and swallow part.",
+ "file:group:swallow_part", _ethumb_getopt_callback_frame_parse, NULL),
+ ECORE_GETOPT_STORE_STR
+ ('k', "key", "key inside eet file to read image from."),
+ ECORE_GETOPT_STORE_DOUBLE
+ ('v', "video_time", "time of video frame to use as thumbnail."),
+ ECORE_GETOPT_STORE_INT
+ ('p', "document_page", "document page to use as thumbnail."),
+ ECORE_GETOPT_LICENSE('L', "license"),
+ ECORE_GETOPT_COPYRIGHT('C', "copyright"),
+ ECORE_GETOPT_VERSION('V', "version"),
+ ECORE_GETOPT_HELP('h', "help"),
+ ECORE_GETOPT_SENTINEL
+ }
+};
+
+static void
+_thumb_report(const char *mode, Ethumb *e)
+{
+ const char *ap, *ak, *gp, *gk;
+ ethumb_file_get(e, &ap, &ak);
+ ethumb_thumb_path_get(e, &gp, &gk);
+ printf("%s '%s' '%s' => '%s' '%s'\n",
+ mode, ap, ak ? ak : "", gp, gk ? gk : "");
+}
+
+static void
+_finished_thumb( void *data EINA_UNUSED, Ethumb *e, Eina_Bool success)
+{
+ const char *mode = success ? "GENERATED" : "FAILED";
+ _thumb_report(mode, e);
+ ecore_main_loop_quit();
+}
+
+int
+main(int argc, char *argv[])
+{
+ Ethumb *e;
+ Eina_Bool quit_option = 0;
+ Eina_Rectangle geometry = {-1, -1, -1, -1};
+ unsigned int format = 0, aspect = 0;
+ char *format_str = NULL;
+ char *aspect_str = NULL;
+ char *directory = NULL;
+ char *category = NULL;
+ char *src_key = NULL;
+ struct frame frame = {NULL, NULL, NULL};
+ const char *thumb_path = NULL;
+ const char *thumb_key = NULL;
+ double video_time = 0;
+ int page = 0;
+ int arg_index;
+ int i;
+
+ int r = 1;
+
+ ethumb_init();
+ ecore_init();
+
+ Ecore_Getopt_Value values[] = {
+ ECORE_GETOPT_VALUE_PTR_CAST(geometry),
+ ECORE_GETOPT_VALUE_PTR_CAST(format_str),
+ ECORE_GETOPT_VALUE_PTR_CAST(aspect_str),
+ ECORE_GETOPT_VALUE_STR(directory),
+ ECORE_GETOPT_VALUE_STR(category),
+ ECORE_GETOPT_VALUE_PTR_CAST(frame),
+ ECORE_GETOPT_VALUE_STR(src_key),
+ ECORE_GETOPT_VALUE_DOUBLE(video_time),
+ ECORE_GETOPT_VALUE_INT(page),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_BOOL(quit_option),
+ ECORE_GETOPT_VALUE_NONE
+ };
+
+ arg_index = ecore_getopt_parse(&optdesc, values, argc, argv);
+ if (arg_index < 0)
+ {
+ fprintf(stderr, "Could not parse arguments.\n");
+ if (frame.file)
+ {
+ eina_stringshare_del(frame.file);
+ eina_stringshare_del(frame.group);
+ eina_stringshare_del(frame.swallow);
+ }
+ ecore_shutdown();
+ ethumb_shutdown();
+ return -1;
+ }
+
+ if (quit_option)
+ {
+ if (frame.file)
+ {
+ eina_stringshare_del(frame.file);
+ eina_stringshare_del(frame.group);
+ eina_stringshare_del(frame.swallow);
+ }
+ ecore_shutdown();
+ ethumb_shutdown();
+ return 0;
+ }
+
+ for (i = 0; i < 3; i++)
+ if (format_opt[i] == format_str)
+ {
+ format = i;
+ break;
+ }
+
+ for (i = 0; i < 3; i++)
+ if (aspect_opt[i] == aspect_str)
+ {
+ aspect = i;
+ break;
+ }
+
+ e = ethumb_new();
+
+ ethumb_thumb_format_set(e, format);
+ ethumb_thumb_aspect_set(e, aspect);
+ if (directory) ethumb_thumb_dir_path_set(e, directory);
+ if (category) ethumb_thumb_category_set(e, category);
+ if (geometry.w > 0 && geometry.h > 0)
+ ethumb_thumb_size_set(e, geometry.w, geometry.h);
+ if (frame.file)
+ {
+ ethumb_frame_set(e, frame.file, frame.group, frame.swallow);
+ eina_stringshare_del(frame.file);
+ eina_stringshare_del(frame.group);
+ eina_stringshare_del(frame.swallow);
+ }
+ if (video_time > 0)
+ ethumb_video_time_set(e, video_time);
+ if (page > 0)
+ ethumb_document_page_set(e, page);
+
+ if (r && arg_index < argc)
+ r = ethumb_file_set(e, argv[arg_index++], src_key);
+ else
+ r = 0;
+ if (r && arg_index < argc)
+ thumb_path = argv[arg_index++];
+ if (r && arg_index < argc)
+ thumb_key = argv[arg_index];
+
+ if (r)
+ {
+ ethumb_thumb_path_set(e, thumb_path, thumb_key);
+ if (ethumb_exists(e))
+ {
+ _thumb_report("EXISTS", e);
+ quit_option = 1;
+ r = 1;
+ }
+ else
+ r = ethumb_generate(e, _finished_thumb, NULL, NULL);
+ }
+
+ if (r && !quit_option)
+ ecore_main_loop_begin();
+
+ ethumb_file_free(e);
+ ethumb_free(e);
+
+ ecore_shutdown();
+ ethumb_shutdown();
+
+ return !r;
+}