void svgtiny_parse_color(const char *s, svgtiny_colour *c,
		struct svgtiny_parse_state *state)
{
	unsigned int r, g, b;
	float rf, gf, bf;
	size_t len = strlen(s);
	char *id = 0, *rparen;

	if (len == 4 && s[0] == '#') {
		if (sscanf(s + 1, "%1x%1x%1x", &r, &g, &b) == 3)
			*c = svgtiny_RGB(r | r << 4, g | g << 4, b | b << 4);

	} else if (len == 7 && s[0] == '#') {
		if (sscanf(s + 1, "%2x%2x%2x", &r, &g, &b) == 3)
			*c = svgtiny_RGB(r, g, b);

	} else if (10 <= len && s[0] == 'r' && s[1] == 'g' && s[2] == 'b' &&
			s[3] == '(' && s[len - 1] == ')') {
		if (sscanf(s + 4, "%u,%u,%u", &r, &g, &b) == 3)
			*c = svgtiny_RGB(r, g, b);
		else if (sscanf(s + 4, "%f%%,%f%%,%f%%", &rf, &gf, &bf) == 3) {
			b = bf * 255 / 100;
			g = gf * 255 / 100;
			r = rf * 255 / 100;
			*c = svgtiny_RGB(r, g, b);
		}

	} else if (len == 4 && strcmp(s, "none") == 0) {
		*c = svgtiny_TRANSPARENT;

	} else if (5 < len && s[0] == 'u' && s[1] == 'r' && s[2] == 'l' &&
			s[3] == '(') {
		if (s[4] == '#') {
			id = strdup(s + 5);
			if (!id)
				return;
			rparen = strchr(id, ')');
			if (rparen)
				*rparen = 0;
			svgtiny_find_gradient(id, state);
			free(id);
			fprintf(stderr, "linear_gradient_stop_count %i\n",
					state->linear_gradient_stop_count);
			if (state->linear_gradient_stop_count == 0)
				*c = svgtiny_TRANSPARENT;
			else if (state->linear_gradient_stop_count == 1)
				*c = state->gradient_stop[0].color;
			else
				*c = svgtiny_LINEAR_GRADIENT;
		}

	} else {
		const struct svgtiny_named_color *named_color;
		named_color = svgtiny_color_lookup(s, strlen(s));
		if (named_color)
			*c = named_color->color;
	}
}
Exemple #2
0
int LICE_RGBA_from_SVG(const char* s,int len)  // returns LICE_pixel
{
  int r = 0, g = 0, b = 0;
  float rf = 0.0f, gf = 0.0f, bf = 0.0f;
  const struct svgtiny_named_color* c = 0;

#ifdef _WIN32
  if (len == 4 && !strnicmp(s, "none", 4)) return 0;
#else
  if (len == 4 && !strncasecmp(s, "none", 4)) return 0;
#endif
  
  if (len == 4 && s[0] == '#') 
  {
		if (sscanf(s+1, "%1x%1x%1x", &r, &g, &b) == 3)
    {
      return svgtiny_RGB(r<<4,g<<4,b<<4);
	  }
  }
  else if (len == 7 && s[0] == '#')
  {
    if (sscanf(s+1, "%2x%2x%2x", &r, &g, &b) == 3)
    {
      return svgtiny_RGB(r, g, b);
    }
  }
  else if (10 <= len && s[0] == 'r' && s[1] == 'g' && s[2] == 'b' && s[3] == '(' && s[len - 1] == ')') 
  {
		if (sscanf(s+4, "%i,%i,%i", &r, &g, &b) == 3)
    {
			return svgtiny_RGB(r, g, b);
    }
		else 
    {
      if (sscanf(s+4, "%f%%,%f%%,%f%%", &rf, &gf, &bf) == 3) 
      {
			  b = (int) (bf*2.55);
			  g = (int) (gf*2.55);
			  r = (int) (rf*2.55);
			  return svgtiny_RGB(r, g, b);
		  }
    }
  }
  else
  {
    c = svgtiny_color_lookup(s, len);
    if (c) return c->color;
  }

  return 0;
}