cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6487a26354f0e11a9c7dd74d2923e7d2466dcc34

commit 6487a26354f0e11a9c7dd74d2923e7d2466dcc34
Author: jiin.moon <jiin.m...@samsung.com>
Date:   Mon Jun 22 17:56:08 2015 +0200

    edje: add support to control the transition time of edje animation globally.
    
    Summary:
    Add the transition scale flag and the transtion scale value.
    This flag can be change using "transition_scale_enable" in edje program.
    If flag is true, the transition scale value affect the transition speed of 
edje
    The transition scale value can be change by elm_config.
    
    @feature
    
    Test Plan: elementary_config
    
    Reviewers: Hermet, cedric
    
    Subscribers: cedric
    
    Differential Revision: https://phab.enlightenment.org/D2287
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 src/bin/edje/edje_cc.h          |   1 +
 src/bin/edje/edje_cc_handlers.c | 174 ++++++++++++++++++++--------------------
 src/bin/edje/edje_cc_parse.c    |  12 +++
 src/lib/edje/Edje_Common.h      |  37 +++++++++
 src/lib/edje/edje_data.c        |   1 +
 src/lib/edje/edje_private.h     |   1 +
 src/lib/edje/edje_program.c     |  20 ++++-
 7 files changed, 156 insertions(+), 90 deletions(-)

diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h
index 6b1e16c..3e25e69 100644
--- a/src/bin/edje/edje_cc.h
+++ b/src/bin/edje/edje_cc.h
@@ -247,6 +247,7 @@ Eina_Bool edje_cc_handlers_wildcard(void);
 void edje_cc_handlers_hierarchy_alloc(void);
 void edje_cc_handlers_hierarchy_free(void);
 void edje_cc_handlers_pop_notify(const char *token);
+int get_param_index(char *str);
 
 /* global vars */
 extern Eina_List             *ext_dirs;
diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index 7b3efd4..6a294cb 100644
--- a/src/bin/edje/edje_cc_handlers.c
+++ b/src/bin/edje/edje_cc_handlers.c
@@ -1570,6 +1570,7 @@ _edje_program_copy(Edje_Program *ep, Edje_Program *ep2)
    ep->tween.v2 = ep2->tween.v2;
    ep->tween.v3 = ep2->tween.v3;
    ep->tween.v4 = ep2->tween.v4;
+   ep->tween.use_duration_factor = ep2->tween.use_duration_factor;
    ep->sample_name = STRDUP(ep2->sample_name);
    ep->tone_name = STRDUP(ep2->tone_name);
    ep->duration = ep2->duration;
@@ -12002,6 +12003,7 @@ ob_collections_group_programs_program(void)
    ep = mem_alloc(SZ(Edje_Program_Parser));
    ep->id = -1;
    ep->tween.mode = EDJE_TWEEN_MODE_LINEAR;
+   ep->tween.use_duration_factor = EINA_FALSE;
    ep->after = NULL;
    epp = (Edje_Program_Parser *)ep;
    epp->can_override = EINA_FALSE;
@@ -12486,7 +12488,8 @@ st_collections_group_programs_program_action(void)
 static void
 st_collections_group_programs_program_transition(void)
 {
-   char *tmp = NULL;
+   int current = -1, index = -1;
+   unsigned int required_args = 0;
 
    check_min_arg_count(2);
 
@@ -12522,106 +12525,101 @@ 
st_collections_group_programs_program_transition(void)
                                            "SPRING", EDJE_TWEEN_MODE_SPRING,
                                            NULL);
    current_program->tween.time = FROM_DOUBLE(parse_float_range(1, 0.0, 
999999999.0));
-   if ((current_program->tween.mode >= EDJE_TWEEN_MODE_LINEAR) &&
-       (current_program->tween.mode <= EDJE_TWEEN_MODE_DECELERATE))
+
+  //Check the index of params not related to tweenmode's param
+  //This index use for count of the tweenmode's param
+   if ((index = get_param_index("USE_DURATION_FACTOR")) != -1)
      {
-        tmp = NULL;
-        if ((get_arg_count() == 3) && (!strcmp((tmp = parse_str(2)), 
"CURRENT")))
-          {
-             free(tmp);
-             current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
-          }
-        else if (get_arg_count() != 2)
-          {
-             free(tmp);
-             ERR("parse error %s:%i. Need 2rd parameter to set time",
-                 file_in, line - 1);
-             exit(-1);
-          }
+        current_program->tween.use_duration_factor = parse_bool(index + 1);
+        required_args += 2;
      }
