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;
}
Example #2
0
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;
}