From 939afcb3eafa10782f8887aac1dfcc96d6e861f6 Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Tue, 21 Apr 2009 23:03:50 +0000 Subject: [PATCH] Added epdf plugin. Err... maybe I forgot to svn add some files in my previous commit... SVN revision: 40277 --- legacy/ethumb/configure.ac | 12 +++ legacy/ethumb/src/bin/ethumb.c | 8 +- legacy/ethumb/src/lib/Ethumb.c | 8 ++ legacy/ethumb/src/lib/Ethumb.h | 6 +- legacy/ethumb/src/lib/Ethumb_Plugin.h | 23 +++++ legacy/ethumb/src/lib/Makefile.am | 2 +- legacy/ethumb/src/plugins/Makefile.am | 15 +++ legacy/ethumb/src/plugins/emotion/Makefile.am | 12 +++ legacy/ethumb/src/plugins/emotion/emotion.c | 93 +++++++++++++++++++ legacy/ethumb/src/plugins/epdf/Makefile.am | 12 +++ legacy/ethumb/src/plugins/epdf/epdf.c | 83 +++++++++++++++++ 11 files changed, 271 insertions(+), 3 deletions(-) create mode 100644 legacy/ethumb/src/lib/Ethumb_Plugin.h create mode 100644 legacy/ethumb/src/plugins/Makefile.am create mode 100644 legacy/ethumb/src/plugins/emotion/Makefile.am create mode 100644 legacy/ethumb/src/plugins/emotion/emotion.c create mode 100644 legacy/ethumb/src/plugins/epdf/Makefile.am create mode 100644 legacy/ethumb/src/plugins/epdf/epdf.c diff --git a/legacy/ethumb/configure.ac b/legacy/ethumb/configure.ac index 6822d4e10a..ea6359dab8 100644 --- a/legacy/ethumb/configure.ac +++ b/legacy/ethumb/configure.ac @@ -60,6 +60,17 @@ if $USE_MODULE_EMOTION ; then requirement_ethumb="$requirement_ethumb emotion" fi +AM_CONDITIONAL(HAVE_EPDF, false) +define([CHECK_MODULE_EPDF], +[ + AC_ETH_CHECK_PKG(EPDF, epdf, [], [EPDF=false]) +]) + +AC_ETH_OPTIONAL_MODULE([epdf], true, [CHECK_MODULE_EPDF]) +if $USE_MODULE_EPDF ; then + requirement_ethumb="$requirement_ethumb epdf" +fi + AC_SUBST(requirement_ethumb) AC_OUTPUT([ @@ -70,6 +81,7 @@ src/bin/Makefile src/lib/Makefile src/plugins/Makefile src/plugins/emotion/Makefile +src/plugins/epdf/Makefile data/Makefile data/frames/Makefile m4/Makefile diff --git a/legacy/ethumb/src/bin/ethumb.c b/legacy/ethumb/src/bin/ethumb.c index 63164ebb12..c7aa1b30b7 100644 --- a/legacy/ethumb/src/bin/ethumb.c +++ b/legacy/ethumb/src/bin/ethumb.c @@ -118,6 +118,8 @@ const Ecore_Getopt optdesc = { ('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"), @@ -149,6 +151,7 @@ main(int argc, char *argv[]) const char *thumb_path = NULL; const char *thumb_key = NULL; double video_time = 0; + int page = 0; int arg_index; int i; @@ -165,6 +168,7 @@ main(int argc, char *argv[]) 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), @@ -212,6 +216,8 @@ main(int argc, char *argv[]) } 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) ef = ethumb_file_new(e, argv[arg_index++], src_key); @@ -226,7 +232,7 @@ main(int argc, char *argv[]) r = ethumb_file_generate(ef, _finished_thumb, NULL); } - if (r) + if (r && !quit_option) ecore_main_loop_begin(); ethumb_file_free(ef); diff --git a/legacy/ethumb/src/lib/Ethumb.c b/legacy/ethumb/src/lib/Ethumb.c index 9545c734e6..4cfc6aa3db 100644 --- a/legacy/ethumb/src/lib/Ethumb.c +++ b/legacy/ethumb/src/lib/Ethumb.c @@ -500,6 +500,14 @@ ethumb_video_time_set(Ethumb *e, float time) e->video.time = time; } +EAPI void +ethumb_document_page_set(Ethumb *e, int page) +{ + EINA_SAFETY_ON_NULL_RETURN(e); + + e->document.page = page; +} + EAPI Ethumb_File * ethumb_file_new(Ethumb *e, const char *path, const char *key) { diff --git a/legacy/ethumb/src/lib/Ethumb.h b/legacy/ethumb/src/lib/Ethumb.h index 0eb1d425d3..2b81c37235 100644 --- a/legacy/ethumb/src/lib/Ethumb.h +++ b/legacy/ethumb/src/lib/Ethumb.h @@ -89,11 +89,14 @@ struct _Ethumb { double time; } video; + struct + { + int page; + } document; Ethumb_Frame *frame; Ecore_Evas *ee, *sub_ee; Evas *e, *sub_e; Evas_Object *o, *img; - Evas_Object *plugin_img; Ecore_Idler *finished_idler; ethumb_generate_callback_t finished_cb; void *cb_data; @@ -139,6 +142,7 @@ EAPI void ethumb_thumb_category_set(Ethumb *e, const char *category) EINA_ARG_NO EAPI const char * ethumb_thumb_category_get(Ethumb *e) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE; EAPI void ethumb_video_time_set(Ethumb *e, float time) EINA_ARG_NONNULL(1); +EAPI void ethumb_document_page_set(Ethumb *e, int page) EINA_ARG_NONNULL(1); EAPI Ethumb_File * ethumb_file_new(Ethumb *e, const char *path, const char *key) EINA_MALLOC EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2); EAPI void ethumb_file_free(Ethumb_File *ef); diff --git a/legacy/ethumb/src/lib/Ethumb_Plugin.h b/legacy/ethumb/src/lib/Ethumb_Plugin.h new file mode 100644 index 0000000000..7dc3440bd0 --- /dev/null +++ b/legacy/ethumb/src/lib/Ethumb_Plugin.h @@ -0,0 +1,23 @@ +#ifndef _ETHUMB_PLUGIN_H_ +#define _ETHUMB_PLUGIN_H_ + +#include +#include +#include + +typedef struct _Ethumb_Plugin Ethumb_Plugin; + +struct _Ethumb_Plugin +{ + const char **extensions; + int (*generate_thumb)(Ethumb_File *); + void (*shutdown)(Ethumb_Plugin *); +}; + +void ethumb_calculate_aspect(Ethumb *e, int iw, int ih, int *w, int *h); +void ethumb_calculate_fill(Ethumb *e, int iw, int ih, int *fx, int *fy, int *fw, int *fh); +int ethumb_plugin_image_resize(Ethumb_File *ef, int w, int h); +int ethumb_image_save(Ethumb_File *ef); +void ethumb_finished_callback_call(Ethumb_File *ef); + +#endif /* _ETHUMB_PLUGIN_H_ */ diff --git a/legacy/ethumb/src/lib/Makefile.am b/legacy/ethumb/src/lib/Makefile.am index 1985e720d8..b9a43081a6 100644 --- a/legacy/ethumb/src/lib/Makefile.am +++ b/legacy/ethumb/src/lib/Makefile.am @@ -5,7 +5,7 @@ AM_CPPFLAGS = \ -I$(top_builddir) \ @EVAS_CFLAGS@ @ECORE_EVAS_CFLAGS@ @ECORE_FILE_CFLAGS@ @EDJE_CFLAGS@ -include_HEADERS = Ethumb.h +include_HEADERS = Ethumb.h Ethumb_Plugin.h noinst_HEADERS = md5.h lib_LTLIBRARIES = libethumb.la diff --git a/legacy/ethumb/src/plugins/Makefile.am b/legacy/ethumb/src/plugins/Makefile.am new file mode 100644 index 0000000000..f1f1d1f74d --- /dev/null +++ b/legacy/ethumb/src/plugins/Makefile.am @@ -0,0 +1,15 @@ +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = + +if USE_MODULE_EMOTION +SUBDIRS += emotion +endif + +if USE_MODULE_EMOTION +SUBDIRS += epdf +endif + +DIST_SUBDIRS = \ + emotion \ + epdf diff --git a/legacy/ethumb/src/plugins/emotion/Makefile.am b/legacy/ethumb/src/plugins/emotion/Makefile.am new file mode 100644 index 0000000000..00fb6d02e4 --- /dev/null +++ b/legacy/ethumb/src/plugins/emotion/Makefile.am @@ -0,0 +1,12 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/plugins/emotion \ + @EVAS_CFLAGS@ @EINA_CFLAGS@ @EMOTION_CFLAGS@ @ECORE_CFLAGS@ + +pkgdir = $(pluginsdir) +pkg_LTLIBRARIES = emotion.la +emotion_la_SOURCES = emotion.c +emotion_la_DEPENDENCIES = $(top_builddir)/config.h +emotion_la_LIBADD = $(top_builddir)/src/lib/libethumb.la \ + @EVAS_LIBS@ @EINA_LIBS@ @EMOTION_LIBS@ @ECORE_LIBS@ +emotion_la_LDFLAGS = -module -avoid-version diff --git a/legacy/ethumb/src/plugins/emotion/emotion.c b/legacy/ethumb/src/plugins/emotion/emotion.c new file mode 100644 index 0000000000..b2d08fa138 --- /dev/null +++ b/legacy/ethumb/src/plugins/emotion/emotion.c @@ -0,0 +1,93 @@ +#include "Ethumb.h" +#include "Ethumb_Plugin.h" +#include "config.h" + +#include +#include +#include +#include +#include +#include + +struct cb_data { + Ethumb_File *ef; + ethumb_generate_callback_t finished_cb; + void *data; +}; + +static Evas_Object *_emotion = NULL; + +static void +_shutdown(Ethumb_Plugin *plugin) +{ + ecore_shutdown(); +} + +static void +_frame_decoded_cb(void *data, Evas_Object *o, void *event_info) +{ + Ethumb_File *ef = data; + Ethumb *e = ef->ethumb; + Evas_Coord ww, hh; + Evas_Coord mw, mh; + + emotion_object_size_get(o, &mw, &mh); + ethumb_calculate_aspect(e, mw, mh, &ww, &hh); + ethumb_plugin_image_resize(ef, ww, hh); + + evas_object_resize(o, ww, hh); + evas_object_move(o, 0, 0); + + ethumb_image_save(ef); + + evas_object_smart_callback_del(o, "frame_decode", _frame_decoded_cb); + emotion_object_play_set(o, 0); + evas_object_del(o); + ethumb_finished_callback_call(ef); +} + +static int +_generate_thumb(Ethumb_File *ef) +{ + Ethumb *e = ef->ethumb; + Evas_Object *o; + int r; + + o = emotion_object_add(e->sub_e); + r = emotion_object_init(o, "xine"); + if (!r) + { + fprintf(stderr, "ERROR: could not start emotion using gstreamer" + " plugin.\n"); + evas_object_del(o); + return r; + } + + emotion_object_file_set(o, ef->src_path); + emotion_object_position_set(o, e->video.time); + emotion_object_play_set(o, 1); + + evas_object_smart_callback_add(o, "frame_decode", _frame_decoded_cb, ef); + + evas_object_show(o); + + _emotion = o; + + return 1; +} + +Ethumb_Plugin * +ethumb_plugin_init(void) +{ + static const char *extensions[] = { "avi", NULL }; + static Ethumb_Plugin plugin = + { + extensions, + _generate_thumb, + _shutdown + }; + + ecore_init(); + + return &plugin; +} diff --git a/legacy/ethumb/src/plugins/epdf/Makefile.am b/legacy/ethumb/src/plugins/epdf/Makefile.am new file mode 100644 index 0000000000..db28d261d2 --- /dev/null +++ b/legacy/ethumb/src/plugins/epdf/Makefile.am @@ -0,0 +1,12 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/plugins/epdf \ + @EINA_CFLAGS@ @EVAS_CFLAGS@ @ECORE_CFLAGS@ @EPDF_CFLAGS@ + +pkgdir = $(pluginsdir) +pkg_LTLIBRARIES = epdf.la +epdf_la_SOURCES = epdf.c +epdf_la_DEPENDENCIES = $(top_builddir)/config.h +epdf_la_LIBADD = $(top_builddir)/src/lib/libethumb.la \ + @EINA_LIBS@ @EVAS_LIBS@ @ECORE_LIBS@ @EPDF_LIBS@ +epdf_la_LDFLAGS = -module -avoid-version diff --git a/legacy/ethumb/src/plugins/epdf/epdf.c b/legacy/ethumb/src/plugins/epdf/epdf.c new file mode 100644 index 0000000000..55a5961baf --- /dev/null +++ b/legacy/ethumb/src/plugins/epdf/epdf.c @@ -0,0 +1,83 @@ +#include "Ethumb.h" +#include "Ethumb_Plugin.h" +#include "config.h" + +#include +#include +#include +#include + +static void +_shutdown(Ethumb_Plugin *plugin) +{ + epdf_shutdown(); +} + +static int +_generate_thumb(Ethumb_File *ef) +{ + Ethumb *e = ef->ethumb; + Epdf_Document *document; + Epdf_Page *page; + Evas_Object *o; + int w, h, ww, hh; + int fx, fy, fw, fh; + int npages; + + document = epdf_document_new(ef->src_path); + if (!document) + { + fprintf(stderr, "ERROR: could not read document: %s\n", ef->src_path); + return 0; + } + + page = epdf_page_new(document); + if (!page) + { + fprintf(stderr, "ERROR: could not read document: %s\n", ef->src_path); + epdf_document_delete(document); + return 0; + } + + npages = epdf_document_page_count_get(document); + if (e->document.page < npages) + epdf_page_page_set(page, e->document.page); + epdf_page_size_get(page, &w, &h); + ethumb_calculate_aspect(e, w, h, &ww, &hh); + ethumb_plugin_image_resize(ef, ww, hh); + + o = evas_object_image_add(e->sub_e); + epdf_page_render(page, o); + evas_object_resize(o, ww, hh); + evas_object_move(o, 0, 0); + + ethumb_calculate_fill(e, w, h, &fx, &fy, &fw, &fh); + evas_object_image_fill_set(o, fx, fy, fw, fh); + + evas_object_show(o); + ethumb_image_save(ef); + + evas_object_del(o); + epdf_page_delete(page); + epdf_document_delete(document); + + ethumb_finished_callback_call(ef); + + return 1; +} + +Ethumb_Plugin * +ethumb_plugin_init(void) +{ + static const char *extensions[] = { "pdf", NULL }; + static Ethumb_Plugin plugin = + { + extensions, + _generate_thumb, + _shutdown + }; + + epdf_init(); + + return &plugin; +}