diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2004-06-15 20:45:02 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2004-06-15 20:45:02 +0000 |
commit | b8896816c3c79139781670f000695f801054450c (patch) | |
tree | 13543df52cbe58fb50a544a0946fe7c24ede03cf /css/ruleset.c | |
parent | 319bd68d034572eaa4358cf7ac40aee8306c4f62 (diff) | |
download | netsurf-b8896816c3c79139781670f000695f801054450c.tar.gz netsurf-b8896816c3c79139781670f000695f801054450c.tar.bz2 |
[project @ 2004-06-15 20:45:02 by jmb]
rgb() support
svn path=/import/netsurf/; revision=974
Diffstat (limited to 'css/ruleset.c')
-rw-r--r-- | css/ruleset.c | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/css/ruleset.c b/css/ruleset.c index a3d43c679..53aef472c 100644 --- a/css/ruleset.c +++ b/css/ruleset.c @@ -433,6 +433,9 @@ colour parse_colour(const struct css_node * const v) unsigned int r, g, b; struct css_colour_entry *col; char colour_name[12]; + const char *u; + char sb[5]; + int i; switch (v->type) { case CSS_NODE_HASH: @@ -446,7 +449,57 @@ colour parse_colour(const struct css_node * const v) break; case CSS_NODE_FUNCTION: - /* TODO: rgb(r, g, b) */ + for (u = v->data+4; + *u == ' ' || *u == '\t' || *u == '\r' || + *u == '\n' || *u == '\f'; + u++) + ; + /* extract r */ + for (i=0; *u != ',' && i != 4; i++) { + sb[i] = *u++; + } + sb[i] = 0; + u++; + + if (sb[i-1] == '%') { + sb[i-1] = 0; + r = (int)((float)(atoi(sb) / 100.0) * 255); + } + else + r = atoi(sb); + + /* extract g */ + for (i=0; *u != ',' && i != 4; i++) { + sb[i] = *u++; + } + sb[i] = 0; + u++; + + if (sb[i-1] == '%') { + sb[i-1] = 0; + g = (int)((float)(atoi(sb) / 100.0) * 255); + } + else + g = atoi(sb); + + /* extract b */ + for (i=0; *u != ')' && i != 4; i++) { + sb[i] = *u++; + } + sb[i] = 0; + + if (sb[i-1] == '%') { + sb[i-1] = 0; + b = (int)((float)(atoi(sb) / 100.0) * 255); + } + else + b = atoi(sb); + + /* calculate c, ensuring that r,g,b are in range */ + c = ((b > 255 ? 255 : b) << 16) | + ((g > 255 ? 255 : g) << 8) | + (r > 255 ? 255 : r); + break; case CSS_NODE_IDENT: |