1 /* grrobot - Ricochet Robot using GTK+ and Xr
3 * Copyright © 2003 Carl Worth
5 * Permission to use, copy, modify, distribute, and sell this software
6 * and its documentation for any purpose is hereby granted without
7 * fee, provided that the above copyright notice appear in all copies
8 * and that both that copyright notice and this permission notice
9 * appear in supporting documentation, and that the name of Carl Worth
10 * not be used in advertising or publicity pertaining to distribution
11 * of the software without specific, written prior permission.
12 * Carl Worth makes no representations about the suitability of this
13 * software for any purpose. It is provided "as is" without express
14 * or implied warranty.
16 * CARL WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
18 * NO EVENT SHALL CARL WORTH BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
20 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
21 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 * Author: Carl Worth <carl@theworths.org>
29 #include <sys/types.h>
35 #include "svg/grr_icon_svg.h"
43 { RR_ROBOT_BLUE, "robot_blue",
44 GRR_ICON_SVG_ROBOT_BLUE, sizeof (GRR_ICON_SVG_ROBOT_BLUE) },
45 { RR_ROBOT_GREEN, "robot_green",
46 GRR_ICON_SVG_ROBOT_GREEN, sizeof (GRR_ICON_SVG_ROBOT_GREEN) },
47 { RR_ROBOT_RED, "robot_red",
48 GRR_ICON_SVG_ROBOT_RED, sizeof (GRR_ICON_SVG_ROBOT_RED) },
49 { RR_ROBOT_YELLOW, "robot_yellow",
50 GRR_ICON_SVG_ROBOT_YELLOW, sizeof (GRR_ICON_SVG_ROBOT_YELLOW) },
52 { RR_TARGET_BLUE_CIRCLE, "target_blue_circle",
53 GRR_ICON_SVG_TARGET_BLUE_CIRCLE, sizeof (GRR_ICON_SVG_TARGET_BLUE_CIRCLE) },
54 { RR_TARGET_BLUE_OCTAGON, "target_blue_octagon",
55 GRR_ICON_SVG_TARGET_BLUE_OCTAGON, sizeof (GRR_ICON_SVG_TARGET_BLUE_OCTAGON) },
56 { RR_TARGET_BLUE_SQUARE, "target_blue_square",
57 GRR_ICON_SVG_TARGET_BLUE_SQUARE, sizeof (GRR_ICON_SVG_TARGET_BLUE_SQUARE) },
58 { RR_TARGET_BLUE_TRIANGLE, "target_blue_triangle",
59 GRR_ICON_SVG_TARGET_BLUE_TRIANGLE, sizeof (GRR_ICON_SVG_TARGET_BLUE_TRIANGLE) },
61 { RR_TARGET_GREEN_CIRCLE, "target_green_circle",
62 GRR_ICON_SVG_TARGET_GREEN_CIRCLE, sizeof (GRR_ICON_SVG_TARGET_GREEN_CIRCLE) },
63 { RR_TARGET_GREEN_OCTAGON, "target_green_octagon",
64 GRR_ICON_SVG_TARGET_GREEN_OCTAGON, sizeof (GRR_ICON_SVG_TARGET_GREEN_OCTAGON) },
65 { RR_TARGET_GREEN_SQUARE, "target_green_square",
66 GRR_ICON_SVG_TARGET_GREEN_SQUARE, sizeof (GRR_ICON_SVG_TARGET_GREEN_SQUARE) },
67 { RR_TARGET_GREEN_TRIANGLE, "target_green_triangle",
68 GRR_ICON_SVG_TARGET_GREEN_TRIANGLE, sizeof (GRR_ICON_SVG_TARGET_GREEN_TRIANGLE) },
70 { RR_TARGET_RED_CIRCLE, "target_red_circle",
71 GRR_ICON_SVG_TARGET_RED_CIRCLE, sizeof (GRR_ICON_SVG_TARGET_RED_CIRCLE) },
72 { RR_TARGET_RED_OCTAGON, "target_red_octagon",
73 GRR_ICON_SVG_TARGET_RED_OCTAGON, sizeof (GRR_ICON_SVG_TARGET_RED_OCTAGON) },
74 { RR_TARGET_RED_SQUARE, "target_red_square",
75 GRR_ICON_SVG_TARGET_RED_SQUARE, sizeof (GRR_ICON_SVG_TARGET_RED_SQUARE) },
76 { RR_TARGET_RED_TRIANGLE, "target_red_triangle",
77 GRR_ICON_SVG_TARGET_RED_TRIANGLE, sizeof (GRR_ICON_SVG_TARGET_RED_TRIANGLE) },
79 { RR_TARGET_YELLOW_CIRCLE, "target_yellow_circle",
80 GRR_ICON_SVG_TARGET_YELLOW_CIRCLE, sizeof (GRR_ICON_SVG_TARGET_YELLOW_CIRCLE) },
81 { RR_TARGET_YELLOW_OCTAGON, "target_yellow_octagon",
82 GRR_ICON_SVG_TARGET_YELLOW_OCTAGON, sizeof (GRR_ICON_SVG_TARGET_YELLOW_OCTAGON) },
83 { RR_TARGET_YELLOW_SQUARE, "target_yellow_square",
84 GRR_ICON_SVG_TARGET_YELLOW_SQUARE, sizeof (GRR_ICON_SVG_TARGET_YELLOW_SQUARE) },
85 { RR_TARGET_YELLOW_TRIANGLE, "target_yellow_triangle",
86 GRR_ICON_SVG_TARGET_YELLOW_TRIANGLE, sizeof (GRR_ICON_SVG_TARGET_YELLOW_TRIANGLE) },
88 { RR_TARGET_WHIRL, "whirl",
89 GRR_ICON_SVG_TARGET_WHIRL, sizeof (GRR_ICON_SVG_TARGET_WHIRL) },
91 { RR_WALL_ABOVE, "wall",
92 GRR_ICON_SVG_WALL, sizeof (GRR_ICON_SVG_WALL) },
95 GRR_ICON_SVG_CELL1, sizeof (GRR_ICON_SVG_CELL1) },
97 GRR_ICON_SVG_CELL2, sizeof (GRR_ICON_SVG_CELL2) }
99 #define NUM_BUILTINS (sizeof (builtins) / sizeof (builtins[0]))
102 _grr_icon_builtin_name (int type);
105 _grr_icon_init (grr_icon_t *icon, char *name);
108 _grr_icon_find_file (char *name);
111 _grr_icon_find_buffer (char *name, char **buf, int *buflen);
114 grr_icon_create (char *name)
118 icon = malloc (sizeof (grr_icon_t));
122 _grr_icon_init (icon, name);
128 _grr_icon_init (grr_icon_t *icon, char *name)
132 GError *error = NULL;
134 icon->surface = NULL;
135 icon->surface_width = 0;
136 icon->surface_height = 0;
138 file = _grr_icon_find_file (name);
140 icon->rsvg = rsvg_handle_new_from_file(file, &error);
142 fprintf (stderr, "Error parsing SVG icon: %s\n", file);
143 return RR_STATUS_PARSE_ERROR;
146 _grr_icon_find_buffer (name, &buf, &buflen);
147 icon->rsvg = rsvg_handle_new_from_data(buf, buflen, &error);
149 fprintf (stderr, "Error parsing built-in SVG icon for: %s\n", name);
150 return RR_STATUS_PARSE_ERROR;
153 return RR_STATUS_SUCCESS;
156 /* XXX: This could be made more interesting, (eg. search in ~/.grrobot
159 _grr_icon_find_file (char *name)
163 struct stat stat_buf;
165 grr_sprintf_alloc (&file, "%s/%s.svg", GRR_ICON_DIR, name);
169 err = stat (file, &stat_buf);
170 if (err == 0 && S_ISREG (stat_buf.st_mode))
178 _grr_icon_find_buffer (char *name, char **buf, int *buflen)
182 for (i=0; i < NUM_BUILTINS; i++){
183 if (strcmp (builtins[i].name, name) == 0) {
184 *buf = builtins[i].svg;
185 *buflen = builtins[i].svg_len;
195 _grr_icon_builtin_name (int type)
199 for (i=0; i < NUM_BUILTINS; i++)
200 if (builtins[i].type == type)
201 return builtins[i].name;
207 grr_icon_robot_name (rr_robot_t robot)
209 return _grr_icon_builtin_name (robot);
213 grr_icon_target_name (rr_target_t target)
215 return _grr_icon_builtin_name (target);
219 grr_icon_draw (grr_icon_t *icon, cairo_t *xrs)
221 rsvg_handle_render_cairo(icon->rsvg, xrs);
224 fprintf (stderr, "svg_cairo_render error\n");
231 grr_icon_predraw (grr_icon_t *icon, cairo_t *xrs, int width, int height)
236 if (icon->surface_width != width || icon->surface_height != height) {
238 cairo_surface_destroy (icon->surface);
239 icon->surface_width = width;
240 icon->surface_height = height;
241 icon->surface = cairo_surface_create_similar (cairo_get_target (xrs),
242 CAIRO_CONTENT_COLOR_ALPHA,
246 /* Need to copy the CTM from the original cairo_t to the new one */
247 xrs2 = cairo_create (icon->surface);
248 cairo_get_matrix (xrs, &ctm);
249 cairo_set_matrix (xrs2, &ctm);
250 grr_icon_draw (icon, xrs2);
251 cairo_destroy (xrs2);
255 grr_icon_draw_predrawn (grr_icon_t *icon, cairo_t *xrs, double alpha)
258 cairo_set_source_surface (xrs, icon->surface, 0.0, 0.0);
259 cairo_paint_with_alpha (xrs, alpha);