From 5c20bde8b544d23fd024dad7ace9b46849336ebf Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Fri, 21 Aug 2009 09:45:13 +0000 Subject: -libcss-align svn path=/trunk/libcss/; revision=9378 --- src/bytecode/opcodes.h | 7 ++++ src/parse/properties/properties.c | 1 + src/parse/properties/properties.h | 3 ++ src/parse/properties/text.c | 78 +++++++++++++++++++++++++++++++++++++++ src/parse/propstrings.c | 1 + src/parse/propstrings.h | 4 +- src/select/dispatch.c | 8 ++++ src/select/properties.c | 56 ++++++++++++++++++++++++++++ src/select/properties.h | 8 ++++ src/select/propget.h | 17 +++++++++ src/select/propset.h | 18 +++++++++ 11 files changed, 199 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h index f69539f..f583537 100644 --- a/src/bytecode/opcodes.h +++ b/src/bytecode/opcodes.h @@ -628,5 +628,12 @@ enum op_z_index { Z_INDEX_AUTO = 0x0000 }; +enum op_libcss_align { + LIBCSS_ALIGN_LEFT = 0x0000, + LIBCSS_ALIGN_RIGHT = 0x0001, + LIBCSS_ALIGN_CENTER = 0x0002, + LIBCSS_ALIGN_JUSTIFY = 0x0003 +}; + #endif diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c index 0f555e1..0cde6c6 100644 --- a/src/parse/properties/properties.c +++ b/src/parse/properties/properties.c @@ -127,5 +127,6 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] = parse_width, parse_word_spacing, parse_z_index, + parse_libcss_align }; diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h index 0dc750a..dd96ac3 100644 --- a/src/parse/properties/properties.h +++ b/src/parse/properties/properties.h @@ -367,6 +367,9 @@ css_error parse_word_spacing(css_language *c, css_error parse_z_index(css_language *c, const parserutils_vector *vector, int *ctx, css_style **result); +css_error parse_libcss_align(css_language *c, + const parserutils_vector *vector, int *ctx, + css_style **result); #endif diff --git a/src/parse/properties/text.c b/src/parse/properties/text.c index 61ce60b..d3c81b5 100644 --- a/src/parse/properties/text.c +++ b/src/parse/properties/text.c @@ -850,3 +850,81 @@ css_error parse_word_spacing(css_language *c, return CSS_OK; } +/** + * Parse -libcss-align + * + * \param c Parsing context + * \param vector Vector of tokens to process + * \param ctx Pointer to vector iteration context + * \param result Pointer to location to receive resulting style + * \return CSS_OK on success, + * CSS_NOMEM on memory exhaustion, + * CSS_INVALID if the input is not valid + * + * Post condition: \a *ctx is updated with the next token to process + * If the input is invalid, then \a *ctx remains unchanged. + */ +css_error parse_libcss_align(css_language *c, + const parserutils_vector *vector, int *ctx, + css_style **result) +{ + int orig_ctx = *ctx; + css_error error; + const css_token *ident; + uint8_t flags = 0; + uint16_t value = 0; + uint32_t opv; + bool match; + + /* IDENT (left, right, center, justify, inherit) */ + ident = parserutils_vector_iterate(vector, ctx); + if (ident == NULL || ident->type != CSS_TOKEN_IDENT) { + *ctx = orig_ctx; + return CSS_INVALID; + } + + if ((lwc_context_string_caseless_isequal( + c->sheet->dictionary, + ident->idata, c->strings[INHERIT], + &match) == lwc_error_ok && match)) { + flags |= FLAG_INHERIT; + } else if ((lwc_context_string_caseless_isequal( + c->sheet->dictionary, + ident->idata, c->strings[LEFT], + &match) == lwc_error_ok && match)) { + value = LIBCSS_ALIGN_LEFT; + } else if ((lwc_context_string_caseless_isequal( + c->sheet->dictionary, + ident->idata, c->strings[RIGHT], + &match) == lwc_error_ok && match)) { + value = LIBCSS_ALIGN_RIGHT; + } else if ((lwc_context_string_caseless_isequal( + c->sheet->dictionary, + ident->idata, c->strings[CENTER], + &match) == lwc_error_ok && match)) { + value = LIBCSS_ALIGN_CENTER; + } else if ((lwc_context_string_caseless_isequal( + c->sheet->dictionary, + ident->idata, c->strings[JUSTIFY], + &match) == lwc_error_ok && match)) { + value = LIBCSS_ALIGN_JUSTIFY; + } else { + *ctx = orig_ctx; + return CSS_INVALID; + } + + opv = buildOPV(CSS_PROP_LIBCSS_ALIGN, flags, value); + + /* Allocate result */ + error = css_stylesheet_style_create(c->sheet, sizeof(opv), result); + if (error != CSS_OK) { + *ctx = orig_ctx; + return error; + } + + /* Copy the bytecode to it */ + memcpy((*result)->bytecode, &opv, sizeof(opv)); + + return CSS_OK; +} + diff --git a/src/parse/propstrings.c b/src/parse/propstrings.c index 906471f..28a1189 100644 --- a/src/parse/propstrings.c +++ b/src/parse/propstrings.c @@ -157,6 +157,7 @@ const stringmap_entry stringmap[LAST_KNOWN] = { { "width", SLEN("width") }, { "word-spacing", SLEN("word-spacing") }, { "z-index", SLEN("z-index") }, + { "-libcss-align", SLEN("-libcss-align") }, { "inherit", SLEN("inherit") }, { "important", SLEN("important") }, diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h index 9a0eb92..fe125cc 100644 --- a/src/parse/propstrings.h +++ b/src/parse/propstrings.h @@ -55,9 +55,9 @@ enum { SPEAK_PUNCTUATION, SPEAK, SPEECH_RATE, STRESS, TABLE_LAYOUT, TEXT_ALIGN, TEXT_DECORATION, TEXT_INDENT, TEXT_TRANSFORM, TOP, UNICODE_BIDI, VERTICAL_ALIGN, VISIBILITY, VOICE_FAMILY, VOLUME, - WHITE_SPACE, WIDOWS, WIDTH, WORD_SPACING, Z_INDEX, + WHITE_SPACE, WIDOWS, WIDTH, WORD_SPACING, Z_INDEX, LIBCSS_ALIGN, - LAST_PROP = Z_INDEX, + LAST_PROP = LIBCSS_ALIGN, /* Other keywords */ INHERIT, IMPORTANT, NONE, BOTH, FIXED, SCROLL, TRANSPARENT, diff --git a/src/select/dispatch.c b/src/select/dispatch.c index c15465b..11345e2 100644 --- a/src/select/dispatch.c +++ b/src/select/dispatch.c @@ -803,5 +803,13 @@ struct prop_table prop_dispatch[CSS_N_PROPERTIES] = { compose_z_index, 0, GROUP_NORMAL + }, + { + cascade_libcss_align, + set_libcss_align_from_hint, + initial_libcss_align, + compose_libcss_align, + 1, + GROUP_NORMAL } }; diff --git a/src/select/properties.c b/src/select/properties.c index 4b7b8a7..b83a29d 100644 --- a/src/select/properties.c +++ b/src/select/properties.c @@ -5452,6 +5452,62 @@ css_error compose_z_index(const css_computed_style *parent, return set_z_index(result, type, index); } +css_error cascade_libcss_align(uint32_t opv, css_style *style, + css_select_state *state) +{ + uint16_t value = CSS_LIBCSS_ALIGN_INHERIT; + + UNUSED(style); + + if (isInherit(opv) == false) { + switch (getValue(opv)) { + case LIBCSS_ALIGN_LEFT: + value = CSS_LIBCSS_ALIGN_LEFT; + break; + case LIBCSS_ALIGN_RIGHT: + value = CSS_LIBCSS_ALIGN_RIGHT; + break; + case LIBCSS_ALIGN_CENTER: + value = CSS_LIBCSS_ALIGN_CENTER; + break; + case LIBCSS_ALIGN_JUSTIFY: + value = CSS_LIBCSS_ALIGN_JUSTIFY; + break; + } + } + + if (outranks_existing(getOpcode(opv), isImportant(opv), state, + isInherit(opv))) { + return set_libcss_align(state->result, value); + } + + return CSS_OK; +} + +css_error set_libcss_align_from_hint(const css_hint *hint, + css_computed_style *style) +{ + return set_libcss_align(style, hint->status); +} + +css_error initial_libcss_align(css_select_state *state) +{ + return set_libcss_align(state->result, CSS_LIBCSS_ALIGN_DEFAULT); +} + +css_error compose_libcss_align(const css_computed_style *parent, + const css_computed_style *child, + css_computed_style *result) +{ + uint8_t type = get_libcss_align(child); + + if (type == CSS_LIBCSS_ALIGN_INHERIT) { + type = get_libcss_align(parent); + } + + return set_libcss_align(result, type); +} + /****************************************************************************** * Utilities below here * ******************************************************************************/ diff --git a/src/select/properties.h b/src/select/properties.h index 9c98e10..75b6f8d 100644 --- a/src/select/properties.h +++ b/src/select/properties.h @@ -806,6 +806,14 @@ css_error initial_z_index(css_select_state *state); css_error compose_z_index(const css_computed_style *parent, const css_computed_style *child, css_computed_style *result); +css_error cascade_libcss_align(uint32_t opv, css_style *style, + css_select_state *state); +css_error set_libcss_align_from_hint(const css_hint *hint, + css_computed_style *style); +css_error initial_libcss_align(css_select_state *state); +css_error compose_libcss_align(const css_computed_style *parent, + const css_computed_style *child, + css_computed_style *result); #endif diff --git a/src/select/propget.h b/src/select/propget.h index 23c7cdf..39f6300 100644 --- a/src/select/propget.h +++ b/src/select/propget.h @@ -1721,4 +1721,21 @@ static inline uint8_t get_list_style_position( #undef LIST_STYLE_POSITION_SHIFT #undef LIST_STYLE_POSITION_INDEX +#define LIBCSS_ALIGN_INDEX 33 +#define LIBCSS_ALIGN_SHIFT 1 +#define LIBCSS_ALIGN_MASK 0xe +static inline uint8_t get_libcss_align( + const css_computed_style *style) +{ + uint8_t bits = style->bits[LIBCSS_ALIGN_INDEX]; + bits &= LIBCSS_ALIGN_MASK; + bits >>= LIBCSS_ALIGN_SHIFT; + + /* 3bits: type */ + return bits; +} +#undef LIBCSS_ALIGN_MASK +#undef LIBCSS_ALIGN_SHIFT +#undef LIBCSS_ALIGN_INDEX + #endif diff --git a/src/select/propset.h b/src/select/propset.h index ac860fd..cc4121a 100644 --- a/src/select/propset.h +++ b/src/select/propset.h @@ -1679,4 +1679,22 @@ static inline css_error set_list_style_position( #undef LIST_STYLE_POSITION_SHIFT #undef LIST_STYLE_POSITION_INDEX +#define LIBCSS_ALIGN_INDEX 33 +#define LIBCSS_ALIGN_SHIFT 1 +#define LIBCSS_ALIGN_MASK 0xe +static inline uint8_t set_libcss_align( + css_computed_style *style, uint8_t type) +{ + uint8_t *bits = &style->bits[LIBCSS_ALIGN_INDEX]; + + /* 3bits: type */ + *bits = (*bits & ~LIBCSS_ALIGN_MASK) | + ((type & 0x7) << LIBCSS_ALIGN_SHIFT); + + return CSS_OK; +} +#undef LIBCSS_ALIGN_MASK +#undef LIBCSS_ALIGN_SHIFT +#undef LIBCSS_ALIGN_INDEX + #endif -- cgit v1.2.3