[elm_animator.c]
authorChunEon Park <chuneon.park@samsung.com>
Fri, 6 Aug 2010 07:04:30 +0000 (16:04 +0900)
committerChunEon Park <chuneon.park@samsung.com>
Fri, 6 Aug 2010 07:04:30 +0000 (16:04 +0900)
[elm_transit.c]

src/lib/Elementary.h.in
src/lib/elm_animator.c
src/lib/elm_transit.c

index 9ae43dc..6557493 100644 (file)
@@ -1957,6 +1957,11 @@ extern "C" {
    EAPI Eina_Bool     elm_animator_auto_reverse_get(Elm_Animator *animator);
    EAPI Eina_Bool     elm_animator_operating_get(Elm_Animator *animator);
    EAPI unsigned int  elm_animator_repeat_get(Elm_Animator *animator);
+   EAPI void           elm_animator_frame_pos_set(Elm_Animator *animator, double pos);
+   EAPI double         elm_animator_frame_pos_get(Elm_Animator *animator);
+   EAPI void           elm_animator_pause(Elm_Animator *animator);
+   EAPI void           elm_animator_resume(Elm_Animator *animator);
+  
 
    /* tansit */
    typedef struct _transit Elm_Transit;
@@ -1973,7 +1978,11 @@ extern "C" {
    EAPI void         elm_transit_event_block_disabled_set(Elm_Transit *transit, Eina_Bool disabled);
    EAPI Eina_Bool    elm_transit_fx_insert(Elm_Transit *transit, Elm_Effect *effect);
    EAPI void         elm_transit_fx_clear(Elm_Transit *transit);
-   EAPI Eina_Bool    elm_transit_event_block_disabled_get(Elm_Transit *transit);
+   EAPI Eina_Bool    elm_transit_event_block_disabled_get(Elm_Transit *transit);  
+   EAPI void           elm_transit_pause(Elm_Transit *transit);
+   EAPI void                   elm_transit_resume(Elm_Transit *transit);
+   EAPI void                   elm_transit_frame_pos_set(Elm_Transit *transit, double pos);
+   EAPI double         elm_transit_frame_pos_get(Elm_Transit *transit);
 
    /* Translation FX */
    EAPI Elm_Effect  *elm_fx_translation_add(Evas_Object *obj, Evas_Coord from_x, Evas_Coord from_y, Evas_Coord to_x, Evas_Coord to_y);
index 6a0b7f3..96d088f 100644 (file)
@@ -13,6 +13,7 @@ struct _Animator
    Ecore_Animator *animator;
    double begin_time;
    double cur_time;
+   double prev_time;
    double duration;
    unsigned int repeat_cnt;
    unsigned int cur_repeat_cnt;
@@ -88,14 +89,20 @@ static int
 _animator_animate_cb(void *data)
 {
    Elm_Animator *animator = (Elm_Animator *) data;
+   double elapsed_time, frame, cur_time;
 
-   animator->cur_time = ecore_loop_time_get();
-   double elapsed_time = animator->cur_time - animator->begin_time;
+   cur_time = ecore_loop_time_get();
 
-   if (elapsed_time > animator->duration)
-      elapsed_time = animator->duration;
+   animator->cur_time += (cur_time - animator->prev_time);
+   animator->prev_time = cur_time;
 
-   double frame = animator->curve_op(elapsed_time / animator->duration);
+   if(animator->cur_time > (animator->begin_time+animator->duration) ) {
+          animator->cur_time = animator->begin_time+animator->duration;
+   }
+
+   elapsed_time = animator->cur_time - animator->begin_time;
+
+   frame = animator->curve_op(elapsed_time / animator->duration);
 
    //Reverse?
    if (animator->auto_reverse)
@@ -356,6 +363,89 @@ elm_animator_completion_callback_set(Elm_Animator *animator,
 }
 
 /**
+ * Pause the animator.
+ *
+ * @param  animator Animator object
+ *
+ * @ingroup Animator
+ */
+EAPI void
+elm_animator_pause(Elm_Animator *animator)
+{
+       if(!animator)
+               return;
+
+       if(!animator->on_animating)
+               return;
+
+       ecore_animator_freeze(animator->animator);
+}
+
+/**
+ * Resume the animator.
+ *
+ * @param  animator Animator object
+ *
+ * @ingroup Animator
+ */
+EAPI void
+elm_animator_resume(Elm_Animator *animator)
+{
+       if(!animator)
+               return;
+
+       if(!animator->on_animating)
+               return;
+
+       ecore_animator_thaw(animator->animator);
+}
+
+/**
+ * Set the frame position
+ *
+ * @param  animator Animator object
+ * @param frame_pos frame position (range:0 ~ 1)
+ *
+ * @ingroup Animator
+ */
+EAPI void
+elm_animator_frame_pos_set(Elm_Animator *animator, double pos)
+{
+       double cur_time;
+
+       if(!animator)
+               return;
+
+       if(!animator->on_animating)
+               return ;
+
+       cur_time = animator->begin_time + (pos * animator->duration);
+
+       if(cur_time < animator->begin_time)
+               cur_time = animator->begin_time;
+
+       animator->prev_time = animator->cur_time = cur_time;
+       _animator_animate_cb(animator);
+}
+
+/**
+ * Get the current frame position
+ *
+ * @param  animator Animator object
+ * @return current frame position
+ *
+ * @ingroup Animator
+ */
+EAPI double
+elm_animator_frame_pos_get(Elm_Animator* animator)
+{
+       if(!animator)
+               return 0;
+
+       return ((animator->cur_time - animator->begin_time) / animator->duration);
+}
+
+/**
  * Stop animator.
  *
  * @param animator Animator object 
@@ -404,7 +494,7 @@ elm_animator_animate(Elm_Animator *animator)
       return;
    if (!animator->animator_op)
       return;
-   animator->begin_time = ecore_loop_time_get();
+   animator->prev_time = animator->cur_time = animator->begin_time = ecore_loop_time_get();
    animator->cur_repeat_cnt = animator->repeat_cnt;
    if (!animator->animator) {
       animator->animator = ecore_animator_add(_animator_animate_cb, animator);
index cc1a1f5..1f59dd3 100644 (file)
@@ -498,6 +498,75 @@ elm_transit_run(Elm_Transit *transit, double duration)
      }
 }
 
+/**
+ * Pause the transit
+ *
+ * @param  transit Transit
+ *
+ * @ingroup Transit
+ */
+EAPI void
+elm_transit_pause(Elm_Transit *transit)
+{
+       if(!transit)
+               return;
+
+       elm_animator_pause(transit->animator);
+}
+
+/**
+ * Resume the transit
+ *
+ * @param  transit Transit
+ *
+ * @ingroup Transit
+ */
+EAPI void
+elm_transit_resume(Elm_Transit *transit)
+{
+       if(!transit)
+               return;
+
+       elm_animator_resume(transit->animator);
+}
+
+/**
+ * Get the current frame position
+ *
+ * @param  transit Transit
+ * @return current frame position (range: 0~1)
+ *
+ * @ingroup Transit
+ */
+EAPI void
+elm_transit_frame_pos_set(Elm_Transit *transit, double pos)
+{
+       if(!transit)
+               return;
+
+       elm_animator_frame_pos_set(transit->animator, pos);
+}
+
+/**
+ * Get the current frame position
+ *
+ * @param  transit Transit
+ * @return current frame position
+ *
+ * @ingroup Transit
+ */
+EAPI double
+elm_transit_frame_pos_get(Elm_Transit *transit )
+{
+       if(!transit)
+               return 0;
+
+       return elm_animator_frame_pos_get(transit->animator);
+}
+
+
+
+
 /////////////////////////////////////////////////////////////////////////////////////
 //Resizing FX
 /////////////////////////////////////////////////////////////////////////////////////