diff options
-rw-r--r-- | docs/Bytecode | 10 | ||||
-rw-r--r-- | include/libcss/computed.h | 24 | ||||
-rw-r--r-- | include/libcss/properties.h | 13 | ||||
-rw-r--r-- | src/bytecode/opcodes.h | 7 | ||||
-rw-r--r-- | src/parse/properties/properties.c | 1 | ||||
-rw-r--r-- | src/parse/properties/properties.h | 3 | ||||
-rw-r--r-- | src/parse/properties/text.c | 78 | ||||
-rw-r--r-- | src/parse/propstrings.c | 1 | ||||
-rw-r--r-- | src/parse/propstrings.h | 4 | ||||
-rw-r--r-- | src/select/dispatch.c | 8 | ||||
-rw-r--r-- | src/select/properties.c | 56 | ||||
-rw-r--r-- | src/select/properties.h | 8 | ||||
-rw-r--r-- | src/select/propget.h | 17 | ||||
-rw-r--r-- | src/select/propset.h | 18 | ||||
-rw-r--r-- | test/data/parse/properties.dat | 37 | ||||
-rw-r--r-- | test/data/parse2/illegal-values.dat | 70 | ||||
-rw-r--r-- | test/data/select/tests1.dat | 3 | ||||
-rw-r--r-- | test/dump.h | 7 | ||||
-rw-r--r-- | test/dump_computed.h | 26 |
19 files changed, 384 insertions, 7 deletions
diff --git a/docs/Bytecode b/docs/Bytecode index fbb126e..8542744 100644 --- a/docs/Bytecode +++ b/docs/Bytecode @@ -1097,5 +1097,13 @@ Opcodes bits 0-6: 0000000 => auto, other => rffe. -63-3ff - Reserved for future expansion. +63 - -libcss-align + <value> (14bits) : + 0 => left, + 1 => right, + 2 => center, + 3 => justify, + other => Reserved for future expansion. + +64-3ff - Reserved for future expansion. diff --git a/include/libcss/computed.h b/include/libcss/computed.h index 8e662e5..cbda9a1 100644 --- a/include/libcss/computed.h +++ b/include/libcss/computed.h @@ -173,8 +173,9 @@ struct css_computed_style { * unicode_bidi 2 * visibility 2 * white_space 3 + * -libcss_align 3 * --- - * 83 bits + * 86 bits * * Colours are 32bits of RRGGBBAA * Dimensions are encoded as a fixed point value + 4 bits of unit data @@ -232,7 +233,7 @@ struct css_computed_style { * 1 bit sizeof(ptr) bytes * * ___ ___ - * 268 bits 140 + 4sizeof(ptr) bytes + * 271 bits 140 + 4sizeof(ptr) bytes * * 34 bytes 140 + 4sizeof(ptr) bytes * =================== @@ -274,7 +275,7 @@ struct css_computed_style { * 31 bbbbllll border-bottom-style | border-left-style * 32 ffffllll font-weight | list-style-type * 33 oooottuu outline-style | table-layout | unicode-bidi - * 34 vvll.... visibility | list-style-position | <unused> + * 34 vvllaaa. visibility | list-style-position | -libcss-align | <unused> */ uint8_t bits[34]; @@ -2176,4 +2177,21 @@ static inline uint8_t css_computed_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 css_computed_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/include/libcss/properties.h b/include/libcss/properties.h index e0ace18..38b264e 100644 --- a/include/libcss/properties.h +++ b/include/libcss/properties.h @@ -109,7 +109,9 @@ enum css_properties_e { CSS_PROP_WORD_SPACING = 0x061, CSS_PROP_Z_INDEX = 0x062, - CSS_N_PROPERTIES = CSS_PROP_Z_INDEX + 1 + CSS_PROP_LIBCSS_ALIGN = 0x063, + + CSS_N_PROPERTIES = CSS_PROP_LIBCSS_ALIGN + 1 }; @@ -595,4 +597,13 @@ enum css_z_index_e { CSS_Z_INDEX_AUTO = 0x2 }; +enum css_libcss_align_e { + CSS_LIBCSS_ALIGN_INHERIT = 0x0, + CSS_LIBCSS_ALIGN_LEFT = 0x1, + CSS_LIBCSS_ALIGN_RIGHT = 0x2, + CSS_LIBCSS_ALIGN_CENTER = 0x3, + CSS_LIBCSS_ALIGN_JUSTIFY = 0x4, + CSS_LIBCSS_ALIGN_DEFAULT = 0x5 +}; + #endif 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 diff --git a/test/data/parse/properties.dat b/test/data/parse/properties.dat index 8dabbc1..3e872d9 100644 --- a/test/data/parse/properties.dat +++ b/test/data/parse/properties.dat @@ -3743,3 +3743,40 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at | 1 * | 0x02000062 0xfffffc00 #reset + +## +## 63 - -libcss-align +## + +#data +* { -libcss-align: left; } +#errors +#expected +| 1 * +| 0x00000063 +#reset + +#data +* { -libcss-align: right; } +#errors +#expected +| 1 * +| 0x00040063 +#reset + +#data +* { -libcss-align: center; } +#errors +#expected +| 1 * +| 0x00080063 +#reset + +#data +* { -libcss-align: justify; } +#errors +#expected +| 1 * +| 0x000c0063 +#reset + diff --git a/test/data/parse2/illegal-values.dat b/test/data/parse2/illegal-values.dat index 8576166..5518ca6 100644 --- a/test/data/parse2/illegal-values.dat +++ b/test/data/parse2/illegal-values.dat @@ -4524,3 +4524,73 @@ max-height: 30%; min-height: 2em; } | * #reset +#data +* { -libcss-align: none 0; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: 0pt; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: -0pt; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: fixed inherit; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: left right; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: left, right; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: left | right; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: justified; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: center 50%; } +#errors +#expected +| * +#reset + +#data +* { -libcss-align: 50%; } +#errors +#expected +| * +#reset + diff --git a/test/data/select/tests1.dat b/test/data/select/tests1.dat index 163e611..35b5e61 100644 --- a/test/data/select/tests1.dat +++ b/test/data/select/tests1.dat @@ -303,6 +303,7 @@ white-space: normal width: auto word-spacing: normal z-index: auto +-libcss-align: default #reset #tree all @@ -388,6 +389,7 @@ white-space: normal width: auto word-spacing: normal z-index: auto +-libcss-align: default #reset #tree @@ -537,5 +539,6 @@ white-space: normal width: auto word-spacing: normal z-index: auto +-libcss-align: default #reset diff --git a/test/dump.h b/test/dump.h index da9e8fb..5352ce3 100644 --- a/test/dump.h +++ b/test/dump.h @@ -1952,6 +1952,13 @@ void dump_bytecode(css_style *style, char **ptr, uint32_t depth) } break; case CSS_PROP_TEXT_ALIGN: + case CSS_PROP_LIBCSS_ALIGN: + assert(LIBCSS_ALIGN_LEFT == TEXT_ALIGN_LEFT); + assert(LIBCSS_ALIGN_RIGHT == TEXT_ALIGN_RIGHT); + assert(LIBCSS_ALIGN_CENTER == + TEXT_ALIGN_CENTER); + assert(LIBCSS_ALIGN_JUSTIFY == + TEXT_ALIGN_JUSTIFY); switch (value) { case TEXT_ALIGN_LEFT: *ptr += sprintf(*ptr, "left"); diff --git a/test/dump_computed.h b/test/dump_computed.h index b3423d7..551830a 100644 --- a/test/dump_computed.h +++ b/test/dump_computed.h @@ -2247,5 +2247,31 @@ static void dump_computed_style(const css_computed_style *style, char *buf, } ptr += wrote; *len -= wrote; + + /* -libcss-align */ + val = css_computed_libcss_align(style); + switch (val) { + case CSS_LIBCSS_ALIGN_LEFT: + wrote = snprintf(ptr, *len, "-libcss-align: left\n"); + break; + case CSS_LIBCSS_ALIGN_RIGHT: + wrote = snprintf(ptr, *len, "-libcss-align: right\n"); + break; + case CSS_LIBCSS_ALIGN_CENTER: + wrote = snprintf(ptr, *len, "-libcss-align: center\n"); + break; + case CSS_LIBCSS_ALIGN_JUSTIFY: + wrote = snprintf(ptr, *len, "-libcss-align: justify\n"); + break; + case CSS_LIBCSS_ALIGN_DEFAULT: + wrote = snprintf(ptr, *len, "-libcss-align: default\n"); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + } |