Ephoto: Use Enlightenment's thumbnailer to achieve better thumbnailing.

This commit is contained in:
Stephen okra Houston 2016-03-24 12:16:05 -05:00
parent c2a555939d
commit d62984608a
6 changed files with 113 additions and 54 deletions

View File

@ -5,6 +5,8 @@ rm -f config.cache
AC_INIT([ephoto], [0.9.99], [enlightenment-devel@lists.sourceforge.net]) AC_INIT([ephoto], [0.9.99], [enlightenment-devel@lists.sourceforge.net])
AC_CHECK_HEADERS([dirent.h limits.h math.h arpa/inet.h netinet/in.h])
AC_PREREQ([2.60]) AC_PREREQ([2.60])
AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@ -45,6 +47,8 @@ PKG_CHECK_MODULES([EFL], [
eina >= 1.7.0 eina >= 1.7.0
evas >= 1.7.0 evas >= 1.7.0
ecore >= 1.7.0 ecore >= 1.7.0
ecore-file >= 1.7.0
ecore-ipc >= 1.7.0
edje >= 1.7.0 edje >= 1.7.0
eo >= 1.7.0 eo >= 1.7.0
eio >= 1.7.0 eio >= 1.7.0

View File

@ -20,17 +20,38 @@ endif
ephoto_SOURCES = \ ephoto_SOURCES = \
ephoto.c \ ephoto.c \
ephoto_main.c \ ephoto_bcg.c \
ephoto_color.c \
ephoto_config.c \ ephoto_config.c \
ephoto_cropper.c \
ephoto_editor.c \
ephoto_filters.c \
ephoto_hsv.c \
ephoto_ipc.c \
ephoto_main.c \
ephoto_thumb.c \
ephoto_thumb_browser.c \ ephoto_thumb_browser.c \
ephoto_single_browser.c \ ephoto_single_browser.c \
ephoto_slideshow.c \ ephoto_slideshow.c
ephoto_cropper.c \
ephoto_bcg.c \ internal_bindir = $(datadir)/$(PACKAGE)
ephoto_hsv.c \ internal_bin_PROGRAMS = ephoto_thumbnail
ephoto_filters.c \
ephoto_color.c \ ephoto_thumbnail_CPPFLAGS = \
ephoto_editor.c -I$(top_srcdir) \
-I$(top_srcdir)/src/bin \
-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
-Wall \
-Wextra \
-Wshadow \
@EFL_CFLAGS@
ephoto_thumbnail_LDADD = @EFL_LIBS@
ephoto_thumbnail_SOURCES = \
ephoto_thumbnailer.c \
ephoto_ipc.c \
ephoto_thumb.c
noinst_HEADERS = ephoto.h noinst_HEADERS = ephoto.h
EXTRA_DIST = ephoto.h EXTRA_DIST = ephoto.h

View File

@ -9,7 +9,6 @@ elm_main(int argc, char **argv)
eio_init(); eio_init();
elm_need_efreet(); elm_need_efreet();
elm_need_ethumb();
elm_language_set(""); elm_language_set("");
elm_app_compile_data_dir_set(PACKAGE_DATA_DIR); elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
elm_app_info_set(elm_main, "ephoto", "themes/crop.edj"); elm_app_info_set(elm_main, "ephoto", "themes/crop.edj");
@ -21,7 +20,11 @@ elm_main(int argc, char **argv)
#endif #endif
if (!efreet_mime_init()) if (!efreet_mime_init())
printf("Could not initialize Efreet_Mime!\n"); printf("Could not initialize Efreet_Mime!\n");
if (!e_ipc_init())
printf("Could not initialize IPC!\n");
if (!e_thumb_init())
printf("Could not initialize Thumbnailer!\n");
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
@ -71,6 +74,7 @@ elm_main(int argc, char **argv)
elm_run(); elm_run();
end: end:
e_thumb_shutdown();
efreet_mime_shutdown(); efreet_mime_shutdown();
eio_shutdown(); eio_shutdown();

View File

@ -5,9 +5,17 @@
# include "config.h" # include "config.h"
# endif # endif
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <dirent.h>
# include <unistd.h>
# include <limits.h>
# include <math.h>
# include <Eet.h> # include <Eet.h>
# include <Ecore.h> # include <Ecore.h>
# include <Ecore_Evas.h> # include <Ecore_Evas.h>
# include <Ecore_Ipc.h>
# include <Ecore_File.h> # include <Ecore_File.h>
# include <Efreet_Mime.h> # include <Efreet_Mime.h>
# include <Elementary.h> # include <Elementary.h>
@ -16,13 +24,6 @@
# include <Edje.h> # include <Edje.h>
# include <Evas.h> # include <Evas.h>
# include <Eio.h> # include <Eio.h>
# include <Ethumb_Client.h>
# include <limits.h>
# include <math.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <dirent.h>
# ifdef HAVE_PO # ifdef HAVE_PO
# include <locale.h> # include <locale.h>
@ -36,6 +37,9 @@
# define ngettext(String1, String2, Var) Var == 1 ? String1 : String2 # define ngettext(String1, String2, Var) Var == 1 ? String1 : String2
#endif #endif
# define USE_IPC
/*local types*/
typedef struct _Ephoto_Config Ephoto_Config; typedef struct _Ephoto_Config Ephoto_Config;
typedef struct _Ephoto Ephoto; typedef struct _Ephoto Ephoto;
typedef struct _Ephoto_Entry Ephoto_Entry; typedef struct _Ephoto_Entry Ephoto_Entry;
@ -44,7 +48,9 @@ typedef struct _Ephoto_Event_Entry_Create Ephoto_Event_Entry_Create;
typedef enum _Ephoto_State Ephoto_State; typedef enum _Ephoto_State Ephoto_State;
typedef enum _Ephoto_Orient Ephoto_Orient; typedef enum _Ephoto_Orient Ephoto_Orient;
typedef enum _Ephoto_Sort Ephoto_Sort; typedef enum _Ephoto_Sort Ephoto_Sort;
typedef enum _Ephoto_Ipc_Domain Ephoto_Ipc_Domain;
/*main window functions*/
Evas_Object *ephoto_window_add(const char *path); Evas_Object *ephoto_window_add(const char *path);
void ephoto_title_set(Ephoto *ephoto, const char *title); void ephoto_title_set(Ephoto *ephoto, const char *title);
void ephoto_thumb_size_set(Ephoto *ephoto, int size); void ephoto_thumb_size_set(Ephoto *ephoto, int size);
@ -54,11 +60,13 @@ void ephoto_thumb_path_set(Evas_Object *obj, const char *path);
void ephoto_directory_set(Ephoto *ephoto, const char *path, void ephoto_directory_set(Ephoto *ephoto, const char *path,
Elm_Object_Item *expanded, Eina_Bool dirs_only, Eina_Bool thumbs_only); Elm_Object_Item *expanded, Eina_Bool dirs_only, Eina_Bool thumbs_only);
/*config panel functions*/
Eina_Bool ephoto_config_init(Ephoto *em); Eina_Bool ephoto_config_init(Ephoto *em);
void ephoto_config_save(Ephoto *em); void ephoto_config_save(Ephoto *em);
void ephoto_config_free(Ephoto *em); void ephoto_config_free(Ephoto *em);
void ephoto_config_main(Ephoto *em); void ephoto_config_main(Ephoto *em);
/*single image functions*/
Evas_Object *ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent); Evas_Object *ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent);
void ephoto_single_browser_entries_set(Evas_Object *obj, Eina_List *entries); void ephoto_single_browser_entries_set(Evas_Object *obj, Eina_List *entries);
void ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry); void ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry);
@ -72,22 +80,40 @@ void ephoto_single_browser_cancel_editing(Evas_Object *main,
Evas_Object *image); Evas_Object *image);
/* smart callbacks called: "back" - the user wants to go back to the previous /* smart callbacks called: "back" - the user wants to go back to the previous
* screen. */ * screen. */
/*slideshow functions*/
Evas_Object *ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent); Evas_Object *ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent);
void ephoto_slideshow_entries_set(Evas_Object *obj, Eina_List *entries); void ephoto_slideshow_entries_set(Evas_Object *obj, Eina_List *entries);
void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry); void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry);
/* smart callbacks called: "back" - the user wants to go back to the previous /* smart callbacks called: "back" - the user wants to go back to the previous
* screen. */ * screen. */
/*thumbnail browser functions*/
Evas_Object *ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent); Evas_Object *ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent);
void ephoto_thumb_browser_fsel_clear(Ephoto *ephoto); void ephoto_thumb_browser_fsel_clear(Ephoto *ephoto);
void ephoto_thumb_browser_top_dir_set(Ephoto *ephoto, const char *dir); void ephoto_thumb_browser_top_dir_set(Ephoto *ephoto, const char *dir);
void ephoto_thumb_browser_insert(Ephoto *ephoto, Ephoto_Entry *entry); void ephoto_thumb_browser_insert(Ephoto *ephoto, Ephoto_Entry *entry);
void ephoto_thumb_browser_remove(Ephoto *ephoto, Ephoto_Entry *entry); void ephoto_thumb_browser_remove(Ephoto *ephoto, Ephoto_Entry *entry);
void ephoto_thumb_browser_update(Ephoto *ephoto, Ephoto_Entry *entry); void ephoto_thumb_browser_update(Ephoto *ephoto, Ephoto_Entry *entry);
/* smart callbacks called: "selected" - an item in the thumb browser is /* smart callbacks called: "selected" - an item in the thumb browser is
* selected. The selected Ephoto_Entry is passed as event_info argument. */ * selected. The selected Ephoto_Entry is passed as event_info argument. */
/*thumbnailing functions taken from enlightenment*/
int e_thumb_init(void);
int e_thumb_shutdown(void);
Evas_Object *e_thumb_icon_add(Evas *evas);
void e_thumb_icon_file_set(Evas_Object *obj, const char *file, const char *key);
void e_thumb_icon_size_set(Evas_Object *obj, int w, int h);
void e_thumb_icon_begin(Evas_Object *obj);
void e_thumb_icon_end(Evas_Object *obj);
void e_thumb_icon_rethumb(Evas_Object *obj);
const char *e_thumb_sort_id_get(Evas_Object *obj);
void e_thumb_client_data(Ecore_Ipc_Event_Client_Data *e);
void e_thumb_client_del(Ecore_Ipc_Event_Client_Del *e);
int e_ipc_init(void);
int e_ipc_shutdown(void);
/*editing functions*/
Evas_Object *ephoto_editor_add(Evas_Object *parent, const char *title, Evas_Object *ephoto_editor_add(Evas_Object *parent, const char *title,
const char *data_name, void *data); const char *data_name, void *data);
void ephoto_editor_del(Evas_Object *obj); void ephoto_editor_del(Evas_Object *obj);
@ -105,6 +131,8 @@ void ephoto_filter_black_and_white(Evas_Object *main, Evas_Object *image);
void ephoto_filter_old_photo(Evas_Object *main, Evas_Object *image); void ephoto_filter_old_photo(Evas_Object *main, Evas_Object *image);
void ephoto_filter_histogram_eq(Evas_Object *main, Evas_Object *image); void ephoto_filter_histogram_eq(Evas_Object *main, Evas_Object *image);
/*data types and structures*/
enum _Ephoto_State enum _Ephoto_State
{ {
EPHOTO_STATE_THUMB, EPHOTO_STATE_THUMB,
@ -132,6 +160,11 @@ enum _Ephoto_Sort
EPHOTO_SORT_MODTIME_DESCENDING EPHOTO_SORT_MODTIME_DESCENDING
}; };
enum _Ephoto_Ipc_Domain
{
EPHOTO_IPC_DOMAIN_THUMB
};
struct _Ephoto_Config struct _Ephoto_Config
{ {
int config_version; int config_version;
@ -219,6 +252,7 @@ struct _Ephoto_Event_Entry_Create
Ephoto_Entry *entry; Ephoto_Entry *entry;
}; };
/*ephoto file functions*/
Ephoto_Entry *ephoto_entry_new(Ephoto *ephoto, const char *path, Ephoto_Entry *ephoto_entry_new(Ephoto *ephoto, const char *path,
const char *label, Eina_File_Type type); const char *label, Eina_File_Type type);
Eina_Bool ephoto_entry_exists(Ephoto *ephoto, const char *path); Eina_Bool ephoto_entry_exists(Ephoto *ephoto, const char *path);
@ -230,6 +264,7 @@ void ephoto_entry_free_listener_del(Ephoto_Entry *entry,
void ephoto_entries_free(Ephoto *ephoto); void ephoto_entries_free(Ephoto *ephoto);
int ephoto_entries_cmp(const void *pa, const void *pb); int ephoto_entries_cmp(const void *pa, const void *pb);
/*check if image can be loaded*/
static inline Eina_Bool static inline Eina_Bool
_ephoto_eina_file_direct_info_image_useful(const Eina_File_Direct_Info *info) _ephoto_eina_file_direct_info_image_useful(const Eina_File_Direct_Info *info)
{ {
@ -264,6 +299,7 @@ _ephoto_eina_file_direct_info_image_useful(const Eina_File_Direct_Info *info)
return EINA_FALSE; return EINA_FALSE;
} }
/*check if image can be saved*/
static inline Eina_Bool static inline Eina_Bool
_ephoto_file_image_can_save(const char *ext) _ephoto_file_image_can_save(const char *ext)
{ {
@ -283,6 +319,7 @@ _ephoto_file_image_can_save(const char *ext)
return EINA_FALSE; return EINA_FALSE;
} }
/*event types*/
extern int EPHOTO_EVENT_ENTRY_CREATE; extern int EPHOTO_EVENT_ENTRY_CREATE;
extern int EPHOTO_EVENT_POPULATE_START; extern int EPHOTO_EVENT_POPULATE_START;
extern int EPHOTO_EVENT_POPULATE_END; extern int EPHOTO_EVENT_POPULATE_END;

View File

@ -630,25 +630,9 @@ _thumb_gen_size_changed_timer_cb(void *data)
EINA_LIST_FOREACH(ephoto->thumbs, l, o) EINA_LIST_FOREACH(ephoto->thumbs, l, o)
{ {
Ethumb_Thumb_Format format; e_thumb_icon_size_set(o, ephoto->thumb_gen_size,
format = (Ethumb_Thumb_Format) (uintptr_t)
evas_object_data_get(o, "ephoto_format");
if (format)
{
elm_thumb_format_set(o, format);
if (format == ETHUMB_THUMB_FDO)
{
if (ephoto->config->thumb_gen_size < 256)
elm_thumb_fdo_size_set(o, ETHUMB_THUMB_NORMAL);
else
elm_thumb_fdo_size_set(o, ETHUMB_THUMB_LARGE);
}
else
elm_thumb_size_set(o, ephoto->thumb_gen_size,
ephoto->thumb_gen_size); ephoto->thumb_gen_size);
elm_thumb_reload(o); e_thumb_icon_rethumb(o);
}
} }
end: end:
ephoto->timer.thumb_regen = NULL; ephoto->timer.thumb_regen = NULL;
@ -682,6 +666,7 @@ _thumb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
{ {
Ephoto *ephoto = data; Ephoto *ephoto = data;
e_thumb_icon_end(obj);
ephoto->thumbs = eina_list_remove(ephoto->thumbs, obj); ephoto->thumbs = eina_list_remove(ephoto->thumbs, obj);
} }
@ -698,16 +683,29 @@ ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, const char *path)
{ {
ext++; ext++;
if ((strcasecmp(ext, "edj") == 0)) if ((strcasecmp(ext, "edj") == 0))
o = elm_icon_add(parent); {
o = elm_icon_add(parent);
}
else else
o = elm_thumb_add(parent); {
o = e_thumb_icon_add(parent);
e_thumb_icon_file_set(o, path, NULL);
e_thumb_icon_size_set(o, ephoto->thumb_gen_size,
ephoto->thumb_gen_size);
e_thumb_icon_begin(o);
}
} }
else else
o = elm_thumb_add(parent); {
ephoto_thumb_path_set(o, path); o = e_thumb_icon_add(parent);
e_thumb_icon_file_set(o, path, NULL);
e_thumb_icon_size_set(o, ephoto->thumb_gen_size,
ephoto->thumb_gen_size);
e_thumb_icon_begin(o);
}
} }
else else
o = elm_thumb_add(parent); o = e_thumb_icon_add(parent);
if (!o) if (!o)
return NULL; return NULL;
@ -720,16 +718,13 @@ ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, const char *path)
void void
ephoto_thumb_path_set(Evas_Object *obj, const char *path) ephoto_thumb_path_set(Evas_Object *obj, const char *path)
{ {
Ethumb_Thumb_Format format = ETHUMB_THUMB_FDO;
const char *group = NULL; const char *group = NULL;
const char *ext = strrchr(path, '.'); const char *ext = strrchr(path, '.');
if (ext) if (ext)
{ {
ext++; ext++;
if ((strcasecmp(ext, "jpg") == 0) || (strcasecmp(ext, "jpeg") == 0)) if ((strcasecmp(ext, "edj") == 0))
format = ETHUMB_THUMB_JPEG;
else if ((strcasecmp(ext, "edj") == 0))
{ {
if (edje_file_group_exists(path, "e/desktop/background")) if (edje_file_group_exists(path, "e/desktop/background"))
group = "e/desktop/background"; group = "e/desktop/background";
@ -741,16 +736,11 @@ ephoto_thumb_path_set(Evas_Object *obj, const char *path)
edje_file_collection_list_free(g); edje_file_collection_list_free(g);
} }
elm_image_file_set(obj, path, group); elm_image_file_set(obj, path, group);
evas_object_data_set(obj, "ephoto_format", NULL);
return; return;
} }
} }
elm_thumb_format_set(obj, format); e_thumb_icon_file_set(obj, path, group);
evas_object_data_set(obj, "ephoto_format", (void *) (uintptr_t) format); e_thumb_icon_begin(obj);
elm_thumb_crop_align_set(obj, 0.5, 0.5);
elm_thumb_aspect_set(obj, ETHUMB_THUMB_CROP);
elm_thumb_orientation_set(obj, ETHUMB_THUMB_ORIENT_ORIGINAL);
elm_thumb_file_set(obj, path, group);
} }
Ephoto_Entry * Ephoto_Entry *

View File

@ -312,7 +312,10 @@ _ephoto_thumb_file_icon_get(void *data, Evas_Object *obj,
return NULL; return NULL;
if (e) if (e)
thumb = ephoto_thumb_add(e->ephoto, obj, e->path); {
thumb = ephoto_thumb_add(e->ephoto, obj, e->path);
evas_object_show(thumb);
}
return thumb; return thumb;
} }