update to 1.10.4
[profile/ivi/clutter.git] / tests / interactive / test-image-box.c
1 #include <stdlib.h>
2 #include <gmodule.h>
3 #include <gdk-pixbuf/gdk-pixbuf.h>
4 #include <clutter/clutter.h>
5
6 static const struct {
7   ClutterContentGravity gravity;
8   const char *name;
9 } gravities[] = {
10   { CLUTTER_CONTENT_GRAVITY_TOP_LEFT, "Top Left" },
11   { CLUTTER_CONTENT_GRAVITY_TOP, "Top" },
12   { CLUTTER_CONTENT_GRAVITY_TOP_RIGHT, "Top Right" },
13
14   { CLUTTER_CONTENT_GRAVITY_LEFT, "Left" },
15   { CLUTTER_CONTENT_GRAVITY_CENTER, "Center" },
16   { CLUTTER_CONTENT_GRAVITY_RIGHT, "Right" },
17
18   { CLUTTER_CONTENT_GRAVITY_BOTTOM_LEFT, "Bottom Left" },
19   { CLUTTER_CONTENT_GRAVITY_BOTTOM, "Bottom" },
20   { CLUTTER_CONTENT_GRAVITY_BOTTOM_RIGHT, "Bottom Right" },
21
22   { CLUTTER_CONTENT_GRAVITY_RESIZE_FILL, "Resize Fill" },
23   { CLUTTER_CONTENT_GRAVITY_RESIZE_ASPECT, "Resize Aspect" },
24 };
25
26 static int n_gravities = G_N_ELEMENTS (gravities);
27 static int cur_gravity = 0;
28
29 static void
30 on_clicked (ClutterClickAction *action,
31             ClutterActor       *actor,
32             ClutterText        *label)
33 {
34   gchar *str;
35
36   clutter_actor_save_easing_state (actor);
37   clutter_actor_set_content_gravity (actor, gravities[cur_gravity].gravity);
38   clutter_actor_restore_easing_state (actor);
39
40   str = g_strconcat ("Content gravity: ", gravities[cur_gravity].name, NULL);
41   clutter_text_set_text (label, str);
42   g_free (str);
43
44   cur_gravity += 1;
45
46   if (cur_gravity >= n_gravities)
47     cur_gravity = 0;
48 }
49
50 G_MODULE_EXPORT const char *
51 test_image_box_describe (void)
52 {
53   return "A test with image content.";
54 }
55
56 G_MODULE_EXPORT int
57 test_image_box_main (int argc, char *argv[])
58 {
59   ClutterActor *stage, *box, *text;
60   ClutterContent *image;
61   ClutterAction *action;
62   GdkPixbuf *pixbuf;
63   gchar *str;
64
65   if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
66     return EXIT_FAILURE;
67
68   stage = clutter_stage_new ();
69   clutter_actor_set_name (stage, "Stage");
70   clutter_stage_set_title (CLUTTER_STAGE (stage), "Content Box");
71   clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE);
72   g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
73   clutter_actor_show (stage);
74
75   box = clutter_actor_new ();
76   clutter_actor_set_name (box, "Image");
77   clutter_actor_set_margin_top (box, 12);
78   clutter_actor_set_margin_right (box, 12);
79   clutter_actor_set_margin_bottom (box, 12);
80   clutter_actor_set_margin_left (box, 12);
81   clutter_actor_add_constraint (box, clutter_bind_constraint_new (stage, CLUTTER_BIND_SIZE, 0.0));
82   clutter_actor_add_child (stage, box);
83
84   pixbuf = gdk_pixbuf_new_from_file (TESTS_DATADIR G_DIR_SEPARATOR_S "redhand.png", NULL);
85   image = clutter_image_new ();
86   clutter_image_set_data (CLUTTER_IMAGE (image),
87                           gdk_pixbuf_get_pixels (pixbuf),
88                           gdk_pixbuf_get_has_alpha (pixbuf)
89                             ? COGL_PIXEL_FORMAT_RGBA_8888
90                             : COGL_PIXEL_FORMAT_RGB_888,
91                           gdk_pixbuf_get_width (pixbuf),
92                           gdk_pixbuf_get_height (pixbuf),
93                           gdk_pixbuf_get_rowstride (pixbuf),
94                           NULL);
95   g_object_unref (pixbuf);
96
97   clutter_actor_set_content_scaling_filters (box,
98                                              CLUTTER_SCALING_FILTER_TRILINEAR,
99                                              CLUTTER_SCALING_FILTER_LINEAR);
100   clutter_actor_set_content_gravity (box, gravities[n_gravities - 1].gravity);
101   clutter_actor_set_content (box, image);
102   g_object_unref (image);
103
104   str = g_strconcat ("Content gravity: ",
105                      gravities[n_gravities - 1].name,
106                      NULL);
107
108   text = clutter_text_new ();
109   clutter_text_set_text (CLUTTER_TEXT (text), str);
110   clutter_actor_add_constraint (text, clutter_align_constraint_new (stage, CLUTTER_ALIGN_BOTH, 0.5));
111   clutter_actor_add_child (stage, text);
112
113   g_free (str);
114
115   action = clutter_click_action_new ();
116   g_signal_connect (action, "clicked", G_CALLBACK (on_clicked), text);
117   clutter_actor_set_reactive (box, TRUE);
118   clutter_actor_add_action (box, action);
119
120   clutter_main ();
121
122   return EXIT_SUCCESS;
123 }