-   // the following need v1
-   // EDJE_TWEEN_MODE_ACCELERATE_FACTOR
-   // EDJE_TWEEN_MODE_DECELERATE_FACTOR
-   // EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR
-   // current_program->tween.v1
-   else if ((current_program->tween.mode >= EDJE_TWEEN_MODE_ACCELERATE_FACTOR) 
&&
-       (current_program->tween.mode <= EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR))
+   if ((current = get_param_index("CURRENT")) != -1)
      {
-        tmp = NULL;
-        if ((get_arg_count() == 4) && (!strcmp((tmp = parse_str(3)), 
"CURRENT")))
-          {
-             free(tmp);
-             current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
-          }
-        else if (get_arg_count() != 3)
-          {
-             free(tmp);
-            ERR("parse error %s:%i. Need 3rd parameter to set factor",
-                file_in, line - 1);
-            exit(-1);
-          }
-        current_program->tween.v1 = FROM_DOUBLE(parse_float_range(2, 0.0, 
999999999.0));
-     }
-   // the followjng also need v2
-   // EDJE_TWEEN_MODE_DIVISOR_INTERP
-   // EDJE_TWEEN_MODE_BOUNCE
-   // EDJE_TWEEN_MODE_SPRING
-   // current_program->tween.v2
-   else if ((current_program->tween.mode >= EDJE_TWEEN_MODE_DIVISOR_INTERP) &&
-            (current_program->tween.mode <= EDJE_TWEEN_MODE_SPRING))
-     {
-        tmp = NULL;
-        if ((get_arg_count() == 5) && (!strcmp((tmp = parse_str(4)), 
"CURRENT")))
-          {
-             free(tmp);
-             current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
-          }
-        else if (get_arg_count() != 4)
-          {
-             free(tmp);
-            ERR("parse error %s:%i. "
-                "Need 3rd and 4th parameters to set factor and counts",
-                file_in, line - 1);
-            exit(-1);
-          }
-        current_program->tween.v1 = FROM_DOUBLE(parse_float_range(2, 0.0, 
999999999.0));
-        current_program->tween.v2 = FROM_DOUBLE(parse_float_range(3, 0.0, 
999999999.0));
+        if (index == -1 || current < index)
+          index = current;
+        required_args++;
      }
