Allow proper rotations and do proper rotations. This is temporary until edje or evas does them correctly.
SVN revision: 57532
This commit is contained in:
parent
53cec34e73
commit
ac899f9de4
|
@ -186,7 +186,13 @@ _ephoto_eina_file_direct_info_image_useful(const Eina_File_Direct_Info *info)
|
|||
ext++;
|
||||
if ((strcasecmp(ext, "jpg") == 0) ||
|
||||
(strcasecmp(ext, "jpeg") == 0) ||
|
||||
(strcasecmp(ext, "png") == 0))
|
||||
(strcasecmp(ext, "png") == 0) ||
|
||||
(strcasecmp(ext, "svg") == 0) ||
|
||||
(strcasecmp(ext, "svgz") == 0) ||
|
||||
(strcasecmp(ext, "bmp") == 0) ||
|
||||
(strcasecmp(ext, "dib") == 0) ||
|
||||
(strcasecmp(ext, "tiff") == 0) ||
|
||||
(strcasecmp(ext, "tif") == 0))
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* elm_photocam and elm_image rotates their images internally.
|
||||
* Rotating the scroller is not correct and was rejected by Raster and others.
|
||||
*/
|
||||
//#define ROTATION 1
|
||||
#define ROTATION 1
|
||||
|
||||
#define ZOOM_STEP 0.2
|
||||
|
||||
|
@ -20,8 +20,6 @@ struct _Ephoto_Single_Browser
|
|||
Ephoto *ephoto;
|
||||
Evas_Object *layout;
|
||||
Evas_Object *edje;
|
||||
Evas_Object *orient_layout;
|
||||
Evas_Object *orient_edje;
|
||||
Evas_Object *viewer;
|
||||
Evas_Object *toolbar;
|
||||
struct {
|
||||
|
@ -52,7 +50,6 @@ struct _Ephoto_Single_Browser
|
|||
|
||||
struct _Ephoto_Viewer
|
||||
{
|
||||
Evas_Object *photocam;
|
||||
Evas_Object *scroller;
|
||||
Evas_Object *image;
|
||||
double zoom;
|
||||
|
@ -80,12 +77,6 @@ _path_is_jpeg(const char *path_stringshared)
|
|||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_viewer_photocam_loaded(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
|
||||
{
|
||||
elm_photocam_paused_set(obj, EINA_FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
_viewer_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
||||
{
|
||||
|
@ -98,22 +89,10 @@ _viewer_add(Evas_Object *parent, const char *path)
|
|||
{
|
||||
Ephoto_Viewer *v = calloc(1, sizeof(Ephoto_Viewer));
|
||||
Evas_Object *obj;
|
||||
Evas_Coord w, h;
|
||||
int err;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(v, NULL);
|
||||
if (_path_is_jpeg(path))
|
||||
{
|
||||
obj = v->photocam = elm_photocam_add(parent);
|
||||
EINA_SAFETY_ON_NULL_GOTO(obj, error);
|
||||
err = elm_photocam_file_set(obj, path);
|
||||
if (err != EVAS_LOAD_ERROR_NONE) goto load_error;
|
||||
elm_photocam_paused_set(obj, EINA_TRUE);
|
||||
evas_object_smart_callback_add
|
||||
(obj, "loaded", _viewer_photocam_loaded, v);
|
||||
}
|
||||
else
|
||||
{
|
||||
Evas_Coord w, h;
|
||||
obj = v->scroller = elm_scroller_add(parent);
|
||||
EINA_SAFETY_ON_NULL_GOTO(obj, error);
|
||||
v->image = evas_object_image_filled_add(evas_object_evas_get(parent));
|
||||
|
@ -128,9 +107,6 @@ _viewer_add(Evas_Object *parent, const char *path)
|
|||
evas_object_resize(v->image, w, h);
|
||||
evas_object_show(v->image);
|
||||
elm_scroller_content_set(obj, v->image);
|
||||
elm_scroller_custom_widget_base_theme_set(obj, "photocam", "default");
|
||||
|
||||
}
|
||||
evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
||||
evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||
evas_object_data_set(obj, "viewer", v);
|
||||
|
@ -147,19 +123,16 @@ _viewer_add(Evas_Object *parent, const char *path)
|
|||
|
||||
static void
|
||||
_viewer_zoom_apply(Ephoto_Viewer *v, double zoom)
|
||||
{
|
||||
v->zoom = zoom;
|
||||
if (v->photocam) elm_photocam_zoom_set(v->photocam, 1.0 / zoom);
|
||||
else
|
||||
{
|
||||
Evas_Coord w, h;
|
||||
|
||||
v->zoom = zoom;
|
||||
evas_object_image_size_get(v->image, &w, &h);
|
||||
w *= zoom;
|
||||
h *= zoom;
|
||||
evas_object_size_hint_min_set(v->image, w, h);
|
||||
evas_object_size_hint_max_set(v->image, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_viewer_zoom_fit_apply(Ephoto_Viewer *v)
|
||||
|
@ -167,16 +140,8 @@ _viewer_zoom_fit_apply(Ephoto_Viewer *v)
|
|||
Evas_Coord cw, ch, iw, ih;
|
||||
double zx, zy, zoom;
|
||||
|
||||
if (v->photocam)
|
||||
{
|
||||
evas_object_geometry_get(v->photocam, NULL, NULL, &cw, &ch);
|
||||
elm_photocam_image_size_get(v->photocam, &iw, &ih);
|
||||
}
|
||||
else
|
||||
{
|
||||
evas_object_geometry_get(v->scroller, NULL, NULL, &cw, &ch);
|
||||
evas_object_image_size_get(v->image, &iw, &ih);
|
||||
}
|
||||
|
||||
if ((cw <= 0) || (ch <= 0)) return; /* object still not resized */
|
||||
EINA_SAFETY_ON_TRUE_RETURN(iw <= 0);
|
||||
|
@ -204,10 +169,6 @@ _viewer_zoom_set(Evas_Object *obj, double zoom)
|
|||
|
||||
if (v->fit)
|
||||
{
|
||||
if (v->photocam)
|
||||
evas_object_event_callback_del_full
|
||||
(v->photocam, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
else
|
||||
evas_object_event_callback_del_full
|
||||
(v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
v->fit = EINA_FALSE;
|
||||
|
@ -231,10 +192,6 @@ _viewer_zoom_fit(Evas_Object *obj)
|
|||
if (v->fit) return;
|
||||
v->fit = EINA_TRUE;
|
||||
|
||||
if (v->photocam)
|
||||
evas_object_event_callback_add
|
||||
(v->photocam, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
else
|
||||
evas_object_event_callback_add
|
||||
(v->scroller, EVAS_CALLBACK_RESIZE, _viewer_resized, v);
|
||||
|
||||
|
@ -245,38 +202,106 @@ static void
|
|||
_orient_apply(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
#ifdef ROTATION
|
||||
const char *sig;
|
||||
unsigned int *im_data, *im_data_new;
|
||||
int inde, ind, i, j, ni, nj, ew, eh, nw, nh;
|
||||
Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer");
|
||||
|
||||
im_data = evas_object_image_data_get(v->image, FALSE);
|
||||
evas_object_image_size_get(v->image, &ew, &eh);
|
||||
inde = 0;
|
||||
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sig = "state,rotate,0";
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sig = "state,rotate,90";
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sig = "state,rotate,180";
|
||||
im_data_new = malloc(sizeof(unsigned int) * ew * eh);
|
||||
nw = eh;
|
||||
nh = ew;
|
||||
for (i = 0; i < nh; i++)
|
||||
{
|
||||
for (j = 0; j < nw; j++)
|
||||
{
|
||||
ni = nw - j - 1;
|
||||
nj = i;
|
||||
|
||||
ind = ni * nh + nj;
|
||||
|
||||
im_data_new[inde] = im_data[ind];
|
||||
|
||||
inde++;
|
||||
}
|
||||
}
|
||||
evas_object_image_size_set(v->image, nw, nh);
|
||||
evas_object_image_data_set(v->image, im_data_new);
|
||||
evas_object_image_data_update_add(v->image, 0, 0, nw, nh);
|
||||
_viewer_zoom_fit_apply(v);
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sig = "state,rotate,270";
|
||||
im_data_new = malloc(sizeof(unsigned int) * ew * eh);
|
||||
nw = eh;
|
||||
nh = ew;
|
||||
for (i = 0; i < nh; i++)
|
||||
{
|
||||
for (j = 0; j < nw; j++)
|
||||
{
|
||||
ni = j;
|
||||
nj = nh - i - 1;
|
||||
|
||||
ind = ni * nh + nj;
|
||||
|
||||
im_data_new[inde] = im_data[ind];
|
||||
|
||||
inde++;
|
||||
}
|
||||
}
|
||||
evas_object_image_size_set(v->image, nw, nh);
|
||||
evas_object_image_data_set(v->image, im_data_new);
|
||||
evas_object_image_data_update_add(v->image, 0, 0, nw, nh);
|
||||
_viewer_zoom_fit_apply(v);
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sig = "state,flip,horiz";
|
||||
im_data_new = malloc(sizeof(unsigned int) * ew * eh);
|
||||
for (i = 0; i < eh; i++)
|
||||
{
|
||||
for (j = 0; j < ew; j++)
|
||||
{
|
||||
ni = i;
|
||||
nj = ew - j - 1;
|
||||
|
||||
ind = ni * ew + nj;
|
||||
|
||||
im_data_new[inde] = im_data[ind];
|
||||
|
||||
inde++;
|
||||
}
|
||||
}
|
||||
evas_object_image_size_set(v->image, ew, eh);
|
||||
evas_object_image_data_set(v->image, im_data_new);
|
||||
evas_object_image_data_update_add(v->image, 0, 0, ew, eh);
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sig = "state,flip,vert";
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sig = "state,flip,horiz,90";
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sig = "state,flip,vert,90";
|
||||
im_data_new = malloc(sizeof(unsigned int) * ew * eh);
|
||||
for (i = 0; i < eh; i++)
|
||||
{
|
||||
for (j = 0; j < ew; j++)
|
||||
{
|
||||
ni = eh - i - 1;
|
||||
nj = j;
|
||||
|
||||
ind = ni * ew + nj;
|
||||
|
||||
im_data_new[inde] = im_data[ind];
|
||||
|
||||
inde++;
|
||||
}
|
||||
}
|
||||
evas_object_image_size_set(v->image, ew, eh);
|
||||
evas_object_image_data_set(v->image, im_data_new);
|
||||
evas_object_image_data_update_add(v->image, 0, 0, ew, eh);
|
||||
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
DBG("orient: %d, signal '%s'", sb->orient, sig);
|
||||
edje_object_signal_emit(sb->orient_edje, sig, "ephoto");
|
||||
#else
|
||||
(void)sb;
|
||||
#endif
|
||||
|
@ -286,132 +311,28 @@ _orient_apply(Ephoto_Single_Browser *sb)
|
|||
static void
|
||||
_rotate_counterclock(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
}
|
||||
_orient_apply(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
_rotate_clock(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
}
|
||||
_orient_apply(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
_flip_horiz(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
}
|
||||
_orient_apply(sb);
|
||||
}
|
||||
|
||||
static void
|
||||
_flip_vert(Ephoto_Single_Browser *sb)
|
||||
{
|
||||
switch (sb->orient)
|
||||
{
|
||||
case EPHOTO_ORIENT_0:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT;
|
||||
break;
|
||||
case EPHOTO_ORIENT_90:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_VERT_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_180:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ;
|
||||
break;
|
||||
case EPHOTO_ORIENT_270:
|
||||
sb->orient = EPHOTO_ORIENT_FLIP_HORIZ_90;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ:
|
||||
sb->orient = EPHOTO_ORIENT_180;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT:
|
||||
sb->orient = EPHOTO_ORIENT_0;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_HORIZ_90:
|
||||
sb->orient = EPHOTO_ORIENT_270;
|
||||
break;
|
||||
case EPHOTO_ORIENT_FLIP_VERT_90:
|
||||
sb->orient = EPHOTO_ORIENT_90;
|
||||
break;
|
||||
}
|
||||
_orient_apply(sb);
|
||||
}
|
||||
#endif
|
||||
|
@ -513,16 +434,14 @@ _ephoto_single_browser_recalc(Ephoto_Single_Browser *sb)
|
|||
if (sb->entry)
|
||||
{
|
||||
const char *bname = ecore_file_file_get(sb->entry->path);
|
||||
sb->viewer = _viewer_add(sb->orient_layout, sb->entry->path);
|
||||
sb->viewer = _viewer_add(sb->layout, sb->entry->path);
|
||||
elm_layout_content_set
|
||||
(sb->orient_layout, "elm.swallow.content", sb->viewer);
|
||||
(sb->layout, "elm.swallow.content", sb->viewer);
|
||||
evas_object_show(sb->viewer);
|
||||
evas_object_event_callback_add
|
||||
(sb->viewer, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel, sb);
|
||||
edje_object_part_text_set(sb->edje, "elm.text.title", bname);
|
||||
ephoto_title_set(sb->ephoto, bname);
|
||||
sb->orient = ephoto_file_orient_get(sb->entry->path);
|
||||
_orient_apply(sb);
|
||||
ephoto_title_set(sb->ephoto, bname);;
|
||||
}
|
||||
|
||||
elm_object_focus(sb->layout);
|
||||
|
@ -942,17 +861,6 @@ ephoto_single_browser_add(Ephoto *ephoto, Evas_Object *parent)
|
|||
(sb->action.flip_vert, "Flip object vertically");
|
||||
#endif
|
||||
|
||||
sb->orient_layout = elm_layout_add(layout);
|
||||
if (!elm_layout_theme_set
|
||||
(sb->orient_layout, "layout", "ephoto", "orient"))
|
||||
{
|
||||
ERR("could not load style 'ephoto/orient' from theme");
|
||||
goto error;
|
||||
}
|
||||
sb->orient_edje = elm_layout_edje_get(sb->orient_layout);
|
||||
elm_layout_content_set(sb->layout, "elm.swallow.content", sb->orient_layout);
|
||||
elm_object_focus_custom_chain_append(sb->layout, sb->orient_layout, NULL);
|
||||
|
||||
_ephoto_single_browser_toolbar_eval(sb);
|
||||
|
||||
sb->handlers = eina_list_append
|
||||
|
|
Loading…
Reference in New Issue