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_CHECK_HEADERS([dirent.h limits.h math.h arpa/inet.h netinet/in.h])
AC_PREREQ([2.60])
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])
@ -45,6 +47,8 @@ PKG_CHECK_MODULES([EFL], [
eina >= 1.7.0
evas >= 1.7.0
ecore >= 1.7.0
ecore-file >= 1.7.0
ecore-ipc >= 1.7.0
edje >= 1.7.0
eo >= 1.7.0
eio >= 1.7.0

View File

@ -20,17 +20,38 @@ endif
ephoto_SOURCES = \
ephoto.c \
ephoto_main.c \
ephoto_bcg.c \
ephoto_color.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_single_browser.c \
ephoto_slideshow.c \
ephoto_cropper.c \
ephoto_bcg.c \
ephoto_hsv.c \
ephoto_filters.c \
ephoto_color.c \
ephoto_editor.c
ephoto_slideshow.c
internal_bindir = $(datadir)/$(PACKAGE)
internal_bin_PROGRAMS = ephoto_thumbnail
ephoto_thumbnail_CPPFLAGS = \
-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
EXTRA_DIST = ephoto.h

View File

@ -9,7 +9,6 @@ elm_main(int argc, char **argv)
eio_init();
elm_need_efreet();
elm_need_ethumb();
elm_language_set("");
elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
elm_app_info_set(elm_main, "ephoto", "themes/crop.edj");
@ -21,7 +20,11 @@ elm_main(int argc, char **argv)
#endif
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);
@ -71,6 +74,7 @@ elm_main(int argc, char **argv)
elm_run();
end:
e_thumb_shutdown();
efreet_mime_shutdown();
eio_shutdown();

View File

@ -5,9 +5,17 @@
# include "config.h"
# 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 <Ecore.h>
# include <Ecore_Evas.h>
# include <Ecore_Ipc.h>
# include <Ecore_File.h>
# include <Efreet_Mime.h>
# include <Elementary.h>
@ -16,13 +24,6 @@
# include <Edje.h>
# include <Evas.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
# include <locale.h>
@ -36,6 +37,9 @@
# define ngettext(String1, String2, Var) Var == 1 ? String1 : String2
#endif
# define USE_IPC
/*local types*/
typedef struct _Ephoto_Config Ephoto_Config;
typedef struct _Ephoto Ephoto;
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_Orient Ephoto_Orient;
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);
void ephoto_title_set(Ephoto *ephoto, const char *title);
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,
Elm_Object_Item *expanded, Eina_Bool dirs_only, Eina_Bool thumbs_only);
/*config panel functions*/
Eina_Bool ephoto_config_init(Ephoto *em);
void ephoto_config_save(Ephoto *em);
void ephoto_config_free(Ephoto *em);
void ephoto_config_main(Ephoto *em);
/*single image functions*/
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_entry_set(Evas_Object *obj, Ephoto_Entry *entry);
@ -72,22 +80,40 @@ void ephoto_single_browser_cancel_editing(Evas_Object *main,
Evas_Object *image);
/* smart callbacks called: "back" - the user wants to go back to the previous
* screen. */
/*slideshow functions*/
Evas_Object *ephoto_slideshow_add(Ephoto *ephoto, Evas_Object *parent);
void ephoto_slideshow_entries_set(Evas_Object *obj, Eina_List *entries);
void ephoto_slideshow_entry_set(Evas_Object *obj, Ephoto_Entry *entry);
/* smart callbacks called: "back" - the user wants to go back to the previous
* screen. */
/*thumbnail browser functions*/
Evas_Object *ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent);
void ephoto_thumb_browser_fsel_clear(Ephoto *ephoto);
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_remove(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
* 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,
const char *data_name, void *data);
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_histogram_eq(Evas_Object *main, Evas_Object *image);
/*data types and structures*/
enum _Ephoto_State
{
EPHOTO_STATE_THUMB,
@ -132,6 +160,11 @@ enum _Ephoto_Sort
EPHOTO_SORT_MODTIME_DESCENDING
};
enum _Ephoto_Ipc_Domain
{
EPHOTO_IPC_DOMAIN_THUMB
};
struct _Ephoto_Config
{
int config_version;
@ -219,6 +252,7 @@ struct _Ephoto_Event_Entry_Create
Ephoto_Entry *entry;
};
/*ephoto file functions*/
Ephoto_Entry *ephoto_entry_new(Ephoto *ephoto, const char *path,
const char *label, Eina_File_Type type);
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);
int ephoto_entries_cmp(const void *pa, const void *pb);
/*check if image can be loaded*/
static inline Eina_Bool
_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;
}
/*check if image can be saved*/
static inline Eina_Bool
_ephoto_file_image_can_save(const char *ext)
{
@ -283,6 +319,7 @@ _ephoto_file_image_can_save(const char *ext)
return EINA_FALSE;
}
/*event types*/
extern int EPHOTO_EVENT_ENTRY_CREATE;
extern int EPHOTO_EVENT_POPULATE_START;
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)
{
Ethumb_Thumb_Format format;
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,
e_thumb_icon_size_set(o, ephoto->thumb_gen_size,
ephoto->thumb_gen_size);
elm_thumb_reload(o);
}
e_thumb_icon_rethumb(o);
}
end:
ephoto->timer.thumb_regen = NULL;
@ -682,6 +666,7 @@ _thumb_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
{
Ephoto *ephoto = data;
e_thumb_icon_end(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++;
if ((strcasecmp(ext, "edj") == 0))
o = elm_icon_add(parent);
{
o = elm_icon_add(parent);
}
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
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
o = elm_thumb_add(parent);
o = e_thumb_icon_add(parent);
if (!o)
return NULL;
@ -720,16 +718,13 @@ ephoto_thumb_add(Ephoto *ephoto, Evas_Object *parent, const char *path)
void
ephoto_thumb_path_set(Evas_Object *obj, const char *path)
{
Ethumb_Thumb_Format format = ETHUMB_THUMB_FDO;
const char *group = NULL;
const char *ext = strrchr(path, '.');
if (ext)
{
ext++;
if ((strcasecmp(ext, "jpg") == 0) || (strcasecmp(ext, "jpeg") == 0))
format = ETHUMB_THUMB_JPEG;
else if ((strcasecmp(ext, "edj") == 0))
if ((strcasecmp(ext, "edj") == 0))
{
if (edje_file_group_exists(path, "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);
}
elm_image_file_set(obj, path, group);
evas_object_data_set(obj, "ephoto_format", NULL);
return;
}
}
elm_thumb_format_set(obj, format);
evas_object_data_set(obj, "ephoto_format", (void *) (uintptr_t) format);
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);
e_thumb_icon_file_set(obj, path, group);
e_thumb_icon_begin(obj);
}
Ephoto_Entry *

View File

@ -312,7 +312,10 @@ _ephoto_thumb_file_icon_get(void *data, Evas_Object *obj,
return NULL;
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;
}