~ubuntu-branches/ubuntu/trusty/goocanvas/trusty-proposed

« back to all changes in this revision

Viewing changes to demo/mv-scalability-demo.c

  • Committer: Bazaar Package Importer
  • Author(s): Jose Carlos Garcia Sogo
  • Date: 2007-05-14 22:49:11 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20070514224911-vyv39khpicv46oe2
Tags: 0.8-2
Link gtk-doc to /usr/share/doc/libgoocanvas-dev (Closes: #423410)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdlib.h>
 
2
#include <goocanvas.h>
 
3
 
 
4
#if 0
 
5
#define N_GROUP_COLS 5
 
6
#define N_GROUP_ROWS 5
 
7
#else
 
8
#define N_GROUP_COLS 25
 
9
#define N_GROUP_ROWS 20
 
10
#endif
 
11
#define N_COLS 10
 
12
#define N_ROWS 10
 
13
#define N_TOTAL_ID_ITEMS (N_GROUP_COLS * N_GROUP_ROWS) * (N_COLS * N_ROWS)
 
14
 
 
15
/* The maximum length of a string identifying an item (i.e. its coords). */
 
16
#define MAX_ID_LEN 20
 
17
 
 
18
#define PADDING 10
 
19
 
 
20
#if 0
 
21
#define USE_PIXMAP 
 
22
#endif
 
23
 
 
24
#if 0
 
25
#define ONLY_ONE
 
26
#endif
 
27
 
 
28
double total_width, total_height;
 
29
double left_offset, top_offset;
 
30
char ids[N_TOTAL_ID_ITEMS][MAX_ID_LEN];
 
31
 
 
32
static clock_t start;
 
33
 
 
34
static gboolean
 
35
on_motion_notify (GooCanvasItem *item,
 
36
                  GooCanvasItem *target,
 
37
                  GdkEventMotion *event,
 
38
                  gpointer data)
 
39
{
 
40
  gchar *id = g_object_get_data (G_OBJECT (item), "id");
 
41
 
 
42
  g_print ("%s item received 'motion-notify' signal\n", id ? id : "Unknown");
 
43
 
 
44
  return FALSE;
 
45
}
 
46
 
 
47
 
 
48
static void
 
49
setup_canvas (GtkWidget *canvas)
 
50
{
 
51
  GooCanvasItemModel *root, *group, *model;
 
52
  GooCanvasItem *item;
 
53
  GdkPixbuf *pixbuf = NULL;
 
54
  cairo_pattern_t *pattern = NULL;
 
55
  int group_i, group_j, i, j;
 
56
  double item_width, item_height;
 
57
  double cell_width, cell_height;
 
58
  double group_width, group_height;
 
59
  int total_items = 0, id_item_num = 0;;
 
60
  GdkColor color = { 0, 0, 0, 0, };
 
61
  GooCanvasStyle *style, *style2;
 
62
  GValue tmpval = { 0 };
 
63
 
 
64
  root = goo_canvas_group_model_new (NULL,
 
65
                                     "font", "Sans 8",
 
66
                                     NULL);
 
67
  goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root);
 
68
  g_object_unref (root);
 
69
 
 
70
#ifdef USE_PIXMAP
 
71
  pixbuf = gdk_pixbuf_new_from_file("toroid.png", NULL);
 
72
  item_width = gdk_pixbuf_get_width (pixbuf);
 
73
  item_height = gdk_pixbuf_get_height (pixbuf);
 
74
  pattern = goo_canvas_cairo_pattern_from_pixbuf (pixbuf);
 
75
#else
 
76
  pixbuf = NULL;
 
77
  item_width = 400/*80*/;
 
78
  item_height = 19;
 
79
#endif
 
80
        
 
81
  cell_width = item_width + PADDING * 2;
 
82
  cell_height = item_height + PADDING * 2;
 
83
 
 
84
  group_width = N_COLS * cell_width;
 
85
  group_height = N_ROWS * cell_height;
 
86
 
 
87
  total_width = N_GROUP_COLS * group_width;
 
88
  total_height = N_GROUP_ROWS * group_height;
 
89
 
 
90
  /* We use -ve offsets to test if -ve coords are handled correctly. */
 
91
  left_offset = -total_width / 2;
 
92
  top_offset = -total_height / 2;
 
93
 
 
94
  style = goo_canvas_style_new ();
 
95
  gdk_color_parse ("mediumseagreen", &color);
 
96
  pattern = cairo_pattern_create_rgb (color.red / 65535.0,
 
97
                                      color.green / 65535.0,
 
98
                                      color.blue / 65535.0);
 
99
  g_value_init (&tmpval, GOO_TYPE_CAIRO_PATTERN);
 
100
  g_value_take_boxed (&tmpval, pattern);
 
101
  goo_canvas_style_set_property (style, goo_canvas_style_fill_pattern_id, &tmpval);
 
102
  g_value_unset (&tmpval);
 
103
 
 
104
  style2 = goo_canvas_style_new ();
 
105
  gdk_color_parse ("steelblue", &color);
 
106
  pattern = cairo_pattern_create_rgb (color.red / 65535.0,
 
107
                                      color.green / 65535.0,
 
108
                                      color.blue / 65535.0);
 
109
  g_value_init (&tmpval, GOO_TYPE_CAIRO_PATTERN);
 
110
  g_value_take_boxed (&tmpval, pattern);
 
111
  goo_canvas_style_set_property (style2, goo_canvas_style_fill_pattern_id, &tmpval);
 
112
  g_value_unset (&tmpval);
 
113
 
 
114
  for (group_i = 0; group_i < N_GROUP_COLS; group_i++)
 
115
    {
 
116
      for (group_j = 0; group_j < N_GROUP_ROWS; group_j++)
 
117
        {
 
118
          double group_x = left_offset + (group_i * group_width);
 
119
          double group_y = top_offset + (group_j * group_height);
 
120
 
 
121
          group = goo_canvas_group_model_new (root, NULL);
 
122
          total_items++;
 
123
          goo_canvas_item_model_translate (group, group_x, group_y);
 
124
 
 
125
          for (i = 0; i < N_COLS; i++)
 
126
            {
 
127
              for (j = 0; j < N_ROWS; j++)
 
128
                {
 
129
                  double item_x = (i * cell_width) + PADDING;
 
130
                  double item_y = (j * cell_height) + PADDING;
 
131
                  double rotation = i % 10 * 2;
 
132
                  double rotation_x = item_x + item_width / 2;
 
133
                  double rotation_y = item_y + item_height / 2;
 
134
 
 
135
                  sprintf (ids[id_item_num], "%g, %g",
 
136
                           group_x + item_x, group_y + item_y);
 
137
 
 
138
#ifdef USE_PIXMAP
 
139
                  model = goo_canvas_image_model_new (group, NULL,
 
140
                                                      item_x, item_y,
 
141
                                                      "pattern", pattern,
 
142
                                                      "width", item_width,
 
143
                                                      "height", item_height,
 
144
                                                      NULL);
 
145
#else
 
146
                  model = goo_canvas_rect_model_new (group, item_x, item_y,
 
147
                                                     item_width, item_height,
 
148
                                                     NULL);
 
149
                  goo_canvas_item_model_set_style (model, (j % 2) ? style : style2);
 
150
                  goo_canvas_item_model_rotate (model, rotation, rotation_x, rotation_y);
 
151
#endif
 
152
 
 
153
                  item = goo_canvas_get_item (GOO_CANVAS (canvas), model);
 
154
                  g_object_set_data (G_OBJECT (item), "id",
 
155
                                     ids[id_item_num]);
 
156
                  g_signal_connect (item, "motion_notify_event",
 
157
                                    (GtkSignalFunc) on_motion_notify, NULL);
 
158
 
 
159
                  model = goo_canvas_text_model_new (group, ids[id_item_num],
 
160
                                                     item_x + item_width / 2,
 
161
                                                     item_y + item_height / 2,
 
162
                                                     -1, GTK_ANCHOR_CENTER,
 
163
                                                     NULL);
 
164
                  goo_canvas_item_model_rotate (model, rotation, rotation_x,
 
165
                                                rotation_y);
 
166
 
 
167
                  id_item_num++;
 
168
                  total_items += 2;
 
169
 
 
170
#ifdef ONLY_ONE
 
171
                  break;
 
172
#endif
 
173
                }
 
174
#ifdef ONLY_ONE
 
175
              break;
 
176
#endif
 
177
            }
 
178
#ifdef ONLY_ONE
 
179
          break;
 
180
#endif
 
181
        }
 
182
#ifdef ONLY_ONE
 
183
      break;
 
184
#endif
 
185
    }
 
186
 
 
187
  if (pattern)
 
188
    cairo_pattern_destroy (pattern);
 
189
 
 
190
  g_print ("Total items: %i\n", total_items);
 
191
 
 
192
}
 
