diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am index c34de68b6..64b3e2942 100644 --- a/doc/cookbook/examples/Makefile.am +++ b/doc/cookbook/examples/Makefile.am @@ -12,6 +12,7 @@ noinst_PROGRAMS = \ animations-moving-state \ animations-reuse \ animations-rotating \ + animations-scaling \ text-shadow \ textures-reflection \ textures-split-go \ @@ -66,6 +67,7 @@ animations_moving_implicit_SOURCES = animations-moving-implicit.c animations_moving_state_SOURCES = animations-moving-state.c animations_reuse_SOURCES = animations-reuse.c animations_rotating_SOURCES = animations-rotating.c +animations_scaling_SOURCES = animations-scaling.c text_shadow_SOURCES = text-shadow.c textures_reflection_SOURCES = textures-reflection.c textures_split_go_SOURCES = textures-split-go.c diff --git a/doc/cookbook/examples/animations-scaling.c b/doc/cookbook/examples/animations-scaling.c new file mode 100644 index 000000000..df723691b --- /dev/null +++ b/doc/cookbook/examples/animations-scaling.c @@ -0,0 +1,183 @@ +#include +#include + +typedef struct +{ + ClutterState *transitions; + ClutterActor *actor; + ClutterActor *props_display; + guint scale_gravity; + gboolean transitions_running; +} State; + +static const ClutterColor stage_color = { 0x33, 0x33, 0x55, 0xff }; +static const ClutterColor red_color = { 0xff, 0x00, 0x00, 0xff }; +static const ClutterColor yellow_color = { 0xff, 0xff, 0x00, 0xff }; + +static void +show_scale_properties_cb (ClutterActor *actor, + gpointer user_data) +{ + State *state = (State *) user_data; + + gfloat transformed_x, transformed_y; + gfloat transformed_width, transformed_height; + gfloat scale_center_x, scale_center_y; + + gchar *message; + + clutter_actor_get_transformed_position (state->actor, + &transformed_x, + &transformed_y); + + clutter_actor_get_transformed_size (state->actor, + &transformed_width, + &transformed_height); + + g_object_get (G_OBJECT (actor), + "scale-center-x", &scale_center_x, + "scale-center-y", &scale_center_y, + NULL); + + /* draw cross on the scale center */ + cogl_set_source_color4ub (255, 255, 0, 255); + + cogl_path_move_to (scale_center_x, scale_center_y); + cogl_path_rel_line_to (10, 10); + cogl_path_rel_line_to (-20, -20); + cogl_path_move_to (scale_center_x, scale_center_y); + cogl_path_rel_line_to (10, -10); + cogl_path_rel_line_to (-20, 20); + + cogl_path_stroke (); + + /* show actor properties */ + message = g_strdup_printf ("Scale center: %.0f, %.0f\n" + "Transformed position: %.2f, %.2f\n" + "Transformed size: %.2f, %.2f", + scale_center_x, scale_center_y, + transformed_x, transformed_y, + transformed_width, transformed_height); + + clutter_text_set_text (CLUTTER_TEXT (state->props_display), message); + + g_free (message); +} + +static void +next_transition_cb (ClutterState *transitions, + gpointer user_data) +{ + State *state = (State *) user_data; + + if (clutter_actor_is_scaled (state->actor)) + clutter_state_set_state (state->transitions, "not-scaled"); + else if (state->scale_gravity > 9) + { + /* gravity is at center, so reset ready for next key press */ + state->scale_gravity = CLUTTER_GRAVITY_NORTH; + + state->transitions_running = FALSE; + } + else + { + g_object_set (G_OBJECT (state->actor), + "scale-gravity", state->scale_gravity, + NULL); + + state->scale_gravity++; + + clutter_state_set_state (state->transitions, "scaled-down"); + } +} + +static gboolean +key_pressed_cb (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) +{ + State *state = (State *) user_data; + + if (!state->transitions_running) + { + state->transitions_running = TRUE; + next_transition_cb (NULL, state); + } + + return TRUE; +} + +int +main (int argc, + char *argv[]) +{ + State *state = g_new0 (State, 1); + ClutterActor *stage; + + clutter_init (&argc, &argv); + + stage = clutter_stage_get_default (); + clutter_actor_set_size (stage, 350, 350); + clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); + g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); + + state->scale_gravity = CLUTTER_GRAVITY_NORTH; + state->transitions_running = FALSE; + + state->props_display = clutter_text_new (); + clutter_actor_set_size (state->props_display, 340, 80); + clutter_actor_set_position (state->props_display, 5, 280); + clutter_text_set_color (CLUTTER_TEXT (state->props_display), &yellow_color); + + state->actor = clutter_rectangle_new_with_color (&red_color); + clutter_actor_set_size (state->actor, 200, 200); + clutter_actor_set_position (state->actor, 75, 50); + + g_object_set (G_OBJECT (state->actor), + "scale-gravity", state->scale_gravity, + NULL); + + state->transitions = clutter_state_new (); + clutter_state_set_duration (state->transitions, NULL, NULL, 400); + + clutter_state_set (state->transitions, NULL, "not-scaled", + state->actor, "scale-x", CLUTTER_LINEAR, 1.0, + state->actor, "scale-y", CLUTTER_LINEAR, 1.0, + NULL); + + clutter_state_set (state->transitions, NULL, "scaled-down", + state->actor, "scale-x", CLUTTER_LINEAR, 0.25, + state->actor, "scale-y", CLUTTER_LINEAR, 0.25, + NULL); + + clutter_state_warp_to_state (state->transitions, "not-scaled"); + + g_signal_connect (stage, + "key-press-event", + G_CALLBACK (key_pressed_cb), + state); + + g_signal_connect (state->transitions, + "completed", + G_CALLBACK (next_transition_cb), + state); + + g_signal_connect_after (state->actor, + "paint", + G_CALLBACK (show_scale_properties_cb), + state); + + clutter_container_add (CLUTTER_CONTAINER (stage), + state->actor, + state->props_display, + NULL); + + clutter_actor_show (stage); + + clutter_main (); + + g_object_unref (state->transitions); + g_free (state); + + return EXIT_SUCCESS; +}