other zoom modes work now.

SVN revision: 42669
This commit is contained in:
Carsten Haitzler 2009-09-24 08:55:12 +00:00
parent 031439f6d7
commit 5b0a120ea4
2 changed files with 132 additions and 18 deletions

View File

@ -19,7 +19,25 @@ my_bt_zoom_out(void *data, Evas_Object *obj, void *event_info)
zoom = elm_photocam_zoom_get(data);
zoom *= 2;
elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL);
if (zoom <= 32) elm_photocam_zoom_set(data, zoom);
if (zoom <= 256) elm_photocam_zoom_set(data, zoom);
}
void
my_bt_zoom_man(void *data, Evas_Object *obj, void *event_info)
{
elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL);
}
void
my_bt_zoom_fit(void *data, Evas_Object *obj, void *event_info)
{
elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT);
}
void
my_bt_zoom_fill(void *data, Evas_Object *obj, void *event_info)
{
elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL);
}
void
@ -69,7 +87,31 @@ test_photocam(void *data, Evas_Object *obj, void *event_info)
evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, ph);
evas_object_size_hint_weight_set(bt, 1.0, 1.0);
evas_object_size_hint_align_set(bt, 0.9, 0.1);
elm_table_pack(tb2, bt, 0, 0, 1, 1);
elm_table_pack(tb2, bt, 2, 0, 1, 1);
evas_object_show(bt);
bt = elm_button_add(win);
elm_button_label_set(bt, "Manual");
evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_man, ph);
evas_object_size_hint_weight_set(bt, 1.0, 1.0);
evas_object_size_hint_align_set(bt, 0.1, 0.9);
elm_table_pack(tb2, bt, 0, 1, 1, 1);
evas_object_show(bt);
bt = elm_button_add(win);
elm_button_label_set(bt, "Fit");
evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, ph);
evas_object_size_hint_weight_set(bt, 1.0, 1.0);
evas_object_size_hint_align_set(bt, 0.5, 0.9);
elm_table_pack(tb2, bt, 1, 1, 1, 1);
evas_object_show(bt);
bt = elm_button_add(win);
elm_button_label_set(bt, "Fill");
evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, ph);
evas_object_size_hint_weight_set(bt, 1.0, 1.0);
evas_object_size_hint_align_set(bt, 0.9, 0.9);
elm_table_pack(tb2, bt, 2, 1, 1, 1);
evas_object_show(bt);
evas_object_show(tb2);

View File

