Ephoto: Add cropping: Warning: Very experimental at this point.

This commit is contained in:
Stephen Houston 2015-02-02 13:54:45 -06:00
parent a74197b4a2
commit 06aea55c17
3 changed files with 235 additions and 4 deletions

View File

@ -72,6 +72,7 @@ AC_OUTPUT([
Makefile
data/Makefile
data/desktop/Makefile
data/themes/Makefile
src/Makefile
src/bin/Makefile
$po_makefile_in

View File

@ -1,2 +1,2 @@
MAINTAINERCLEANFILES = Makefile.in Makefile
SUBDIRS = desktop
SUBDIRS = desktop themes

View File

@ -144,7 +144,7 @@ _viewer_add(Evas_Object *parent, const char *path)
elm_image_file_set(v->image, path, group);
err = evas_object_image_load_error_get(elm_image_object_get(v->image));
if (err != EVAS_LOAD_ERROR_NONE) goto load_error;
elm_image_object_size_get(v->image, &w, &h);
evas_object_image_size_get(elm_image_object_get(v->image), &w, &h);
elm_drop_target_add(v->image, ELM_SEL_FORMAT_IMAGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
evas_object_size_hint_min_set(v->image, w, h);
evas_object_size_hint_max_set(v->image, w, h);
@ -674,6 +674,212 @@ _last_entry(Ephoto_Single_Browser *sb)
ephoto_single_browser_entry_set(sb->main, entry);
}
static void _apply_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win = data;
Evas_Object *layout = evas_object_data_get(win, "layout");
Evas_Object *image = evas_object_data_get(layout, "image");
Evas_Object *edje = elm_layout_edje_get(layout);
Evas_Object *image_object = elm_image_object_get(image);
Evas_Object *crop;
Ephoto_Single_Browser *sb = evas_object_data_get(win, "single_browser");
Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer");
const char *path, *key, *type;;
char tmp_path[PATH_MAX];
int x, y, w, h, cx, cy, cw, ch, iw, ih, sw, sh;
int nx, ny, nw, nh, i, j, tmpx, tmpy, ind, index;
double scalex, scaley, scalew, scaleh;
unsigned int *idata, *idata_new;
elm_image_file_get(image, &path, &key);
crop = evas_object_image_add(evas_object_evas_get(win));
evas_object_image_file_set(crop, path, key);
evas_object_geometry_get(layout, &x, &y, &w, &h);
edje_object_part_geometry_get(edje, "cropper", &cx, &cy, &cw, &ch);
evas_object_image_size_get(crop, &iw, &ih);
idata = evas_object_image_data_get(crop, EINA_FALSE);
scalex = (double)cx/(double)w;
scaley = (double)cy/(double)h;
scalew = (double)cw/(double)w;
scaleh = (double)ch/(double)h;
nx = iw*scalex;
ny = ih*scaley;
nw = iw*scalew;
nh = ih*scaleh;
index = 0;
idata_new = malloc(sizeof(unsigned int)*nw*nh);
for (i = 0; i < nh; i++)
{
tmpy = (i+ny)*iw;
for (j = 0; j < nw; j++)
{
tmpx = j+nx;
ind = tmpy+tmpx;
idata_new[index] = idata[ind];
index++;
}
}
evas_object_image_size_set(crop, nw, nh);
evas_object_image_data_set(crop, idata_new);
evas_object_image_data_update_add(crop, 0, 0, nw, nh);
type = strrchr(sb->entry->basename, '.');
snprintf(tmp_path, PATH_MAX, "%s/.config/ephoto/tmp%s", getenv("HOME"), type);
if (ecore_file_exists(tmp_path))
ecore_file_unlink(tmp_path);
evas_object_image_save(crop, tmp_path, NULL, NULL);
elm_image_file_set(v->image, tmp_path, NULL);
evas_object_geometry_get(sb->table, 0, 0, &sw, &sh);
if (nw < sw && nh < sh)
_zoom_set(sb, 1.0);
else
_zoom_fit(sb);
evas_object_del(win);
}
static void _cancel_crop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *win = data;
evas_object_del(win);
}
static void _image_resize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Evas_Object *image = data;
int sx, sy, sw, sh, iw, ih, diffw, diffh;
evas_object_geometry_get(obj, &sx, &sy, &sw, &sh);
evas_object_image_size_get(elm_image_object_get(image), &iw, &ih);
if (iw < sw && ih < sh)
{
diffw = sw - iw;
diffh = sh - ih;
diffw /= 2;
diffh /= 2;
evas_object_resize(obj, iw, ih);
evas_object_move(obj, sx+diffw, sy+diffh);
}
else
{
int nw, nh;
if (sw > sh)
{
nw = sw;
nh = ih*((double)sw/(double)iw);
if (nh > sh)
{
int onw, onh;
onw = nw;
onh = nh;
nh = sh;
nw = onw*((double)nh/(double)onh);
}
}
else
{
nh = sh;
nw = iw*((double)sh/(double)ih);
if (nw > sw)
{
int onw, onh;
onw = nw;
onh = nh;
nw = sw;
nh = onh*((double)nw/(double)onw);
}
}
diffw = sw - nw;
diffh = sh - nh;
diffw /= 2;
diffh /= 2;
evas_object_resize(obj, nw, nh);
evas_object_move(obj, sx+diffw, sy+diffh);
}
}
static void
_crop_image(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
{
const char *path, *key;
Ephoto_Single_Browser *sb = data;
Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer");
Evas_Object *win, *box, *frame, *layout, *image, *hbox, *ic, *button;
win = elm_win_inwin_add(sb->ephoto->win);
evas_object_data_set(win, "single_browser", sb);
evas_object_show(win);
box = elm_box_add(win);
elm_box_horizontal_set(box, EINA_FALSE);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_win_inwin_content_set(win, box);
evas_object_show(box);
frame = elm_frame_add(box);
elm_frame_autocollapse_set(frame, EINA_FALSE);
elm_object_text_set(frame, "Crop Image");
evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, frame);
evas_object_show(frame);
layout = elm_layout_add(frame);
elm_layout_file_set(layout, PACKAGE_DATA_DIR "/themes/crop.edj", "image_cropper");
evas_object_data_set(win, "layout", layout);
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_content_set(frame, layout);
evas_object_show(layout);
elm_image_file_get(v->image, &path, &key);
image = elm_image_add(frame);
elm_image_file_set(image, path, key);
evas_object_data_set(layout, "image", image);
evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_layout_content_set(layout, "ephoto.swallow.image", image);
evas_object_show(image);
hbox = elm_box_add(box);
elm_box_homogeneous_set(hbox, EINA_TRUE);
elm_box_horizontal_set(hbox, EINA_TRUE);
evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, hbox);
evas_object_show(hbox);
ic = elm_icon_add(box);
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
elm_icon_standard_set(ic, "document-save");
button = elm_button_add(hbox);
elm_object_text_set(button, "Apply");
elm_object_part_content_set(button, "icon", ic);
evas_object_smart_callback_add(button, "clicked", _apply_crop, win);
elm_box_pack_end(hbox, button);
evas_object_show(button);
ic = elm_icon_add(hbox);
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
elm_icon_standard_set(ic, "window-close");
button = elm_button_add(box);
elm_object_text_set(button, "Cancel");
elm_object_part_content_set(button, "icon", ic);
evas_object_smart_callback_add(button, "clicked", _cancel_crop, win);
elm_box_pack_end(hbox, button);
evas_object_show(button);
evas_object_event_callback_add(layout, EVAS_CALLBACK_RESIZE, _image_resize, image);
}
static void
_go_first(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
{
@ -830,8 +1036,11 @@ _entry_free(void *data, const Ephoto_Entry *entry EINA_UNUSED)
static void
_main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
{
char tmp_path[PATH_MAX];
Ephoto_Single_Browser *sb = data;
Ecore_Event_Handler *handler;
Eina_Iterator *tmps;
Eina_File_Direct_Info *info;
EINA_LIST_FREE(sb->handlers, handler)
ecore_event_handler_del(handler);
@ -839,6 +1048,14 @@ _main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *eve
ephoto_entry_free_listener_del(sb->entry, _entry_free, sb);
if (sb->pending_path)
eina_stringshare_del(sb->pending_path);
snprintf(tmp_path, PATH_MAX, "%s/.config/ephoto/", getenv("HOME"));
tmps = eina_file_stat_ls(tmp_path);
EINA_ITERATOR_FOREACH(tmps, info)
{
const char *bname = info->path + info->name_start;
if (!strncmp(bname, "tmp", 3))
ecore_file_unlink(info->path);
}
free(sb);
}
@ -907,6 +1124,7 @@ ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent)
elm_toolbar_menu_parent_set(sb->bar, sb->ephoto->win);
menu = elm_toolbar_item_menu_get(icon);
elm_menu_item_add(menu, NULL, NULL, "Crop", _crop_image, sb);
elm_menu_item_add(menu, NULL, "object-rotate-left", "Rotate Left", _go_rotate_counterclock, sb);
elm_menu_item_add(menu, NULL, "object-rotate-right", "Rotate Right", _go_rotate_clock, sb);
elm_menu_item_add(menu, NULL, "object-flip-horizontal", "Flip Horizontal", _go_flip_horiz, sb);
@ -973,10 +1191,22 @@ ephoto_single_browser_entry_set(Evas_Object *obj, Ephoto_Entry *entry)
sb->entry = entry;
if (entry)
ephoto_entry_free_listener_add(entry, _entry_free, sb);
ephoto_entry_free_listener_add(entry, _entry_free, sb);
_ephoto_single_browser_recalc(sb);
if (sb->viewer)
_zoom_fit(sb);
{
Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer");
Evas_Coord sw, sh, iw, ih;
evas_object_geometry_get(sb->table, 0, 0, &sw, &sh);
evas_object_image_size_get(elm_image_object_get(v->image), &iw, &ih);
if (iw < sw && ih < sh)
_zoom_set(sb, 1.0);
else
_zoom_fit(sb);
}
}
void