+/* grrobot - Ricochet Robot using GTK+ and Xr
+ *
+ * Copyright © 2003 Carl Worth
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of Carl Worth
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.
+ * Carl Worth makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express
+ * or implied warranty.
+ *
+ * CARL WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL CARL WORTH BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Carl Worth <carl@theworths.org>
+ */
+
+#include "grr_icon.h"
+#include "grr_icon_svg.h"
+
+struct {
+ int type;
+ char *name;
+ char *svg;
+} icons[] = {
+ { RR_ROBOT_BLUE,
+ "robot_blue", GRR_ICON_SVG_ROBOT_BLUE },
+ { RR_ROBOT_GREEN,
+ "robot_green", GRR_ICON_SVG_ROBOT_GREEN },
+ { RR_ROBOT_RED,
+ "robot_red", GRR_ICON_SVG_ROBOT_RED },
+ { RR_ROBOT_YELLOW,
+ "robot_yellow", GRR_ICON_SVG_ROBOT_YELLOW },
+
+ { RR_TARGET_BLUE_CIRCLE,
+ "target_blue_circle", GRR_ICON_SVG_TARGET_BLUE_CIRCLE },
+ { RR_TARGET_BLUE_OCTAGON,
+ "target_blue_octagon", GRR_ICON_SVG_TARGET_BLUE_OCTAGON },
+ { RR_TARGET_BLUE_SQUARE,
+ "target_blue_square", GRR_ICON_SVG_TARGET_BLUE_SQUARE },
+ { RR_TARGET_BLUE_TRIANGLE,
+ "target_blue_triangle", GRR_ICON_SVG_TARGET_BLUE_TRIANGLE },
+
+ { RR_TARGET_GREEN_CIRCLE,
+ "target_green_circle", GRR_ICON_SVG_TARGET_GREEN_CIRCLE },
+ { RR_TARGET_GREEN_OCTAGON,
+ "target_green_octagon", GRR_ICON_SVG_TARGET_GREEN_OCTAGON },
+ { RR_TARGET_GREEN_SQUARE,
+ "target_green_square", GRR_ICON_SVG_TARGET_GREEN_SQUARE },
+ { RR_TARGET_GREEN_TRIANGLE,
+ "target_green_triangle", GRR_ICON_SVG_TARGET_GREEN_TRIANGLE },
+
+ { RR_TARGET_RED_CIRCLE,
+ "target_red_circle", GRR_ICON_SVG_TARGET_RED_CIRCLE },
+ { RR_TARGET_RED_OCTAGON,
+ "target_red_octagon", GRR_ICON_SVG_TARGET_RED_OCTAGON },
+ { RR_TARGET_RED_SQUARE,
+ "target_red_square", GRR_ICON_SVG_TARGET_RED_SQUARE },
+ { RR_TARGET_RED_TRIANGLE,
+ "target_red_triangle", GRR_ICON_SVG_TARGET_RED_TRIANGLE },
+
+ { RR_TARGET_YELLOW_CIRCLE,
+ "target_yellow_circle", GRR_ICON_SVG_TARGET_YELLOW_CIRCLE },
+ { RR_TARGET_YELLOW_OCTAGON,
+ "target_yellow_octagon", GRR_ICON_SVG_TARGET_YELLOW_OCTAGON },
+ { RR_TARGET_YELLOW_SQUARE,
+ "target_yellow_square", GRR_ICON_SVG_TARGET_YELLOW_SQUARE },
+ { RR_TARGET_YELLOW_TRIANGLE,
+ "target_yellow_triangle", GRR_ICON_SVG_TARGET_YELLOW_TRIANGLE },
+
+ { RR_TARGET_WHIRL,
+ "whirl", GRR_ICON_SVG_TARGET_WHIRL },
+
+ { RR_WALL_ABOVE,
+ "wall", GRR_ICON_SVG_WALL },
+
+ { RR_CELL,
+ "cell", GRR_ICON_SVG_CELL }
+};
+
+typedef struct grr_icon {
+ xsvg_t *xsvg;
+} grr_icon_t;
+
+grr_icon_t *
+grr_icon_create (char *name)
+{
+ grr_icon *icon;
+
+ icon = malloc (sizeof (grr_icon_t));
+ if (icon == NULL)
+ return NULL;
+
+ _grr_icon_init (icon, name);
+
+ return icon;
+}
+
+static rr_status_t
+_grr_icon_init (grr_icon_t *icon, char *name)
+{
+ xsvg_status_t status;
+ char *file, *buf;
+
+ status = xsvg_create (&icon->xsvg);
+ if (status)
+ return RR_STATUS_NO_MEMORY;
+
+ file = grr_icon_find_file (name);
+
+ if (file) {
+ status = xsvg_parse_file (icon->xsvg, file);
+ if (status == XSVG_STATUS_SUCCESS) {
+ free (file);
+ return RR_STATUS_SUCCESS;
+ }
+ fprintf (stderr, "Error parsing SVG icon: %s\n", file);
+ free (file);
+ }
+
+ buf = grr_icon_find_buffer (name);
+ status = xsvg_parse_buffer (icon->xsvg, buf, strlen (buf));
+ if (status) {
+ fprintf (stderr, "Error parsing built-in SVG icon for: %s\n", name);
+ return RR_STATUS_PARSE_ERROR;
+ }
+
+ return RR_STATUS_SUCCESS;
+}
+
+/* XXX: This could be made more interesting, (eg. search in ~/.grrobot
+ or something). */
+static char *
+_grr_icon_find_file (char *name)
+{
+ int err;
+ char *file;
+ struct stat stat_buf;
+
+ rr_string_sprintf_alloc (&file, "%s/%s", GRR_ICON_DIR, name);
+ if (file == NULL)
+ return NULL;
+
+ err = stat (file, &stat_buf);
+ if (err == 0 && S_ISREG (state.st_mode))
+ return (file);
+ free (file);
+}