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