static svg_status_t _svg_color_parse_component (const char **str, unsigned int *component) { const char *s, *end; double c; s = *str; c = _svg_ascii_strtod (s, &end); if (end == s) return SVG_STATUS_PARSE_ERROR; s = end; _svg_str_skip_space (&s); if (*s == '%') { c *= 2.55; s++; } _svg_str_skip_space (&s); if (c > 255) c = 255; else if (c < 0) c = 0; *component = (unsigned int) c; *str = s; return SVG_STATUS_SUCCESS; }
static svg_status_t _svg_parser_parse_polyline (svg_parser_t *parser, const char **attributes, svg_element_t **path_element) { svg_status_t status; const char *points; const char *p, *next; svg_path_t *path; double pt[2]; int first; _svg_attribute_get_string (attributes, "points", &points, NULL); if (points == NULL) return SVG_STATUS_PARSE_ERROR; status = _svg_parser_new_leaf_element (parser, path_element, SVG_ELEMENT_TYPE_PATH); if (status) return status; path = &(*path_element)->e.path; first = 1; p = points; while (*p) { status = _svg_str_parse_csv_doubles (p, pt, 2, &next); if (status) return SVG_STATUS_PARSE_ERROR; if (first) { _svg_path_move_to (path, pt[0], pt[1]); first = 0; } else { _svg_path_line_to (path, pt[0], pt[1]); } p = next; _svg_str_skip_space (&p); } return SVG_STATUS_SUCCESS; }
svg_status_t _svg_color_init_from_str (svg_color_t *color, const char *str) { unsigned int r=0, g=0, b=0; svg_status_t status; svg_color_map_t *map; /* XXX: Need to check SVG spec. for this error case */ if (str == NULL || str[0] == '\0') return _svg_color_init_rgb (color, 0, 0, 0); if (strcmp (str, "currentColor") == 0) { _svg_color_init_rgb (color, 0, 0, 0); color->is_current_color = 1; return SVG_STATUS_SUCCESS; } color->is_current_color = 0; if (str[0] == '#') { str++; if (strlen(str) >= 6) { r = _svg_color_get_two_hex_digits (str); str += 2; g = _svg_color_get_two_hex_digits (str); str += 2; b = _svg_color_get_two_hex_digits (str); } else if (strlen(str) >= 3) { r = _svg_color_get_hex_digit (str); r += (r << 4); str++; g = _svg_color_get_hex_digit (str); g += (g << 4); str++; b = _svg_color_get_hex_digit (str); b += (b << 4); } return _svg_color_init_rgb (color, r, g, b); } _svg_str_skip_space (&str); if (strncmp (str, "rgb", 3) == 0) { str += 3; _svg_str_skip_space (&str); _svg_str_skip_char (&str, '('); status = _svg_color_parse_component (&str, &r); if (status) return status; _svg_str_skip_char (&str, ','); status = _svg_color_parse_component (&str, &g); if (status) return status; _svg_str_skip_char (&str, ','); status = _svg_color_parse_component (&str, &b); if (status) return status; _svg_str_skip_char (&str, ')'); return _svg_color_init_rgb (color, r, g, b); } map = (svg_color_map_t *)bsearch (str, SVG_COLOR_MAP, SVG_ARRAY_SIZE(SVG_COLOR_MAP), sizeof (svg_color_map_t), _svg_color_cmp); /* default to black on failed lookup */ if (map == NULL) return _svg_color_init_rgb (color, 0, 0, 0); *color = map->color; return SVG_STATUS_SUCCESS; }