From b1692363b809dfe3776866e4319b7a659ca159a4 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 14 Feb 2009 21:52:08 +0000 Subject: Finally, a representation of a computed content property. svn path=/trunk/libcss/; revision=6515 --- src/select/properties.c | 150 +++++++++++++++++++++++++++++++++++++----------- src/select/propset.h | 26 +++++++++ 2 files changed, 141 insertions(+), 35 deletions(-) (limited to 'src/select') diff --git a/src/select/properties.c b/src/select/properties.c index d084bc5..7ac0e36 100644 --- a/src/select/properties.c +++ b/src/select/properties.c @@ -628,59 +628,139 @@ static css_error initial_color(css_computed_style *style) static css_error cascade_content(uint32_t opv, css_style *style, css_select_state *state) { - uint16_t value = 0; + uint16_t value = CSS_CONTENT_INHERIT; + css_computed_content_item *content = NULL; + uint32_t n_contents = 0; if (isInherit(opv) == false) { uint32_t v = getValue(opv); if (v == CONTENT_NORMAL) { - value = 0; + value = CSS_CONTENT_NORMAL; } else if (v == CONTENT_NONE) { - value = 0; - } + value = CSS_CONTENT_NONE; + } else { + value = CSS_CONTENT_SET; - while (v != CONTENT_NORMAL) { - parserutils_hash_entry *he = + while (v != CONTENT_NORMAL) { + css_computed_content_item *temp; + parserutils_hash_entry *he = *((parserutils_hash_entry **) style->bytecode); - switch (v & 0xff) { - case CONTENT_COUNTER: - advance_bytecode(style, sizeof(he)); - break; - case CONTENT_COUNTERS: - { - parserutils_hash_entry *sep; + temp = state->result->alloc(content, + (n_contents + 1) * + sizeof(css_computed_content_item), + state->result->pw); + if (temp == NULL) { + if (content != NULL) { + state->result->alloc(content, + 0, state->result->pw); + } + return CSS_NOMEM; + } - advance_bytecode(style, sizeof(he)); + content = temp; + + switch (v & 0xff) { + case CONTENT_COUNTER: + advance_bytecode(style, sizeof(he)); + + content[n_contents].type = + CSS_COMPUTED_CONTENT_COUNTER; + content[n_contents].data.counter.name.data = (uint8_t *) he->data; + content[n_contents].data.counter.name.len = he->len; + content[n_contents].data.counter.style = v >> CONTENT_COUNTER_STYLE_SHIFT; + break; + case CONTENT_COUNTERS: + { + parserutils_hash_entry *sep; + + advance_bytecode(style, sizeof(he)); + + sep = *((parserutils_hash_entry **) + style->bytecode); + advance_bytecode(style, sizeof(sep)); + + content[n_contents].type = + CSS_COMPUTED_CONTENT_COUNTERS; + content[n_contents].data.counters.name.data = (uint8_t *) he->data; + content[n_contents].data.counters.name.len = he->len; + content[n_contents].data.counters.sep.data = (uint8_t *) sep->data; + content[n_contents].data.counters.sep.len = sep->len; + content[n_contents].data.counters.style = v >> CONTENT_COUNTERS_STYLE_SHIFT; + } + break; + case CONTENT_URI: + advance_bytecode(style, sizeof(he)); + + content[n_contents].type = + CSS_COMPUTED_CONTENT_URI; + content[n_contents].data.uri.data = (uint8_t *) he->data; + content[n_contents].data.uri.len = he->len; + break; + case CONTENT_ATTR: + advance_bytecode(style, sizeof(he)); + + content[n_contents].type = + CSS_COMPUTED_CONTENT_ATTR; + content[n_contents].data.attr.data = (uint8_t *) he->data; + content[n_contents].data.attr.len = he->len; + break; + case CONTENT_STRING: + advance_bytecode(style, sizeof(he)); + + content[n_contents].type = + CSS_COMPUTED_CONTENT_STRING; + content[n_contents].data.string.data = (uint8_t *) he->data; + content[n_contents].data.string.len = he->len; + break; + case CONTENT_OPEN_QUOTE: + content[n_contents].type = + CSS_COMPUTED_CONTENT_OPEN_QUOTE; + break; + case CONTENT_CLOSE_QUOTE: + content[n_contents].type = + CSS_COMPUTED_CONTENT_CLOSE_QUOTE; + break; + case CONTENT_NO_OPEN_QUOTE: + content[n_contents].type = + CSS_COMPUTED_CONTENT_NO_OPEN_QUOTE; + break; + case CONTENT_NO_CLOSE_QUOTE: + content[n_contents].type = + CSS_COMPUTED_CONTENT_NO_CLOSE_QUOTE; + break; + } - sep = *((parserutils_hash_entry **) - style->bytecode); - advance_bytecode(style, sizeof(sep)); + n_contents++; + v = *((uint32_t *) style->bytecode); + advance_bytecode(style, sizeof(v)); } - break; - case CONTENT_URI: - case CONTENT_ATTR: - case CONTENT_STRING: - advance_bytecode(style, sizeof(he)); - break; - case CONTENT_OPEN_QUOTE: - break; - case CONTENT_CLOSE_QUOTE: - break; - case CONTENT_NO_OPEN_QUOTE: - break; - case CONTENT_NO_CLOSE_QUOTE: - break; - } + } + } - v = *((uint32_t *) style->bytecode); - advance_bytecode(style, sizeof(v)); + /* If we have some content, terminate the array with a blank entry */ + if (n_contents > 0) { + css_computed_content_item *temp; + + temp = state->result->alloc(content, + (n_contents + 1) * sizeof(css_computed_content_item), + state->result->pw); + if (temp == NULL) { + state->result->alloc(content, 0, state->result->pw); + return CSS_NOMEM; } + + content = temp; + + content[n_contents].type = CSS_COMPUTED_CONTENT_NONE; } if (outranks_existing(getOpcode(opv), isImportant(opv), state)) { - /** \todo content */ + return set_content(state->result, value, content); + } else if (content != NULL) { + state->result->alloc(content, 0, state->result->pw); } return CSS_OK; diff --git a/src/select/propset.h b/src/select/propset.h index 661913b..64f7829 100644 --- a/src/select/propset.h +++ b/src/select/propset.h @@ -323,6 +323,32 @@ static inline css_error set_clip( #undef CLIP_SHIFT #undef CLIP_INDEX +#define CONTENT_INDEX 7 +#define CONTENT_SHIFT 0 +#define CONTENT_MASK 0x3 +static inline css_error set_content( + css_computed_style *style, uint8_t type, + css_computed_content_item *content) +{ + uint8_t *bits; + + ENSURE_UNCOMMON; + + /* 2bits: type */ + bits = &style->uncommon->bits[CONTENT_INDEX]; + + *bits = (*bits & ~CONTENT_MASK) | + ((type & 0x3) << CONTENT_SHIFT); + + style->uncommon->content = content; + + return CSS_OK; +} +#undef CONTENT_MASK +#undef CONTENT_SHIFT +#undef CONTENT_INDEX + + #define VERTICAL_ALIGN_INDEX 0 #define VERTICAL_ALIGN_SHIFT 0 #define VERTICAL_ALIGN_MASK 0xff -- cgit v1.2.3