Transit: Support BEZIER CURVE

Summary:
Support BEZIER CURVE in elm transit
         @feature

Reviewers: seoz, raster, Hermet

Subscribers: raster, seoz

Differential Revision: https://phab.enlightenment.org/D1759
This commit is contained in:
jiin.moon 2014-12-17 19:35:13 +09:00 committed by ChunEon Park
parent 4a61d3955e
commit a40fa2528b
2 changed files with 71 additions and 16 deletions

View File

@ -57,7 +57,7 @@ struct _Elm_Transit
double progress;
unsigned int effects_pending_del;
int walking;
double v1, v2;
double v[4];
Eina_Bool auto_reverse : 1;
Eina_Bool event_enabled : 1;
Eina_Bool deleted : 1;
@ -348,34 +348,39 @@ _transit_animate_cb(void *data)
transit->progress =
ecore_animator_pos_map(transit->progress,
ECORE_POS_MAP_ACCELERATE_FACTOR,
transit->v1, 0);
transit->v[0], 0);
break;
case ELM_TRANSIT_TWEEN_MODE_DECELERATE:
transit->progress =
ecore_animator_pos_map(transit->progress,
ECORE_POS_MAP_DECELERATE_FACTOR,
transit->v1, 0);
transit->v[0], 0);
break;
case ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL:
transit->progress =
ecore_animator_pos_map(transit->progress,
ECORE_POS_MAP_SINUSOIDAL_FACTOR,
transit->v1, 0);
transit->v[0], 0);
break;
case ELM_TRANSIT_TWEEN_MODE_DIVISOR_INTERP:
transit->progress = ecore_animator_pos_map(transit->progress,
ECORE_POS_MAP_DIVISOR_INTERP,
transit->v1, transit->v2);
transit->v[0], transit->v[1]);
break;
case ELM_TRANSIT_TWEEN_MODE_BOUNCE:
transit->progress = ecore_animator_pos_map(transit->progress,
ECORE_POS_MAP_BOUNCE,
transit->v1, transit->v2);
transit->v[0], transit->v[1]);
break;
case ELM_TRANSIT_TWEEN_MODE_SPRING:
transit->progress = ecore_animator_pos_map(transit->progress,
ECORE_POS_MAP_SPRING,
transit->v1, transit->v2);
transit->v[0], transit->v[1]);
break;
case ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE:
transit->progress = ecore_animator_pos_map_n(transit->progress,
ECORE_POS_MAP_CUBIC_BEZIER,
4, transit->v);
break;
default:
break;
@ -477,8 +482,8 @@ elm_transit_add(void)
elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_LINEAR);
transit->v1 = 1.0;
transit->v2 = 0.0;
transit->v[0] = 1.0;
transit->v[1] = 0.0;
transit->smooth = EINA_TRUE;
return transit;
@ -681,16 +686,26 @@ EAPI void
elm_transit_tween_mode_factor_set(Elm_Transit *transit, double v1, double v2)
{
ELM_TRANSIT_CHECK_OR_RETURN(transit);
transit->v1 = v1;
transit->v2 = v2;
transit->v[0] = v1;
transit->v[1] = v2;
}
EAPI void
elm_transit_tween_mode_factor_get(const Elm_Transit *transit, double *v1, double *v2)
{
ELM_TRANSIT_CHECK_OR_RETURN(transit);
if (v1) *v1 = transit->v1;
if (v2) *v2 = transit->v2;
if (v1) *v1 = transit->v[0];
if (v2) *v2 = transit->v[1];
}
EAPI void
elm_transit_tween_mode_factor_n_set(Elm_Transit *transit, unsigned int v_size, double *v)
{
int i;
ELM_TRANSIT_CHECK_OR_RETURN(transit);
if (v_size > 4) v_size = 4;
for (i = 0; i < v_size; i++)
transit->v[i] = v[i];
}
EAPI void

View File

@ -74,9 +74,13 @@ typedef enum
ELM_TRANSIT_TWEEN_MODE_BOUNCE, /**< Start at 0.0 then "drop" like a ball
bouncing to the ground at 1.0, and
bounce v2 times, with decay factor of v1 */
ELM_TRANSIT_TWEEN_MODE_SPRING /**< Start at 0.0 then "wobble" like a spring
rest position 1.0, and wobble v2 times,
with decay factor of v1 */
ELM_TRANSIT_TWEEN_MODE_SPRING, /**< Start at 0.0 then "wobble" like a spring
rest position 1.0, and wobble v2 times,
with decay factor of v1 */
ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE /**< @since 1.13
Follow the cubic-bezier curve
calculated with the control points
(x1, y1), (x2, y2) */
} Elm_Transit_Tween_Mode;
/**
@ -501,6 +505,42 @@ EAPI void elm_transit_tween_mode_factor_set(Elm_Transit *trans
*/
EAPI void elm_transit_tween_mode_factor_get(const Elm_Transit *transit, double *v1, double *v2);
/**
* Set the transit animation acceleration factor.
*
* This function sets the tween mode factor of the transit that can be:
* If you use the below tween modes, you have to set the factor using this API.
* ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL - Start slow, speed up then slow down
* at end, v[0] being a power factor, 0.0 being linear, 1.0 being
* ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL default, 2.0 being much more pronounced
* sinusoidal(squared), 3.0 being cubed, etc.
* ELM_TRANSIT_TWEEN_MODE_DECELERATE - Start fast then slow down, v[0] being a
* power factor, 0.0 being linear, 1.0 being ELM_TRANSIT_TWEEN_MODE_DECELERATE
* default, 2.0 being much more pronounced decelerate (squared), 3.0 being
* cubed, etc.
* ELM_TRANSIT_TWEEN_MODE_ACCELERATE - Start slow then speed up, v[0] being a
* power factor, 0.0 being linear, 1.0 being ELM_TRANSIT_TWEEN_MODE_ACCELERATE
* default, 2.0 being much more pronounced accelerate (squared), 3.0 being
* cubed, etc.
* ELM_TRANSIT_TWEEN_MODE_DIVISOR_INTERP - Start at gradient v[0], interpolated
* via power of v[1] curve
* ELM_TRANSIT_TWEEN_MODE_BOUNCE - Start at 0.0 then "drop" like a ball bouncing
* to the ground at 1.0, and bounce v[1] times, with decay factor of v[0]
* ELM_TRANSIT_TWEEN_MODE_SPRING - Start at 0.0 then "wobble" like a spring rest
* position 1.0, and wobble v[1] times, with decay factor of v[0]
* ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE - Use an interpolated cubic-bezier curve
* ajusted with parameters from v[0] to v[3]
*
* @param transit The transit object.
* @param v_size The size of the array pointing to v
* @param v The address of an array with the double parameters to be used by the mapping.
*
* @see elm_transit_tween_mode_factor_set()
* @since 1.13
* @ingroup Transit
*/
EAPI void elm_transit_tween_mode_factor_n_set(Elm_Transit *transit, unsigned int v_size, double *v);
/**
* Set the transit animation time
*