193
 
 
194
 
 
195
static gboolean
 
196
on_expose_event (GtkWidget *canvas,
 
197
                 GdkEvent  *event,
 
198
                 gpointer   unused_data)
 
199
{
 
200
  static gboolean first_time = TRUE;
 
201
 
 
202
  if (first_time)
 
203
    {
 
204
      printf ("Update Canvas Time Used: %g\n",
 
205
              (double) (clock() - start) / CLOCKS_PER_SEC);
 
206
      first_time = FALSE;
 
207
    }
 
208
 
 
209
  return FALSE;
 
210
}
 
211
 
 
212
 
 
213
GtkWidget *
 
214
create_canvas (void)
 
215
{
 
216
  GtkWidget *canvas;
 
217
 
 
218
  /* Create the canvas. */
 
219
  canvas = goo_canvas_new ();
 
220
  gtk_widget_set_size_request (canvas, 600, 450);
 
221
 
 
222
  start = clock();
 
223
  setup_canvas (canvas);
 
224
  printf ("Create Canvas Time Used: %g\n",
 
225
          (double) (clock() - start) / CLOCKS_PER_SEC);
 
226
 
 
227
  start = clock();
 
228
  goo_canvas_set_bounds (GOO_CANVAS (canvas), left_offset, top_offset,
 
229
                         left_offset + total_width, top_offset + total_height);
 
230
  gtk_widget_show (canvas);
 
231
 
 
232
  g_signal_connect (canvas, "expose_event",
 
233
                    (GtkSignalFunc) on_expose_event, NULL);
 
234
 
 
235
  return canvas;
 
236
}
 
