From 7ecab92e9a8508c44a758a8ca58defe9a5965bb4 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 14 Feb 2009 00:06:01 +0000 Subject: A motley selection of changes. Vague summary: + Add config makefile (not that there's anything to configure at present :) + Fix dumping of UNIT_MS to actually use sprintf and not printf + Extend computed style dumping (still loads of properties missing) + Make result buffer larger in select-auto.c -- avoids buffer overflows when there's way more output than expected + Expand expected test output to contain defaulted properties (more of this will be needed once the computed style dumping is complete) + Store interned string pointers in css_select_state. + Intern pseudo class/element names at start of selecting styles for a sheet + Group properties so we know which ones appear in the extension blocks + Fixup unset properties once the cascade has completed + Implement matching of pseudo class/element selectors + Fix setting of background-image and list-style-image when there's no URL. svn path=/trunk/libcss/; revision=6470 --- test/dump_computed.h | 301 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) (limited to 'test/dump_computed.h') diff --git a/test/dump_computed.h b/test/dump_computed.h index dda07c1..f573e9d 100644 --- a/test/dump_computed.h +++ b/test/dump_computed.h @@ -1,6 +1,141 @@ #include #include +#include "utils/fpmath.h" + +static size_t dump_css_fixed(css_fixed f, char *ptr, size_t len) +{ +#define ABS(x) (uint32_t)((x) < 0 ? -(x) : (x)) + uint32_t uintpart = FIXTOINT(ABS(f)); + /* + 500 to ensure round to nearest (division will truncate) */ + uint32_t fracpart = ((ABS(f) & 0x3ff) * 1000 + 500) / (1 << 10); +#undef ABS + size_t flen = 0; + char tmp[20]; + size_t tlen = 0; + char *buf = ptr; + + if (len == 0) + return 0; + + if (f < 0) { + buf[0] = '-'; + buf++; + len--; + } + + do { + tmp[tlen] = "0123456789"[uintpart % 10]; + tlen++; + + uintpart /= 10; + } while (tlen < 20 && uintpart != 0); + + while (tlen > 0 && len > 0) { + buf[0] = tmp[--tlen]; + buf++; + len--; + } + + if (len > 0) { + buf[0] = '.'; + buf++; + len--; + } + + do { + tmp[tlen] = "0123456789"[fracpart % 10]; + tlen++; + + fracpart /= 10; + } while (tlen < 20 && fracpart != 0); + + while (tlen > 0 && len > 0) { + buf[0] = tmp[--tlen]; + buf++; + flen++; + len--; + } + + while (flen < 3 && len > 0) { + buf[0] = '0'; + buf++; + flen++; + len--; + } + + if (len > 0) + buf[0] = '\0'; + + return buf - ptr; +} +static size_t dump_css_number(css_fixed val, char *ptr, size_t len) +{ + if (INTTOFIX(FIXTOINT(val)) == val) + return snprintf(ptr, len, "%d", FIXTOINT(val)); + else + return dump_css_fixed(val, ptr, len); +} + +static size_t dump_css_unit(css_fixed val, css_unit unit, char *ptr, size_t len) +{ + size_t ret = dump_css_number(val, ptr, len); + + switch (unit) { + case CSS_UNIT_PX: + ret += snprintf(ptr + ret, len - ret, "px"); + break; + case CSS_UNIT_EX: + ret += snprintf(ptr + ret, len - ret, "ex"); + break; + case CSS_UNIT_EM: + ret += snprintf(ptr + ret, len - ret, "em"); + break; + case CSS_UNIT_IN: + ret += snprintf(ptr + ret, len - ret, "in"); + break; + case CSS_UNIT_CM: + ret += snprintf(ptr + ret, len - ret, "cm"); + break; + case CSS_UNIT_MM: + ret += snprintf(ptr + ret, len - ret, "mm"); + break; + case CSS_UNIT_PT: + ret += snprintf(ptr + ret, len - ret, "pt"); + break; + case CSS_UNIT_PC: + ret += snprintf(ptr + ret, len - ret, "pc"); + break; + case CSS_UNIT_PCT: + ret += snprintf(ptr + ret, len - ret, "%%"); + break; + case CSS_UNIT_DEG: + ret += snprintf(ptr + ret, len - ret, "deg"); + break; + case CSS_UNIT_GRAD: + ret += snprintf(ptr + ret, len - ret, "grad"); + break; + case CSS_UNIT_RAD: + ret += snprintf(ptr + ret, len - ret, "rad"); + break; + case CSS_UNIT_MS: + ret += snprintf(ptr + ret, len - ret, "ms"); + break; + case CSS_UNIT_S: + ret += snprintf(ptr + ret, len - ret, "s"); + break; + case CSS_UNIT_HZ: + ret += snprintf(ptr + ret, len - ret, "Hz"); + break; + case CSS_UNIT_KHZ: + ret += snprintf(ptr + ret, len - ret, "kHz"); + break; + } + + return ret; +} + + static void dump_computed_style(const css_computed_style *style, char *buf, size_t *len) { @@ -8,6 +143,9 @@ static void dump_computed_style(const css_computed_style *style, char *buf, size_t wrote = 0; uint8_t val; css_color color; + const css_string *url; + css_fixed len1, len2; + css_unit unit1, unit2; val = css_computed_background_attachment(style); switch (val) { @@ -39,6 +177,169 @@ static void dump_computed_style(const css_computed_style *style, char *buf, ptr += wrote; *len -= wrote; + val = css_computed_background_image(style, &url); + if (val == CSS_BACKGROUND_IMAGE_IMAGE && url->data != NULL) { + wrote = snprintf(ptr, *len, "background-image: url('%.*s')\n", + (int) url->len, url->data); + } else if (val == CSS_BACKGROUND_IMAGE_NONE) { + wrote = snprintf(ptr, *len, "background-image: none\n"); + } else { + wrote = 0; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_background_position(style, &len1, &unit1, + &len2, &unit2); + if (val == CSS_BACKGROUND_POSITION_SET) { + wrote = snprintf(ptr, *len, "background-position: "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len1, unit1, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, " "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len2, unit2, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, "\n"); + ptr += wrote; + *len -= wrote; + } + + val = css_computed_background_repeat(style); + switch (val) { + case CSS_BACKGROUND_REPEAT_REPEAT_X: + wrote = snprintf(ptr, *len, "background-repeat: repeat-x\n"); + break; + case CSS_BACKGROUND_REPEAT_REPEAT_Y: + wrote = snprintf(ptr, *len, "background-repeat: repeat-y\n"); + break; + case CSS_BACKGROUND_REPEAT_REPEAT: + wrote = snprintf(ptr, *len, "background-repeat: repeat\n"); + break; + case CSS_BACKGROUND_REPEAT_NO_REPEAT: + wrote = snprintf(ptr, *len, "background-repeat: no-repeat\n"); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_collapse(style); + switch (val) { + case CSS_BORDER_COLLAPSE_SEPARATE: + wrote = snprintf(ptr, *len, "border-collapse: separate\n"); + break; + case CSS_BORDER_COLLAPSE_COLLAPSE: + wrote = snprintf(ptr, *len, "border-collapse: collapse\n"); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + if (style->uncommon != NULL) { + val = css_computed_border_spacing(style, &len1, &unit1, + &len2, &unit2); + if (val == CSS_BORDER_SPACING_SET) { + wrote = snprintf(ptr, *len, "border-spacing: "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len1, unit1, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, " "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len2, unit2, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, "\n"); + ptr += wrote; + *len -= wrote; + } + } + + val = css_computed_border_top_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, "border-top-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, "border-top-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_right_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, + "border-right-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, + "border-right-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_bottom_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, + "border-bottom-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, + "border-bottom-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_left_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, "border-left-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, + "border-left-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + val = css_computed_color(style, &color); if (val == CSS_COLOR_COLOR) { wrote = snprintf(ptr, *len, "color: #%08x\n", color); -- cgit v1.2.3