summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-08-21 09:45:13 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-08-21 09:45:13 +0000
commit5c20bde8b544d23fd024dad7ace9b46849336ebf (patch)
tree07dc508d51d281b7553e471a42ba3684018fe512
parent5bd907c74151d0bbe1859c37cb2bde898ab72e2f (diff)
downloadlibcss-5c20bde8b544d23fd024dad7ace9b46849336ebf.tar.gz
libcss-5c20bde8b544d23fd024dad7ace9b46849336ebf.tar.bz2
-libcss-align
svn path=/trunk/libcss/; revision=9378
-rw-r--r--docs/Bytecode10
-rw-r--r--include/libcss/computed.h24
-rw-r--r--include/libcss/properties.h13
-rw-r--r--src/bytecode/opcodes.h7
-rw-r--r--src/parse/properties/properties.c1
-rw-r--r--src/parse/properties/properties.h3
-rw-r--r--src/parse/properties/text.c78
-rw-r--r--src/parse/propstrings.c1
-rw-r--r--src/parse/propstrings.h4
-rw-r--r--src/select/dispatch.c8
-rw-r--r--src/select/properties.c56
-rw-r--r--src/select/properties.h8
-rw-r--r--src/select/propget.h17
-rw-r--r--src/select/propset.h18
-rw-r--r--test/data/parse/properties.dat37
-rw-r--r--test/data/parse2/illegal-values.dat70
-rw-r--r--test/data/select/tests1.dat3
-rw-r--r--test/dump.h7
-rw-r--r--test/dump_computed.h26
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;
+
}