other zoom modes work now.
authorCarsten Haitzler <raster@rasterman.com>
Thu, 24 Sep 2009 08:55:12 +0000 (08:55 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Thu, 24 Sep 2009 08:55:12 +0000 (08:55 +0000)
SVN revision: 42669

src/bin/test_photocam.c
src/lib/elm_photocam.c

index f37ecd3..8563244 100644 (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);
index 5daf7ce..1ce099e 100644 (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);
 }
 
 /**