mutter/tests/interactive/test-scale.c
Emmanuele Bassi 7d7372af43 [animation] Move the alpha value to floating point
The current Alpha value is an unsigned integer that can be used
implicitly as a fixed point value. This makes writing an alpha
function overshooting below and above the current range basically
impossible without complicating an already complex code, and
creating weird corner cases.

For this reason, the Alpha value should be defined as a floating
point normalized value, spanning a range between 0.0 and 1.0; in
order to allow overshooting, the valid range is extended one unit
below and one unit above, thus making it -1.0 .. 2.0.

This commit updates the various users of the ClutterAlpha API
and the tests cases.

This commit also removes all the current alpha functions exposed
in the public API.
2009-01-20 16:42:49 +00:00

114 lines
3.1 KiB
C

#include <stdlib.h>
#include <gmodule.h>
#include <clutter/clutter.h>
static const ClutterGravity gravities[] = {
CLUTTER_GRAVITY_NORTH_EAST,
CLUTTER_GRAVITY_NORTH,
CLUTTER_GRAVITY_NORTH_WEST,
CLUTTER_GRAVITY_WEST,
CLUTTER_GRAVITY_SOUTH_WEST,
CLUTTER_GRAVITY_SOUTH,
CLUTTER_GRAVITY_SOUTH_EAST,
CLUTTER_GRAVITY_EAST,
CLUTTER_GRAVITY_CENTER,
CLUTTER_GRAVITY_NONE
};
static gint gindex = 0;
static ClutterActor *label;
static void
set_next_gravity (ClutterActor *actor)
{
ClutterGravity gravity = gravities[gindex];
GEnumClass *eclass;
GEnumValue *evalue;
clutter_actor_move_anchor_point_from_gravity (actor, gravities[gindex]);
eclass = g_type_class_ref (CLUTTER_TYPE_GRAVITY);
evalue = g_enum_get_value (eclass, gravity);
clutter_text_set_text (CLUTTER_TEXT (label), evalue->value_nick);
g_type_class_unref (eclass);
if (++gindex >= G_N_ELEMENTS (gravities))
gindex = 0;
}
static gdouble
my_ramp_func (ClutterAlpha *alpha,
gpointer unused)
{
ClutterTimeline *timeline = clutter_alpha_get_timeline (alpha);
return clutter_timeline_get_progress (timeline);
}
G_MODULE_EXPORT int
test_scale_main (int argc, char *argv[])
{
ClutterActor *stage, *rect;
ClutterColor stage_color = { 0x0, 0x0, 0x0, 0xff };
ClutterColor rect_color = { 0xff, 0xff, 0xff, 0x99 };
ClutterTimeline *timeline;
ClutterAlpha *alpha;
ClutterBehaviour *behave;
clutter_init (&argc, &argv);
stage = clutter_stage_get_default ();
clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
clutter_actor_set_size (stage, 300, 300);
rect = clutter_rectangle_new_with_color (&rect_color);
clutter_actor_set_size (rect, 100, 100);
clutter_actor_set_position (rect, 100, 100);
clutter_group_add (CLUTTER_GROUP (stage), rect);
label = clutter_text_new_with_text ("Sans 20px", "");
clutter_text_set_color (CLUTTER_TEXT (label),
&(ClutterColor) { 0xff, 0xff, 0xff, 0xff });
clutter_actor_set_position (label,
clutter_actor_get_x (rect),
clutter_actor_get_y (rect)
+ clutter_actor_get_height (rect));
clutter_group_add (CLUTTER_GROUP (stage), label);
rect_color.alpha = 0xff;
rect = clutter_rectangle_new_with_color (&rect_color);
clutter_actor_set_position (rect, 100, 100);
clutter_actor_set_size (rect, 100, 100);
set_next_gravity (rect);
clutter_group_add (CLUTTER_GROUP (stage), rect);
timeline = clutter_timeline_new_for_duration (750);
alpha = clutter_alpha_new_with_func (timeline,
my_ramp_func,
NULL, NULL);
behave = clutter_behaviour_scale_new (alpha,
0.0, 0.0, /* scale start */
1.0, 1.0); /* scale end */
clutter_behaviour_apply (behave, rect);
clutter_timeline_set_loop (timeline, TRUE);
g_signal_connect_swapped (timeline, "completed",
G_CALLBACK (set_next_gravity), rect);
clutter_timeline_start (timeline);
clutter_actor_show_all (stage);
clutter_main();
g_object_unref (timeline);
g_object_unref (behave);
return EXIT_SUCCESS;
}