optional libexif support.

initial rotation support with edje map (the swallow still needs to be refitted in the available space after the rotation)



SVN revision: 52238
This commit is contained in:
Viktor Kojouharov 2010-09-14 08:35:42 +00:00
parent 1dcf8aef39
commit 35c4b294bd
5 changed files with 246 additions and 12 deletions

View File

@ -177,6 +177,34 @@ PKG_CHECK_MODULES([EIO], eio,
]
)
AC_ARG_ENABLE([libexif],
[AC_HELP_STRING([--enable-libexif], [enable libexif support @<:@default=yes@:>@])],
[
if test "x${enableval}" = "xyes" ; then
_ephoto_enable_libexif="yes"
else
_ephoto_enable_libexif="no"
fi
],
[_ephoto_enable_libexif="yes"]
)
AC_MSG_CHECKING([whether ethumb is built])
AC_MSG_RESULT([${_ephoto_enable_libexif}])
have_libexif="no"
if test "x${_ephoto_enable_libexif}" = "xyes" ; then
PKG_CHECK_MODULES(EXIF, libexif, [
have_libexif="yes"
AC_DEFINE(HAVE_LIBEXIF, 1, [have libexif support])
],[
have_libexif="no"
])
fi
AM_CONDITIONAL(BUILD_LIBEXIF, test $have_libexif = yes)
AC_OUTPUT([
Makefile
ephoto.spec
@ -220,7 +248,7 @@ echo " Eina.............: $have_eina"
echo " Ethumb...........: $have_ethumb"
echo " Elementary.......: $have_elementary"
echo " Eio..............: $have_eio"
echo " Libexif .........: $have_exif"
echo " Libexif .........: $have_libexif"
echo
echo "Installation Path.........: $prefix"
echo

View File

@ -460,6 +460,45 @@ collections
state: "default" 0.0;
rel2.to: "ephoto.toolbar.swallow";
rel2.relative: 1 0;
map {
on: 1;
}
}
description {
state: "rotate_0" 0.0;
inherit: "default" 0.0;
map {
rotation {
z: 0;
}
}
}
description {
state: "rotate_90" 0.0;
inherit: "default" 0.0;
map {
rotation {
z: 90;
}
}
}
description {
state: "rotate_180" 0.0;
inherit: "default" 0.0;
map {
rotation {
z: 180;
}
}
}
description {
state: "rotate_270" 0.0;
inherit: "default" 0.0;
map {
rotation {
z: 270;
}
}
}
}
part {
@ -473,6 +512,40 @@ collections
}
}
}
programs {
program {
name: "go_rotate_0";
signal: "ef,state,rotate,0";
source: "ef";
action: STATE_SET "rotate_0" 0.0;
transition: SINUSOIDAL 0.2;
target: "ephoto.flow.swallow";
}
program {
name: "go_rotate_90";
signal: "ef,state,rotate,90";
source: "ef";
action: STATE_SET "rotate_90" 0.0;
transition: SINUSOIDAL 0.2;
target: "ephoto.flow.swallow";
}
program {
name: "go_rotate_180";
signal: "ef,state,rotate,180";
source: "ef";
action: STATE_SET "rotate_180" 0.0;
transition: SINUSOIDAL 0.2;
target: "ephoto.flow.swallow";
}
program {
name: "go_rotate_270";
signal: "ef,state,rotate,270";
source: "ef";
action: STATE_SET "rotate_270" 0.0;
transition: SINUSOIDAL 0.2;
target: "ephoto.flow.swallow";
}
}
}
}

View File

@ -17,3 +17,10 @@ ephoto_SOURCES = \
ephoto_CFLAGS = @EET_CFLAGS@ @EVAS_CFLAGS@ @EDJE_CFLAGS@ @EINA_CFLAGS@ @EFREET_MIME_CFLAGS@ @ETHUMB_CFLAGS@ @ELEMENTARY_CFLAGS@ @EIO_CFLAGS@ -Wall -g
ephoto_LDADD = @EET_LIBS@ @EVAS_LIBS@ @EDJE_LIBS@ @EINA_LIBS@ @EFREET_MIME_LIBS@ @ETHUMB_LIBS@ @ELEMENTARY_LIBS@ @EIO_LIBS@
if BUILD_LIBEXIF
ephoto_CFLAGS += @EXIF_CFLAGS@
endif
if BUILD_LIBEXIF
ephoto_LDADD += @EXIF_LIBS@
endif

