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