@ -400,7 +400,7 @@ _zoom_anim(void *data)
Evas_Object *obj = data;
Widget_Data *wd = elm_widget_data_get(obj);
double t;
Evas_Coord ow, oh;
Evas_Coord xx, yy, ow, oh;
t = ecore_loop_time_get();
if (t >= wd->t_end)
@ -412,13 +412,14 @@ _zoom_anim(void *data)
t = 1.0 - (t * t);
wd->size.w = (wd->size.ow * (1.0 - t)) + (wd->size.nw * t);
wd->size.h = (wd->size.oh * (1.0 - t)) + (wd->size.nh * t);
printf("%3.3f %3.3f\n", wd->size.spos.x, wd->size.spos.y);
// elm_smart_scroller_child_viewport_size_get(wd->scr, &ow, &oh);
// elm_smart_scroller_child_region_show
// (wd->scr,
// (wd->size.spos.x * wd->size.w) - (ow / 2),
// (wd->size.spos.y * wd->size.h) - (oh / 2),
// ow, oh);
elm_smart_scroller_child_viewport_size_get(wd->scr, &ow, &oh);
xx = (wd->size.spos.x * wd->size.w) - (ow / 2);
yy = (wd->size.spos.y * wd->size.h) - (oh / 2);
if (xx < 0) xx = 0;
else if (xx > (wd->size.w - ow)) xx = wd->size.w - ow;
if (yy < 0) yy = 0;
else if (yy > (wd->size.h - oh)) yy = wd->size.h - oh;
elm_smart_scroller_child_region_show(wd->scr, xx, yy, ow, oh);
if (wd->calc_job) ecore_job_del(wd->calc_job);
wd->calc_job = ecore_job_add(_calc_job, wd);
if (t >= 1.0)
@ -785,6 +786,7 @@ elm_photocam_zoom_set(Evas_Object *obj, int zoom)
Eina_List *l;
Grid *g, *g_zoom = NULL;
Evas_Coord pw, ph, rx, ry, rw, rh;
int z;
Ecore_Animator *an;
if (zoom < 1) zoom = 1;
@ -792,11 +794,76 @@ elm_photocam_zoom_set(Evas_Object *obj, int zoom)
wd->zoom = zoom;
wd->size.ow = wd->size.w;
wd->size.oh = wd->size.h;
wd->size.nw = wd->size.imw / wd->zoom;
wd->size.nh = wd->size.imh / wd->zoom;
wd->size.w = wd->size.nw;
wd->size.h = wd->size.nh;
if (wd->main_load_pending) goto done;
elm_smart_scroller_child_pos_get(wd->scr, &rx, &ry);
elm_smart_scroller_child_viewport_size_get(wd->scr, &rw, &rh);
if (wd->mode == ELM_PHOTOCAM_ZOOM_MODE_MANUAL)
{
wd->size.nw = wd->size.imw / wd->zoom;
wd->size.nh = wd->size.imh / wd->zoom;
}
else if (wd->mode == ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT)
{
ph = (wd->size.imh * rw) / wd->size.imw;
if (ph > rh)
{
pw = (wd->size.imw * rh) / wd->size.imh;
ph = rh;
}
else
{
pw = rw;
}
if ((pw > wd->size.imw) || (ph > wd->size.imh))
{
pw = wd->size.imw;
ph = wd->size.imh;
}
if (wd->size.imw > wd->size.imh)
z = wd->size.imw / pw;
else
z = wd->size.imh / ph;
z++;
if (z <= 1) z == 1;
else if (z <= 2) z = 2;
else if (z <= 4) z = 4;
else if (z <= 8) z = 8;
else z = 8;
wd->zoom = z;
wd->size.nw = pw;
wd->size.nh = ph;
}
else if (wd->mode == ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL)
{
ph = (wd->size.imh * rw) / wd->size.imw;
if (ph < rh)
{
pw = (wd->size.imw * rh) / wd->size.imh;
ph = rh;
}
else
{
pw = rw;
}
if (wd->size.imw > wd->size.imh)
z = wd->size.imw / pw;
else
z = wd->size.imh / ph;
z++;
if (z <= 1) z == 1;
else if (z <= 2) z = 2;
else if (z <= 4) z = 4;
else if (z <= 8) z = 8;
else z = 8;
wd->zoom = z;
wd->size.nw = pw;
wd->size.nh = ph;
}
if (wd->main_load_pending)
{
wd->size.w = wd->size.nw;
wd->size.h = wd->size.nh;
goto done;
}
EINA_LIST_FOREACH(wd->grids, l, g)
{
if (g->zoom == wd->zoom)
@ -828,11 +895,13 @@ elm_photocam_zoom_set(Evas_Object *obj, int zoom)
if (wd->nosmooth == 1) _smooth_update(obj);
}
wd->t_start = ecore_loop_time_get();
elm_smart_scroller_child_pos_get(wd->scr, &rx, &ry);
elm_smart_scroller_child_viewport_size_get(wd->scr, &rw, &rh);
wd->t_end = wd->t_start + _elm_config->zoom_friction;
wd->size.spos.x = (double)(rx + (rw / 2)) / (double)wd->size.w;
wd->size.spos.y = (double)(ry + (rh / 2)) / (double)wd->size.h;
wd->t_end = wd->t_start + _elm_config->zoom_friction;
if (rw > wd->size.w) wd->size.spos.x = 0.5;
if (rh > wd->size.h) wd->size.spos.y = 0.5;
if (wd->size.spos.x > 1.0) wd->size.spos.x = 1.0;
if (wd->size.spos.y > 1.0) wd->size.spos.y = 1.0;
an = wd->zoom_animator;
if (!_zoom_anim(obj)) ecore_animator_del(an);
if (wd->calc_job) ecore_job_del(wd->calc_job);
@ -869,6 +938,9 @@ elm_photocam_zoom_mode_set(Evas_Object *obj, Elm_Photocam_Zoom_Mode mode)
{
Widget_Data *wd = elm_widget_data_get(obj);
if (wd->mode == mode) return;
wd->mode = mode;
wd->zoom++;
elm_photocam_zoom_set(obj, wd->zoom - 1);
}
/**