-   else if (current_program->tween.mode == EDJE_TWEEN_MODE_CUBIC_BEZIER)
+   switch(current_program->tween.mode)
      {
-        tmp = NULL;
-        if ((get_arg_count() == 7) && (!strcmp((tmp = parse_str(4)), 
"CURRENT")))
+        case EDJE_TWEEN_MODE_LINEAR:
+        case EDJE_TWEEN_MODE_SINUSOIDAL:
+        case EDJE_TWEEN_MODE_ACCELERATE:
+        case EDJE_TWEEN_MODE_DECELERATE:
           {
-             free(tmp);
-             current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
+             required_args += 2;
+             check_arg_count(required_args);
           }
-        else if (get_arg_count() != 6)
+        break;
+
+        // the following need v1
+        case EDJE_TWEEN_MODE_ACCELERATE_FACTOR:
+        case EDJE_TWEEN_MODE_DECELERATE_FACTOR:
+        case EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR:
           {
-             free(tmp);
-             ERR("parse error %s:%i. "
-             "Need 3rd, 4th, 5th and 6th parameters to set x1, y1, x2 and y2",
-             file_in, line - 1);
-             exit(-1);
+             required_args += 3;
+             check_arg_count(required_args);
+             if (index == -1 || index > 2)
+               {
+                   current_program->tween.v1 =
+                      FROM_DOUBLE(parse_float_range(2, -999999999.0, 
999999999.0));
+                   break;
+               }
+             else
+               {
+                  ERR("parse error %s:%i. Need 3rd parameter to set factor",
+                  file_in, line - 1);
+                  exit(-1);
+               }
           }
-        current_program->tween.v1 =
-           FROM_DOUBLE(parse_float_range(2, -999999999.0, 999999999.0));
-        current_program->tween.v2 =
-           FROM_DOUBLE(parse_float_range(3, -999999999.0, 999999999.0));
-        if (get_arg_count() == 7)
+        case EDJE_TWEEN_MODE_DIVISOR_INTERP:
+        case EDJE_TWEEN_MODE_BOUNCE:
+        case EDJE_TWEEN_MODE_SPRING:
           {
-             current_program->tween.v3 =
-                FROM_DOUBLE(parse_float_range(5, -999999999.0, 999999999.0));
-             current_program->tween.v4 =
-                FROM_DOUBLE(parse_float_range(6, -999999999.0, 999999999.0));
+             required_args += 4;
+             check_arg_count(required_args);
+             if (index == -1 || index > 3)
+               {
+                   current_program->tween.v1 =
+                      FROM_DOUBLE(parse_float_range(2, -999999999.0, 
999999999.0));
+                   current_program->tween.v2 =
+                      FROM_DOUBLE(parse_float_range(3, -999999999.0, 
999999999.0));
+                   break;
+               }
+             else
+               {
+                  ERR("parse error %s:%i. "
+                  "Need 3rd and 4th parameters to set factor and counts",
+                  file_in, line - 1);
+                  exit(-1);
+               }
           }
-        else
+        case EDJE_TWEEN_MODE_CUBIC_BEZIER:
           {
-             current_program->tween.v3 =
-                FROM_DOUBLE(parse_float_range(4, -999999999.0, 999999999.0));
-             current_program->tween.v4 =
-                FROM_DOUBLE(parse_float_range(5, -999999999.0, 999999999.0));
+             required_args += 6;
+             check_arg_count(required_args);
+             if (index == -1 || index > 5)
+               {
+                   current_program->tween.v1 =
+                      FROM_DOUBLE(parse_float_range(2, -999999999.0, 
999999999.0));
+                   current_program->tween.v2 =
+                      FROM_DOUBLE(parse_float_range(3, -999999999.0, 
999999999.0));
+                   current_program->tween.v3 =
+                      FROM_DOUBLE(parse_float_range(4, -999999999.0, 
999999999.0));
+                   current_program->tween.v4 =
+                      FROM_DOUBLE(parse_float_range(5, -999999999.0, 
999999999.0));
+                   break;
+               }
+             else
+               {
+                  ERR("parse error %s:%i. "
+                  "Need 3rd, 4th, 5th and 6th parameters to set x1, y1, x2 and 
y2",
+                  file_in, line - 1);
+                  exit(-1);
+               }
           }
-     }
+        }
+      if (current > 0)
+        current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
 }
 
 static void
diff --git a/src/bin/edje/edje_cc_parse.c b/src/bin/edje/edje_cc_parse.c
index b87afb0..6327e8e 100644
--- a/src/bin/edje/edje_cc_parse.c
+++ b/src/bin/edje/edje_cc_parse.c
@@ -1815,3 +1815,15 @@ strstrip(const char *in, char *out, size_t size)
    *out = '\0';
    return 1;
 }
