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; } }
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; }