1 
2 #include <math.h>
3 #include <stdlib.h>
4 #include <clutter/clutter.h>
5 
6 #define N_ACTORS 100
7 #define N_EVENTS 5
8 
9 static gint n_actors = N_ACTORS;
10 static gint n_events = N_EVENTS;
11 
12 static GOptionEntry entries[] = {
13   {
14     "num-actors", 'a',
15     0,
16     G_OPTION_ARG_INT, &n_actors,
17     "Number of actors", "ACTORS"
18   },
19   {
20     "num-events", 'e',
21     0,
22     G_OPTION_ARG_INT, &n_events,
23     "Number of events", "EVENTS"
24   },
25   { NULL }
26 };
27 
28 static gboolean
motion_event_cb(ClutterActor * actor,ClutterEvent * event,gpointer user_data)29 motion_event_cb (ClutterActor *actor, ClutterEvent *event, gpointer user_data)
30 {
31   return FALSE;
32 }
33 
34 static void
do_events(ClutterActor * stage)35 do_events (ClutterActor *stage)
36 {
37   glong i;
38   static gdouble angle = 0;
39 
40   for (i = 0; i < n_events; i++)
41     {
42       angle += (2.0 * G_PI) / (gdouble)n_actors;
43       while (angle > G_PI * 2.0)
44         angle -= G_PI * 2.0;
45 
46       /* If we synthesized events, they would be motion compressed;
47        * calling get_actor_at_position() doesn't have that problem
48        */
49       clutter_stage_get_actor_at_pos (CLUTTER_STAGE (stage),
50 				      CLUTTER_PICK_REACTIVE,
51 				      256.0 + 206.0 * cos (angle),
52 				      256.0 + 206.0 * sin (angle));
53     }
54 }
55 
56 static void
on_paint(ClutterActor * stage,gconstpointer * data)57 on_paint (ClutterActor *stage, gconstpointer *data)
58 {
59   do_events (stage);
60 }
61 
62 static gboolean
queue_redraw(gpointer stage)63 queue_redraw (gpointer stage)
64 {
65   clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
66 
67   return TRUE;
68 }
69 
70 int
main(int argc,char ** argv)71 main (int argc, char **argv)
72 {
73   glong i;
74   gdouble angle;
75   ClutterColor color = { 0x00, 0x00, 0x00, 0xff };
76   ClutterActor *stage, *rect;
77   GError *error = NULL;
78 
79   g_setenv ("CLUTTER_VBLANK", "none", FALSE);
80   g_setenv ("CLUTTER_DEFAULT_FPS", "1000", FALSE);
81   g_setenv ("CLUTTER_SHOW_FPS", "1", FALSE);
82 
83   if (clutter_init_with_args (&argc, &argv,
84                               NULL,
85                               entries,
86                               NULL,
87                               &error) != CLUTTER_INIT_SUCCESS)
88     return 1;
89 
90   stage = clutter_stage_new ();
91   clutter_actor_set_size (stage, 512, 512);
92   clutter_stage_set_color (CLUTTER_STAGE (stage), CLUTTER_COLOR_Black);
93   clutter_stage_set_title (CLUTTER_STAGE (stage), "Picking");
94 
95   printf ("Picking performance test with "
96           "%d actors and %d events per frame\n",
97           n_actors,
98           n_events);
99 
100   for (i = n_actors - 1; i >= 0; i--)
101     {
102       angle = ((2.0 * G_PI) / (gdouble) n_actors) * i;
103 
104       color.red = (1.0 - ABS ((MAX (0, MIN (n_actors/2.0 + 0, i))) /
105                   (gdouble)(n_actors/4.0) - 1.0)) * 255.0;
106       color.green = (1.0 - ABS ((MAX (0, MIN (n_actors/2.0 + 0,
107                     fmod (i + (n_actors/3.0)*2, n_actors)))) /
108                     (gdouble)(n_actors/4) - 1.0)) * 255.0;
109       color.blue = (1.0 - ABS ((MAX (0, MIN (n_actors/2.0 + 0,
110                    fmod ((i + (n_actors/3.0)), n_actors)))) /
111                    (gdouble)(n_actors/4.0) - 1.0)) * 255.0;
112 
113       rect = clutter_rectangle_new_with_color (&color);
114       clutter_actor_set_size (rect, 100, 100);
115       clutter_actor_set_anchor_point_from_gravity (rect,
116                                                    CLUTTER_GRAVITY_CENTER);
117       clutter_actor_set_position (rect,
118                                   256 + 206 * cos (angle),
119                                   256 + 206 * sin (angle));
120       clutter_actor_set_reactive (rect, TRUE);
121       g_signal_connect (rect, "motion-event",
122                         G_CALLBACK (motion_event_cb), NULL);
123 
124       clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect);
125     }
126 
127   clutter_actor_show (stage);
128 
129   clutter_threads_add_idle (queue_redraw, stage);
130 
131   g_signal_connect (stage, "paint", G_CALLBACK (on_paint), NULL);
132 
133   clutter_main ();
134 
135   clutter_actor_destroy (stage);
136 
137   return 0;
138 }
139 
140 
141