237
 
 
238
 
 
239
static gboolean
 
240
on_delete_event (GtkWidget *window,
 
241
                 GdkEvent  *event,
 
242
                 gpointer   unused_data)
 
243
{
 
244
  gtk_main_quit ();
 
245
  return FALSE;
 
246
}
 
247
 
 
248
 
 
249
int
 
250
main (int argc, char *argv[])
 
251
{
 
252
  GtkWidget *window, *scrolled_win, *canvas;
 
253
 
 
254
  gtk_set_locale ();
 
255
  gtk_init (&argc, &argv);
 
256
 
 
257
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
258
  gtk_window_set_default_size (GTK_WINDOW (window), 640, 600);
 
259
  gtk_widget_show (window);
 
260
  g_signal_connect (window, "delete_event", (GtkSignalFunc) on_delete_event,
 
261
                    NULL);
 
262
 
 
263
  scrolled_win = gtk_scrolled_window_new (NULL, NULL);
 
264
  gtk_widget_show (scrolled_win);
 
265
  gtk_container_add (GTK_CONTAINER (window), scrolled_win);
 
266
 
 
267
  canvas = create_canvas ();
 
268
  gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
 
269
 
 
270
  gtk_main ();
 
271
 
 
272
  return 0;
 
273
}
 
274
 
 
275