c240c3b01dfb5696202f6325c34ce3effe3ec4ca
[framework/graphics/cairo.git] / perf / micro / world-map.c
1 /*
2  * Copyright © 2006 Red Hat, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person
5  * obtaining a copy of this software and associated documentation
6  * files (the "Software"), to deal in the Software without
7  * restriction, including without limitation the rights to use, copy,
8  * modify, merge, publish, distribute, sublicense, and/or sell copies
9  * of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  *
24  * Author: Carl D. Worth <cworth@cworth.org>
25  */
26
27 #include "cairo-perf.h"
28
29 #ifdef HAVE_UNISTD_H
30 #include <unistd.h>
31 #endif
32
33 typedef enum {
34     WM_NEW_PATH,
35     WM_MOVE_TO,
36     WM_LINE_TO,
37     WM_HLINE_TO,
38     WM_VLINE_TO,
39     WM_REL_LINE_TO,
40     WM_END
41 } wm_type_t;
42
43 typedef struct _wm_element {
44     wm_type_t type;
45     double x;
46     double y;
47 } wm_element_t;
48
49 #include "world-map.h"
50
51 enum {
52     STROKE = 1,
53     FILL = 2,
54 };
55
56 static cairo_time_t
57 do_world_map (cairo_t *cr, int width, int height, int loops, int mode)
58 {
59     const wm_element_t *e;
60     double cx, cy;
61
62     cairo_set_line_width (cr, 0.2);
63
64     cairo_perf_timer_start ();
65     cairo_perf_set_thread_aware (cr, FALSE);
66
67     while (loops--) {
68         if (loops == 0)
69                 cairo_perf_set_thread_aware (cr, TRUE);
70         cairo_set_source_rgb (cr, .68, .85, .90); /* lightblue */
71         cairo_rectangle (cr, 0, 0, 800, 400);
72         cairo_fill (cr);
73
74         e = &countries[0];
75         while (1) {
76             switch (e->type) {
77             case WM_NEW_PATH:
78             case WM_END:
79                 if (mode & FILL) {
80                     cairo_set_source_rgb (cr, .75, .75, .75); /* silver */
81                     cairo_fill_preserve (cr);
82                 }
83                 if (mode & STROKE) {
84                     cairo_set_source_rgb (cr, .50, .50, .50); /* gray */
85                     cairo_stroke (cr);
86                 }
87                 cairo_new_path (cr);
88                 cairo_move_to (cr, e->x, e->y);
89                 break;
90             case WM_MOVE_TO:
91                 cairo_close_path (cr);
92                 cairo_move_to (cr, e->x, e->y);
93                 break;
94             case WM_LINE_TO:
95                 cairo_line_to (cr, e->x, e->y);
96                 break;
97             case WM_HLINE_TO:
98                 cairo_get_current_point (cr, &cx, &cy);
99                 cairo_line_to (cr, e->x, cy);
100                 break;
101             case WM_VLINE_TO:
102                 cairo_get_current_point (cr, &cx, &cy);
103                 cairo_line_to (cr, cx, e->y);
104                 break;
105             case WM_REL_LINE_TO:
106                 cairo_rel_line_to (cr, e->x, e->y);
107                 break;
108             }
109             if (e->type == WM_END)
110                 break;
111             e++;
112         }
113
114         cairo_new_path (cr);
115     }
116
117     cairo_perf_timer_stop ();
118
119     return cairo_perf_timer_elapsed ();
120 }
121
122 static cairo_time_t
123 do_world_map_stroke (cairo_t *cr, int width, int height, int loops)
124 {
125     return do_world_map (cr, width, height, loops, STROKE);
126 }
127
128 static cairo_time_t
129 do_world_map_fill (cairo_t *cr, int width, int height, int loops)
130 {
131     return do_world_map (cr, width, height, loops, FILL);
132 }
133
134 static cairo_time_t
135 do_world_map_both (cairo_t *cr, int width, int height, int loops)
136 {
137     return do_world_map (cr, width, height, loops, FILL | STROKE);
138 }
139
140 cairo_bool_t
141 world_map_enabled (cairo_perf_t *perf)
142 {
143     return cairo_perf_can_run (perf, "world-map", NULL);
144 }
145
146 void
147 world_map (cairo_perf_t *perf, cairo_t *cr, int width, int height)
148 {
149     cairo_perf_run (perf, "world-map-stroke", do_world_map_stroke, NULL);
150     cairo_perf_run (perf, "world-map-fill", do_world_map_fill, NULL);
151     cairo_perf_run (perf, "world-map", do_world_map_both, NULL);
152 }