+
+int
+get_param_index(char *str)
+{
+  int index ;
+  for(index = 0; index < get_arg_count(); index++)
+  {
+      if(!strcmp(str,_parse_param_get(index)))
+        return index;
+  }
+  return -1;
+}
diff --git a/src/lib/edje/Edje_Common.h b/src/lib/edje/Edje_Common.h
index 668eab0..7e33765 100644
--- a/src/lib/edje/Edje_Common.h
+++ b/src/lib/edje/Edje_Common.h
@@ -1834,6 +1834,43 @@ EAPI void         edje_thaw                       (void);
 EAPI void         edje_language_set               (const char *locale);
 
 /**
+ * @brief Set edje trasition's duration factor.
+ *
+ * @param scale The edje trasition's duration factor (the default value is @c 
1.0)
+ *
+ * This function sets the edje transition duration factor
+ * It will affect the speed of transitions
+ * which had the @c use_duration_factor property set to @1.
+ * The default value of @c use_duration_factor property is @c zero,
+ * but can be changed by @p "USE_DURATION_FACTOR 1" or @p "USE_DURATION_FACTOR 
0"
+ * as parameter of @c "TRANSITION" property at EDC level.
+ * If the parameter is @p "USE_DURATION_FACTOR 0" or not mentioned about @p 
"USE_DURATION_FACTOR",
+ * the duration of transition keeps original duration
+ *
+ * @warning The transition's duration factor cannot be set on each translation.
+ * If you use this function, it will affect transitions globally
+ *
+ * @see edje_transition_duration_factor_get()
+ *
+ * @since 1.15
+ */
+EAPI void         edje_transition_duration_factor_set        (double scale);
+
+/**
+ * @brief Retrieve trasitions'duration factor.
+ *
+ * @return The edje transition duration factor
+ *
+ * This function returns the edje transition duration factor.
+ *
+ * @see edje_transition_duration_set() for more details
+ *
+ * @since 1.15
+ *
+ */
+EAPI double       edje_transition_duration_factor_get                  (void);
+
+/**
  * @}
  */
 
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index 2352e85..608e802 100644
--- a/src/lib/edje/edje_data.c
+++ b/src/lib/edje/edje_data.c
@@ -580,6 +580,7 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "v2", 
tween.v2, EDJE_T_FLOAT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "v3", 
tween.v3, EDJE_T_FLOAT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "v4", 
tween.v4, EDJE_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"use_duration_factor", tween.use_duration_factor, EET_T_UCHAR);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_program, Edje_Program, 
"targets", targets, _edje_edd_edje_program_target);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_program, Edje_Program, "after", 
after, _edje_edd_edje_program_after);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"api.name", api.name, EET_T_STRING);
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index fe8bc21..d69a783 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -756,6 +756,7 @@ struct _Edje_Program /* a conditional program to be run */
       FLOAT_T  v2; /* other value for drag actions */
       FLOAT_T  v3; /* other value for drag actions */
       FLOAT_T  v4; /* other value for drag actions */
+      Eina_Bool use_duration_factor; /* use duration factor or not */
    } tween;
 
    Eina_List  *targets; /* list of target parts to apply the state to */
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index 2b5a1fa..9947f44 100644
--- a/src/lib/edje/edje_program.c
+++ b/src/lib/edje/edje_program.c
@@ -7,6 +7,7 @@ static void _edje_param_set(Edje *ed, Edje_Real_Part *part, 
const char *param, c
 int _edje_anim_count = 0;
 Ecore_Animator *_edje_timer = NULL;
 Eina_List *_edje_animators = NULL;
+static double _edje_transition_duration_scale = 0;
 
 static Eina_Bool
 _edje_emit_aliased(Edje *ed, const char *part, const char *sig, const char 
*src)
@@ -182,6 +183,18 @@ edje_frametime_get(void)
    return ecore_animator_frametime_get();
 }
 
+EAPI double
+edje_transition_duration_factor_get(void)
+{
+   return _edje_transition_duration_scale;
+}
+
+EAPI void
+edje_transition_duration_factor_set(double scale)
+{
+   _edje_transition_duration_scale = FROM_DOUBLE(scale);
+}
+
 void
 edje_object_propagate_callback_add(Evas_Object *obj, void (*func)(void *data, 
Evas_Object *o, const char *emission, const char *source), void *data)
 {
@@ -399,7 +412,7 @@ _edje_object_animation_get(Eo *obj EINA_UNUSED, Edje *ed)
 Eina_Bool
 _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
 {
-   FLOAT_T t, total;
+   FLOAT_T t, total, t_scale = 1.0;
    Eina_List *l;
    Edje *ed;
    Edje_Program_Target *pt;
@@ -410,8 +423,11 @@ _edje_program_run_iterate(Edje_Running_Program *runp, 
double tim)
    _edje_block(ed);
    _edje_ref(ed);
    _edje_util_freeze(ed);
+
+   if (runp->program->tween.use_duration_factor)
+     t_scale = _edje_transition_duration_scale;
    t = FROM_DOUBLE(tim - runp->start_time);
-   total = runp->program->tween.time;
+   total = runp->program->tween.time * t_scale;
    t = DIV(t, total);
    if (t > FROM_INT(1)) t = FROM_INT(1);
    EINA_LIST_FOREACH(runp->program->targets, l, pt)

-- 


Reply via email to