On Thu, Nov 3, 2011 at 5:43 AM, Enlightenment SVN
<no-re...@enlightenment.org> wrote:
> Log:
> Add CURRENT option which edje object moves from current position.
>  Currently, when the part in edc move by transition, it moves from the
>  one of the states to another of the states even if it is ainimating.
>  We need it to move from current position, because the animation is not
>  natural and smooth. So I made the "CURRENT" option.

And that's patch is so super simple to read and understand now ! That
rock ! Thanks !

> Author:       jaehwan
> Date:         2011-11-02 21:43:00 -0700 (Wed, 02 Nov 2011)
> New Revision: 64675
> Trac:         http://trac.enlightenment.org/e/changeset/64675
>
> Modified:
>  trunk/edje/src/bin/edje_cc_handlers.c trunk/edje/src/lib/Edje.h 
> trunk/edje/src/lib/edje_calc.c trunk/edje/src/lib/edje_private.h 
> trunk/edje/src/lib/edje_program.c
>
> Modified: trunk/edje/src/bin/edje_cc_handlers.c
> ===================================================================
> --- trunk/edje/src/bin/edje_cc_handlers.c       2011-11-03 03:26:29 UTC (rev 
> 64674)
> +++ trunk/edje/src/bin/edje_cc_handlers.c       2011-11-03 04:43:00 UTC (rev 
> 64675)
> @@ -7121,7 +7121,7 @@
>     @property
>         transition
>     @parameters
> -        [type] [length] [[interp val 1]] [[interp val 2]]
> +        [type] [length] [[interp val 1]] [[interp val 2]] [[option]]
>     @effect
>         Defines how transitions occur using STATE_SET action.\n
>         Where 'type' is the style of the transition and 'length' is a double
> @@ -7157,6 +7157,11 @@
>         spring "swings" and val 1 specifies the decay, but it can exceed 1.0
>         on the outer swings.
>
> +        Valid option is CURRENT.
> +
> +        CURRENT is the option which the edje object moves from current 
> position.
> +        It can be used as the last parameter of the every type.
> +
>     @endproperty
>  */
>  static void
> @@ -7190,15 +7195,30 @@
>                                            "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))
> +     {
> +        if ((get_arg_count() == 3) && (!strcmp(parse_str(2), "CURRENT")))
> +          current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
> +        else if (get_arg_count() != 2)
> +          {
> +             ERR("%s: Error. parse error %s:%i. "
> +                 "Need 2rd parameter to set time",
> +                 progname, file_in, line - 1);
> +             exit(-1);
> +          }
> +     }
>    // the following need v1
>    // EDJE_TWEEN_MODE_ACCELERATE_FACTOR
>    // EDJE_TWEEN_MODE_DECELERATE_FACTOR
>    // EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR
>    // current_program->tween.v1
> -   if ((current_program->tween.mode >= EDJE_TWEEN_MODE_ACCELERATE_FACTOR) &&
> +   else if ((current_program->tween.mode >= 
> EDJE_TWEEN_MODE_ACCELERATE_FACTOR) &&
>        (current_program->tween.mode <= EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR))
>      {
> -        if (get_arg_count() != 3)
> +        if ((get_arg_count() == 4) && (!strcmp(parse_str(3), "CURRENT")))
> +          current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
> +        else if (get_arg_count() != 3)
>           {
>             ERR("%s: Error. parse error %s:%i. "
>                 "Need 3rd parameter to set factor",
> @@ -7215,7 +7235,9 @@
>    else if ((current_program->tween.mode >= EDJE_TWEEN_MODE_DIVISOR_INTERP) &&
>             (current_program->tween.mode <= EDJE_TWEEN_MODE_SPRING))
>      {
> -        if (get_arg_count() != 4)
> +        if ((get_arg_count() == 5) && (!strcmp(parse_str(4), "CURRENT")))
> +          current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT;
> +        else if (get_arg_count() != 4)
>           {
>             ERR("%s: Error. parse error %s:%i. "
>                 "Need 3rd and 4th parameters to set factor and counts",
>
> Modified: trunk/edje/src/lib/Edje.h
> ===================================================================
> --- trunk/edje/src/lib/Edje.h   2011-11-03 03:26:29 UTC (rev 64674)
> +++ trunk/edje/src/lib/Edje.h   2011-11-03 04:43:00 UTC (rev 64675)
> @@ -631,7 +631,9 @@
>    EDJE_TWEEN_MODE_DIVISOR_INTERP    = 8,
>    EDJE_TWEEN_MODE_BOUNCE            = 9,
>    EDJE_TWEEN_MODE_SPRING            = 10,
> -   EDJE_TWEEN_MODE_LAST              = 11
> +   EDJE_TWEEN_MODE_LAST              = 11,
> +   EDJE_TWEEN_MODE_MASK              = 0xff,
> +   EDJE_TWEEN_MODE_OPT_FROM_CURRENT  = (1 << 31)
>  } Edje_Tween_Mode;
>
>  typedef enum _Edje_Cursor
>
> Modified: trunk/edje/src/lib/edje_calc.c
> ===================================================================
> --- trunk/edje/src/lib/edje_calc.c      2011-11-03 03:26:29 UTC (rev 64674)
> +++ trunk/edje/src/lib/edje_calc.c      2011-11-03 04:43:00 UTC (rev 64675)
> @@ -56,7 +56,7 @@
>          break;
>      }
>  #else
> -   switch (mode)
> +   switch (mode & EDJE_TWEEN_MODE_MASK)
>      {
>       case EDJE_TWEEN_MODE_SINUSOIDAL:
>         npos = FROM_DOUBLE(ecore_animator_pos_map(TO_DOUBLE(pos),
> @@ -2212,11 +2212,32 @@
>  #endif
>          }
>      }
> -   if (ep->param2 && ep->description_pos != ZERO)
> +   if (ep->param2)
>      {
>        int beginning_pos, part_type;
>        Edje_Calc_Params *p2, *p3;
>
> +        if (ep->current)
> +          {
> +             p1->x = ep->current->x - ed->x;
> +             p1->y = ep->current->y - ed->y;

Hum, I don't think you should look so late into ed->x and ed->y. I
guess that if the object is moved between the time your got the
current->x position and the time you update the position, it will be
wrong. Couldn't you directly do this operation when you retrieve the
current state ?

> +             p1->w = ep->current->w;
> +             p1->h = ep->current->h;
> +             p1->color.r = ep->current->color.r;
> +             p1->color.g = ep->current->color.g;
> +             p1->color.b = ep->current->color.b;
> +             p1->color.a = ep->current->color.a;
> +             p1->type.text.size = ep->current->type.text.size;
> +             p1->type.text.color2.r = ep->current->type.text.color2.r;
> +             p1->type.text.color2.g = ep->current->type.text.color2.g;
> +             p1->type.text.color2.b = ep->current->type.text.color2.b;
> +             p1->type.text.color2.a = ep->current->type.text.color2.a;
> +             p1->type.text.color3.r = ep->current->type.text.color3.r;
> +             p1->type.text.color3.g = ep->current->type.text.color3.g;
> +             p1->type.text.color3.b = ep->current->type.text.color3.b;
> +             p1->type.text.color3.a = ep->current->type.text.color3.a;
> +          }

There is still some parameter that are not extracted from the current
state and I really think that at the end, you should just do *p1 =
*ep->current;. If you do so, that mean you don't need to compute p1 at
all, so you should disable it's computation a little bit earlier in
this function.

>        p3 = &lp3;
>
>  #ifndef EDJE_CALC_CACHE
>
> Modified: trunk/edje/src/lib/edje_private.h
> ===================================================================
> --- trunk/edje/src/lib/edje_private.h   2011-11-03 03:26:29 UTC (rev 64674)
> +++ trunk/edje/src/lib/edje_private.h   2011-11-03 04:43:00 UTC (rev 64675)
> @@ -1212,6 +1212,7 @@
>    Edje_Real_Part_State      param1; // 20
>    // WITH EDJE_CALC_CACHE: 140
>    Edje_Real_Part_State     *param2, *custom; // 8
> +   Edje_Calc_Params         *current; // 4
>
>  #ifdef EDJE_CALC_CACHE
>    int                       state; // 4
> @@ -1230,8 +1231,8 @@
>  #ifdef EDJE_CALC_CACHE
>    unsigned char             invalidate : 1; // 0
>  #endif
> -}; //  260
> -// WITH EDJE_CALC_CACHE: 400
> +}; //  264
> +// WITH EDJE_CALC_CACHE: 404
>
>  struct _Edje_Running_Program
>  {
>
> Modified: trunk/edje/src/lib/edje_program.c
> ===================================================================
> --- trunk/edje/src/lib/edje_program.c   2011-11-03 03:26:29 UTC (rev 64674)
> +++ trunk/edje/src/lib/edje_program.c   2011-11-03 04:43:00 UTC (rev 64675)
> @@ -478,6 +478,35 @@
>                       rp = ed->table_parts[pt->id % ed->table_parts_size];
>                       if (rp)
>                         {
> +                            if ((rp->object) && (pr->tween.mode & 
> EDJE_TWEEN_MODE_OPT_FROM_CURRENT))
> +                              {
> +                                 rp->current = calloc(1, 
> sizeof(Edje_Calc_Params));
> +                                 evas_object_geometry_get(rp->object, 
> &(rp->current->x),
> +                                                          &(rp->current->y),
> +                                                          &(rp->current->w),
> +                                                          &(rp->current->h));
> +                                 evas_object_color_get(rp->object, (int 
> *)&(rp->current->color.r),
> +                                                       (int 
> *)&(rp->current->color.g),
> +                                                       (int 
> *)&(rp->current->color.b),
> +                                                       (int 
> *)&(rp->current->color.a));
> +                                 evas_object_text_font_get(rp->object, NULL, 
> &(rp->current->type.text.size));
> +                                 
> evas_object_text_outline_color_get(rp->object,
> +                                                       (int 
> *)&(rp->current->type.text.color2.r),
> +                                                       (int 
> *)&(rp->current->type.text.color2.g),
> +                                                       (int 
> *)&(rp->current->type.text.color2.b),
> +                                                       (int 
> *)&(rp->current->type.text.color2.a));
> +                                 
> evas_object_text_shadow_color_get(rp->object,
> +                                                       (int 
> *)&(rp->current->type.text.color3.r),
> +                                                       (int 
> *)&(rp->current->type.text.color3.g),
> +                                                       (int 
> *)&(rp->current->type.text.color3.b),
> +                                                       (int 
> *)&(rp->current->type.text.color3.a));

Please don't rely on Evas doing type/magic check to have this working.
It would be way nicer to have a switch/case that handle part->type and
do the reverse of what we do in edje_calc.c

> +                              }
> +                            else
> +                              {
> +                                 if (rp->current) free(rp->current);
> +                                 rp->current = NULL;
> +                              }
> +
>                            if (rp->program)
>                              _edje_program_end(ed, rp->program);
>                            _edje_part_description_apply(ed, rp,

Anyway, that's a very nice patch, like what was done just need a
little bit more polish and that would be ready for 1.1.
-- 
Cedric BAIL
------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to