View File

@ -27,6 +27,7 @@ typedef struct _Ephoto_Config Ephoto_Config;
typedef struct _Ephoto Ephoto;
typedef enum _Ephoto_State Ephoto_State;
typedef enum _Ephoto_Orient Ephoto_Orient;
/*Main Functions*/
void ephoto_create_main_window(const char *directory, const char *image);
@ -66,6 +67,14 @@ enum _Ephoto_State
EPHOTO_STATE_SLIDESHOW
};
enum _Ephoto_Orient
{
EPHOTO_ORIENT_0,
EPHOTO_ORIENT_90,
EPHOTO_ORIENT_180,
EPHOTO_ORIENT_270
};
struct _Ephoto_Config
{
int config_version;

View File

@ -1,5 +1,10 @@
#include "ephoto.h"
#ifdef HAVE_LIBEXIF
#include <libexif/exif-data.h>
#endif
/*Callbacks*/
static void _ephoto_go_back(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_go_first(void *data, Evas_Object *obj, void *event_info);
@ -7,6 +12,8 @@ static void _ephoto_go_last(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_go_next(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_go_previous(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_go_slideshow(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_go_rotate_counterclockwise(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_go_rotate_clockwise(void *data, Evas_Object *obj, void *event_info);
static void _ephoto_key_pressed(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _ephoto_flow_browser_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _ephoto_flow_browser_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
@ -21,6 +28,8 @@ struct _Ephoto_Flow_Browser
Evas_Object *image2;
Evas_Object *toolbar;
const char *cur_image;
Ephoto_Orient orient;
};
static const char *toolbar_items[] = {
@ -47,8 +56,7 @@ static void
_ephoto_go_update(Ephoto_Flow_Browser *ef)
{
const char *file_type;
char *buffer;
int length;
int success = 0;
efreet_mime_init();
@ -60,23 +68,76 @@ _ephoto_go_update(Ephoto_Flow_Browser *ef)
file_type = efreet_mime_type_get(ef->cur_image);
if (file_type && !strcmp(file_type, "image/jpeg"))
{
elm_photocam_file_set(ef->image, ef->cur_image);
success = elm_photocam_file_set(ef->image, ef->cur_image);
elm_layout_content_set(ef->flow_browser, "ephoto.flow.swallow", ef->image);
evas_object_show(ef->image);
} else {
elm_image_file_set(ef->image2, ef->cur_image, NULL);
success = elm_image_file_set(ef->image2, ef->cur_image, NULL);
elm_layout_content_set(ef->flow_browser, "ephoto.flow.swallow", ef->image2);
evas_object_show(ef->image2);
}
elm_toolbar_item_unselect_all(ef->toolbar);
if (success)
{
char *buffer;
int length;
#ifdef HAVE_LIBEXIF
int orientation = 0;
efreet_mime_shutdown();
ExifData *exif = exif_data_new_from_file(ef->cur_image);
ExifEntry *entry = NULL;
ExifByteOrder bo;
if (exif)
{
entry = exif_data_get_entry(exif, EXIF_TAG_ORIENTATION);
if (entry)
{
bo = exif_data_get_byte_order(exif);
orientation = exif_get_short(entry->data, bo);
}
exif_data_free(exif);
}
length = strlen(ef->cur_image) + strlen("Ephoto - ") + 1;
buffer = alloca(length);
snprintf(buffer, length, "Ephoto - %s", ef->cur_image);
elm_win_title_set(em->win, buffer);
if (orientation > 1 && orientation < 9)
{
Evas_Object *o = elm_layout_edje_get(ef->flow_browser);
switch (orientation)
{
case 2: /* Horizontal flip */
break;
case 3: /* Rotate 180 clockwise */
ef->orient = EPHOTO_ORIENT_180;
edje_object_signal_emit(o, "ef,state,rotate,180", "ef");
break;
case 4: /* Vertical flip */
break;
case 5: /* Transpose */
break;
case 6: /* Rotate 90 clockwise */
ef->orient = EPHOTO_ORIENT_90;
edje_object_signal_emit(o, "ef,state,rotate,90", "ef");
break;
case 7: /* Transverse */
break;
case 8: /* Rotate 90 counter-clockwise */
ef->orient = EPHOTO_ORIENT_270;
edje_object_signal_emit(o, "ef,state,rotate,270", "ef");
break;
}
}
#endif
length = strlen(ef->cur_image) + strlen("Ephoto - ") + 1;
buffer = alloca(length);
snprintf(buffer, length, "Ephoto - %s", ef->cur_image);
elm_win_title_set(em->win, buffer);
}
elm_toolbar_item_unselect_all(ef->toolbar);
efreet_mime_shutdown();
}
/*Create the flow browser*/
@ -174,7 +235,7 @@ ephoto_flow_browser_image_set(Evas_Object *obj, const char *current_image)
elm_toolbar_item_disabled_set(o, !ef->iter ? EINA_TRUE : EINA_FALSE);
}
fprintf(stderr, "iter: %p\n", ef->iter);
DBG("iter: %p", ef->iter);
_ephoto_go_update(ef);
}
@ -221,6 +282,8 @@ static const struct
{ "Right", _ephoto_go_next },
{ "space", _ephoto_go_next },
{ "Escape", _ephoto_go_back },
{ "bracketleft", _ephoto_go_rotate_counterclockwise },
{ "bracketright", _ephoto_go_rotate_clockwise },
{ NULL, NULL }
};
@ -232,6 +295,7 @@ _ephoto_key_pressed(void *data, Evas *e, Evas_Object *obj, void *event_data)
int i;
eku = (Evas_Event_Key_Up *)event_data;
DBG("Key name: %s", eku->keyname);
for (i = 0; keys[i].name; ++i)
if (!strcmp(eku->keyname, keys[i].name))
keys[i].func(ef, NULL, NULL);
@ -317,3 +381,56 @@ _ephoto_go_slideshow(void *data, Evas_Object *obj, void *event_info)
elm_toolbar_item_unselect_all(ef->toolbar);
}
static void
_ephoto_go_rotate_counterclockwise(void *data, Evas_Object *obj, void *event_info)
{
Ephoto_Flow_Browser *ef = data;
Evas_Object *o = elm_layout_edje_get(ef->flow_browser);
switch(ef->orient)
{
case EPHOTO_ORIENT_0:
ef->orient = EPHOTO_ORIENT_270;
edje_object_signal_emit(o, "ef,state,rotate,270", "ef");
break;
case EPHOTO_ORIENT_90:
ef->orient = EPHOTO_ORIENT_0;
edje_object_signal_emit(o, "ef,state,rotate,0", "ef");
break;
case EPHOTO_ORIENT_180:
ef->orient = EPHOTO_ORIENT_90;
edje_object_signal_emit(o, "ef,state,rotate,90", "ef");
break;
case EPHOTO_ORIENT_270:
ef->orient = EPHOTO_ORIENT_180;
edje_object_signal_emit(o, "ef,state,rotate,180", "ef");
break;
}
}
static void
_ephoto_go_rotate_clockwise(void *data, Evas_Object *obj, void *event_info)
{
Ephoto_Flow_Browser *ef = data;
Evas_Object *o = elm_layout_edje_get(ef->flow_browser);
switch(ef->orient)
{
case EPHOTO_ORIENT_0:
ef->orient = EPHOTO_ORIENT_90;
edje_object_signal_emit(o, "ef,state,rotate,90", "ef");
break;
case EPHOTO_ORIENT_90:
ef->orient = EPHOTO_ORIENT_180;
edje_object_signal_emit(o, "ef,state,rotate,180", "ef");
break;
case EPHOTO_ORIENT_180:
ef->orient = EPHOTO_ORIENT_270;
edje_object_signal_emit(o, "ef,state,rotate,270", "ef");
break;
case EPHOTO_ORIENT_270:
ef->orient = EPHOTO_ORIENT_0;
edje_object_signal_emit(o, "ef,state,rotate,0", "ef");
break;
}
}