2007-08-06 Matthew Allum <mallum@openedhand.com>

* clutter/clutter-behaviour-depth.c:
        Modify to work like all other behvaiours in not forcing
        increasing order in behaviour 'limits'. (#436)
        Rename limit min/max props to start/end.

        * tests/test-depth.c:
        Simplify test-case to work with above change and
        without multiple ramps

        * clutter/clutter-behaviour-rotate.c:
        Handle CW rotation when end > start and similar for CCW just
        like ellipse behaviour.
This commit is contained in:
Matthew Allum
2007-08-05 23:13:27 +00:00
parent e1d439f9c9
commit 7949cfe30a
4 changed files with 132 additions and 91 deletions

View File

@ -118,7 +118,7 @@ static void
clutter_behaviour_rotate_alpha_notify (ClutterBehaviour *behaviour,
guint32 alpha_value)
{
ClutterFixed factor, angle;
ClutterFixed factor, angle, diff;
ClutterBehaviourRotate *rotate_behaviour;
ClutterBehaviourRotatePrivate *priv;
@ -131,12 +131,66 @@ clutter_behaviour_rotate_alpha_notify (ClutterBehaviour *behaviour,
switch (priv->direction)
{
case CLUTTER_ROTATE_CW:
angle = CLUTTER_FIXED_MUL (factor, (priv->angle_end - priv->angle_begin));
angle += priv->angle_begin;
if (priv->angle_end >= priv->angle_begin)
{
angle = CLUTTER_FIXED_MUL (factor,
(priv->angle_end - priv->angle_begin));
angle += priv->angle_begin;
}
else
{
/* Work out the angular length of the arch represented by the
* end angle in CCW direction
*/
if (priv->angle_end > CLUTTER_INT_TO_FIXED(360))
{
ClutterFixed rounds, a1, a2;
rounds = priv->angle_begin / 360;
a1 = rounds * 360;
a2 = CLUTTER_INT_TO_FIXED(360) - (priv->angle_begin - a1);
diff = a1 + a2 + priv->angle_end;
}
else
{
diff = CLUTTER_INT_TO_FIXED(360)
- priv->angle_begin + priv->angle_end;
}
angle = CLUTTER_FIXED_MUL (diff, factor);
angle += priv->angle_begin;
}
break;
case CLUTTER_ROTATE_CCW:
angle = CLUTTER_FIXED_MUL (factor, (priv->angle_begin - priv->angle_end));
angle += priv->angle_end;
if (priv->angle_end <= priv->angle_begin)
{
angle = CLUTTER_FIXED_MUL (factor,
(priv->angle_begin - priv->angle_end));
angle += priv->angle_end;
}
else
{
/* Work out the angular length of the arch represented by the
* end angle in CCW direction
*/
if (priv->angle_end > CLUTTER_INT_TO_FIXED(360))
{
ClutterFixed rounds, a1, a2;
rounds = priv->angle_begin / 360;
a1 = rounds * 360;
a2 = CLUTTER_INT_TO_FIXED(360) - (priv->angle_end - a1);
diff = a1 + a2 + priv->angle_begin;
}
else
{
diff = CLUTTER_INT_TO_FIXED(360)
- priv->angle_end + priv->angle_begin;
}
angle = priv->angle_begin - CLUTTER_FIXED_MUL (diff, factor);
}
break;
}
@ -257,7 +311,9 @@ clutter_behaviour_rotate_class_init (ClutterBehaviourRotateClass *klass)
g_param_spec_double ("angle-begin",
"Angle Begin",
"Initial angle",
0.0, 359.0, 0.0,
0.0,
CLUTTER_ANGLE_MAX_DEG,
0.0,
CLUTTER_PARAM_READWRITE));
/**
* ClutterBehaviourRotate:angle-end:
@ -271,7 +327,9 @@ clutter_behaviour_rotate_class_init (ClutterBehaviourRotateClass *klass)
g_param_spec_double ("angle-end",
"Angle End",
"Final angle",
0.0, 359.0, 359.0,
0.0,
CLUTTER_ANGLE_MAX_DEG,
360.0,
CLUTTER_PARAM_READWRITE));
/**
* ClutterBehaviourRotate:axis: