summaryrefslogtreecommitdiff
path: root/src
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 /src
parent5bd907c74151d0bbe1859c37cb2bde898ab72e2f (diff)
downloadlibcss-5c20bde8b544d23fd024dad7ace9b46849336ebf.tar.gz
libcss-5c20bde8b544d23fd024dad7ace9b46849336ebf.tar.bz2
-libcss-align
svn path=/trunk/libcss/; revision=9378
Diffstat (limited to 'src')
-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
11 files changed, 199 insertions, 2 deletions
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