summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-11-30 01:29:26 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-11-30 01:29:26 +0000
commit2cd8f03eb67438c8396b1d13b2a464308cc12195 (patch)
treef552ff3c4c8b0559a046615c8b262656eccc4c39 /src
parent23ec03c90f2fdc91dfad16e2de69e466d58f0a42 (diff)
downloadlibcss-2cd8f03eb67438c8396b1d13b2a464308cc12195.tar.gz
libcss-2cd8f03eb67438c8396b1d13b2a464308cc12195.tar.bz2
Beginnings of azimuth.
svn path=/trunk/libcss/; revision=5847
Diffstat (limited to 'src')
-rw-r--r--src/parse/properties.c72
-rw-r--r--src/parse/propstrings.h4
2 files changed, 70 insertions, 6 deletions
diff --git a/src/parse/properties.c b/src/parse/properties.c
index aceb720..b5b3025 100644
--- a/src/parse/properties.c
+++ b/src/parse/properties.c
@@ -452,11 +452,73 @@ css_error parse_azimuth(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style **result)
{
- /** \todo azimuth */
- UNUSED(c);
- UNUSED(vector);
- UNUSED(ctx);
- UNUSED(result);
+ css_error error;
+ const css_token *token;
+ uint8_t flags = 0;
+ uint16_t value = 0;
+ uint32_t opv;
+ fixed length = 0;
+ uint32_t unit = 0;
+ uint32_t required_size;
+
+ /* angle | [ IDENT(left-side, far-left, left, center-left, center,
+ * center-right, right, far-right, right-side) ||
+ * IDENT(behind)
+ * ]
+ * | IDENT(leftwards, rightwards, inherit)
+ */
+ token = parserutils_vector_peek(vector, *ctx);
+ if (token == NULL)
+ return CSS_INVALID;
+
+ if (token->type == CSS_TOKEN_IDENT &&
+ token->lower.data == c->strings[INHERIT]) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_INHERIT;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ token->lower.data == c->strings[LEFTWARDS]) {
+ parserutils_vector_iterate(vector, ctx);
+ value = AZIMUTH_LEFTWARDS;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ token->lower.data == c->strings[RIGHTWARDS]) {
+ parserutils_vector_iterate(vector, ctx);
+ value = AZIMUTH_RIGHTWARDS;
+ } else if (token->type == CSS_TOKEN_IDENT) {
+ /** \todo the rest. behind on its own isn't defined afaics */
+ } else {
+ error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ if (error != CSS_OK)
+ return error;
+
+ if ((unit & UNIT_ANGLE) == false)
+ return CSS_INVALID;
+
+ value = AZIMUTH_ANGLE;
+ }
+
+ error = parse_important(c, vector, ctx, &flags);
+ if (error != CSS_OK)
+ return error;
+
+ opv = buildOPV(OP_AZIMUTH, flags, value);
+
+ required_size = sizeof(opv);
+ if ((flags & FLAG_INHERIT) == false && value == AZIMUTH_ANGLE)
+ required_size += sizeof(length) + sizeof(unit);
+
+ /* Allocate result */
+ error = css_stylesheet_style_create(c->sheet, required_size, result);
+ if (error != CSS_OK)
+ return error;
+
+ /* Copy the bytecode to it */
+ memcpy((*result)->bytecode, &opv, sizeof(opv));
+ if ((flags & FLAG_INHERIT) == false && value == AZIMUTH_ANGLE) {
+ memcpy(((uint8_t *) (*result)->bytecode) + sizeof(opv),
+ &length, sizeof(length));
+ memcpy(((uint8_t *) (*result)->bytecode) + sizeof(opv) +
+ sizeof(length), &unit, sizeof(unit));
+ }
return CSS_OK;
}
diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h
index 4050840..24858c0 100644
--- a/src/parse/propstrings.h
+++ b/src/parse/propstrings.h
@@ -59,7 +59,7 @@ enum {
SLOW, FAST, X_FAST, FASTER, SLOWER, CENTER, JUSTIFY, CAPITALIZE,
UPPERCASE, LOWERCASE, EMBED, BIDI_OVERRIDE, BASELINE, SUB, SUPER,
TEXT_TOP, MIDDLE, TEXT_BOTTOM, SILENT, X_SOFT, SOFT, LOUD, X_LOUD,
- PRE, NOWRAP, PRE_WRAP, PRE_LINE,
+ PRE, NOWRAP, PRE_WRAP, PRE_LINE, LEFTWARDS, RIGHTWARDS,
LAST_KNOWN
};
@@ -299,6 +299,8 @@ static struct {
{ "nowrap", SLEN("nowrap") },
{ "pre-wrap", SLEN("pre-wrap") },
{ "pre-line", SLEN("pre-line") },
+ { "leftwards", SLEN("leftwards") },
+ { "rightwards", SLEN("rightwards") },
};
#endif