libcss: branch tlsa/calc updated. release/0.9.1-8-g52e9c6c
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libcss.git/shortlog/52e9c6c2dbe62caabd71e1...
...commit http://git.netsurf-browser.org/libcss.git/commit/52e9c6c2dbe62caabd71e1a1...
...tree http://git.netsurf-browser.org/libcss.git/tree/52e9c6c2dbe62caabd71e1a104...
The branch, tlsa/calc has been updated
discards 384495b311e287affacd59238b2159fdd8cfff6b (commit)
discards 709b6c7b5db034edb9b7d2f3b989916180dbf1e1 (commit)
discards e3583052459e8cb7ecabaa25784ce85c5ab7421d (commit)
discards 62dc80851eef3e256ef522dd68346672f30b7375 (commit)
via 52e9c6c2dbe62caabd71e1a10406587fe08b29a3 (commit)
via 91cdc4e7bc41b782ea23d25a18e990a3c22c09fb (commit)
via a3d9f32b67d403b698658a277b3dd9dd2e865d4f (commit)
via d2092a264cad8342d05e05ed519e49218a5855a1 (commit)
via e2b4077eed0ad778847cd7b17406e8bf8b61a4ae (commit)
via d7c1541ac2d21577e58f2839879e71a2cebed229 (commit)
via 0b84fa9cc67593667002d7e7953d90400a66ac09 (commit)
via 1c1cf39d306428fe91260842082dfc9a66a6a236 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (384495b311e287affacd59238b2159fdd8cfff6b)
\
N -- N -- N (52e9c6c2dbe62caabd71e1a10406587fe08b29a3)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=52e9c6c2dbe62caabd71...
commit 52e9c6c2dbe62caabd71e1a10406587fe08b29a3
Author: Daniel Silverstone <dsilvers(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
parse: Tests and fixes for calc() parser.
Co-authored-by: Michael Drake <michael.drake(a)netsurf-browser.org>
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index c48f6f8..d96390d 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -24,12 +24,13 @@ enum flag {
};
enum calc_opcodes {
- CALC_PUSH_VALUE = 'V',
- CALC_ADD = '+',
- CALC_SUBTRACT = '-',
- CALC_MULTIPLY = '*',
- CALC_DIVIDE = '/',
- CALC_FINISH = '=',
+ CALC_PUSH_NUMBER = 'N',
+ CALC_PUSH_VALUE = 'V',
+ CALC_ADD = '+',
+ CALC_SUBTRACT = '-',
+ CALC_MULTIPLY = '*',
+ CALC_DIVIDE = '/',
+ CALC_FINISH = '=',
};
typedef enum unit {
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index a0fc786..ddb488f 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1365,6 +1365,31 @@ css__parse_calc_sum(css_language *c,
css_style *result);
static css_error
+css__parse_calc_number(
+ const parserutils_vector *vector, int *ctx,
+ css_style *result)
+{
+ const css_token *token;
+ css_fixed num;
+ size_t consumed;
+
+ /* Consume the number token */
+ token = parserutils_vector_iterate(vector, ctx);
+ if (token == NULL || token->type != CSS_TOKEN_NUMBER) {
+ return CSS_INVALID;
+ }
+
+ num = css__number_from_string((const uint8_t *)lwc_string_data(token->idata),
+ lwc_string_length(token->idata), false, &consumed);
+
+ if (consumed != lwc_string_length(token->idata)) {
+ return CSS_INVALID;
+ }
+
+ return css__stylesheet_style_vappend(result, 2, (css_code_t) CALC_PUSH_NUMBER, (css_code_t)num);
+}
+
+static css_error
css__parse_calc_value(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style *result)
@@ -1377,6 +1402,7 @@ css__parse_calc_value(css_language *c,
token = parserutils_vector_peek(vector, *ctx);
if (tokenIsChar(token, '(')) {
parserutils_vector_iterate(vector, ctx);
+ consumeWhitespace(vector, ctx);
error = css__parse_calc_sum(c, vector, ctx, result);
if (error != CSS_OK) {
return error;
@@ -1389,7 +1415,12 @@ css__parse_calc_value(css_language *c,
/* Consume the close-paren to complete this value */
parserutils_vector_iterate(vector, ctx);
} else switch (token->type) {
- case CSS_TOKEN_NUMBER: /* Fall through */
+ case CSS_TOKEN_NUMBER:
+ error = css__parse_calc_number(vector, ctx, result);
+ if (error != CSS_OK) {
+ return error;
+ }
+ break;
case CSS_TOKEN_DIMENSION: /* Fall through */
case CSS_TOKEN_PERCENTAGE:
{
@@ -1412,11 +1443,7 @@ css__parse_calc_value(css_language *c,
break;
}
- token = parserutils_vector_peek(vector, *ctx);
- while (token->type == CSS_TOKEN_S) {
- parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
- }
+ consumeWhitespace(vector, ctx);
return error;
}
@@ -1462,14 +1489,15 @@ css__parse_calc_product(css_language *c,
}
/* Consume that * or / now */
parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
- while (token->type == CSS_TOKEN_S) {
- parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
+ consumeWhitespace(vector, ctx);
+
+ if (multiplication) {
+ /* parse another value */
+ error = css__parse_calc_value(c, vector, ctx, result);
+ } else {
+ error = css__parse_calc_number(vector, ctx, result);
}
- /* parse another value */
- error = css__parse_calc_value(c, vector, ctx, result);
if (error != CSS_OK)
break;
@@ -1516,12 +1544,7 @@ css__parse_calc_sum(css_language *c,
}
/* Consume that + or - now */
parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
-
- while (token->type == CSS_TOKEN_S) {
- parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
- }
+ consumeWhitespace(vector, ctx);
/* parse another product */
error = css__parse_calc_product(c, vector, ctx, result);
@@ -1547,17 +1570,14 @@ css_error css__parse_calc(css_language *c,
css_error error = CSS_OK;
css_style *calc_style = NULL;
+ consumeWhitespace(vector, ctx);
+
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL) {
*ctx = orig_ctx;
return CSS_INVALID;
}
- while (token->type == CSS_TOKEN_S) {
- parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
- }
-
error = css__stylesheet_style_create(c->sheet, &calc_style);
if (error != CSS_OK)
goto cleanup;
@@ -1574,11 +1594,8 @@ css_error css__parse_calc(css_language *c,
if (error != CSS_OK)
goto cleanup;
+ consumeWhitespace(vector, ctx);
token = parserutils_vector_peek(vector, *ctx);
- while (token->type == CSS_TOKEN_S) {
- parserutils_vector_iterate(vector, ctx);
- token = parserutils_vector_peek(vector, *ctx);
- }
if (!tokenIsChar(token, ')')) {
/* If we don't get a close-paren, give up now */
error = CSS_INVALID;
diff --git a/test/data/parse2/calc.dat b/test/data/parse2/calc.dat
index 95abf6c..e9d176d 100644
--- a/test/data/parse2/calc.dat
+++ b/test/data/parse2/calc.dat
@@ -4,4 +4,154 @@
#expected
| *
| height: /* -> 0px */ calc(50vh 10px + =)
-#reset
\ No newline at end of file
+#reset
+
+#data
+* { line-height: calc(50vh + 10px)}
+#errors
+#expected
+| *
+| line-height: /* -> 0any */ calc(50vh 10px + =)
+#reset
+
+#data
+* { line-height: calc( / 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { line-height: calc( + 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { line-height: calc(2 / 2px)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(50vh + 10px)}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(50vh 10px + =)
+#reset
+
+#data
+* { z-index: calc(2 * 3)}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(2 3 * =)
+#reset
+
+#data
+* { z-index: calc(50vh + 10px / 9)}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(50vh 10px 9 / + =)
+#reset
+
+#data
+* { z-index: calc(1 + 2 + 3 + 4)}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(1 2 + 3 + 4 + =)
+#reset
+
+#data
+* { z-index: calc(1 + 2 * 3 + 4)}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(1 2 3 * + 4 + =)
+#reset
+
+#data
+* { z-index: calc((1 + 2) * (3 + 4))}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(1 2 + 3 4 + * =)
+#reset
+
+#data
+* { z-index: calc(1 + 2}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc (1 + 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(1)}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(1 =)
+#reset
+
+#data
+* { z-index: calc()}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc((1 + 2)}
+#errors
+#expected
+| *
+#reset
+
+#data
+* { z-index: calc(((1 + 2)))}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(1 2 + =)
+#reset
+
+#data
+* { z-index: calc( ( ( 1 + 2 ) ) )}
+#errors
+#expected
+| *
+| z-index: /* -> 0number */ calc(1 2 + =)
+#reset
+
+#data
+* { z-index: calc( ( 3 / ( 1 + 2 ) ) )}
+#errors
+#expected
+| *
+#reset
diff --git a/test/dump.h b/test/dump.h
index 7ad84d9..71d2801 100644
--- a/test/dump.h
+++ b/test/dump.h
@@ -834,6 +834,13 @@ void dump_bytecode(css_style *style, char **ptr, uint32_t depth)
dump_unit(num, unit, ptr);
*ptr += sprintf(*ptr, " ");
break;
+ case CALC_PUSH_NUMBER: {
+ css_fixed num = *((css_fixed *)bytecode);
+ ADVANCE(sizeof(num));
+ dump_number(num, ptr);
+ *ptr += sprintf(*ptr, " ");
+ break;
+ }
}
default:
*ptr += sprintf(*ptr, "??%d ", calc_opcode);
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=91cdc4e7bc41b782ea23...
commit 91cdc4e7bc41b782ea23d25a18e990a3c22c09fb
Author: Daniel Silverstone <dsilvers(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
parse: calc() test and fixup.
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index c356f90..c48f6f8 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -23,6 +23,14 @@ enum flag {
FLAG_INHERIT = (1<<1)
};
+enum calc_opcodes {
+ CALC_PUSH_VALUE = 'V',
+ CALC_ADD = '+',
+ CALC_SUBTRACT = '-',
+ CALC_MULTIPLY = '*',
+ CALC_DIVIDE = '/',
+ CALC_FINISH = '=',
+};
typedef enum unit {
UNIT_LENGTH = (1u << 8),
@@ -110,6 +118,12 @@ static inline bool isInherit(css_code_t OPV)
return getFlags(OPV) & 0x2;
}
+static inline bool isCalc(css_code_t OPV)
+{
+ /* Note, this relies on all _CALC values being the same ultimately */
+ return getValue(OPV) == 0x7f;
+}
+
#endif
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index 1cdb27f..08f3f12 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -310,7 +310,7 @@ void output_calc(FILE *outputf, struct keyval *parseid, struct keyval_list *kvli
kind = ckv->key;
fprintf(outputf,
- "if ((token->type == CSS_TOKEN_IDENT) && "
+ "if ((token->type == CSS_TOKEN_FUNCTION) && "
"(lwc_string_caseless_isequal(token->idata, c->strings[CALC], &match) == lwc_error_ok && match))"
" {\n"
"\t\terror = css__parse_calc(c, vector, ctx, result, buildOPV(%s, 0, %s), %s);\n"
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index 11b7f72..a0fc786 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1373,8 +1373,10 @@ css__parse_calc_value(css_language *c,
int orig_ctx = *ctx;
const css_token *token;
- token = parserutils_vector_iterate(vector, ctx);
+ /* On entry, we are already pointing at the value to parse, so peek it */
+ token = parserutils_vector_peek(vector, *ctx);
if (tokenIsChar(token, '(')) {
+ parserutils_vector_iterate(vector, ctx);
error = css__parse_calc_sum(c, vector, ctx, result);
if (error != CSS_OK) {
return error;
@@ -1384,7 +1386,8 @@ css__parse_calc_value(css_language *c,
if (!tokenIsChar(token, ')')) {
return CSS_INVALID;
}
-
+ /* Consume the close-paren to complete this value */
+ parserutils_vector_iterate(vector, ctx);
} else switch (token->type) {
case CSS_TOKEN_NUMBER: /* Fall through */
case CSS_TOKEN_DIMENSION: /* Fall through */
@@ -1400,7 +1403,7 @@ css__parse_calc_value(css_language *c,
return error;
}
- error = css__stylesheet_style_vappend(result, 3, (css_code_t) 'V', length, unit);
+ error = css__stylesheet_style_vappend(result, 3, (css_code_t) CALC_PUSH_VALUE, length, unit);
}
break;
@@ -1409,6 +1412,11 @@ css__parse_calc_value(css_language *c,
break;
}
+ token = parserutils_vector_peek(vector, *ctx);
+ while (token->type == CSS_TOKEN_S) {
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+ }
return error;
}
@@ -1439,7 +1447,10 @@ css__parse_calc_product(css_language *c,
if (token == NULL) {
error = CSS_INVALID;
break;
- } else if (tokenIsChar(token, ')'))
+ } else if (
+ tokenIsChar(token, ')') ||
+ tokenIsChar(token, '+') ||
+ tokenIsChar(token, '-'))
break;
else if (tokenIsChar(token, '*'))
multiplication = true;
@@ -1450,15 +1461,21 @@ css__parse_calc_product(css_language *c,
break;
}
/* Consume that * or / now */
- token = parserutils_vector_iterate(vector, ctx);
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+ while (token->type == CSS_TOKEN_S) {
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+ }
/* parse another value */
error = css__parse_calc_value(c, vector, ctx, result);
if (error != CSS_OK)
break;
/* emit the multiplication/division operator */
- error = css__stylesheet_style_append(result, (css_code_t) (multiplication ? '*' : '/'));
+ error = css__stylesheet_style_append(result,
+ (css_code_t) (multiplication ? CALC_MULTIPLY : CALC_DIVIDE));
} while (1);
/* We've fallen off, either we had an error or we're left with ')' */
return error;
@@ -1498,7 +1515,13 @@ css__parse_calc_sum(css_language *c,
break;
}
/* Consume that + or - now */
- token = parserutils_vector_iterate(vector, ctx);
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+
+ while (token->type == CSS_TOKEN_S) {
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+ }
/* parse another product */
error = css__parse_calc_product(c, vector, ctx, result);
@@ -1506,7 +1529,7 @@ css__parse_calc_sum(css_language *c,
break;
/* emit the addition/subtraction operator */
- error = css__stylesheet_style_append(result, (css_code_t) (addition ? '+' : '-'));
+ error = css__stylesheet_style_append(result, (css_code_t) (addition ? CALC_ADD : CALC_SUBTRACT));
} while (1);
/* We've fallen off, either we had an error or we're left with ')' */
return error;
@@ -1524,16 +1547,15 @@ css_error css__parse_calc(css_language *c,
css_error error = CSS_OK;
css_style *calc_style = NULL;
- token = parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
if (token == NULL) {
*ctx = orig_ctx;
return CSS_INVALID;
}
- if (!tokenIsChar(token, '(')) {
- /* If we don't get an open-paren, give up now */
- *ctx = orig_ctx;
- return CSS_INVALID;
+ while (token->type == CSS_TOKEN_S) {
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
}
error = css__stylesheet_style_create(c->sheet, &calc_style);
@@ -1545,27 +1567,33 @@ css_error css__parse_calc(css_language *c,
goto cleanup;
error = css__stylesheet_style_append(calc_style, (css_code_t) unit);
+ if (error != CSS_OK)
+ goto cleanup;
error = css__parse_calc_sum(c, vector, ctx, calc_style);
if (error != CSS_OK)
goto cleanup;
- token = parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+ while (token->type == CSS_TOKEN_S) {
+ parserutils_vector_iterate(vector, ctx);
+ token = parserutils_vector_peek(vector, *ctx);
+ }
if (!tokenIsChar(token, ')')) {
/* If we don't get a close-paren, give up now */
error = CSS_INVALID;
goto cleanup;
}
+ /* Swallow that close paren */
+ parserutils_vector_iterate(vector, ctx);
+
/* Append the indicator that the calc is finished */
- error = css__stylesheet_style_append(calc_style, (css_code_t) '=');
+ error = css__stylesheet_style_append(calc_style, (css_code_t) CALC_FINISH);
if (error != CSS_OK)
goto cleanup;
- /* TODO: Once we're OK to do so, merge the style */
- (void)result;
- /* error = css__stylesheet_style_merge_style(result, calc_style); */
-
+ error = css__stylesheet_merge_style(result, calc_style);
cleanup:
css__stylesheet_style_destroy(calc_style);
if (error != CSS_OK) {
diff --git a/test/data/parse2/INDEX b/test/data/parse2/INDEX
index 331cf5c..bb2a79b 100644
--- a/test/data/parse2/INDEX
+++ b/test/data/parse2/INDEX
@@ -23,3 +23,4 @@ multicol.dat Multi-column layout property tests
flexbox.dat Flexbox properties and shorthands tests
units.dat Length unit tests
dodgy-media-block.dat Media block with incomplete ruleset
+calc.dat calc() tests
diff --git a/test/data/parse2/calc.dat b/test/data/parse2/calc.dat
new file mode 100644
index 0000000..95abf6c
--- /dev/null
+++ b/test/data/parse2/calc.dat
@@ -0,0 +1,7 @@
+#data
+* { height: calc(50vh + 10px)}
+#errors
+#expected
+| *
+| height: /* -> 0px */ calc(50vh 10px + =)
+#reset
\ No newline at end of file
diff --git a/test/dump.h b/test/dump.h
index d67bb2a..7ad84d9 100644
--- a/test/dump.h
+++ b/test/dump.h
@@ -647,6 +647,12 @@ static void dump_unit(css_fixed val, uint32_t unit, char **ptr)
case UNIT_KHZ:
*ptr += sprintf(*ptr, "kHz");
break;
+ case UNIT_CALC_ANY:
+ *ptr += sprintf(*ptr, "any");
+ break;
+ case UNIT_CALC_NUMBER:
+ *ptr += sprintf(*ptr, "number");
+ break;
}
}
@@ -797,6 +803,45 @@ void dump_bytecode(css_style *style, char **ptr, uint32_t depth)
if (isInherit(opv)) {
*ptr += sprintf(*ptr, "inherit");
+ } else if (isCalc(opv)) {
+ /* First entry is a unit */
+ uint32_t unit = *((uint32_t *)bytecode);
+ ADVANCE(sizeof(unit));
+ *ptr += sprintf(*ptr, "/* -> ");
+ dump_unit(0, unit, ptr);
+ *ptr += sprintf(*ptr, " */ calc(");
+ css_code_t calc_opcode;
+ while ((calc_opcode = *((css_code_t *)bytecode)) != CALC_FINISH) {
+ ADVANCE(sizeof(calc_opcode));
+ switch (calc_opcode) {
+ case CALC_ADD:
+ *ptr += sprintf(*ptr, "+ ");
+ break;
+ case CALC_SUBTRACT:
+ *ptr += sprintf(*ptr, "- ");
+ break;
+ case CALC_MULTIPLY:
+ *ptr += sprintf(*ptr, "* ");
+ break;
+ case CALC_DIVIDE:
+ *ptr += sprintf(*ptr, "/ ");
+ break;
+ case CALC_PUSH_VALUE: {
+ css_fixed num = *((css_fixed *)bytecode);
+ ADVANCE(sizeof(num));
+ uint32_t unit = *((uint32_t *)bytecode);
+ ADVANCE(sizeof(unit));
+ dump_unit(num, unit, ptr);
+ *ptr += sprintf(*ptr, " ");
+ break;
+ }
+ default:
+ *ptr += sprintf(*ptr, "??%d ", calc_opcode);
+ break;
+ }
+ }
+ ADVANCE(sizeof(calc_opcode));
+ *ptr += sprintf(*ptr, "=)");
} else {
value = getValue(opv);
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=a3d9f32b67d403b69865...
commit a3d9f32b67d403b698658a277b3dd9dd2e865d4f
Author: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
parse: Update parser generator to support calc() details.
Co-authored-by: Daniel Silverstone <dsilvers(a)netsurf-browser.org>
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 7518281..c356f90 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -68,6 +68,10 @@ typedef enum unit {
UNIT_DPI = (1 << 13) + 0,
UNIT_DPCM = (1 << 13) + 1,
UNIT_DPPX = (1 << 13) + 2,
+
+ /* These are special only to the CALC bytecodes */
+ UNIT_CALC_ANY = (1 << 20),
+ UNIT_CALC_NUMBER = (1 << 20) + 1,
} unit;
typedef uint32_t colour;
diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h
index 82bf75f..d728831 100644
--- a/src/bytecode/opcodes.h
+++ b/src/bytecode/opcodes.h
@@ -119,6 +119,7 @@ enum op_border_style {
};
enum op_border_width {
+ BORDER_WIDTH_CALC = 0x007f,
BORDER_WIDTH_SET = 0x0080,
BORDER_WIDTH_THIN = 0x0000,
BORDER_WIDTH_MEDIUM = 0x0001,
@@ -126,6 +127,7 @@ enum op_border_width {
};
enum op_bottom {
+ BOTTOM_CALC = 0x007f,
BOTTOM_SET = 0x0080,
BOTTOM_AUTO = 0x0000
};
@@ -198,6 +200,7 @@ enum op_color {
enum op_column_count {
COLUMN_COUNT_AUTO = 0x0000,
+ COLUMN_COUNT_CALC = 0x007f,
COLUMN_COUNT_SET = 0x0080
};
@@ -208,6 +211,7 @@ enum op_column_fill {
enum op_column_gap {
COLUMN_GAP_NORMAL = 0x0000,
+ COLUMN_GAP_CALC = 0x007f,
COLUMN_GAP_SET = 0x0080
};
@@ -231,6 +235,7 @@ enum op_column_rule_style {
};
enum op_column_rule_width {
+ COLUMN_RULE_WIDTH_CALC = BORDER_WIDTH_CALC,
COLUMN_RULE_WIDTH_SET = BORDER_WIDTH_SET,
COLUMN_RULE_WIDTH_THIN = BORDER_WIDTH_THIN,
COLUMN_RULE_WIDTH_MEDIUM = BORDER_WIDTH_MEDIUM,
@@ -244,6 +249,7 @@ enum op_column_span {
enum op_column_width {
COLUMN_WIDTH_AUTO = 0x0000,
+ COLUMN_WIDTH_CALC = 0x007f,
COLUMN_WIDTH_SET = 0x0080
};
@@ -352,6 +358,7 @@ enum op_empty_cells {
enum op_flex_basis {
FLEX_BASIS_AUTO = 0x0000,
FLEX_BASIS_CONTENT = 0x0001,
+ FLEX_BASIS_CALC = 0x007f,
FLEX_BASIS_SET = 0x0080
};
@@ -363,10 +370,12 @@ enum op_flex_direction {
};
enum op_flex_grow {
+ FLEX_GROW_CALC = 0x007f,
FLEX_GROW_SET = 0x0080
};
enum op_flex_shrink {
+ FLEX_SHRINK_CALC = 0x007f,
FLEX_SHRINK_SET = 0x0080
};
@@ -396,6 +405,7 @@ enum op_font_family {
};
enum op_font_size {
+ FONT_SIZE_CALC = 0x007f,
FONT_SIZE_DIMENSION = 0x0080,
FONT_SIZE_XX_SMALL = 0x0000,
@@ -437,6 +447,7 @@ enum op_font_weight {
};
enum op_height {
+ HEIGHT_CALC = 0x007f,
HEIGHT_SET = 0x0080,
HEIGHT_AUTO = 0x0000
};
@@ -451,16 +462,19 @@ enum op_justify_content {
};
enum op_left {
+ LEFT_CALC = BOTTOM_CALC,
LEFT_SET = BOTTOM_SET,
LEFT_AUTO = BOTTOM_AUTO
};
enum op_letter_spacing {
+ LETTER_SPACING_CALC = 0x007f,
LETTER_SPACING_SET = 0x0080,
LETTER_SPACING_NORMAL = 0x0000
};
enum op_line_height {
+ LINE_HEIGHT_CALC = 0x007f,
LINE_HEIGHT_NUMBER = 0x0080,
LINE_HEIGHT_DIMENSION = 0x0081,
LINE_HEIGHT_NORMAL = 0x0000
@@ -495,26 +509,31 @@ enum op_list_style_type {
};
enum op_margin {
+ MARGIN_CALC = 0x007f,
MARGIN_SET = 0x0080,
MARGIN_AUTO = 0x0000
};
enum op_max_height {
+ MAX_HEIGHT_CALC = 0x007f,
MAX_HEIGHT_SET = 0x0080,
MAX_HEIGHT_NONE = 0x0000
};
enum op_max_width {
+ MAX_WIDTH_CALC = 0x007f,
MAX_WIDTH_SET = 0x0080,
MAX_WIDTH_NONE = 0x0000
};
enum op_min_height {
+ MIN_HEIGHT_CALC = 0x007f,
MIN_HEIGHT_SET = 0x0080,
MIN_HEIGHT_AUTO = 0x0000
};
enum op_min_width {
+ MIN_WIDTH_CALC = 0x007f,
MIN_WIDTH_SET = 0x0080,
MIN_WIDTH_AUTO = 0x0000
};
@@ -524,10 +543,12 @@ enum op_opacity {
};
enum op_order {
+ ORDER_CALC = 0x007f,
ORDER_SET = 0x0080
};
enum op_orphans {
+ ORPHANS_CALC = 0x007f,
ORPHANS_SET = 0x0080
};
@@ -566,6 +587,7 @@ enum op_overflow {
};
enum op_padding {
+ PADDING_CALC = 0x007f,
PADDING_SET = 0x0080
};
@@ -591,18 +613,22 @@ enum op_page_break_inside {
};
enum op_pause_after {
+ PAUSE_AFTER_CALC = 0x007f,
PAUSE_AFTER_SET = 0x0080
};
enum op_pause_before {
+ PAUSE_BEFORE_CALC = 0x007f,
PAUSE_BEFORE_SET = 0x0080
};
enum op_pitch_range {
+ PITCH_RANGE_CALC = 0x007f,
PITCH_RANGE_SET = 0x0080
};
enum op_pitch {
+ PITCH_CALC = 0x007f,
PITCH_FREQUENCY = 0x0080,
PITCH_X_LOW = 0x0000,
@@ -636,6 +662,7 @@ enum op_quotes {
};
enum op_richness {
+ RICHNESS_CALC = 0x007f,
RICHNESS_SET = 0x0080
};
@@ -666,6 +693,7 @@ enum op_speak {
};
enum op_speech_rate {
+ SPEECH_RATE_CALC = 0x007f,
SPEECH_RATE_SET = 0x0080,
SPEECH_RATE_X_SLOW = 0x0000,
@@ -678,6 +706,7 @@ enum op_speech_rate {
};
enum op_stress {
+ STRESS_CALC = 0x007f,
STRESS_SET = 0x0080
};
@@ -706,6 +735,7 @@ enum op_text_decoration {
};
enum op_text_indent {
+ TEXT_INDENT_CALC = 0x007f,
TEXT_INDENT_SET = 0x0080
};
@@ -717,6 +747,7 @@ enum op_text_transform {
};
enum op_top {
+ TOP_CALC = BOTTOM_CALC,
TOP_SET = BOTTOM_SET,
TOP_AUTO = BOTTOM_AUTO
};
@@ -728,6 +759,7 @@ enum op_unicode_bidi {
};
enum op_vertical_align {
+ VERTICAL_ALIGN_CALC = 0x007f,
VERTICAL_ALIGN_SET = 0x0080,
VERTICAL_ALIGN_BASELINE = 0x0000,
@@ -758,6 +790,7 @@ enum op_voice_family {
};
enum op_volume {
+ VOLUME_CALC = 0x007f,
VOLUME_NUMBER = 0x0080,
VOLUME_DIMENSION = 0x0081,
@@ -778,16 +811,19 @@ enum op_white_space {
};
enum op_widows {
+ WIDOWS_CALC = 0x007f,
WIDOWS_SET = 0x0080
};
enum op_width {
+ WIDTH_CALC = 0x007f,
WIDTH_SET = 0x0080,
WIDTH_AUTO = 0x0000
};
enum op_word_spacing {
+ WORD_SPACING_CALC = 0x007f,
WORD_SPACING_SET = 0x0080,
WORD_SPACING_NORMAL = 0x0000
@@ -800,6 +836,7 @@ enum op_writing_mode {
};
enum op_z_index {
+ Z_INDEX_CALC = 0x007f,
Z_INDEX_SET = 0x0080,
Z_INDEX_AUTO = 0x0000
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index 3d88cef..1cdb27f 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -19,6 +19,12 @@
* list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE IDENT:)
*/
+typedef enum {
+ CALC_ANY,
+ CALC_NUMBER,
+ CALC_UNIT,
+} calc_kind;
+
struct keyval {
char *key;
char *val;
@@ -291,21 +297,34 @@ void output_color(FILE *outputf, struct keyval *parseid, struct keyval_list *kvl
parseid->val);
}
-void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_list *kvlist)
+void output_calc(FILE *outputf, struct keyval *parseid, struct keyval_list *kvlist)
{
struct keyval *ckv = kvlist->item[0];
- int ident_count;
+ const char *kind;
+
+ if (strcmp(ckv->key, "NUMBER") == 0)
+ kind = "UNIT_CALC_NUMBER";
+ else if (strcmp(ckv->key, "ANY") == 0)
+ kind = "UNIT_CALC_ANY";
+ else
+ kind = ckv->key;
fprintf(outputf,
"if ((token->type == CSS_TOKEN_IDENT) && "
"(lwc_string_caseless_isequal(token->idata, c->strings[CALC], &match) == lwc_error_ok && match))"
" {\n"
- "\t\terror = css__parse_calc(c, vector, ctx, result, buildOPV(%s, 0, %s /* _CALC */), %s);\n"
+ "\t\terror = css__parse_calc(c, vector, ctx, result, buildOPV(%s, 0, %s), %s);\n"
"\t} else ",
parseid->val,
ckv->val,
- ckv->key
+ kind
);
+}
+
+void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_list *kvlist)
+{
+ struct keyval *ckv = kvlist->item[0];
+ int ident_count;
fprintf(outputf,
"{\n"
@@ -501,6 +520,7 @@ int main(int argc, char **argv)
struct keyval_list WRAP;
struct keyval_list NUMBER;
struct keyval_list COLOR;
+ struct keyval_list CALC;
if (argc < 2) {
@@ -533,6 +553,7 @@ int main(int argc, char **argv)
COLOR.count = 0;
LENGTH_UNIT.count = 0;
IDENT_LIST.count = 0;
+ CALC.count = 0;
curlist = &base;
@@ -548,7 +569,7 @@ int main(int argc, char **argv)
if (strcmp(rkv->key, "WRAP") == 0) {
WRAP.item[WRAP.count++] = rkv;
only_ident = false;
- } else if (strcmp(rkv->key, "NUMBER") == 0) {
+ } else if (curlist == &base && strcmp(rkv->key, "NUMBER") == 0) {
if (rkv->val[0] == '(') {
curlist = &NUMBER;
} else if (rkv->val[0] == ')') {
@@ -579,6 +600,14 @@ int main(int argc, char **argv)
}
only_ident = false;
do_token_check = false;
+ } else if (strcmp(rkv->key, "CALC") == 0) {
+ if (rkv->val[0] == '(') {
+ curlist = &CALC;
+ } else if (rkv->val[0] == ')') {
+ curlist = &base;
+ }
+ only_ident = false;
+ do_token_check = false;
} else if (strcmp(rkv->key, "COLOR") == 0) {
COLOR.item[COLOR.count++] = rkv;
do_token_check = false;
@@ -602,7 +631,7 @@ int main(int argc, char **argv)
/* header */
-output_header(outputf, descriptor, base.item[0], is_generic);
+ output_header(outputf, descriptor, base.item[0], is_generic);
if (WRAP.count > 0) {
output_wrap(outputf, base.item[0], &WRAP);
@@ -616,6 +645,10 @@ output_header(outputf, descriptor, base.item[0], is_generic);
if (URI.count > 0)
output_uri(outputf, base.item[0], &URI);
+ if (CALC.count > 0) {
+ output_calc(outputf, base.item[0], &CALC);
+ }
+
if (NUMBER.count > 0)
output_number(outputf, base.item[0], &NUMBER);
diff --git a/src/parse/properties/properties.gen b/src/parse/properties/properties.gen
index e729285..9830ce4 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -6,6 +6,13 @@
#property:CSS_PROP_ENUM IDENT:( INHERIT: IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
#property:CSS_PROP_ENUM WRAP:
+# When a property takes a NUMBER and/or LENGTH_UNIT you may add calc() support:
+# In the below, PROPERTY_FOO_CALC is the opcode enum for the set-but-calculated value bytecode.
+# e.g. HEIGHT_SET (for a LENGTH_UNIT) would be HEIGHT_CALC here.
+# CALC:( UNIT_??:PROPERTY_FOO_CALC CALC:) <-- When a default unit must be considered
+# CALC:( NUMBER:PROPERTY_FOO_CALC CALC:) <-- When a number must be produced (not a dimension)
+# CALC:( ANY:PROPERTY_FOO_CALC CALC:) <-- When a number or dimension is valid (e.g. line-height)
+
background_repeat:CSS_PROP_BACKGROUND_REPEAT IDENT:( INHERIT: NO_REPEAT:0,BACKGROUND_REPEAT_NO_REPEAT REPEAT_X:0,BACKGROUND_REPEAT_REPEAT_X REPEAT_Y:0,BACKGROUND_REPEAT_REPEAT_Y REPEAT:0,BACKGROUND_REPEAT_REPEAT IDENT:)
border_collapse:CSS_PROP_BORDER_COLLAPSE IDENT:( INHERIT: COLLAPSE:0,BORDER_COLLAPSE_COLLAPSE SEPARATE:0,BORDER_COLLAPSE_SEPARATE IDENT:)
@@ -22,35 +29,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: SHOW:0,EMPTY_CELLS_SHOW HIDE:0
float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT NONE:0,FLOAT_NONE IDENT:)
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION MASK:UNIT_MASK_FONT_SIZE RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) CALC:( UNIT_PX:FONT_SIZE_CALC CALC:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION MASK:UNIT_MASK_FONT_SIZE RANGE:<0 LENGTH_UNIT:)
font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET MASK:UNIT_MASK_HEIGHT RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) CALC:( UNIT_PX:HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET MASK:UNIT_MASK_HEIGHT RANGE:<0 LENGTH_UNIT:)
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET MASK:UNIT_MASK_LETTER_SPACING LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:LETTER_SPACING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET MASK:UNIT_MASK_LETTER_SPACING LENGTH_UNIT:)
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION MASK:UNIT_MASK_LINE_HEIGHT RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) CALC:( ANY:LINE_HEIGHT_CALC CALC:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION MASK:UNIT_MASK_LINE_HEIGHT RANGE:<0 LENGTH_UNIT:)
border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET MASK:UNIT_MASK_MAX_HEIGHT RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) CALC:( UNIT_PX:MAX_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET MASK:UNIT_MASK_MAX_HEIGHT RANGE:<0 LENGTH_UNIT:)
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET MASK:UNIT_MASK_MAX_WIDTH RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) CALC:( UNIT_PX:MAX_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET MASK:UNIT_MASK_MAX_WIDTH RANGE:<0 LENGTH_UNIT:)
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET MASK:UNIT_MASK_MIN_HEIGHT RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) CALC:( UNIT_PX:MIN_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET MASK:UNIT_MASK_MIN_HEIGHT RANGE:<0 LENGTH_UNIT:)
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET MASK:UNIT_MASK_MIN_WIDTH RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) CALC:( UNIT_PX:MIN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET MASK:UNIT_MASK_MIN_WIDTH RANGE:<0 LENGTH_UNIT:)
color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
#generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET MASK:UNIT_MASK_PADDING_SIDE RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT CALC:( UNIT_PX:PADDING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:PADDING_SET MASK:UNIT_MASK_PADDING_SIDE RANGE:<0 LENGTH_UNIT:)
padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -59,7 +66,7 @@ padding_right:CSS_PROP_PADDING_RIGHT WRAP:css__parse_padding_side
#generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET MASK:UNIT_MASK_MARGIN_SIDE LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) CALC:( UNIT_PX:MARGIN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET MASK:UNIT_MASK_MARGIN_SIDE LENGTH_UNIT:)
margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -67,7 +74,7 @@ margin_left:CSS_PROP_MARGIN_LEFT WRAP:css__parse_margin_side
margin_right:CSS_PROP_MARGIN_RIGHT WRAP:css__parse_margin_side
#generic for {top, bottom, left, right}.c
-side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) CALC:( UNIT_PX:BOTTOM_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
top:CSS_PROP_TOP WRAP:css__parse_side
bottom:CSS_PROP_BOTTOM WRAP:css__parse_side
@@ -76,7 +83,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
#generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET MASK:UNIT_MASK_BORDER_SIDE_WIDTH RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) CALC:( UNIT_PX:BORDER_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET MASK:UNIT_MASK_BORDER_SIDE_WIDTH RANGE:<0 LENGTH_UNIT:)
border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH WRAP:css__parse_border_side_width
@@ -120,7 +127,7 @@ list_style_image:CSS_PROP_LIST_STYLE_IMAGE IDENT:( INHERIT: NONE:0,LIST_STYLE_IM
list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE IDENT:)
-orphans:CSS_PROP_ORPHANS IDENT:INHERIT NUMBER:( true:ORPHANS_SET RANGE:num<0 NUMBER:)
+orphans:CSS_PROP_ORPHANS IDENT:INHERIT CALC:( NUMBER:ORPHANS_CALC CALC:) NUMBER:( true:ORPHANS_SET RANGE:num<0 NUMBER:)
outline_color:CSS_PROP_OUTLINE_COLOR IDENT:( INHERIT: INVERT:0,OUTLINE_COLOR_INVERT IDENT:) COLOR:OUTLINE_COLOR_SET
@@ -140,17 +147,17 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_
page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET MASK:UNIT_MASK_PAUSE_AFTER RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT CALC:( UNIT_S:PAUSE_AFTER_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET MASK:UNIT_MASK_PAUSE_AFTER RANGE:<0 LENGTH_UNIT:)
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET MASK:UNIT_MASK_PAUSE_BEFORE RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT CALC:( UNIT_S:PAUSE_BEFORE_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET MASK:UNIT_MASK_PAUSE_BEFORE RANGE:<0 LENGTH_UNIT:)
-pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY MASK:UNIT_MASK_PITCH RANGE:<0 LENGTH_UNIT:)
+pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) CALC:( UNIT_HZ:PITCH_CALC CALC:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY MASK:UNIT_MASK_PITCH RANGE:<0 LENGTH_UNIT:)
-pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
+pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT CALC:( NUMBER:PITCH_RANGE_CALC CALC:) NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
position:CSS_PROP_POSITION IDENT:( INHERIT: LIBCSS_STATIC:0,POSITION_STATIC RELATIVE:0,POSITION_RELATIVE ABSOLUTE:0,POSITION_ABSOLUTE FIXED:0,POSITION_FIXED IDENT:)
-richness:CSS_PROP_RICHNESS IDENT:INHERIT NUMBER:( false:RICHNESS_SET RANGE:num<0||num>F_100 NUMBER:)
+richness:CSS_PROP_RICHNESS IDENT:INHERIT CALC:( NUMBER:RICHNESS_CALC CALC:) NUMBER:( false:RICHNESS_SET RANGE:num<0||num>F_100 NUMBER:)
speak:CSS_PROP_SPEAK IDENT:( INHERIT: NORMAL:0,SPEAK_NORMAL NONE:0,SPEAK_NONE SPELL_OUT:0,SPEAK_SPELL_OUT IDENT:)
@@ -160,37 +167,35 @@ speak_numeral:CSS_PROP_SPEAK_NUMERAL IDENT:( INHERIT: DIGITS:0,SPEAK_NUMERAL_DIG
speak_punctuation:CSS_PROP_SPEAK_PUNCTUATION IDENT:( INHERIT: CODE:0,SPEAK_PUNCTUATION_CODE NONE:0,SPEAK_PUNCTUATION_NONE IDENT:)
-speech_rate:CSS_PROP_SPEECH_RATE IDENT:( INHERIT: X_SLOW:0,SPEECH_RATE_X_SLOW SLOW:0,SPEECH_RATE_SLOW MEDIUM:0,SPEECH_RATE_MEDIUM FAST:0,SPEECH_RATE_FAST X_FAST:0,SPEECH_RATE_X_FAST FASTER:0,SPEECH_RATE_FASTER SLOWER:0,SPEECH_RATE_SLOWER IDENT:) NUMBER:( false:SPEECH_RATE_SET RANGE:num<0 NUMBER:)
+speech_rate:CSS_PROP_SPEECH_RATE IDENT:( INHERIT: X_SLOW:0,SPEECH_RATE_X_SLOW SLOW:0,SPEECH_RATE_SLOW MEDIUM:0,SPEECH_RATE_MEDIUM FAST:0,SPEECH_RATE_FAST X_FAST:0,SPEECH_RATE_X_FAST FASTER:0,SPEECH_RATE_FASTER SLOWER:0,SPEECH_RATE_SLOWER IDENT:) CALC:( NUMBER:SPEECH_RATE_CALC CALC:) NUMBER:( false:SPEECH_RATE_SET RANGE:num<0 NUMBER:)
-stress:CSS_PROP_STRESS IDENT:INHERIT NUMBER:( false:STRESS_SET RANGE:num<0||num>INTTOFIX(100) NUMBER:)
+stress:CSS_PROP_STRESS IDENT:INHERIT CALC:( NUMBER:STRESS_CALC CALC:) NUMBER:( false:STRESS_SET RANGE:num<0||num>INTTOFIX(100) NUMBER:)
table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO FIXED:0,TABLE_LAYOUT_FIXED IDENT:)
text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT IDENT:)
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET MASK:UNIT_MASK_TEXT_INDENT LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT CALC:( UNIT_PX:TEXT_INDENT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET MASK:UNIT_MASK_TEXT_INDENT LENGTH_UNIT:)
text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET MASK:UNIT_MASK_VERTICAL_ALIGN LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) CALC:( UNIT_PX:VERTICAL_ALIGN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET MASK:UNIT_MASK_VERTICAL_ALIGN LENGTH_UNIT:)
visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
-volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION MASK:UNIT_MASK_VOLUME RANGE:<0 LENGTH_UNIT:)
+volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) CALC:( ANY:VOLUME_CALC CALC:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION MASK:UNIT_MASK_VOLUME RANGE:<0 LENGTH_UNIT:)
white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL PRE:0,WHITE_SPACE_PRE NOWRAP:0,WHITE_SPACE_NOWRAP PRE_WRAP:0,WHITE_SPACE_PRE_WRAP PRE_LINE:0,WHITE_SPACE_PRE_LINE IDENT:)
-widows:CSS_PROP_WIDOWS IDENT:INHERIT NUMBER:( true:WIDOWS_SET RANGE:num<0 NUMBER:)
-
-
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET MASK:UNIT_MASK_WIDTH RANGE:<0 LENGTH_UNIT:)
+widows:CSS_PROP_WIDOWS IDENT:INHERIT CALC:( NUMBER:WIDOWS_CALC CALC:) NUMBER:( true:WIDOWS_SET RANGE:num<0 NUMBER:)
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET MASK:UNIT_MASK_WORD_SPACING LENGTH_UNIT:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) CALC:( UNIT_PX:WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET MASK:UNIT_MASK_WIDTH RANGE:<0 LENGTH_UNIT:)
-z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( true:Z_INDEX_SET NUMBER:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:WORD_SPACING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET MASK:UNIT_MASK_WORD_SPACING LENGTH_UNIT:)
+z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) CALC:( NUMBER:Z_INDEX_CALC CALC:) NUMBER:( true:Z_INDEX_SET NUMBER:)
break_after:CSS_PROP_BREAK_AFTER IDENT:( INHERIT: AUTO:0,BREAK_AFTER_AUTO ALWAYS:0,BREAK_AFTER_ALWAYS AVOID:0,BREAK_AFTER_AVOID LEFT:0,BREAK_AFTER_LEFT RIGHT:0,BREAK_AFTER_RIGHT PAGE:0,BREAK_AFTER_PAGE COLUMN:0,BREAK_AFTER_COLUMN AVOID_PAGE:0,BREAK_AFTER_AVOID_PAGE AVOID_COLUMN:0,BREAK_AFTER_AVOID_COLUMN IDENT:)
@@ -198,11 +203,11 @@ break_before:CSS_PROP_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,BREAK_BEFORE_AUTO ALW
break_inside:CSS_PROP_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,BREAK_INSIDE_AUTO AVOID:0,BREAK_INSIDE_AVOID AVOID_PAGE:0,BREAK_INSIDE_AVOID_PAGE AVOID_COLUMN:0,BREAK_INSIDE_AVOID_COLUMN IDENT:)
-column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO IDENT:) NUMBER:( true:COLUMN_COUNT_SET RANGE:num<0 NUMBER:)
+column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO IDENT: CALC:( NUMBER:COLUMN_COUNT_CALC CALC:)) NUMBER:( true:COLUMN_COUNT_SET RANGE:num<0 NUMBER:)
column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 MASK:UNIT_MASK_COLUMN_GAP LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) CALC:( UNIT_PX:COLUMN_GAP_CALC CALC:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 MASK:UNIT_MASK_COLUMN_GAP LENGTH_UNIT:)
column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) COLOR:COLUMN_RULE_COLOR_SET
@@ -212,7 +217,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH WRAP:css__parse_border_side_width
column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE ALL:0,COLUMN_SPAN_ALL IDENT:)
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET MASK:UNIT_MASK_COLUMN_WIDTH LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) CALC:( UNIT_PX:COLUMN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET MASK:UNIT_MASK_COLUMN_WIDTH LENGTH_UNIT:)
writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR IDENT:)
@@ -224,16 +229,16 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: STRETCH:0,ALIGN_ITEMS_STRETCH
align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE AUTO:0,ALIGN_SELF_AUTO IDENT:)
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET MASK:UNIT_MASK_FLEX_BASIS RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) CALC:( UNIT_PX:FLEX_BASIS_CALC CALC:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET MASK:UNIT_MASK_FLEX_BASIS RANGE:<0 LENGTH_UNIT:)
flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE IDENT:)
-flex_grow:CSS_PROP_FLEX_GROW IDENT:INHERIT NUMBER:( false:FLEX_GROW_SET RANGE:num<0 NUMBER:)
+flex_grow:CSS_PROP_FLEX_GROW IDENT:INHERIT CALC:( NUMBER:FLEX_GROW_CALC CALC:) NUMBER:( false:FLEX_GROW_SET RANGE:num<0 NUMBER:)
-flex_shrink:CSS_PROP_FLEX_SHRINK IDENT:INHERIT NUMBER:( false:FLEX_SHRINK_SET RANGE:num<0 NUMBER:)
+flex_shrink:CSS_PROP_FLEX_SHRINK IDENT:INHERIT CALC:( NUMBER:FLEX_SHRINK_CALC CALC:) NUMBER:( false:FLEX_SHRINK_SET RANGE:num<0 NUMBER:)
flex_wrap:CSS_PROP_FLEX_WRAP IDENT:( INHERIT: NOWRAP:0,FLEX_WRAP_NOWRAP WRAP_STRING:0,FLEX_WRAP_WRAP WRAP_REVERSE:0,FLEX_WRAP_WRAP_REVERSE IDENT:)
justify_content:CSS_PROP_JUSTIFY_CONTENT IDENT:( INHERIT: FLEX_START:0,JUSTIFY_CONTENT_FLEX_START FLEX_END:0,JUSTIFY_CONTENT_FLEX_END CENTER:0,JUSTIFY_CONTENT_CENTER SPACE_BETWEEN:0,JUSTIFY_CONTENT_SPACE_BETWEEN SPACE_AROUND:0,JUSTIFY_CONTENT_SPACE_AROUND SPACE_EVENLY:0,JUSTIFY_CONTENT_SPACE_EVENLY IDENT:)
-order:CSS_PROP_ORDER IDENT:INHERIT NUMBER:( true:ORDER_SET NUMBER:)
+order:CSS_PROP_ORDER IDENT:INHERIT CALC:( NUMBER:ORDER_CALC CALC:) NUMBER:( true:ORDER_SET NUMBER:)
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index b1864cb..11b7f72 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1351,9 +1351,9 @@ cleanup:
*
*
* calc(10px + (4rem / 2)) =>
- * U 10 px
- * U 4 rem
- * N 2
+ * V 10 px
+ * V 4 rem
+ * V 2 NUMBER
* /
* +
* =
@@ -1362,14 +1362,12 @@ cleanup:
static css_error
css__parse_calc_sum(css_language *c,
const parserutils_vector *vector, int *ctx,
- css_style *result,
- uint32_t unit);
+ css_style *result);
static css_error
css__parse_calc_value(css_language *c,
const parserutils_vector *vector, int *ctx,
- css_style *result,
- uint32_t default_unit)
+ css_style *result)
{
css_error error;
int orig_ctx = *ctx;
@@ -1377,7 +1375,7 @@ css__parse_calc_value(css_language *c,
token = parserutils_vector_iterate(vector, ctx);
if (tokenIsChar(token, '(')) {
- error = css__parse_calc_sum(c, vector, ctx, result, default_unit);
+ error = css__parse_calc_sum(c, vector, ctx, result);
if (error != CSS_OK) {
return error;
}
@@ -1396,13 +1394,13 @@ css__parse_calc_value(css_language *c,
uint32_t unit = 0;
*ctx = orig_ctx;
- error = css__parse_unit_specifier(c, vector, ctx, default_unit, &length, &unit);
+ error = css__parse_unit_specifier(c, vector, ctx, UNIT_CALC_NUMBER, &length, &unit);
if (error != CSS_OK) {
*ctx = orig_ctx;
return error;
}
- error = css__stylesheet_style_vappend(result, 3, (css_code_t) 'U', length, unit);
+ error = css__stylesheet_style_vappend(result, 3, (css_code_t) 'V', length, unit);
}
break;
@@ -1422,8 +1420,7 @@ css__parse_calc_value(css_language *c,
static css_error
css__parse_calc_product(css_language *c,
const parserutils_vector *vector, int *ctx,
- css_style *result,
- uint32_t unit)
+ css_style *result)
{
css_error error = CSS_OK;
const css_token *token;
@@ -1431,7 +1428,7 @@ css__parse_calc_product(css_language *c,
/* First parse a value */
- error = css__parse_calc_value(c, vector, ctx, result, unit);
+ error = css__parse_calc_value(c, vector, ctx, result);
if (error != CSS_OK) {
return error;
}
@@ -1455,33 +1452,10 @@ css__parse_calc_product(css_language *c,
/* Consume that * or / now */
token = parserutils_vector_iterate(vector, ctx);
- if (multiplication) {
- /* parse another value */
- error = css__parse_calc_value(c, vector, ctx, result, unit);
- if (error != CSS_OK)
- break;
- } else {
- css_fixed num;
- size_t consumed;
-
- token = parserutils_vector_iterate(vector, ctx);
- if (token->type != CSS_TOKEN_NUMBER) {
- error = CSS_INVALID;
- break;
- }
- num = css__number_from_lwc_string(token->idata, false, &consumed);
- if (consumed != lwc_string_length(token->idata)) {
- error = CSS_INVALID;
- break;
- }
-
- error = css__stylesheet_style_append(result, (css_code_t) 'N');
- if (error != CSS_OK)
- break;
- error = css__stylesheet_style_append(result, (css_code_t) num);
- if (error != CSS_OK)
- break;
- }
+ /* parse another value */
+ error = css__parse_calc_value(c, vector, ctx, result);
+ if (error != CSS_OK)
+ break;
/* emit the multiplication/division operator */
error = css__stylesheet_style_append(result, (css_code_t) (multiplication ? '*' : '/'));
@@ -1494,8 +1468,7 @@ css__parse_calc_product(css_language *c,
css_error
css__parse_calc_sum(css_language *c,
const parserutils_vector *vector, int *ctx,
- css_style *result,
- uint32_t unit)
+ css_style *result)
{
css_error error = CSS_OK;
const css_token *token;
@@ -1503,7 +1476,7 @@ css__parse_calc_sum(css_language *c,
/* First parse a product */
- error = css__parse_calc_product(c, vector, ctx, result, unit);
+ error = css__parse_calc_product(c, vector, ctx, result);
if (error != CSS_OK) {
return error;
}
@@ -1528,7 +1501,7 @@ css__parse_calc_sum(css_language *c,
token = parserutils_vector_iterate(vector, ctx);
/* parse another product */
- error = css__parse_calc_product(c, vector, ctx, result, unit);
+ error = css__parse_calc_product(c, vector, ctx, result);
if (error != CSS_OK)
break;
@@ -1570,8 +1543,10 @@ css_error css__parse_calc(css_language *c,
error = css__stylesheet_style_append(calc_style, property);
if (error != CSS_OK)
goto cleanup;
+
+ error = css__stylesheet_style_append(calc_style, (css_code_t) unit);
- error = css__parse_calc_sum(c, vector, ctx, calc_style, unit);
+ error = css__parse_calc_sum(c, vector, ctx, calc_style);
if (error != CSS_OK)
goto cleanup;
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=d2092a264cad8342d05e...
commit d2092a264cad8342d05e05ed519e49218a5855a1
Author: Daniel Silverstone <dsilvers(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
parse: Add calc() parser.
Co-authored-by: Michael Drake <michael.drake(a)netsurf-browser.org>
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index 24cc536..3d88cef 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -296,6 +296,16 @@ void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_lis
struct keyval *ckv = kvlist->item[0];
int ident_count;
+ fprintf(outputf,
+ "if ((token->type == CSS_TOKEN_IDENT) && "
+ "(lwc_string_caseless_isequal(token->idata, c->strings[CALC], &match) == lwc_error_ok && match))"
+ " {\n"
+ "\t\terror = css__parse_calc(c, vector, ctx, result, buildOPV(%s, 0, %s /* _CALC */), %s);\n"
+ "\t} else ",
+ parseid->val,
+ ckv->val,
+ ckv->key
+ );
fprintf(outputf,
"{\n"
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index 0e49853..b1864cb 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -1334,3 +1334,268 @@ cleanup:
return error;
}
+/******************************************************************************/
+
+/* CALC
+ *
+ * calc( <calc-sum> )
+ *
+ * where
+ * <calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]*
+ *
+ * where
+ * <calc-product> = <calc-value> [ '*' <calc-value> | '/' <number> ]*
+ *
+ * where
+ * <calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )
+ *
+ *
+ * calc(10px + (4rem / 2)) =>
+ * U 10 px
+ * U 4 rem
+ * N 2
+ * /
+ * +
+ * =
+ */
+
+static css_error
+css__parse_calc_sum(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result,
+ uint32_t unit);
+
+static css_error
+css__parse_calc_value(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result,
+ uint32_t default_unit)
+{
+ css_error error;
+ int orig_ctx = *ctx;
+ const css_token *token;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if (tokenIsChar(token, '(')) {
+ error = css__parse_calc_sum(c, vector, ctx, result, default_unit);
+ if (error != CSS_OK) {
+ return error;
+ }
+
+ token = parserutils_vector_peek(vector, *ctx);
+ if (!tokenIsChar(token, ')')) {
+ return CSS_INVALID;
+ }
+
+ } else switch (token->type) {
+ case CSS_TOKEN_NUMBER: /* Fall through */
+ case CSS_TOKEN_DIMENSION: /* Fall through */
+ case CSS_TOKEN_PERCENTAGE:
+ {
+ css_fixed length = 0;
+ uint32_t unit = 0;
+ *ctx = orig_ctx;
+
+ error = css__parse_unit_specifier(c, vector, ctx, default_unit, &length, &unit);
+ if (error != CSS_OK) {
+ *ctx = orig_ctx;
+ return error;
+ }
+
+ error = css__stylesheet_style_vappend(result, 3, (css_code_t) 'U', length, unit);
+ }
+ break;
+
+ default:
+ error = CSS_INVALID;
+ break;
+ }
+
+ return error;
+}
+
+/* Both this, and css_parse_calc_sum must stop when it encounters a close-paren.
+ * If it hasn't had any useful tokens before that, it's an error. It does not
+ * need to restore ctx before returning an error but it does need to ensure that
+ * the close paren has not been consumed
+ */
+static css_error
+css__parse_calc_product(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result,
+ uint32_t unit)
+{
+ css_error error = CSS_OK;
+ const css_token *token;
+ bool multiplication;
+
+
+ /* First parse a value */
+ error = css__parse_calc_value(c, vector, ctx, result, unit);
+ if (error != CSS_OK) {
+ return error;
+ }
+
+ do {
+ /* What is our next token? */
+ token = parserutils_vector_peek(vector, *ctx);
+ if (token == NULL) {
+ error = CSS_INVALID;
+ break;
+ } else if (tokenIsChar(token, ')'))
+ break;
+ else if (tokenIsChar(token, '*'))
+ multiplication = true;
+ else if (tokenIsChar(token, '/'))
+ multiplication = false;
+ else {
+ error = CSS_INVALID;
+ break;
+ }
+ /* Consume that * or / now */
+ token = parserutils_vector_iterate(vector, ctx);
+
+ if (multiplication) {
+ /* parse another value */
+ error = css__parse_calc_value(c, vector, ctx, result, unit);
+ if (error != CSS_OK)
+ break;
+ } else {
+ css_fixed num;
+ size_t consumed;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if (token->type != CSS_TOKEN_NUMBER) {
+ error = CSS_INVALID;
+ break;
+ }
+ num = css__number_from_lwc_string(token->idata, false, &consumed);
+ if (consumed != lwc_string_length(token->idata)) {
+ error = CSS_INVALID;
+ break;
+ }
+
+ error = css__stylesheet_style_append(result, (css_code_t) 'N');
+ if (error != CSS_OK)
+ break;
+ error = css__stylesheet_style_append(result, (css_code_t) num);
+ if (error != CSS_OK)
+ break;
+ }
+
+ /* emit the multiplication/division operator */
+ error = css__stylesheet_style_append(result, (css_code_t) (multiplication ? '*' : '/'));
+ } while (1);
+ /* We've fallen off, either we had an error or we're left with ')' */
+ return error;
+}
+
+
+css_error
+css__parse_calc_sum(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result,
+ uint32_t unit)
+{
+ css_error error = CSS_OK;
+ const css_token *token;
+ bool addition;
+
+
+ /* First parse a product */
+ error = css__parse_calc_product(c, vector, ctx, result, unit);
+ if (error != CSS_OK) {
+ return error;
+ }
+
+ do {
+ /* What is our next token? */
+ token = parserutils_vector_peek(vector, *ctx);
+ if (token == NULL) {
+ error = CSS_INVALID;
+ break;
+ } else if (tokenIsChar(token, ')'))
+ break;
+ else if (tokenIsChar(token, '+'))
+ addition = true;
+ else if (tokenIsChar(token, '-'))
+ addition = false;
+ else {
+ error = CSS_INVALID;
+ break;
+ }
+ /* Consume that + or - now */
+ token = parserutils_vector_iterate(vector, ctx);
+
+ /* parse another product */
+ error = css__parse_calc_product(c, vector, ctx, result, unit);
+ if (error != CSS_OK)
+ break;
+
+ /* emit the addition/subtraction operator */
+ error = css__stylesheet_style_append(result, (css_code_t) (addition ? '+' : '-'));
+ } while (1);
+ /* We've fallen off, either we had an error or we're left with ')' */
+ return error;
+}
+
+/* Documented in utils.h */
+css_error css__parse_calc(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result,
+ css_code_t property,
+ uint32_t unit)
+{
+ int orig_ctx = *ctx;
+ const css_token *token;
+ css_error error = CSS_OK;
+ css_style *calc_style = NULL;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if (token == NULL) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ if (!tokenIsChar(token, '(')) {
+ /* If we don't get an open-paren, give up now */
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ error = css__stylesheet_style_create(c->sheet, &calc_style);
+ if (error != CSS_OK)
+ goto cleanup;
+
+ error = css__stylesheet_style_append(calc_style, property);
+ if (error != CSS_OK)
+ goto cleanup;
+
+ error = css__parse_calc_sum(c, vector, ctx, calc_style, unit);
+ if (error != CSS_OK)
+ goto cleanup;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if (!tokenIsChar(token, ')')) {
+ /* If we don't get a close-paren, give up now */
+ error = CSS_INVALID;
+ goto cleanup;
+ }
+
+ /* Append the indicator that the calc is finished */
+ error = css__stylesheet_style_append(calc_style, (css_code_t) '=');
+ if (error != CSS_OK)
+ goto cleanup;
+
+ /* TODO: Once we're OK to do so, merge the style */
+ (void)result;
+ /* error = css__stylesheet_style_merge_style(result, calc_style); */
+
+cleanup:
+ css__stylesheet_style_destroy(calc_style);
+ if (error != CSS_OK) {
+ *ctx = orig_ctx;
+ }
+
+ return error;
+}
\ No newline at end of file
diff --git a/src/parse/properties/utils.h b/src/parse/properties/utils.h
index e4c97c7..e5331d2 100644
--- a/src/parse/properties/utils.h
+++ b/src/parse/properties/utils.h
@@ -199,4 +199,28 @@ css_error css__comma_list_to_style(css_language *c,
bool first),
css_style *result);
+/**
+ * Parse a CSS calc() invocation
+ *
+ * Calc can generate a number of kinds of units, so we have to tell the
+ * parser the kind of unit we're aiming for (e.g. UNIT_PX, UNIT_ANGLE, etc.)
+ *
+ * \param[in] c Parsing context
+ * \param[in] vector Vector of tokens to process
+ * \param[in] ctx Pointer to vector iteration context
+ * \param[in] result Pointer to location to receive resulting style
+ * \param[in] property The CSS property we are calculating for
+ * \param[in] unit The kind of unit which we want to come out of this calc()
+ * \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 css__parse_calc(css_language *c,
+ const parserutils_vector *vector, int *ctx,
+ css_style *result,
+ css_code_t property,
+ uint32_t unit);
#endif
diff --git a/src/parse/propstrings.c b/src/parse/propstrings.c
index 3c9401b..0156ea4 100644
--- a/src/parse/propstrings.c
+++ b/src/parse/propstrings.c
@@ -443,6 +443,7 @@ const stringmap_entry stringmap[LAST_KNOWN] = {
{ "or", SLEN("or") },
{ "only", SLEN("only") },
{ "infinite", SLEN("infinite") },
+ { "calc", SLEN("calc") },
{ "aliceblue", SLEN("aliceblue") },
{ "antiquewhite", SLEN("antiquewhite") },
diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h
index 24b681b..c5dd113 100644
--- a/src/parse/propstrings.h
+++ b/src/parse/propstrings.h
@@ -101,7 +101,7 @@ enum {
AVOID_PAGE, AVOID_COLUMN, BALANCE, HORIZONTAL_TB, VERTICAL_RL,
VERTICAL_LR, CONTENT_BOX, BORDER_BOX, STRETCH, INLINE_FLEX, FLEX_START,
FLEX_END, SPACE_BETWEEN, SPACE_AROUND, SPACE_EVENLY, ROW, ROW_REVERSE,
- COLUMN_REVERSE, WRAP_STRING, WRAP_REVERSE, AND, OR, ONLY, INFINITE,
+ COLUMN_REVERSE, WRAP_STRING, WRAP_REVERSE, AND, OR, ONLY, INFINITE, CALC,
/* Named colours */
FIRST_COLOUR,
-----------------------------------------------------------------------
Summary of changes:
docs/Bytecode | 12 +-
src/bytecode/bytecode.h | 85 +++++-----
src/parse/properties/css_property_parser_gen.c | 7 +
src/parse/properties/properties.c | 128 +++++++++++++++
src/parse/properties/properties.gen | 48 +++---
src/parse/properties/properties.h | 113 +++++++++++++
src/select/computed.c | 2 +-
test/data/parse/properties.dat | 200 ++++++++++++------------
8 files changed, 421 insertions(+), 174 deletions(-)
diff --git a/docs/Bytecode b/docs/Bytecode
index dd0f424..880ccbd 100644
--- a/docs/Bytecode
+++ b/docs/Bytecode
@@ -33,7 +33,7 @@ The table is found in the stylesheet object.
CSS dimensions are stored as two 32bit values: <length, units>.
Length is a 32bit numeric value (as described above) and unit is as follows:
- bit 8 clear => length unit
+ bit 8 set => length unit
bits 9-31: MBZ
bits 0-7 :
00000000 => px
@@ -58,11 +58,11 @@ Length is a 32bit numeric value (as described above) and unit is as follows:
00010011 => vmax
00010100 => q
- bit 8 set => percentage unit
+ bit 9 set => percentage unit
bits 9-31: MBZ
bits 0-7 : MBZ
- bit 9 set => angle unit
+ bit 10 set => angle unit
bits 10-31: MBZ
bit 8 : MBZ
bits 0-7 :
@@ -71,21 +71,21 @@ Length is a 32bit numeric value (as described above) and unit is as follows:
00000010 => rad
00000011 => turn
- bit 10 set => time unit
+ bit 11 set => time unit
bits 11-31: MBZ
bits 8-9 : MBZ
bits 0-7 :
00000000 => ms
00000001 => s
- bit 11 set => frequency unit
+ bit 12 set => frequency unit
bits 12-31: MBZ
bits 8-10 : MBZ
bits 0-7 :
00000000 => Hz
00000001 => kHz
- bit 12 set => resolution unit
+ bit 13 set => resolution unit
bits 13-31: MBZ
bits 8-11 : MBZ
bits 0-7 :
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 2dff97c..d96390d 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -34,48 +34,49 @@ enum calc_opcodes {
};
typedef enum unit {
- UNIT_PX = 0,
- UNIT_EX = 1,
- UNIT_EM = 2,
- UNIT_IN = 3,
- UNIT_CM = 4,
- UNIT_MM = 5,
- UNIT_PT = 6,
- UNIT_PC = 7,
- UNIT_CAP = 8,
- UNIT_CH = 9,
- UNIT_IC = 10,
- UNIT_REM = 11,
- UNIT_LH = 12,
- UNIT_RLH = 13,
- UNIT_VH = 14,
- UNIT_VW = 15,
- UNIT_VI = 16,
- UNIT_VB = 17,
- UNIT_VMIN = 18,
- UNIT_VMAX = 19,
- UNIT_Q = 20,
-
- UNIT_PCT = (1 << 8),
-
- UNIT_ANGLE = (1 << 9),
- UNIT_DEG = (1 << 9) + 0,
- UNIT_GRAD = (1 << 9) + 1,
- UNIT_RAD = (1 << 9) + 2,
- UNIT_TURN = (1 << 9) + 3,
-
- UNIT_TIME = (1 << 10),
- UNIT_MS = (1 << 10) + 0,
- UNIT_S = (1 << 10) + 1,
-
- UNIT_FREQ = (1 << 11),
- UNIT_HZ = (1 << 11) + 0,
- UNIT_KHZ = (1 << 11) + 1,
-
- UNIT_RESOLUTION = (1 << 12),
- UNIT_DPI = (1 << 12) + 0,
- UNIT_DPCM = (1 << 12) + 1,
- UNIT_DPPX = (1 << 12) + 2,
+ UNIT_LENGTH = (1u << 8),
+ UNIT_PX = (1u << 8) + 0,
+ UNIT_EX = (1u << 8) + 1,
+ UNIT_EM = (1u << 8) + 2,
+ UNIT_IN = (1u << 8) + 3,
+ UNIT_CM = (1u << 8) + 4,
+ UNIT_MM = (1u << 8) + 5,
+ UNIT_PT = (1u << 8) + 6,
+ UNIT_PC = (1u << 8) + 7,
+ UNIT_CAP = (1u << 8) + 8,
+ UNIT_CH = (1u << 8) + 9,
+ UNIT_IC = (1u << 8) + 10,
+ UNIT_REM = (1u << 8) + 11,
+ UNIT_LH = (1u << 8) + 12,
+ UNIT_RLH = (1u << 8) + 13,
+ UNIT_VH = (1u << 8) + 14,
+ UNIT_VW = (1u << 8) + 15,
+ UNIT_VI = (1u << 8) + 16,
+ UNIT_VB = (1u << 8) + 17,
+ UNIT_VMIN = (1u << 8) + 18,
+ UNIT_VMAX = (1u << 8) + 19,
+ UNIT_Q = (1u << 8) + 20,
+
+ UNIT_PCT = (1 << 9),
+
+ UNIT_ANGLE = (1 << 10),
+ UNIT_DEG = (1 << 10) + 0,
+ UNIT_GRAD = (1 << 10) + 1,
+ UNIT_RAD = (1 << 10) + 2,
+ UNIT_TURN = (1 << 10) + 3,
+
+ UNIT_TIME = (1 << 11),
+ UNIT_MS = (1 << 11) + 0,
+ UNIT_S = (1 << 11) + 1,
+
+ UNIT_FREQ = (1 << 12),
+ UNIT_HZ = (1 << 12) + 0,
+ UNIT_KHZ = (1 << 12) + 1,
+
+ UNIT_RESOLUTION = (1 << 13),
+ UNIT_DPI = (1 << 13) + 0,
+ UNIT_DPCM = (1 << 13) + 1,
+ UNIT_DPPX = (1 << 13) + 2,
/* These are special only to the CALC bytecodes */
UNIT_CALC_ANY = (1 << 20),
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index e68ad55..08f3f12 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -355,6 +355,13 @@ void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_lis
"\t\t\treturn CSS_INVALID;\n"
"\t\t}\n\n",
ulkv->val);
+ } else if (strcmp(ulkv->key, "MASK") == 0) {
+ fprintf(outputf,
+ "\t\tif ((unit & %s ) == 0) {\n"
+ "\t\t\t*ctx = orig_ctx;\n"
+ "\t\t\treturn CSS_INVALID;\n"
+ "\t\t}\n\n",
+ ulkv->val);
} else if (strcmp(ulkv->key, "RANGE") == 0) {
fprintf(outputf,
"\t\tif (length %s) {\n"
diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c
index 3f374fa..06524da 100644
--- a/src/parse/properties/properties.c
+++ b/src/parse/properties/properties.c
@@ -158,3 +158,131 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
css__parse_writing_mode,
css__parse_z_index
};
+
+/** Mapping from property bytecode index to bytecode unit class mask. */
+const uint32_t property_unit_mask[CSS_N_PROPERTIES] = {
+ [CSS_PROP_AZIMUTH] = UNIT_MASK_AZIMUTH,
+ [CSS_PROP_BACKGROUND_ATTACHMENT] = UNIT_MASK_BACKGROUND_ATTACHMENT,
+ [CSS_PROP_BACKGROUND_COLOR] = UNIT_MASK_BACKGROUND_COLOR,
+ [CSS_PROP_BACKGROUND_IMAGE] = UNIT_MASK_BACKGROUND_IMAGE,
+ [CSS_PROP_BACKGROUND_POSITION] = UNIT_MASK_BACKGROUND_POSITION,
+ [CSS_PROP_BACKGROUND_REPEAT] = UNIT_MASK_BACKGROUND_REPEAT,
+ [CSS_PROP_BORDER_COLLAPSE] = UNIT_MASK_BORDER_COLLAPSE,
+ [CSS_PROP_BORDER_SPACING] = UNIT_MASK_BORDER_SPACING,
+ [CSS_PROP_BORDER_TOP_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_RIGHT_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_BOTTOM_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_LEFT_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_TOP_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_RIGHT_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_BOTTOM_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_LEFT_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_TOP_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_RIGHT_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_BOTTOM_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_LEFT_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BOTTOM] = UNIT_MASK_BOTTOM,
+ [CSS_PROP_CAPTION_SIDE] = UNIT_MASK_CAPTION_SIDE,
+ [CSS_PROP_CLEAR] = UNIT_MASK_CLEAR,
+ [CSS_PROP_CLIP] = UNIT_MASK_CLIP,
+ [CSS_PROP_COLOR] = UNIT_MASK_COLOR,
+ [CSS_PROP_CONTENT] = UNIT_MASK_CONTENT,
+ [CSS_PROP_COUNTER_INCREMENT] = UNIT_MASK_COUNTER_INCREMENT,
+ [CSS_PROP_COUNTER_RESET] = UNIT_MASK_COUNTER_RESET,
+ [CSS_PROP_CUE_AFTER] = UNIT_MASK_CUE_AFTER,
+ [CSS_PROP_CUE_BEFORE] = UNIT_MASK_CUE_BEFORE,
+ [CSS_PROP_CURSOR] = UNIT_MASK_CURSOR,
+ [CSS_PROP_DIRECTION] = UNIT_MASK_DIRECTION,
+ [CSS_PROP_DISPLAY] = UNIT_MASK_DISPLAY,
+ [CSS_PROP_ELEVATION] = UNIT_MASK_ELEVATION,
+ [CSS_PROP_EMPTY_CELLS] = UNIT_MASK_EMPTY_CELLS,
+ [CSS_PROP_FLOAT] = UNIT_MASK_FLOAT,
+ [CSS_PROP_FONT_FAMILY] = UNIT_MASK_FONT_FAMILY,
+ [CSS_PROP_FONT_SIZE] = UNIT_MASK_FONT_SIZE,
+ [CSS_PROP_FONT_STYLE] = UNIT_MASK_FONT_STYLE,
+ [CSS_PROP_FONT_VARIANT] = UNIT_MASK_FONT_VARIANT,
+ [CSS_PROP_FONT_WEIGHT] = UNIT_MASK_FONT_WEIGHT,
+ [CSS_PROP_HEIGHT] = UNIT_MASK_HEIGHT,
+ [CSS_PROP_LEFT] = UNIT_MASK_LEFT,
+ [CSS_PROP_LETTER_SPACING] = UNIT_MASK_LETTER_SPACING,
+ [CSS_PROP_LINE_HEIGHT] = UNIT_MASK_LINE_HEIGHT,
+ [CSS_PROP_LIST_STYLE_IMAGE] = UNIT_MASK_LIST_STYLE_IMAGE,
+ [CSS_PROP_LIST_STYLE_POSITION] = UNIT_MASK_LIST_STYLE_POSITION,
+ [CSS_PROP_LIST_STYLE_TYPE] = UNIT_MASK_LIST_STYLE_TYPE,
+ [CSS_PROP_MARGIN_TOP] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_RIGHT] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_BOTTOM] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_LEFT] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MAX_HEIGHT] = UNIT_MASK_MAX_HEIGHT,
+ [CSS_PROP_MAX_WIDTH] = UNIT_MASK_MAX_WIDTH,
+ [CSS_PROP_MIN_HEIGHT] = UNIT_MASK_MIN_HEIGHT,
+ [CSS_PROP_MIN_WIDTH] = UNIT_MASK_MIN_WIDTH,
+ [CSS_PROP_ORPHANS] = UNIT_MASK_ORPHANS,
+ [CSS_PROP_OUTLINE_COLOR] = UNIT_MASK_OUTLINE_COLOR,
+ [CSS_PROP_OUTLINE_STYLE] = UNIT_MASK_OUTLINE_STYLE,
+ [CSS_PROP_OUTLINE_WIDTH] = UNIT_MASK_OUTLINE_WIDTH,
+ [CSS_PROP_OVERFLOW_X] = UNIT_MASK_OVERFLOW_X,
+ [CSS_PROP_PADDING_TOP] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_RIGHT] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_BOTTOM] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_LEFT] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PAGE_BREAK_AFTER] = UNIT_MASK_PAGE_BREAK_AFTER,
+ [CSS_PROP_PAGE_BREAK_BEFORE] = UNIT_MASK_PAGE_BREAK_BEFORE,
+ [CSS_PROP_PAGE_BREAK_INSIDE] = UNIT_MASK_PAGE_BREAK_INSIDE,
+ [CSS_PROP_PAUSE_AFTER] = UNIT_MASK_PAUSE_AFTER,
+ [CSS_PROP_PAUSE_BEFORE] = UNIT_MASK_PAUSE_BEFORE,
+ [CSS_PROP_PITCH_RANGE] = UNIT_MASK_PITCH_RANGE,
+ [CSS_PROP_PITCH] = UNIT_MASK_PITCH,
+ [CSS_PROP_PLAY_DURING] = UNIT_MASK_PLAY_DURING,
+ [CSS_PROP_POSITION] = UNIT_MASK_POSITION,
+ [CSS_PROP_QUOTES] = UNIT_MASK_QUOTES,
+ [CSS_PROP_RICHNESS] = UNIT_MASK_RICHNESS,
+ [CSS_PROP_RIGHT] = UNIT_MASK_RIGHT,
+ [CSS_PROP_SPEAK_HEADER] = UNIT_MASK_SPEAK_HEADER,
+ [CSS_PROP_SPEAK_NUMERAL] = UNIT_MASK_SPEAK_NUMERAL,
+ [CSS_PROP_SPEAK_PUNCTUATION] = UNIT_MASK_SPEAK_PUNCTUATION,
+ [CSS_PROP_SPEAK] = UNIT_MASK_SPEAK,
+ [CSS_PROP_SPEECH_RATE] = UNIT_MASK_SPEECH_RATE,
+ [CSS_PROP_STRESS] = UNIT_MASK_STRESS,
+ [CSS_PROP_TABLE_LAYOUT] = UNIT_MASK_TABLE_LAYOUT,
+ [CSS_PROP_TEXT_ALIGN] = UNIT_MASK_TEXT_ALIGN,
+ [CSS_PROP_TEXT_DECORATION] = UNIT_MASK_TEXT_DECORATION,
+ [CSS_PROP_TEXT_INDENT] = UNIT_MASK_TEXT_INDENT,
+ [CSS_PROP_TEXT_TRANSFORM] = UNIT_MASK_TEXT_TRANSFORM,
+ [CSS_PROP_TOP] = UNIT_MASK_TOP,
+ [CSS_PROP_UNICODE_BIDI] = UNIT_MASK_UNICODE_BIDI,
+ [CSS_PROP_VERTICAL_ALIGN] = UNIT_MASK_VERTICAL_ALIGN,
+ [CSS_PROP_VISIBILITY] = UNIT_MASK_VISIBILITY,
+ [CSS_PROP_VOICE_FAMILY] = UNIT_MASK_VOICE_FAMILY,
+ [CSS_PROP_VOLUME] = UNIT_MASK_VOLUME,
+ [CSS_PROP_WHITE_SPACE] = UNIT_MASK_WHITE_SPACE,
+ [CSS_PROP_WIDOWS] = UNIT_MASK_WIDOWS,
+ [CSS_PROP_WIDTH] = UNIT_MASK_WIDTH,
+ [CSS_PROP_WORD_SPACING] = UNIT_MASK_WORD_SPACING,
+ [CSS_PROP_Z_INDEX] = UNIT_MASK_Z_INDEX,
+ [CSS_PROP_OPACITY] = UNIT_MASK_OPACITY,
+ [CSS_PROP_BREAK_AFTER] = UNIT_MASK_BREAK_AFTER,
+ [CSS_PROP_BREAK_BEFORE] = UNIT_MASK_BREAK_BEFORE,
+ [CSS_PROP_BREAK_INSIDE] = UNIT_MASK_BREAK_INSIDE,
+ [CSS_PROP_COLUMN_COUNT] = UNIT_MASK_COLUMN_COUNT,
+ [CSS_PROP_COLUMN_FILL] = UNIT_MASK_COLUMN_FILL,
+ [CSS_PROP_COLUMN_GAP] = UNIT_MASK_COLUMN_GAP,
+ [CSS_PROP_COLUMN_RULE_COLOR] = UNIT_MASK_COLUMN_RULE_COLOR,
+ [CSS_PROP_COLUMN_RULE_STYLE] = UNIT_MASK_COLUMN_RULE_STYLE,
+ [CSS_PROP_COLUMN_RULE_WIDTH] = UNIT_MASK_COLUMN_RULE_WIDTH,
+ [CSS_PROP_COLUMN_SPAN] = UNIT_MASK_COLUMN_SPAN,
+ [CSS_PROP_COLUMN_WIDTH] = UNIT_MASK_COLUMN_WIDTH,
+ [CSS_PROP_WRITING_MODE] = UNIT_MASK_WRITING_MODE,
+ [CSS_PROP_OVERFLOW_Y] = UNIT_MASK_OVERFLOW_Y,
+ [CSS_PROP_BOX_SIZING] = UNIT_MASK_BOX_SIZING,
+ [CSS_PROP_ALIGN_CONTENT] = UNIT_MASK_ALIGN_CONTENT,
+ [CSS_PROP_ALIGN_ITEMS] = UNIT_MASK_ALIGN_ITEMS,
+ [CSS_PROP_ALIGN_SELF] = UNIT_MASK_ALIGN_SELF,
+ [CSS_PROP_FLEX_BASIS] = UNIT_MASK_FLEX_BASIS,
+ [CSS_PROP_FLEX_DIRECTION] = UNIT_MASK_FLEX_DIRECTION,
+ [CSS_PROP_FLEX_GROW] = UNIT_MASK_FLEX_GROW,
+ [CSS_PROP_FLEX_SHRINK] = UNIT_MASK_FLEX_SHRINK,
+ [CSS_PROP_FLEX_WRAP] = UNIT_MASK_FLEX_WRAP,
+ [CSS_PROP_JUSTIFY_CONTENT] = UNIT_MASK_JUSTIFY_CONTENT,
+ [CSS_PROP_ORDER] = UNIT_MASK_ORDER,
+};
diff --git a/src/parse/properties/properties.gen b/src/parse/properties/properties.gen
index 33df482..9830ce4 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -29,35 +29,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: SHOW:0,EMPTY_CELLS_SHOW HIDE:0
float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT NONE:0,FLOAT_NONE IDENT:)
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) CALC:( UNIT_PX:FONT_SIZE_CALC CALC:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) CALC:( UNIT_PX:FONT_SIZE_CALC CALC:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION MASK:UNIT_MASK_FONT_SIZE RANGE:<0 LENGTH_UNIT:)
font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) CALC:( UNIT_PX:HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) CALC:( UNIT_PX:HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET MASK:UNIT_MASK_HEIGHT RANGE:<0 LENGTH_UNIT:)
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:LETTER_SPACING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:LETTER_SPACING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET MASK:UNIT_MASK_LETTER_SPACING LENGTH_UNIT:)
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) CALC:( ANY:LINE_HEIGHT_CALC CALC:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) CALC:( ANY:LINE_HEIGHT_CALC CALC:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION MASK:UNIT_MASK_LINE_HEIGHT RANGE:<0 LENGTH_UNIT:)
border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) CALC:( UNIT_PX:MAX_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) CALC:( UNIT_PX:MAX_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET MASK:UNIT_MASK_MAX_HEIGHT RANGE:<0 LENGTH_UNIT:)
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) CALC:( UNIT_PX:MAX_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) CALC:( UNIT_PX:MAX_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET MASK:UNIT_MASK_MAX_WIDTH RANGE:<0 LENGTH_UNIT:)
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) CALC:( UNIT_PX:MIN_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) CALC:( UNIT_PX:MIN_HEIGHT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET MASK:UNIT_MASK_MIN_HEIGHT RANGE:<0 LENGTH_UNIT:)
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) CALC:( UNIT_PX:MIN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) CALC:( UNIT_PX:MIN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET MASK:UNIT_MASK_MIN_WIDTH RANGE:<0 LENGTH_UNIT:)
color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
#generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT CALC:( UNIT_PX:PADDING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:PADDING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT CALC:( UNIT_PX:PADDING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:PADDING_SET MASK:UNIT_MASK_PADDING_SIDE RANGE:<0 LENGTH_UNIT:)
padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -66,7 +66,7 @@ padding_right:CSS_PROP_PADDING_RIGHT WRAP:css__parse_padding_side
#generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) CALC:( UNIT_PX:MARGIN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) CALC:( UNIT_PX:MARGIN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET MASK:UNIT_MASK_MARGIN_SIDE LENGTH_UNIT:)
margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -74,7 +74,7 @@ margin_left:CSS_PROP_MARGIN_LEFT WRAP:css__parse_margin_side
margin_right:CSS_PROP_MARGIN_RIGHT WRAP:css__parse_margin_side
#generic for {top, bottom, left, right}.c
-side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) CALC:( UNIT_PX:BOTTOM_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) CALC:( UNIT_PX:BOTTOM_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
top:CSS_PROP_TOP WRAP:css__parse_side
bottom:CSS_PROP_BOTTOM WRAP:css__parse_side
@@ -83,7 +83,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
#generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) CALC:( UNIT_PX:BORDER_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) CALC:( UNIT_PX:BORDER_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET MASK:UNIT_MASK_BORDER_SIDE_WIDTH RANGE:<0 LENGTH_UNIT:)
border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH WRAP:css__parse_border_side_width
@@ -147,11 +147,11 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_
page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT CALC:( UNIT_S:PAUSE_AFTER_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT CALC:( UNIT_S:PAUSE_AFTER_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET MASK:UNIT_MASK_PAUSE_AFTER RANGE:<0 LENGTH_UNIT:)
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT CALC:( UNIT_S:PAUSE_BEFORE_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT CALC:( UNIT_S:PAUSE_BEFORE_CALC CALC:) LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET MASK:UNIT_MASK_PAUSE_BEFORE RANGE:<0 LENGTH_UNIT:)
-pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) CALC:( UNIT_HZ:PITCH_CALC CALC:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW:unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) CALC:( UNIT_HZ:PITCH_CALC CALC:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY MASK:UNIT_MASK_PITCH RANGE:<0 LENGTH_UNIT:)
pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT CALC:( NUMBER:PITCH_RANGE_CALC CALC:) NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
@@ -175,30 +175,28 @@ table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO FIX
text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT IDENT:)
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT CALC:( UNIT_PX:TEXT_INDENT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT CALC:( UNIT_PX:TEXT_INDENT_CALC CALC:) LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET MASK:UNIT_MASK_TEXT_INDENT LENGTH_UNIT:)
text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) CALC:( UNIT_PX:VERTICAL_ALIGN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) CALC:( UNIT_PX:VERTICAL_ALIGN_CALC CALC:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET MASK:UNIT_MASK_VERTICAL_ALIGN LENGTH_UNIT:)
visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
-volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) CALC:( ANY:VOLUME_CALC CALC:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
+volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) CALC:( ANY:VOLUME_CALC CALC:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION MASK:UNIT_MASK_VOLUME RANGE:<0 LENGTH_UNIT:)
white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL PRE:0,WHITE_SPACE_PRE NOWRAP:0,WHITE_SPACE_NOWRAP PRE_WRAP:0,WHITE_SPACE_PRE_WRAP PRE_LINE:0,WHITE_SPACE_PRE_LINE IDENT:)
widows:CSS_PROP_WIDOWS IDENT:INHERIT CALC:( NUMBER:WIDOWS_CALC CALC:) NUMBER:( true:WIDOWS_SET RANGE:num<0 NUMBER:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) CALC:( UNIT_PX:WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET MASK:UNIT_MASK_WIDTH RANGE:<0 LENGTH_UNIT:)
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) CALC:( UNIT_PX:WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
-
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:WORD_SPACING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) CALC:( UNIT_PX:WORD_SPACING_CALC CALC:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET MASK:UNIT_MASK_WORD_SPACING LENGTH_UNIT:)
z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) CALC:( NUMBER:Z_INDEX_CALC CALC:) NUMBER:( true:Z_INDEX_SET NUMBER:)
-
break_after:CSS_PROP_BREAK_AFTER IDENT:( INHERIT: AUTO:0,BREAK_AFTER_AUTO ALWAYS:0,BREAK_AFTER_ALWAYS AVOID:0,BREAK_AFTER_AVOID LEFT:0,BREAK_AFTER_LEFT RIGHT:0,BREAK_AFTER_RIGHT PAGE:0,BREAK_AFTER_PAGE COLUMN:0,BREAK_AFTER_COLUMN AVOID_PAGE:0,BREAK_AFTER_AVOID_PAGE AVOID_COLUMN:0,BREAK_AFTER_AVOID_COLUMN IDENT:)
break_before:CSS_PROP_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,BREAK_BEFORE_AUTO ALWAYS:0,BREAK_BEFORE_ALWAYS AVOID:0,BREAK_BEFORE_AVOID LEFT:0,BREAK_BEFORE_LEFT RIGHT:0,BREAK_BEFORE_RIGHT PAGE:0,BREAK_BEFORE_PAGE COLUMN:0,BREAK_BEFORE_COLUMN AVOID_PAGE:0,BREAK_BEFORE_AVOID_PAGE AVOID_COLUMN:0,BREAK_BEFORE_AVOID_COLUMN IDENT:)
@@ -209,7 +207,7 @@ column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO IDE
column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) CALC:( UNIT_PX:COLUMN_GAP_CALC CALC:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) CALC:( UNIT_PX:COLUMN_GAP_CALC CALC:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 MASK:UNIT_MASK_COLUMN_GAP LENGTH_UNIT:)
column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) COLOR:COLUMN_RULE_COLOR_SET
@@ -219,7 +217,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH WRAP:css__parse_border_side_width
column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE ALL:0,COLUMN_SPAN_ALL IDENT:)
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) CALC:( UNIT_PX:COLUMN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) CALC:( UNIT_PX:COLUMN_WIDTH_CALC CALC:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET MASK:UNIT_MASK_COLUMN_WIDTH LENGTH_UNIT:)
writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR IDENT:)
@@ -231,7 +229,7 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: STRETCH:0,ALIGN_ITEMS_STRETCH
align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE AUTO:0,ALIGN_SELF_AUTO IDENT:)
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) CALC:( UNIT_PX:FLEX_BASIS_CALC CALC:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) CALC:( UNIT_PX:FLEX_BASIS_CALC CALC:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET MASK:UNIT_MASK_FLEX_BASIS RANGE:<0 LENGTH_UNIT:)
flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE IDENT:)
diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h
index 1e085c5..1e7f821 100644
--- a/src/parse/properties/properties.h
+++ b/src/parse/properties/properties.h
@@ -458,4 +458,117 @@ css_error css__parse_z_index(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style *result);
+/** Mapping from property bytecode index to bytecode unit class mask. */
+extern const uint32_t property_unit_mask[CSS_N_PROPERTIES];
+
+#define UNIT_MASK_AZIMUTH (UNIT_ANGLE)
+#define UNIT_MASK_BACKGROUND_ATTACHMENT (0)
+#define UNIT_MASK_BACKGROUND_COLOR (0)
+#define UNIT_MASK_BACKGROUND_IMAGE (0)
+#define UNIT_MASK_BACKGROUND_POSITION (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_BACKGROUND_REPEAT (0)
+#define UNIT_MASK_BORDER_COLLAPSE (0)
+#define UNIT_MASK_BORDER_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_BORDER_SIDE_COLOR (0)
+#define UNIT_MASK_BORDER_SIDE_STYLE (0)
+#define UNIT_MASK_BORDER_SIDE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_BOTTOM (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_CAPTION_SIDE (0)
+#define UNIT_MASK_CLEAR (0)
+#define UNIT_MASK_CLIP (UNIT_LENGTH)
+#define UNIT_MASK_COLOR (0)
+#define UNIT_MASK_CONTENT (0)
+#define UNIT_MASK_COUNTER_INCREMENT (0)
+#define UNIT_MASK_COUNTER_RESET (0)
+#define UNIT_MASK_CUE_AFTER (0)
+#define UNIT_MASK_CUE_BEFORE (0)
+#define UNIT_MASK_CURSOR (0)
+#define UNIT_MASK_DIRECTION (0)
+#define UNIT_MASK_DISPLAY (0)
+#define UNIT_MASK_ELEVATION (UNIT_ANGLE)
+#define UNIT_MASK_EMPTY_CELLS (0)
+#define UNIT_MASK_FLOAT (0)
+#define UNIT_MASK_FONT_FAMILY (0)
+#define UNIT_MASK_FONT_SIZE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_FONT_STYLE (0)
+#define UNIT_MASK_FONT_VARIANT (0)
+#define UNIT_MASK_FONT_WEIGHT (0)
+#define UNIT_MASK_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LEFT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LETTER_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_LINE_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LIST_STYLE_IMAGE (0)
+#define UNIT_MASK_LIST_STYLE_POSITION (0)
+#define UNIT_MASK_LIST_STYLE_TYPE (0)
+#define UNIT_MASK_MARGIN_SIDE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MAX_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MAX_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MIN_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MIN_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_ORPHANS (0)
+#define UNIT_MASK_OUTLINE_COLOR (0)
+#define UNIT_MASK_OUTLINE_STYLE (0)
+#define UNIT_MASK_OUTLINE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_OVERFLOW_X (0)
+#define UNIT_MASK_PADDING_SIDE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_PAGE_BREAK_AFTER (0)
+#define UNIT_MASK_PAGE_BREAK_BEFORE (0)
+#define UNIT_MASK_PAGE_BREAK_INSIDE (0)
+#define UNIT_MASK_PAUSE_AFTER (UNIT_TIME | UNIT_PCT)
+#define UNIT_MASK_PAUSE_BEFORE (UNIT_TIME | UNIT_PCT)
+#define UNIT_MASK_PITCH_RANGE (0)
+#define UNIT_MASK_PITCH (UNIT_FREQ)
+#define UNIT_MASK_PLAY_DURING (0)
+#define UNIT_MASK_POSITION (0)
+#define UNIT_MASK_QUOTES (0)
+#define UNIT_MASK_RICHNESS (0)
+#define UNIT_MASK_RIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_SPEAK_HEADER (0)
+#define UNIT_MASK_SPEAK_NUMERAL (0)
+#define UNIT_MASK_SPEAK_PUNCTUATION (0)
+#define UNIT_MASK_SPEAK (0)
+#define UNIT_MASK_SPEECH_RATE (0)
+#define UNIT_MASK_STRESS (0)
+#define UNIT_MASK_TABLE_LAYOUT (0)
+#define UNIT_MASK_TEXT_ALIGN (0)
+#define UNIT_MASK_TEXT_DECORATION (0)
+#define UNIT_MASK_TEXT_INDENT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_TEXT_TRANSFORM (0)
+#define UNIT_MASK_TOP (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_UNICODE_BIDI (0)
+#define UNIT_MASK_VERTICAL_ALIGN (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_VISIBILITY (0)
+#define UNIT_MASK_VOICE_FAMILY (0)
+#define UNIT_MASK_VOLUME (UNIT_PCT)
+#define UNIT_MASK_WHITE_SPACE (0)
+#define UNIT_MASK_WIDOWS (0)
+#define UNIT_MASK_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_WORD_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_Z_INDEX (0)
+#define UNIT_MASK_OPACITY (0)
+#define UNIT_MASK_BREAK_AFTER (0)
+#define UNIT_MASK_BREAK_BEFORE (0)
+#define UNIT_MASK_BREAK_INSIDE (0)
+#define UNIT_MASK_COLUMN_COUNT (0)
+#define UNIT_MASK_COLUMN_FILL (0)
+#define UNIT_MASK_COLUMN_GAP (UNIT_LENGTH)
+#define UNIT_MASK_COLUMN_RULE_COLOR (0)
+#define UNIT_MASK_COLUMN_RULE_STYLE (0)
+#define UNIT_MASK_COLUMN_RULE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_COLUMN_SPAN (0)
+#define UNIT_MASK_COLUMN_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_WRITING_MODE (0)
+#define UNIT_MASK_OVERFLOW_Y (0)
+#define UNIT_MASK_BOX_SIZING (0)
+#define UNIT_MASK_ALIGN_CONTENT (0)
+#define UNIT_MASK_ALIGN_ITEMS (0)
+#define UNIT_MASK_ALIGN_SELF (0)
+#define UNIT_MASK_FLEX_BASIS (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_FLEX_DIRECTION (0)
+#define UNIT_MASK_FLEX_GROW (0)
+#define UNIT_MASK_FLEX_SHRINK (0)
+#define UNIT_MASK_FLEX_WRAP (0)
+#define UNIT_MASK_JUSTIFY_CONTENT (0)
+#define UNIT_MASK_ORDER (0)
+
#endif
diff --git a/src/select/computed.c b/src/select/computed.c
index 4e5588a..a1b345b 100644
--- a/src/select/computed.c
+++ b/src/select/computed.c
@@ -1702,8 +1702,8 @@ css_error compute_absolute_length(css_computed_style *style,
css_error (*set)(css_computed_style *style, uint8_t type,
css_fixed len, css_unit unit))
{
+ css_unit unit = CSS_UNIT_PX;
css_fixed length;
- css_unit unit;
uint8_t type;
type = get(style, &length, &unit);
diff --git a/test/data/parse/properties.dat b/test/data/parse/properties.dat
index 3dcb5a4..302b2dc 100644
--- a/test/data/parse/properties.dat
+++ b/test/data/parse/properties.dat
@@ -182,7 +182,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x0000b400 0x00000200
+| 0x02000000 0x0000b400 0x00000400
#reset
#data
@@ -190,7 +190,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0xffff4c00 0x00000200
+| 0x02000000 0xffff4c00 0x00000400
#reset
#data
@@ -198,7 +198,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x0000c800 0x00000201
+| 0x02000000 0x0000c800 0x00000401
#reset
#data
@@ -206,7 +206,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x00000324 0x00000202
+| 0x02000000 0x00000324 0x00000402
#reset
#data
@@ -214,7 +214,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0xfffffcdc 0x00000202
+| 0x02000000 0xfffffcdc 0x00000402
#reset
##
@@ -350,7 +350,7 @@
#errors
#expected
| 1 *
-| 0x02000004 0x00002800 0x00000100
+| 0x02000004 0x00002800 0x00000200
#reset
#data
@@ -358,7 +358,7 @@
#errors
#expected
| 1 *
-| 0x02000004 0x00000800 0x00000000
+| 0x02000004 0x00000800 0x00000100
#reset
#data
@@ -366,7 +366,7 @@
#errors
#expected
| 1 *
-| 0x02200004 0x00002800 0x00000100 0x00005000 0x00000100
+| 0x02200004 0x00002800 0x00000200 0x00005000 0x00000200
#reset
#data
@@ -374,7 +374,7 @@
#errors
#expected
| 1 *
-| 0x02200004 0x00002800 0x00000100 0x00000800 0x00000000
+| 0x02200004 0x00002800 0x00000200 0x00000800 0x00000100
#reset
#data
@@ -382,7 +382,7 @@
#errors
#expected
| 1 *
-| 0x02040004 0x00000800 0x00000000
+| 0x02040004 0x00000800 0x00000100
#reset
# possible quirk
@@ -391,7 +391,7 @@
##errors
##expected
#| 1 *
-#| 0x02040004 0x00000800 0x00000000
+#| 0x02040004 0x00000800 0x00000100
##reset
#data
@@ -399,7 +399,7 @@
#errors
#expected
| 1 *
-| 0x00a00004 0x00002800 0x00000100
+| 0x00a00004 0x00002800 0x00000200
#reset
#data
@@ -407,7 +407,7 @@
#errors
#expected
| 1 *
-| 0x02200404 0x00002800 0x00000100 0x00005000 0x00000100
+| 0x02200404 0x00002800 0x00000200 0x00005000 0x00000200
#reset
##
@@ -475,7 +475,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000c00 0x00000002 0x00000c00 0x00000002
+| 0x02000007 0x00000c00 0x00000102 0x00000c00 0x00000102
#reset
#data
@@ -483,7 +483,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000a00 0x00000002 0x00000a00 0x00000002
+| 0x02000007 0x00000a00 0x00000102 0x00000a00 0x00000102
#reset
#data
@@ -491,7 +491,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000c00 0x00000000 0x00000a00 0x00000002
+| 0x02000007 0x00000c00 0x00000100 0x00000a00 0x00000102
#reset
#data
@@ -499,7 +499,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000c00 0x00000002 0x00000c00 0x00000002
+| 0x02000407 0x00000c00 0x00000102 0x00000c00 0x00000102
#reset
#data
@@ -507,7 +507,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000a00 0x00000002 0x00000a00 0x00000002
+| 0x02000407 0x00000a00 0x00000102 0x00000a00 0x00000102
#reset
#data
@@ -515,7 +515,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000c00 0x00000000 0x00000a00 0x00000002
+| 0x02000407 0x00000c00 0x00000100 0x00000a00 0x00000102
#reset
##
@@ -688,7 +688,7 @@
#errors
#expected
| 1 *
-| 0x02000013 0x00000000 0x00000000
+| 0x02000013 0x00000000 0x00000100
#reset
#data
@@ -696,7 +696,7 @@
#errors
#expected
| 1 *
-| 0x02000010 0x00000800 0x00000000
+| 0x02000010 0x00000800 0x00000100
#reset
##
@@ -716,7 +716,7 @@
#errors
#expected
| 1 *
-| 0x02000014 0x00000300 0x00000002
+| 0x02000014 0x00000300 0x00000102
#reset
#data
@@ -724,7 +724,7 @@
#errors
#expected
| 1 *
-| 0x02000014 0x00010aab 0x00000100
+| 0x02000014 0x00010aab 0x00000200
#reset
##
@@ -800,7 +800,7 @@
#errors
#expected
| 1 *
-| 0x02c00017 0x00002800 0x00000000 0x00002800 0x00000000
+| 0x02c00017 0x00002800 0x00000100 0x00002800 0x00000100
#reset
#data
@@ -816,7 +816,7 @@
#errors
#expected
| 1 *
-| 0x02000017 0x00000400 0x00000000 0x00000800 0x00000000 0x00000c00 0x00000000 0x00001000 0x00000000
+| 0x02000017 0x00000400 0x00000100 0x00000800 0x00000100 0x00000c00 0x00000100 0x00001000 0x00000100
#reset
#data
@@ -824,7 +824,7 @@
#errors
#expected
| 1 *
-| 0x03200017 0x00000400 0x00000002 0x00000400 0x00000002
+| 0x03200017 0x00000400 0x00000102 0x00000400 0x00000102
#reset
#data
@@ -832,7 +832,7 @@
#errors
#expected
| 1 *
-| 0x02000017 0x00000000 0x00000000 0x00037000 0x00000000 0x000006cd 0x00000002 0x00000000 0x00000000
+| 0x02000017 0x00000000 0x00000100 0x00037000 0x00000100 0x000006cd 0x00000102 0x00000000 0x00000100
#reset
#data
@@ -848,7 +848,7 @@
#errors
#expected
| 1 *
-| 0x02c00417 0x00002800 0x00000000 0x00002800 0x00000000
+| 0x02c00417 0x00002800 0x00000100 0x00002800 0x00000100
#reset
#data
@@ -864,7 +864,7 @@
#errors
#expected
| 1 *
-| 0x02000417 0x00000400 0x00000000 0x00000800 0x00000000 0x00000c00 0x00000000 0x00001000 0x00000000
+| 0x02000417 0x00000400 0x00000100 0x00000800 0x00000100 0x00000c00 0x00000100 0x00001000 0x00000100
#reset
#data
@@ -872,7 +872,7 @@
#errors
#expected
| 1 *
-| 0x03200417 0x00000400 0x00000002 0x00000400 0x00000002
+| 0x03200417 0x00000400 0x00000102 0x00000400 0x00000102
#reset
#data
@@ -880,7 +880,7 @@
#errors
#expected
| 1 *
-| 0x02000417 0x00000000 0x00000000 0x00037000 0x00000000 0x000006cd 0x00000002 0x00000000 0x00000000
+| 0x02000417 0x00000000 0x00000100 0x00037000 0x00000100 0x000006cd 0x00000102 0x00000000 0x00000100
#reset
##
@@ -1708,7 +1708,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x0000b400 0x00000200
+| 0x02000021 0x0000b400 0x00000400
#reset
#data
@@ -1716,7 +1716,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0xffff4c00 0x00000200
+| 0x02000021 0xffff4c00 0x00000400
#reset
#data
@@ -1724,7 +1724,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x0000c800 0x00000201
+| 0x02000021 0x0000c800 0x00000401
#reset
#data
@@ -1732,7 +1732,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x00000324 0x00000202
+| 0x02000021 0x00000324 0x00000402
#reset
#data
@@ -1748,7 +1748,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000421 0x0000b400 0x00000200
+| 0x02000421 0x0000b400 0x00000400
#reset
##
@@ -1956,7 +1956,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x00003000 0x00000006
+| 0x02000025 0x00003000 0x00000106
#reset
#data
@@ -1964,7 +1964,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x00019000 0x00000000
+| 0x02000025 0x00019000 0x00000100
#reset
#data
@@ -1972,7 +1972,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x0001e000 0x00000100
+| 0x02000025 0x0001e000 0x00000200
#reset
##
@@ -2148,7 +2148,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000029 0x061a7fff 0x00000001
+| 0x02000029 0x061a7fff 0x00000101
#reset
#data
@@ -2156,7 +2156,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000029 0x00010aab 0x00000100
+| 0x02000029 0x00010aab 0x00000200
#reset
##
@@ -2176,7 +2176,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002a 0x00000200 0x00000003
+| 0x0200002a 0x00000200 0x00000103
#reset
#data
@@ -2184,7 +2184,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002a 0x00001000 0x00000100
+| 0x0200002a 0x00001000 0x00000200
#reset
##
@@ -2204,7 +2204,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002b 0x00000152 0x00000004
+| 0x0200002b 0x00000152 0x00000104
#reset
#data
@@ -2212,7 +2212,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200042b 0x00000152 0x00000004
+| 0x0200042b 0x00000152 0x00000104
#reset
##
@@ -2240,7 +2240,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204002c 0x00003000 0x00000005
+| 0x0204002c 0x00003000 0x00000105
#reset
#data
@@ -2256,7 +2256,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204042c 0x00003000 0x00000005
+| 0x0204042c 0x00003000 0x00000105
#reset
#data
@@ -2264,7 +2264,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204002c 0x00008552 0x00000100
+| 0x0204002c 0x00008552 0x00000200
#reset
##
@@ -2475,7 +2475,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000030 0x00002800 0x00000007
+| 0x02000030 0x00002800 0x00000107
#reset
#data
@@ -2483,7 +2483,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000031 0x00000400 0x00000000
+| 0x02000031 0x00000400 0x00000100
#reset
#data
@@ -2491,7 +2491,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000032 0x00000800 0x00000002
+| 0x02000032 0x00000800 0x00000102
#reset
#data
@@ -2499,7 +2499,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000033 0x00001400 0x00000100
+| 0x02000033 0x00001400 0x00000200
#reset
##
@@ -2519,7 +2519,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000034 0x00019000 0x00000000
+| 0x02000034 0x00019000 0x00000100
#reset
#data
@@ -2527,7 +2527,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000434 0x00019000 0x00000000
+| 0x02000434 0x00019000 0x00000100
#reset
#data
@@ -2535,7 +2535,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000034 0x0000c800 0x00000100
+| 0x02000034 0x0000c800 0x00000200
#reset
##
@@ -2555,7 +2555,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000035 0x00019000 0x00000000
+| 0x02000035 0x00019000 0x00000100
#reset
#data
@@ -2563,7 +2563,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000035 0x0000c800 0x00000100
+| 0x02000035 0x0000c800 0x00000200
#reset
##
@@ -2575,7 +2575,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000036 0x00019000 0x00000000
+| 0x02000036 0x00019000 0x00000100
#reset
#data
@@ -2583,7 +2583,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000036 0x0000c800 0x00000100
+| 0x02000036 0x0000c800 0x00000200
#reset
##
@@ -2595,7 +2595,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000037 0x00019000 0x00000000
+| 0x02000037 0x00019000 0x00000100
#reset
#data
@@ -2603,7 +2603,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000037 0x0000c800 0x00000100
+| 0x02000037 0x0000c800 0x00000200
#reset
##
@@ -2763,7 +2763,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003b 0x00000c00 0x00000000
+| 0x0200003b 0x00000c00 0x00000100
#reset
#data
@@ -2771,7 +2771,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003b 0x00000000 0x00000000
+| 0x0200003b 0x00000000 0x00000100
#reset
##
@@ -2858,7 +2858,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003d 0x00002800 0x00000007
+| 0x0200003d 0x00002800 0x00000107
#reset
#data
@@ -2866,7 +2866,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003e 0x00000400 0x00000000
+| 0x0200003e 0x00000400 0x00000100
#reset
#data
@@ -2874,7 +2874,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003f 0x00000800 0x00000002
+| 0x0200003f 0x00000800 0x00000102
#reset
#data
@@ -2882,7 +2882,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000040 0x00001400 0x00000100
+| 0x02000040 0x00001400 0x00000200
#reset
##
@@ -3002,7 +3002,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x00000000 0x00000401
+| 0x02000044 0x00000000 0x00000801
#reset
#data
@@ -3010,7 +3010,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x00019000 0x00000400
+| 0x02000044 0x00019000 0x00000800
#reset
#data
@@ -3018,7 +3018,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x000002cd 0x00000401
+| 0x02000044 0x000002cd 0x00000801
#reset
#data
@@ -3026,7 +3026,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x0001e000 0x00000100
+| 0x02000044 0x0001e000 0x00000200
#reset
##
@@ -3038,7 +3038,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x00000000 0x00000401
+| 0x02000045 0x00000000 0x00000801
#reset
#data
@@ -3046,7 +3046,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x00019000 0x00000400
+| 0x02000045 0x00019000 0x00000800
#reset
#data
@@ -3054,7 +3054,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x000002cd 0x00000401
+| 0x02000045 0x000002cd 0x00000801
#reset
#data
@@ -3062,7 +3062,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x0001e000 0x00000100
+| 0x02000045 0x0001e000 0x00000200
#reset
##
@@ -3150,7 +3150,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00000000 0x00000800
+| 0x02000047 0x00000000 0x00001000
#reset
#data
@@ -3158,7 +3158,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000447 0x00000000 0x00000800
+| 0x02000447 0x00000000 0x00001000
#reset
#data
@@ -3166,7 +3166,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00064000 0x00000800
+| 0x02000047 0x00064000 0x00001000
#reset
#data
@@ -3174,7 +3174,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00000466 0x00000801
+| 0x02000047 0x00000466 0x00001001
#reset
##
@@ -3370,7 +3370,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200004c 0x00000200 0x00000003
+| 0x0200004c 0x00000200 0x00000103
#reset
#data
@@ -3378,7 +3378,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200004c 0x00001000 0x00000100
+| 0x0200004c 0x00001000 0x00000200
#reset
##
@@ -3738,7 +3738,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00000000 0x00000000
+| 0x02000056 0x00000000 0x00000100
#reset
#data
@@ -3746,7 +3746,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00003000 0x00000005
+| 0x02000056 0x00003000 0x00000105
#reset
#data
@@ -3754,7 +3754,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00008552 0x00000100
+| 0x02000056 0x00008552 0x00000200
#reset
##
@@ -3810,7 +3810,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000058 0x00000200 0x00000003
+| 0x02000058 0x00000200 0x00000103
#reset
#data
@@ -3818,7 +3818,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000058 0x00001000 0x00000100
+| 0x02000058 0x00001000 0x00000200
#reset
##
@@ -3922,7 +3922,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200045a 0xffffd800 0x00000100
+| 0x0200045a 0xffffd800 0x00000200
#reset
#data
@@ -3930,7 +3930,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0xffffd800 0x00000100
+| 0x0200005a 0xffffd800 0x00000200
#reset
#data
@@ -3938,7 +3938,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0x00005000 0x00000100
+| 0x0200005a 0x00005000 0x00000200
#reset
#data
@@ -3946,7 +3946,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0x00001000 0x00000000
+| 0x0200005a 0x00001000 0x00000100
#reset
#data
@@ -3954,7 +3954,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0xfffff000 0x00000000
+| 0x0200005a 0xfffff000 0x00000100
#reset
##
@@ -4135,7 +4135,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204005d 0x00008552 0x00000100
+| 0x0204005d 0x00008552 0x00000200
#reset
# dunno if % can be tested here, cos it's a percentage of the inherited value
@@ -4144,7 +4144,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204045d 0x00008552 0x00000100
+| 0x0204045d 0x00008552 0x00000200
#reset
##
@@ -4220,7 +4220,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000060 0x061a7fff 0x00000001
+| 0x02000060 0x061a7fff 0x00000101
#reset
#data
@@ -4228,7 +4228,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000060 0x00010aab 0x00000100
+| 0x02000060 0x00010aab 0x00000200
#reset
##
@@ -4248,7 +4248,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000061 0x00000066 0x00000002
+| 0x02000061 0x00000066 0x00000102
#reset
##
@@ -4540,7 +4540,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000069 0x00000066 0x00000002
+| 0x02000069 0x00000066 0x00000102
#reset
##
@@ -4688,7 +4688,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006c 0x00000c00 0x00000000
+| 0x0200006c 0x00000c00 0x00000100
#reset
#data
@@ -4696,7 +4696,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006c 0x00000000 0x00000000
+| 0x0200006c 0x00000000 0x00000100
#reset
##
@@ -4736,7 +4736,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006e 0x00000066 0x00000002
+| 0x0200006e 0x00000066 0x00000102
#reset
##
--
Cascading Style Sheets library
3 years
libcss: branch master updated. release/0.9.1-4-ge2b4077
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libcss.git/shortlog/e2b4077eed0ad778847cd7...
...commit http://git.netsurf-browser.org/libcss.git/commit/e2b4077eed0ad778847cd7b1...
...tree http://git.netsurf-browser.org/libcss.git/tree/e2b4077eed0ad778847cd7b174...
The branch, master has been updated
via e2b4077eed0ad778847cd7b17406e8bf8b61a4ae (commit)
via d7c1541ac2d21577e58f2839879e71a2cebed229 (commit)
via 0b84fa9cc67593667002d7e7953d90400a66ac09 (commit)
from 1c1cf39d306428fe91260842082dfc9a66a6a236 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=e2b4077eed0ad778847c...
commit e2b4077eed0ad778847cd7b17406e8bf8b61a4ae
Author: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
parse: properties: Add property-specific unit class masks.
There's a table we can index into for calc():
const uint32_t property_unit_mask[CSS_N_PROPERTIES]
And there are #defines for where the code is already
property-specific, avoiding the lookup.
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index 0e6ce72..24cc536 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -326,6 +326,13 @@ void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_lis
"\t\t\treturn CSS_INVALID;\n"
"\t\t}\n\n",
ulkv->val);
+ } else if (strcmp(ulkv->key, "MASK") == 0) {
+ fprintf(outputf,
+ "\t\tif ((unit & %s ) == 0) {\n"
+ "\t\t\t*ctx = orig_ctx;\n"
+ "\t\t\treturn CSS_INVALID;\n"
+ "\t\t}\n\n",
+ ulkv->val);
} else if (strcmp(ulkv->key, "RANGE") == 0) {
fprintf(outputf,
"\t\tif (length %s) {\n"
diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c
index 3f374fa..06524da 100644
--- a/src/parse/properties/properties.c
+++ b/src/parse/properties/properties.c
@@ -158,3 +158,131 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
css__parse_writing_mode,
css__parse_z_index
};
+
+/** Mapping from property bytecode index to bytecode unit class mask. */
+const uint32_t property_unit_mask[CSS_N_PROPERTIES] = {
+ [CSS_PROP_AZIMUTH] = UNIT_MASK_AZIMUTH,
+ [CSS_PROP_BACKGROUND_ATTACHMENT] = UNIT_MASK_BACKGROUND_ATTACHMENT,
+ [CSS_PROP_BACKGROUND_COLOR] = UNIT_MASK_BACKGROUND_COLOR,
+ [CSS_PROP_BACKGROUND_IMAGE] = UNIT_MASK_BACKGROUND_IMAGE,
+ [CSS_PROP_BACKGROUND_POSITION] = UNIT_MASK_BACKGROUND_POSITION,
+ [CSS_PROP_BACKGROUND_REPEAT] = UNIT_MASK_BACKGROUND_REPEAT,
+ [CSS_PROP_BORDER_COLLAPSE] = UNIT_MASK_BORDER_COLLAPSE,
+ [CSS_PROP_BORDER_SPACING] = UNIT_MASK_BORDER_SPACING,
+ [CSS_PROP_BORDER_TOP_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_RIGHT_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_BOTTOM_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_LEFT_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_TOP_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_RIGHT_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_BOTTOM_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_LEFT_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_TOP_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_RIGHT_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_BOTTOM_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_LEFT_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BOTTOM] = UNIT_MASK_BOTTOM,
+ [CSS_PROP_CAPTION_SIDE] = UNIT_MASK_CAPTION_SIDE,
+ [CSS_PROP_CLEAR] = UNIT_MASK_CLEAR,
+ [CSS_PROP_CLIP] = UNIT_MASK_CLIP,
+ [CSS_PROP_COLOR] = UNIT_MASK_COLOR,
+ [CSS_PROP_CONTENT] = UNIT_MASK_CONTENT,
+ [CSS_PROP_COUNTER_INCREMENT] = UNIT_MASK_COUNTER_INCREMENT,
+ [CSS_PROP_COUNTER_RESET] = UNIT_MASK_COUNTER_RESET,
+ [CSS_PROP_CUE_AFTER] = UNIT_MASK_CUE_AFTER,
+ [CSS_PROP_CUE_BEFORE] = UNIT_MASK_CUE_BEFORE,
+ [CSS_PROP_CURSOR] = UNIT_MASK_CURSOR,
+ [CSS_PROP_DIRECTION] = UNIT_MASK_DIRECTION,
+ [CSS_PROP_DISPLAY] = UNIT_MASK_DISPLAY,
+ [CSS_PROP_ELEVATION] = UNIT_MASK_ELEVATION,
+ [CSS_PROP_EMPTY_CELLS] = UNIT_MASK_EMPTY_CELLS,
+ [CSS_PROP_FLOAT] = UNIT_MASK_FLOAT,
+ [CSS_PROP_FONT_FAMILY] = UNIT_MASK_FONT_FAMILY,
+ [CSS_PROP_FONT_SIZE] = UNIT_MASK_FONT_SIZE,
+ [CSS_PROP_FONT_STYLE] = UNIT_MASK_FONT_STYLE,
+ [CSS_PROP_FONT_VARIANT] = UNIT_MASK_FONT_VARIANT,
+ [CSS_PROP_FONT_WEIGHT] = UNIT_MASK_FONT_WEIGHT,
+ [CSS_PROP_HEIGHT] = UNIT_MASK_HEIGHT,
+ [CSS_PROP_LEFT] = UNIT_MASK_LEFT,
+ [CSS_PROP_LETTER_SPACING] = UNIT_MASK_LETTER_SPACING,
+ [CSS_PROP_LINE_HEIGHT] = UNIT_MASK_LINE_HEIGHT,
+ [CSS_PROP_LIST_STYLE_IMAGE] = UNIT_MASK_LIST_STYLE_IMAGE,
+ [CSS_PROP_LIST_STYLE_POSITION] = UNIT_MASK_LIST_STYLE_POSITION,
+ [CSS_PROP_LIST_STYLE_TYPE] = UNIT_MASK_LIST_STYLE_TYPE,
+ [CSS_PROP_MARGIN_TOP] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_RIGHT] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_BOTTOM] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_LEFT] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MAX_HEIGHT] = UNIT_MASK_MAX_HEIGHT,
+ [CSS_PROP_MAX_WIDTH] = UNIT_MASK_MAX_WIDTH,
+ [CSS_PROP_MIN_HEIGHT] = UNIT_MASK_MIN_HEIGHT,
+ [CSS_PROP_MIN_WIDTH] = UNIT_MASK_MIN_WIDTH,
+ [CSS_PROP_ORPHANS] = UNIT_MASK_ORPHANS,
+ [CSS_PROP_OUTLINE_COLOR] = UNIT_MASK_OUTLINE_COLOR,
+ [CSS_PROP_OUTLINE_STYLE] = UNIT_MASK_OUTLINE_STYLE,
+ [CSS_PROP_OUTLINE_WIDTH] = UNIT_MASK_OUTLINE_WIDTH,
+ [CSS_PROP_OVERFLOW_X] = UNIT_MASK_OVERFLOW_X,
+ [CSS_PROP_PADDING_TOP] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_RIGHT] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_BOTTOM] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_LEFT] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PAGE_BREAK_AFTER] = UNIT_MASK_PAGE_BREAK_AFTER,
+ [CSS_PROP_PAGE_BREAK_BEFORE] = UNIT_MASK_PAGE_BREAK_BEFORE,
+ [CSS_PROP_PAGE_BREAK_INSIDE] = UNIT_MASK_PAGE_BREAK_INSIDE,
+ [CSS_PROP_PAUSE_AFTER] = UNIT_MASK_PAUSE_AFTER,
+ [CSS_PROP_PAUSE_BEFORE] = UNIT_MASK_PAUSE_BEFORE,
+ [CSS_PROP_PITCH_RANGE] = UNIT_MASK_PITCH_RANGE,
+ [CSS_PROP_PITCH] = UNIT_MASK_PITCH,
+ [CSS_PROP_PLAY_DURING] = UNIT_MASK_PLAY_DURING,
+ [CSS_PROP_POSITION] = UNIT_MASK_POSITION,
+ [CSS_PROP_QUOTES] = UNIT_MASK_QUOTES,
+ [CSS_PROP_RICHNESS] = UNIT_MASK_RICHNESS,
+ [CSS_PROP_RIGHT] = UNIT_MASK_RIGHT,
+ [CSS_PROP_SPEAK_HEADER] = UNIT_MASK_SPEAK_HEADER,
+ [CSS_PROP_SPEAK_NUMERAL] = UNIT_MASK_SPEAK_NUMERAL,
+ [CSS_PROP_SPEAK_PUNCTUATION] = UNIT_MASK_SPEAK_PUNCTUATION,
+ [CSS_PROP_SPEAK] = UNIT_MASK_SPEAK,
+ [CSS_PROP_SPEECH_RATE] = UNIT_MASK_SPEECH_RATE,
+ [CSS_PROP_STRESS] = UNIT_MASK_STRESS,
+ [CSS_PROP_TABLE_LAYOUT] = UNIT_MASK_TABLE_LAYOUT,
+ [CSS_PROP_TEXT_ALIGN] = UNIT_MASK_TEXT_ALIGN,
+ [CSS_PROP_TEXT_DECORATION] = UNIT_MASK_TEXT_DECORATION,
+ [CSS_PROP_TEXT_INDENT] = UNIT_MASK_TEXT_INDENT,
+ [CSS_PROP_TEXT_TRANSFORM] = UNIT_MASK_TEXT_TRANSFORM,
+ [CSS_PROP_TOP] = UNIT_MASK_TOP,
+ [CSS_PROP_UNICODE_BIDI] = UNIT_MASK_UNICODE_BIDI,
+ [CSS_PROP_VERTICAL_ALIGN] = UNIT_MASK_VERTICAL_ALIGN,
+ [CSS_PROP_VISIBILITY] = UNIT_MASK_VISIBILITY,
+ [CSS_PROP_VOICE_FAMILY] = UNIT_MASK_VOICE_FAMILY,
+ [CSS_PROP_VOLUME] = UNIT_MASK_VOLUME,
+ [CSS_PROP_WHITE_SPACE] = UNIT_MASK_WHITE_SPACE,
+ [CSS_PROP_WIDOWS] = UNIT_MASK_WIDOWS,
+ [CSS_PROP_WIDTH] = UNIT_MASK_WIDTH,
+ [CSS_PROP_WORD_SPACING] = UNIT_MASK_WORD_SPACING,
+ [CSS_PROP_Z_INDEX] = UNIT_MASK_Z_INDEX,
+ [CSS_PROP_OPACITY] = UNIT_MASK_OPACITY,
+ [CSS_PROP_BREAK_AFTER] = UNIT_MASK_BREAK_AFTER,
+ [CSS_PROP_BREAK_BEFORE] = UNIT_MASK_BREAK_BEFORE,
+ [CSS_PROP_BREAK_INSIDE] = UNIT_MASK_BREAK_INSIDE,
+ [CSS_PROP_COLUMN_COUNT] = UNIT_MASK_COLUMN_COUNT,
+ [CSS_PROP_COLUMN_FILL] = UNIT_MASK_COLUMN_FILL,
+ [CSS_PROP_COLUMN_GAP] = UNIT_MASK_COLUMN_GAP,
+ [CSS_PROP_COLUMN_RULE_COLOR] = UNIT_MASK_COLUMN_RULE_COLOR,
+ [CSS_PROP_COLUMN_RULE_STYLE] = UNIT_MASK_COLUMN_RULE_STYLE,
+ [CSS_PROP_COLUMN_RULE_WIDTH] = UNIT_MASK_COLUMN_RULE_WIDTH,
+ [CSS_PROP_COLUMN_SPAN] = UNIT_MASK_COLUMN_SPAN,
+ [CSS_PROP_COLUMN_WIDTH] = UNIT_MASK_COLUMN_WIDTH,
+ [CSS_PROP_WRITING_MODE] = UNIT_MASK_WRITING_MODE,
+ [CSS_PROP_OVERFLOW_Y] = UNIT_MASK_OVERFLOW_Y,
+ [CSS_PROP_BOX_SIZING] = UNIT_MASK_BOX_SIZING,
+ [CSS_PROP_ALIGN_CONTENT] = UNIT_MASK_ALIGN_CONTENT,
+ [CSS_PROP_ALIGN_ITEMS] = UNIT_MASK_ALIGN_ITEMS,
+ [CSS_PROP_ALIGN_SELF] = UNIT_MASK_ALIGN_SELF,
+ [CSS_PROP_FLEX_BASIS] = UNIT_MASK_FLEX_BASIS,
+ [CSS_PROP_FLEX_DIRECTION] = UNIT_MASK_FLEX_DIRECTION,
+ [CSS_PROP_FLEX_GROW] = UNIT_MASK_FLEX_GROW,
+ [CSS_PROP_FLEX_SHRINK] = UNIT_MASK_FLEX_SHRINK,
+ [CSS_PROP_FLEX_WRAP] = UNIT_MASK_FLEX_WRAP,
+ [CSS_PROP_JUSTIFY_CONTENT] = UNIT_MASK_JUSTIFY_CONTENT,
+ [CSS_PROP_ORDER] = UNIT_MASK_ORDER,
+};
diff --git a/src/parse/properties/properties.gen b/src/parse/properties/properties.gen
index db3a531..e729285 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -22,35 +22,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: SHOW:0,EMPTY_CELLS_SHOW HIDE:0
float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT NONE:0,FLOAT_NONE IDENT:)
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION MASK:UNIT_MASK_FONT_SIZE RANGE:<0 LENGTH_UNIT:)
font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET MASK:UNIT_MASK_HEIGHT RANGE:<0 LENGTH_UNIT:)
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET MASK:UNIT_MASK_LETTER_SPACING LENGTH_UNIT:)
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION MASK:UNIT_MASK_LINE_HEIGHT RANGE:<0 LENGTH_UNIT:)
border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET MASK:UNIT_MASK_MAX_HEIGHT RANGE:<0 LENGTH_UNIT:)
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET MASK:UNIT_MASK_MAX_WIDTH RANGE:<0 LENGTH_UNIT:)
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET MASK:UNIT_MASK_MIN_HEIGHT RANGE:<0 LENGTH_UNIT:)
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET MASK:UNIT_MASK_MIN_WIDTH RANGE:<0 LENGTH_UNIT:)
color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
#generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET MASK:UNIT_MASK_PADDING_SIDE RANGE:<0 LENGTH_UNIT:)
padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -59,7 +59,7 @@ padding_right:CSS_PROP_PADDING_RIGHT WRAP:css__parse_padding_side
#generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET MASK:UNIT_MASK_MARGIN_SIDE LENGTH_UNIT:)
margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -76,7 +76,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
#generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET ALLOW:unit&UNIT_LENGTH RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET MASK:UNIT_MASK_BORDER_SIDE_WIDTH RANGE:<0 LENGTH_UNIT:)
border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH WRAP:css__parse_border_side_width
@@ -140,11 +140,11 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_
page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET ALLOW:unit&(UNIT_TIME|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET MASK:UNIT_MASK_PAUSE_AFTER RANGE:<0 LENGTH_UNIT:)
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET ALLOW:unit&(UNIT_TIME|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET MASK:UNIT_MASK_PAUSE_BEFORE RANGE:<0 LENGTH_UNIT:)
-pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW:unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY MASK:UNIT_MASK_PITCH RANGE:<0 LENGTH_UNIT:)
pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
@@ -168,26 +168,26 @@ table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO FIX
text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT IDENT:)
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET MASK:UNIT_MASK_TEXT_INDENT LENGTH_UNIT:)
text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET MASK:UNIT_MASK_VERTICAL_ALIGN LENGTH_UNIT:)
visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
-volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
+volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION MASK:UNIT_MASK_VOLUME RANGE:<0 LENGTH_UNIT:)
white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL PRE:0,WHITE_SPACE_PRE NOWRAP:0,WHITE_SPACE_NOWRAP PRE_WRAP:0,WHITE_SPACE_PRE_WRAP PRE_LINE:0,WHITE_SPACE_PRE_LINE IDENT:)
widows:CSS_PROP_WIDOWS IDENT:INHERIT NUMBER:( true:WIDOWS_SET RANGE:num<0 NUMBER:)
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET MASK:UNIT_MASK_WIDTH RANGE:<0 LENGTH_UNIT:)
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET MASK:UNIT_MASK_WORD_SPACING LENGTH_UNIT:)
z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( true:Z_INDEX_SET NUMBER:)
@@ -202,7 +202,7 @@ column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO IDE
column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 MASK:UNIT_MASK_COLUMN_GAP LENGTH_UNIT:)
column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) COLOR:COLUMN_RULE_COLOR_SET
@@ -212,7 +212,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH WRAP:css__parse_border_side_width
column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE ALL:0,COLUMN_SPAN_ALL IDENT:)
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET MASK:UNIT_MASK_COLUMN_WIDTH LENGTH_UNIT:)
writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR IDENT:)
@@ -224,7 +224,7 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: STRETCH:0,ALIGN_ITEMS_STRETCH
align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE AUTO:0,ALIGN_SELF_AUTO IDENT:)
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET MASK:UNIT_MASK_FLEX_BASIS RANGE:<0 LENGTH_UNIT:)
flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE IDENT:)
diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h
index 1e085c5..1e7f821 100644
--- a/src/parse/properties/properties.h
+++ b/src/parse/properties/properties.h
@@ -458,4 +458,117 @@ css_error css__parse_z_index(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style *result);
+/** Mapping from property bytecode index to bytecode unit class mask. */
+extern const uint32_t property_unit_mask[CSS_N_PROPERTIES];
+
+#define UNIT_MASK_AZIMUTH (UNIT_ANGLE)
+#define UNIT_MASK_BACKGROUND_ATTACHMENT (0)
+#define UNIT_MASK_BACKGROUND_COLOR (0)
+#define UNIT_MASK_BACKGROUND_IMAGE (0)
+#define UNIT_MASK_BACKGROUND_POSITION (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_BACKGROUND_REPEAT (0)
+#define UNIT_MASK_BORDER_COLLAPSE (0)
+#define UNIT_MASK_BORDER_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_BORDER_SIDE_COLOR (0)
+#define UNIT_MASK_BORDER_SIDE_STYLE (0)
+#define UNIT_MASK_BORDER_SIDE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_BOTTOM (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_CAPTION_SIDE (0)
+#define UNIT_MASK_CLEAR (0)
+#define UNIT_MASK_CLIP (UNIT_LENGTH)
+#define UNIT_MASK_COLOR (0)
+#define UNIT_MASK_CONTENT (0)
+#define UNIT_MASK_COUNTER_INCREMENT (0)
+#define UNIT_MASK_COUNTER_RESET (0)
+#define UNIT_MASK_CUE_AFTER (0)
+#define UNIT_MASK_CUE_BEFORE (0)
+#define UNIT_MASK_CURSOR (0)
+#define UNIT_MASK_DIRECTION (0)
+#define UNIT_MASK_DISPLAY (0)
+#define UNIT_MASK_ELEVATION (UNIT_ANGLE)
+#define UNIT_MASK_EMPTY_CELLS (0)
+#define UNIT_MASK_FLOAT (0)
+#define UNIT_MASK_FONT_FAMILY (0)
+#define UNIT_MASK_FONT_SIZE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_FONT_STYLE (0)
+#define UNIT_MASK_FONT_VARIANT (0)
+#define UNIT_MASK_FONT_WEIGHT (0)
+#define UNIT_MASK_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LEFT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LETTER_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_LINE_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LIST_STYLE_IMAGE (0)
+#define UNIT_MASK_LIST_STYLE_POSITION (0)
+#define UNIT_MASK_LIST_STYLE_TYPE (0)
+#define UNIT_MASK_MARGIN_SIDE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MAX_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MAX_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MIN_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MIN_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_ORPHANS (0)
+#define UNIT_MASK_OUTLINE_COLOR (0)
+#define UNIT_MASK_OUTLINE_STYLE (0)
+#define UNIT_MASK_OUTLINE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_OVERFLOW_X (0)
+#define UNIT_MASK_PADDING_SIDE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_PAGE_BREAK_AFTER (0)
+#define UNIT_MASK_PAGE_BREAK_BEFORE (0)
+#define UNIT_MASK_PAGE_BREAK_INSIDE (0)
+#define UNIT_MASK_PAUSE_AFTER (UNIT_TIME | UNIT_PCT)
+#define UNIT_MASK_PAUSE_BEFORE (UNIT_TIME | UNIT_PCT)
+#define UNIT_MASK_PITCH_RANGE (0)
+#define UNIT_MASK_PITCH (UNIT_FREQ)
+#define UNIT_MASK_PLAY_DURING (0)
+#define UNIT_MASK_POSITION (0)
+#define UNIT_MASK_QUOTES (0)
+#define UNIT_MASK_RICHNESS (0)
+#define UNIT_MASK_RIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_SPEAK_HEADER (0)
+#define UNIT_MASK_SPEAK_NUMERAL (0)
+#define UNIT_MASK_SPEAK_PUNCTUATION (0)
+#define UNIT_MASK_SPEAK (0)
+#define UNIT_MASK_SPEECH_RATE (0)
+#define UNIT_MASK_STRESS (0)
+#define UNIT_MASK_TABLE_LAYOUT (0)
+#define UNIT_MASK_TEXT_ALIGN (0)
+#define UNIT_MASK_TEXT_DECORATION (0)
+#define UNIT_MASK_TEXT_INDENT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_TEXT_TRANSFORM (0)
+#define UNIT_MASK_TOP (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_UNICODE_BIDI (0)
+#define UNIT_MASK_VERTICAL_ALIGN (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_VISIBILITY (0)
+#define UNIT_MASK_VOICE_FAMILY (0)
+#define UNIT_MASK_VOLUME (UNIT_PCT)
+#define UNIT_MASK_WHITE_SPACE (0)
+#define UNIT_MASK_WIDOWS (0)
+#define UNIT_MASK_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_WORD_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_Z_INDEX (0)
+#define UNIT_MASK_OPACITY (0)
+#define UNIT_MASK_BREAK_AFTER (0)
+#define UNIT_MASK_BREAK_BEFORE (0)
+#define UNIT_MASK_BREAK_INSIDE (0)
+#define UNIT_MASK_COLUMN_COUNT (0)
+#define UNIT_MASK_COLUMN_FILL (0)
+#define UNIT_MASK_COLUMN_GAP (UNIT_LENGTH)
+#define UNIT_MASK_COLUMN_RULE_COLOR (0)
+#define UNIT_MASK_COLUMN_RULE_STYLE (0)
+#define UNIT_MASK_COLUMN_RULE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_COLUMN_SPAN (0)
+#define UNIT_MASK_COLUMN_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_WRITING_MODE (0)
+#define UNIT_MASK_OVERFLOW_Y (0)
+#define UNIT_MASK_BOX_SIZING (0)
+#define UNIT_MASK_ALIGN_CONTENT (0)
+#define UNIT_MASK_ALIGN_ITEMS (0)
+#define UNIT_MASK_ALIGN_SELF (0)
+#define UNIT_MASK_FLEX_BASIS (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_FLEX_DIRECTION (0)
+#define UNIT_MASK_FLEX_GROW (0)
+#define UNIT_MASK_FLEX_SHRINK (0)
+#define UNIT_MASK_FLEX_WRAP (0)
+#define UNIT_MASK_JUSTIFY_CONTENT (0)
+#define UNIT_MASK_ORDER (0)
+
#endif
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=d7c1541ac2d21577e58f...
commit d7c1541ac2d21577e58f2839879e71a2cebed229
Author: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
parse: properties.gen: Convert to using unit allow masks.
diff --git a/src/parse/properties/properties.gen b/src/parse/properties/properties.gen
index 61dcd5e..db3a531 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -22,35 +22,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: SHOW:0,EMPTY_CELLS_SHOW HIDE:0
float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT NONE:0,FLOAT_NONE IDENT:)
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
#generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -59,7 +59,7 @@ padding_right:CSS_PROP_PADDING_RIGHT WRAP:css__parse_padding_side
#generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -67,7 +67,7 @@ margin_left:CSS_PROP_MARGIN_LEFT WRAP:css__parse_margin_side
margin_right:CSS_PROP_MARGIN_RIGHT WRAP:css__parse_margin_side
#generic for {top, bottom, left, right}.c
-side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
top:CSS_PROP_TOP WRAP:css__parse_side
bottom:CSS_PROP_BOTTOM WRAP:css__parse_side
@@ -76,7 +76,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
#generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET ALLOW:unit&UNIT_LENGTH RANGE:<0 LENGTH_UNIT:)
border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH WRAP:css__parse_border_side_width
@@ -140,9 +140,9 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_
page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET ALLOW:unit&(UNIT_TIME|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET ALLOW:unit&(UNIT_TIME|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW:unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
@@ -168,13 +168,13 @@ table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO FIX
text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT IDENT:)
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
@@ -185,9 +185,9 @@ white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL PR
widows:CSS_PROP_WIDOWS IDENT:INHERIT NUMBER:( true:WIDOWS_SET RANGE:num<0 NUMBER:)
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( true:Z_INDEX_SET NUMBER:)
@@ -202,7 +202,7 @@ column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO IDE
column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) COLOR:COLUMN_RULE_COLOR_SET
@@ -212,7 +212,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH WRAP:css__parse_border_side_width
column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE ALL:0,COLUMN_SPAN_ALL IDENT:)
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET ALLOW:unit&UNIT_LENGTH LENGTH_UNIT:)
writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR IDENT:)
@@ -224,7 +224,7 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: STRETCH:0,ALIGN_ITEMS_STRETCH
align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE AUTO:0,ALIGN_SELF_AUTO IDENT:)
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) RANGE:<0 LENGTH_UNIT:)
flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE IDENT:)
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=0b84fa9cc67593667002...
commit 0b84fa9cc67593667002d7e7953d90400a66ac09
Author: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
bytecode: Change unit representation, so that length has a bit set.
This means that we can use a mask to check the unit class.
diff --git a/docs/Bytecode b/docs/Bytecode
index dd0f424..880ccbd 100644
--- a/docs/Bytecode
+++ b/docs/Bytecode
@@ -33,7 +33,7 @@ The table is found in the stylesheet object.
CSS dimensions are stored as two 32bit values: <length, units>.
Length is a 32bit numeric value (as described above) and unit is as follows:
- bit 8 clear => length unit
+ bit 8 set => length unit
bits 9-31: MBZ
bits 0-7 :
00000000 => px
@@ -58,11 +58,11 @@ Length is a 32bit numeric value (as described above) and unit is as follows:
00010011 => vmax
00010100 => q
- bit 8 set => percentage unit
+ bit 9 set => percentage unit
bits 9-31: MBZ
bits 0-7 : MBZ
- bit 9 set => angle unit
+ bit 10 set => angle unit
bits 10-31: MBZ
bit 8 : MBZ
bits 0-7 :
@@ -71,21 +71,21 @@ Length is a 32bit numeric value (as described above) and unit is as follows:
00000010 => rad
00000011 => turn
- bit 10 set => time unit
+ bit 11 set => time unit
bits 11-31: MBZ
bits 8-9 : MBZ
bits 0-7 :
00000000 => ms
00000001 => s
- bit 11 set => frequency unit
+ bit 12 set => frequency unit
bits 12-31: MBZ
bits 8-10 : MBZ
bits 0-7 :
00000000 => Hz
00000001 => kHz
- bit 12 set => resolution unit
+ bit 13 set => resolution unit
bits 13-31: MBZ
bits 8-11 : MBZ
bits 0-7 :
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 22703f7..7518281 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -23,49 +23,51 @@ enum flag {
FLAG_INHERIT = (1<<1)
};
+
typedef enum unit {
- UNIT_PX = 0,
- UNIT_EX = 1,
- UNIT_EM = 2,
- UNIT_IN = 3,
- UNIT_CM = 4,
- UNIT_MM = 5,
- UNIT_PT = 6,
- UNIT_PC = 7,
- UNIT_CAP = 8,
- UNIT_CH = 9,
- UNIT_IC = 10,
- UNIT_REM = 11,
- UNIT_LH = 12,
- UNIT_RLH = 13,
- UNIT_VH = 14,
- UNIT_VW = 15,
- UNIT_VI = 16,
- UNIT_VB = 17,
- UNIT_VMIN = 18,
- UNIT_VMAX = 19,
- UNIT_Q = 20,
-
- UNIT_PCT = (1 << 8),
-
- UNIT_ANGLE = (1 << 9),
- UNIT_DEG = (1 << 9) + 0,
- UNIT_GRAD = (1 << 9) + 1,
- UNIT_RAD = (1 << 9) + 2,
- UNIT_TURN = (1 << 9) + 3,
-
- UNIT_TIME = (1 << 10),
- UNIT_MS = (1 << 10) + 0,
- UNIT_S = (1 << 10) + 1,
-
- UNIT_FREQ = (1 << 11),
- UNIT_HZ = (1 << 11) + 0,
- UNIT_KHZ = (1 << 11) + 1,
-
- UNIT_RESOLUTION = (1 << 12),
- UNIT_DPI = (1 << 12) + 0,
- UNIT_DPCM = (1 << 12) + 1,
- UNIT_DPPX = (1 << 12) + 2,
+ UNIT_LENGTH = (1u << 8),
+ UNIT_PX = (1u << 8) + 0,
+ UNIT_EX = (1u << 8) + 1,
+ UNIT_EM = (1u << 8) + 2,
+ UNIT_IN = (1u << 8) + 3,
+ UNIT_CM = (1u << 8) + 4,
+ UNIT_MM = (1u << 8) + 5,
+ UNIT_PT = (1u << 8) + 6,
+ UNIT_PC = (1u << 8) + 7,
+ UNIT_CAP = (1u << 8) + 8,
+ UNIT_CH = (1u << 8) + 9,
+ UNIT_IC = (1u << 8) + 10,
+ UNIT_REM = (1u << 8) + 11,
+ UNIT_LH = (1u << 8) + 12,
+ UNIT_RLH = (1u << 8) + 13,
+ UNIT_VH = (1u << 8) + 14,
+ UNIT_VW = (1u << 8) + 15,
+ UNIT_VI = (1u << 8) + 16,
+ UNIT_VB = (1u << 8) + 17,
+ UNIT_VMIN = (1u << 8) + 18,
+ UNIT_VMAX = (1u << 8) + 19,
+ UNIT_Q = (1u << 8) + 20,
+
+ UNIT_PCT = (1 << 9),
+
+ UNIT_ANGLE = (1 << 10),
+ UNIT_DEG = (1 << 10) + 0,
+ UNIT_GRAD = (1 << 10) + 1,
+ UNIT_RAD = (1 << 10) + 2,
+ UNIT_TURN = (1 << 10) + 3,
+
+ UNIT_TIME = (1 << 11),
+ UNIT_MS = (1 << 11) + 0,
+ UNIT_S = (1 << 11) + 1,
+
+ UNIT_FREQ = (1 << 12),
+ UNIT_HZ = (1 << 12) + 0,
+ UNIT_KHZ = (1 << 12) + 1,
+
+ UNIT_RESOLUTION = (1 << 13),
+ UNIT_DPI = (1 << 13) + 0,
+ UNIT_DPCM = (1 << 13) + 1,
+ UNIT_DPPX = (1 << 13) + 2,
} unit;
typedef uint32_t colour;
diff --git a/test/data/parse/properties.dat b/test/data/parse/properties.dat
index 3dcb5a4..302b2dc 100644
--- a/test/data/parse/properties.dat
+++ b/test/data/parse/properties.dat
@@ -182,7 +182,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x0000b400 0x00000200
+| 0x02000000 0x0000b400 0x00000400
#reset
#data
@@ -190,7 +190,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0xffff4c00 0x00000200
+| 0x02000000 0xffff4c00 0x00000400
#reset
#data
@@ -198,7 +198,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x0000c800 0x00000201
+| 0x02000000 0x0000c800 0x00000401
#reset
#data
@@ -206,7 +206,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x00000324 0x00000202
+| 0x02000000 0x00000324 0x00000402
#reset
#data
@@ -214,7 +214,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0xfffffcdc 0x00000202
+| 0x02000000 0xfffffcdc 0x00000402
#reset
##
@@ -350,7 +350,7 @@
#errors
#expected
| 1 *
-| 0x02000004 0x00002800 0x00000100
+| 0x02000004 0x00002800 0x00000200
#reset
#data
@@ -358,7 +358,7 @@
#errors
#expected
| 1 *
-| 0x02000004 0x00000800 0x00000000
+| 0x02000004 0x00000800 0x00000100
#reset
#data
@@ -366,7 +366,7 @@
#errors
#expected
| 1 *
-| 0x02200004 0x00002800 0x00000100 0x00005000 0x00000100
+| 0x02200004 0x00002800 0x00000200 0x00005000 0x00000200
#reset
#data
@@ -374,7 +374,7 @@
#errors
#expected
| 1 *
-| 0x02200004 0x00002800 0x00000100 0x00000800 0x00000000
+| 0x02200004 0x00002800 0x00000200 0x00000800 0x00000100
#reset
#data
@@ -382,7 +382,7 @@
#errors
#expected
| 1 *
-| 0x02040004 0x00000800 0x00000000
+| 0x02040004 0x00000800 0x00000100
#reset
# possible quirk
@@ -391,7 +391,7 @@
##errors
##expected
#| 1 *
-#| 0x02040004 0x00000800 0x00000000
+#| 0x02040004 0x00000800 0x00000100
##reset
#data
@@ -399,7 +399,7 @@
#errors
#expected
| 1 *
-| 0x00a00004 0x00002800 0x00000100
+| 0x00a00004 0x00002800 0x00000200
#reset
#data
@@ -407,7 +407,7 @@
#errors
#expected
| 1 *
-| 0x02200404 0x00002800 0x00000100 0x00005000 0x00000100
+| 0x02200404 0x00002800 0x00000200 0x00005000 0x00000200
#reset
##
@@ -475,7 +475,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000c00 0x00000002 0x00000c00 0x00000002
+| 0x02000007 0x00000c00 0x00000102 0x00000c00 0x00000102
#reset
#data
@@ -483,7 +483,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000a00 0x00000002 0x00000a00 0x00000002
+| 0x02000007 0x00000a00 0x00000102 0x00000a00 0x00000102
#reset
#data
@@ -491,7 +491,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000c00 0x00000000 0x00000a00 0x00000002
+| 0x02000007 0x00000c00 0x00000100 0x00000a00 0x00000102
#reset
#data
@@ -499,7 +499,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000c00 0x00000002 0x00000c00 0x00000002
+| 0x02000407 0x00000c00 0x00000102 0x00000c00 0x00000102
#reset
#data
@@ -507,7 +507,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000a00 0x00000002 0x00000a00 0x00000002
+| 0x02000407 0x00000a00 0x00000102 0x00000a00 0x00000102
#reset
#data
@@ -515,7 +515,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000c00 0x00000000 0x00000a00 0x00000002
+| 0x02000407 0x00000c00 0x00000100 0x00000a00 0x00000102
#reset
##
@@ -688,7 +688,7 @@
#errors
#expected
| 1 *
-| 0x02000013 0x00000000 0x00000000
+| 0x02000013 0x00000000 0x00000100
#reset
#data
@@ -696,7 +696,7 @@
#errors
#expected
| 1 *
-| 0x02000010 0x00000800 0x00000000
+| 0x02000010 0x00000800 0x00000100
#reset
##
@@ -716,7 +716,7 @@
#errors
#expected
| 1 *
-| 0x02000014 0x00000300 0x00000002
+| 0x02000014 0x00000300 0x00000102
#reset
#data
@@ -724,7 +724,7 @@
#errors
#expected
| 1 *
-| 0x02000014 0x00010aab 0x00000100
+| 0x02000014 0x00010aab 0x00000200
#reset
##
@@ -800,7 +800,7 @@
#errors
#expected
| 1 *
-| 0x02c00017 0x00002800 0x00000000 0x00002800 0x00000000
+| 0x02c00017 0x00002800 0x00000100 0x00002800 0x00000100
#reset
#data
@@ -816,7 +816,7 @@
#errors
#expected
| 1 *
-| 0x02000017 0x00000400 0x00000000 0x00000800 0x00000000 0x00000c00 0x00000000 0x00001000 0x00000000
+| 0x02000017 0x00000400 0x00000100 0x00000800 0x00000100 0x00000c00 0x00000100 0x00001000 0x00000100
#reset
#data
@@ -824,7 +824,7 @@
#errors
#expected
| 1 *
-| 0x03200017 0x00000400 0x00000002 0x00000400 0x00000002
+| 0x03200017 0x00000400 0x00000102 0x00000400 0x00000102
#reset
#data
@@ -832,7 +832,7 @@
#errors
#expected
| 1 *
-| 0x02000017 0x00000000 0x00000000 0x00037000 0x00000000 0x000006cd 0x00000002 0x00000000 0x00000000
+| 0x02000017 0x00000000 0x00000100 0x00037000 0x00000100 0x000006cd 0x00000102 0x00000000 0x00000100
#reset
#data
@@ -848,7 +848,7 @@
#errors
#expected
| 1 *
-| 0x02c00417 0x00002800 0x00000000 0x00002800 0x00000000
+| 0x02c00417 0x00002800 0x00000100 0x00002800 0x00000100
#reset
#data
@@ -864,7 +864,7 @@
#errors
#expected
| 1 *
-| 0x02000417 0x00000400 0x00000000 0x00000800 0x00000000 0x00000c00 0x00000000 0x00001000 0x00000000
+| 0x02000417 0x00000400 0x00000100 0x00000800 0x00000100 0x00000c00 0x00000100 0x00001000 0x00000100
#reset
#data
@@ -872,7 +872,7 @@
#errors
#expected
| 1 *
-| 0x03200417 0x00000400 0x00000002 0x00000400 0x00000002
+| 0x03200417 0x00000400 0x00000102 0x00000400 0x00000102
#reset
#data
@@ -880,7 +880,7 @@
#errors
#expected
| 1 *
-| 0x02000417 0x00000000 0x00000000 0x00037000 0x00000000 0x000006cd 0x00000002 0x00000000 0x00000000
+| 0x02000417 0x00000000 0x00000100 0x00037000 0x00000100 0x000006cd 0x00000102 0x00000000 0x00000100
#reset
##
@@ -1708,7 +1708,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x0000b400 0x00000200
+| 0x02000021 0x0000b400 0x00000400
#reset
#data
@@ -1716,7 +1716,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0xffff4c00 0x00000200
+| 0x02000021 0xffff4c00 0x00000400
#reset
#data
@@ -1724,7 +1724,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x0000c800 0x00000201
+| 0x02000021 0x0000c800 0x00000401
#reset
#data
@@ -1732,7 +1732,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x00000324 0x00000202
+| 0x02000021 0x00000324 0x00000402
#reset
#data
@@ -1748,7 +1748,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000421 0x0000b400 0x00000200
+| 0x02000421 0x0000b400 0x00000400
#reset
##
@@ -1956,7 +1956,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x00003000 0x00000006
+| 0x02000025 0x00003000 0x00000106
#reset
#data
@@ -1964,7 +1964,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x00019000 0x00000000
+| 0x02000025 0x00019000 0x00000100
#reset
#data
@@ -1972,7 +1972,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x0001e000 0x00000100
+| 0x02000025 0x0001e000 0x00000200
#reset
##
@@ -2148,7 +2148,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000029 0x061a7fff 0x00000001
+| 0x02000029 0x061a7fff 0x00000101
#reset
#data
@@ -2156,7 +2156,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000029 0x00010aab 0x00000100
+| 0x02000029 0x00010aab 0x00000200
#reset
##
@@ -2176,7 +2176,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002a 0x00000200 0x00000003
+| 0x0200002a 0x00000200 0x00000103
#reset
#data
@@ -2184,7 +2184,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002a 0x00001000 0x00000100
+| 0x0200002a 0x00001000 0x00000200
#reset
##
@@ -2204,7 +2204,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002b 0x00000152 0x00000004
+| 0x0200002b 0x00000152 0x00000104
#reset
#data
@@ -2212,7 +2212,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200042b 0x00000152 0x00000004
+| 0x0200042b 0x00000152 0x00000104
#reset
##
@@ -2240,7 +2240,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204002c 0x00003000 0x00000005
+| 0x0204002c 0x00003000 0x00000105
#reset
#data
@@ -2256,7 +2256,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204042c 0x00003000 0x00000005
+| 0x0204042c 0x00003000 0x00000105
#reset
#data
@@ -2264,7 +2264,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204002c 0x00008552 0x00000100
+| 0x0204002c 0x00008552 0x00000200
#reset
##
@@ -2475,7 +2475,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000030 0x00002800 0x00000007
+| 0x02000030 0x00002800 0x00000107
#reset
#data
@@ -2483,7 +2483,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000031 0x00000400 0x00000000
+| 0x02000031 0x00000400 0x00000100
#reset
#data
@@ -2491,7 +2491,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000032 0x00000800 0x00000002
+| 0x02000032 0x00000800 0x00000102
#reset
#data
@@ -2499,7 +2499,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000033 0x00001400 0x00000100
+| 0x02000033 0x00001400 0x00000200
#reset
##
@@ -2519,7 +2519,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000034 0x00019000 0x00000000
+| 0x02000034 0x00019000 0x00000100
#reset
#data
@@ -2527,7 +2527,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000434 0x00019000 0x00000000
+| 0x02000434 0x00019000 0x00000100
#reset
#data
@@ -2535,7 +2535,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000034 0x0000c800 0x00000100
+| 0x02000034 0x0000c800 0x00000200
#reset
##
@@ -2555,7 +2555,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000035 0x00019000 0x00000000
+| 0x02000035 0x00019000 0x00000100
#reset
#data
@@ -2563,7 +2563,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000035 0x0000c800 0x00000100
+| 0x02000035 0x0000c800 0x00000200
#reset
##
@@ -2575,7 +2575,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000036 0x00019000 0x00000000
+| 0x02000036 0x00019000 0x00000100
#reset
#data
@@ -2583,7 +2583,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000036 0x0000c800 0x00000100
+| 0x02000036 0x0000c800 0x00000200
#reset
##
@@ -2595,7 +2595,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000037 0x00019000 0x00000000
+| 0x02000037 0x00019000 0x00000100
#reset
#data
@@ -2603,7 +2603,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000037 0x0000c800 0x00000100
+| 0x02000037 0x0000c800 0x00000200
#reset
##
@@ -2763,7 +2763,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003b 0x00000c00 0x00000000
+| 0x0200003b 0x00000c00 0x00000100
#reset
#data
@@ -2771,7 +2771,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003b 0x00000000 0x00000000
+| 0x0200003b 0x00000000 0x00000100
#reset
##
@@ -2858,7 +2858,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003d 0x00002800 0x00000007
+| 0x0200003d 0x00002800 0x00000107
#reset
#data
@@ -2866,7 +2866,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003e 0x00000400 0x00000000
+| 0x0200003e 0x00000400 0x00000100
#reset
#data
@@ -2874,7 +2874,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003f 0x00000800 0x00000002
+| 0x0200003f 0x00000800 0x00000102
#reset
#data
@@ -2882,7 +2882,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000040 0x00001400 0x00000100
+| 0x02000040 0x00001400 0x00000200
#reset
##
@@ -3002,7 +3002,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x00000000 0x00000401
+| 0x02000044 0x00000000 0x00000801
#reset
#data
@@ -3010,7 +3010,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x00019000 0x00000400
+| 0x02000044 0x00019000 0x00000800
#reset
#data
@@ -3018,7 +3018,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x000002cd 0x00000401
+| 0x02000044 0x000002cd 0x00000801
#reset
#data
@@ -3026,7 +3026,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x0001e000 0x00000100
+| 0x02000044 0x0001e000 0x00000200
#reset
##
@@ -3038,7 +3038,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x00000000 0x00000401
+| 0x02000045 0x00000000 0x00000801
#reset
#data
@@ -3046,7 +3046,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x00019000 0x00000400
+| 0x02000045 0x00019000 0x00000800
#reset
#data
@@ -3054,7 +3054,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x000002cd 0x00000401
+| 0x02000045 0x000002cd 0x00000801
#reset
#data
@@ -3062,7 +3062,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x0001e000 0x00000100
+| 0x02000045 0x0001e000 0x00000200
#reset
##
@@ -3150,7 +3150,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00000000 0x00000800
+| 0x02000047 0x00000000 0x00001000
#reset
#data
@@ -3158,7 +3158,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000447 0x00000000 0x00000800
+| 0x02000447 0x00000000 0x00001000
#reset
#data
@@ -3166,7 +3166,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00064000 0x00000800
+| 0x02000047 0x00064000 0x00001000
#reset
#data
@@ -3174,7 +3174,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00000466 0x00000801
+| 0x02000047 0x00000466 0x00001001
#reset
##
@@ -3370,7 +3370,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200004c 0x00000200 0x00000003
+| 0x0200004c 0x00000200 0x00000103
#reset
#data
@@ -3378,7 +3378,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200004c 0x00001000 0x00000100
+| 0x0200004c 0x00001000 0x00000200
#reset
##
@@ -3738,7 +3738,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00000000 0x00000000
+| 0x02000056 0x00000000 0x00000100
#reset
#data
@@ -3746,7 +3746,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00003000 0x00000005
+| 0x02000056 0x00003000 0x00000105
#reset
#data
@@ -3754,7 +3754,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00008552 0x00000100
+| 0x02000056 0x00008552 0x00000200
#reset
##
@@ -3810,7 +3810,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000058 0x00000200 0x00000003
+| 0x02000058 0x00000200 0x00000103
#reset
#data
@@ -3818,7 +3818,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000058 0x00001000 0x00000100
+| 0x02000058 0x00001000 0x00000200
#reset
##
@@ -3922,7 +3922,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200045a 0xffffd800 0x00000100
+| 0x0200045a 0xffffd800 0x00000200
#reset
#data
@@ -3930,7 +3930,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0xffffd800 0x00000100
+| 0x0200005a 0xffffd800 0x00000200
#reset
#data
@@ -3938,7 +3938,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0x00005000 0x00000100
+| 0x0200005a 0x00005000 0x00000200
#reset
#data
@@ -3946,7 +3946,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0x00001000 0x00000000
+| 0x0200005a 0x00001000 0x00000100
#reset
#data
@@ -3954,7 +3954,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0xfffff000 0x00000000
+| 0x0200005a 0xfffff000 0x00000100
#reset
##
@@ -4135,7 +4135,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204005d 0x00008552 0x00000100
+| 0x0204005d 0x00008552 0x00000200
#reset
# dunno if % can be tested here, cos it's a percentage of the inherited value
@@ -4144,7 +4144,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204045d 0x00008552 0x00000100
+| 0x0204045d 0x00008552 0x00000200
#reset
##
@@ -4220,7 +4220,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000060 0x061a7fff 0x00000001
+| 0x02000060 0x061a7fff 0x00000101
#reset
#data
@@ -4228,7 +4228,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000060 0x00010aab 0x00000100
+| 0x02000060 0x00010aab 0x00000200
#reset
##
@@ -4248,7 +4248,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000061 0x00000066 0x00000002
+| 0x02000061 0x00000066 0x00000102
#reset
##
@@ -4540,7 +4540,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000069 0x00000066 0x00000002
+| 0x02000069 0x00000066 0x00000102
#reset
##
@@ -4688,7 +4688,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006c 0x00000c00 0x00000000
+| 0x0200006c 0x00000c00 0x00000100
#reset
#data
@@ -4696,7 +4696,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006c 0x00000000 0x00000000
+| 0x0200006c 0x00000000 0x00000100
#reset
##
@@ -4736,7 +4736,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006e 0x00000066 0x00000002
+| 0x0200006e 0x00000066 0x00000102
#reset
##
-----------------------------------------------------------------------
Summary of changes:
docs/Bytecode | 12 +-
src/bytecode/bytecode.h | 86 +++++-----
src/parse/properties/css_property_parser_gen.c | 7 +
src/parse/properties/properties.c | 128 +++++++++++++++
src/parse/properties/properties.gen | 46 +++---
src/parse/properties/properties.h | 113 +++++++++++++
test/data/parse/properties.dat | 200 ++++++++++++------------
7 files changed, 421 insertions(+), 171 deletions(-)
diff --git a/docs/Bytecode b/docs/Bytecode
index dd0f424..880ccbd 100644
--- a/docs/Bytecode
+++ b/docs/Bytecode
@@ -33,7 +33,7 @@ The table is found in the stylesheet object.
CSS dimensions are stored as two 32bit values: <length, units>.
Length is a 32bit numeric value (as described above) and unit is as follows:
- bit 8 clear => length unit
+ bit 8 set => length unit
bits 9-31: MBZ
bits 0-7 :
00000000 => px
@@ -58,11 +58,11 @@ Length is a 32bit numeric value (as described above) and unit is as follows:
00010011 => vmax
00010100 => q
- bit 8 set => percentage unit
+ bit 9 set => percentage unit
bits 9-31: MBZ
bits 0-7 : MBZ
- bit 9 set => angle unit
+ bit 10 set => angle unit
bits 10-31: MBZ
bit 8 : MBZ
bits 0-7 :
@@ -71,21 +71,21 @@ Length is a 32bit numeric value (as described above) and unit is as follows:
00000010 => rad
00000011 => turn
- bit 10 set => time unit
+ bit 11 set => time unit
bits 11-31: MBZ
bits 8-9 : MBZ
bits 0-7 :
00000000 => ms
00000001 => s
- bit 11 set => frequency unit
+ bit 12 set => frequency unit
bits 12-31: MBZ
bits 8-10 : MBZ
bits 0-7 :
00000000 => Hz
00000001 => kHz
- bit 12 set => resolution unit
+ bit 13 set => resolution unit
bits 13-31: MBZ
bits 8-11 : MBZ
bits 0-7 :
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 22703f7..7518281 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -23,49 +23,51 @@ enum flag {
FLAG_INHERIT = (1<<1)
};
+
typedef enum unit {
- UNIT_PX = 0,
- UNIT_EX = 1,
- UNIT_EM = 2,
- UNIT_IN = 3,
- UNIT_CM = 4,
- UNIT_MM = 5,
- UNIT_PT = 6,
- UNIT_PC = 7,
- UNIT_CAP = 8,
- UNIT_CH = 9,
- UNIT_IC = 10,
- UNIT_REM = 11,
- UNIT_LH = 12,
- UNIT_RLH = 13,
- UNIT_VH = 14,
- UNIT_VW = 15,
- UNIT_VI = 16,
- UNIT_VB = 17,
- UNIT_VMIN = 18,
- UNIT_VMAX = 19,
- UNIT_Q = 20,
-
- UNIT_PCT = (1 << 8),
-
- UNIT_ANGLE = (1 << 9),
- UNIT_DEG = (1 << 9) + 0,
- UNIT_GRAD = (1 << 9) + 1,
- UNIT_RAD = (1 << 9) + 2,
- UNIT_TURN = (1 << 9) + 3,
-
- UNIT_TIME = (1 << 10),
- UNIT_MS = (1 << 10) + 0,
- UNIT_S = (1 << 10) + 1,
-
- UNIT_FREQ = (1 << 11),
- UNIT_HZ = (1 << 11) + 0,
- UNIT_KHZ = (1 << 11) + 1,
-
- UNIT_RESOLUTION = (1 << 12),
- UNIT_DPI = (1 << 12) + 0,
- UNIT_DPCM = (1 << 12) + 1,
- UNIT_DPPX = (1 << 12) + 2,
+ UNIT_LENGTH = (1u << 8),
+ UNIT_PX = (1u << 8) + 0,
+ UNIT_EX = (1u << 8) + 1,
+ UNIT_EM = (1u << 8) + 2,
+ UNIT_IN = (1u << 8) + 3,
+ UNIT_CM = (1u << 8) + 4,
+ UNIT_MM = (1u << 8) + 5,
+ UNIT_PT = (1u << 8) + 6,
+ UNIT_PC = (1u << 8) + 7,
+ UNIT_CAP = (1u << 8) + 8,
+ UNIT_CH = (1u << 8) + 9,
+ UNIT_IC = (1u << 8) + 10,
+ UNIT_REM = (1u << 8) + 11,
+ UNIT_LH = (1u << 8) + 12,
+ UNIT_RLH = (1u << 8) + 13,
+ UNIT_VH = (1u << 8) + 14,
+ UNIT_VW = (1u << 8) + 15,
+ UNIT_VI = (1u << 8) + 16,
+ UNIT_VB = (1u << 8) + 17,
+ UNIT_VMIN = (1u << 8) + 18,
+ UNIT_VMAX = (1u << 8) + 19,
+ UNIT_Q = (1u << 8) + 20,
+
+ UNIT_PCT = (1 << 9),
+
+ UNIT_ANGLE = (1 << 10),
+ UNIT_DEG = (1 << 10) + 0,
+ UNIT_GRAD = (1 << 10) + 1,
+ UNIT_RAD = (1 << 10) + 2,
+ UNIT_TURN = (1 << 10) + 3,
+
+ UNIT_TIME = (1 << 11),
+ UNIT_MS = (1 << 11) + 0,
+ UNIT_S = (1 << 11) + 1,
+
+ UNIT_FREQ = (1 << 12),
+ UNIT_HZ = (1 << 12) + 0,
+ UNIT_KHZ = (1 << 12) + 1,
+
+ UNIT_RESOLUTION = (1 << 13),
+ UNIT_DPI = (1 << 13) + 0,
+ UNIT_DPCM = (1 << 13) + 1,
+ UNIT_DPPX = (1 << 13) + 2,
} unit;
typedef uint32_t colour;
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index 0e6ce72..24cc536 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -326,6 +326,13 @@ void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_lis
"\t\t\treturn CSS_INVALID;\n"
"\t\t}\n\n",
ulkv->val);
+ } else if (strcmp(ulkv->key, "MASK") == 0) {
+ fprintf(outputf,
+ "\t\tif ((unit & %s ) == 0) {\n"
+ "\t\t\t*ctx = orig_ctx;\n"
+ "\t\t\treturn CSS_INVALID;\n"
+ "\t\t}\n\n",
+ ulkv->val);
} else if (strcmp(ulkv->key, "RANGE") == 0) {
fprintf(outputf,
"\t\tif (length %s) {\n"
diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c
index 3f374fa..06524da 100644
--- a/src/parse/properties/properties.c
+++ b/src/parse/properties/properties.c
@@ -158,3 +158,131 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
css__parse_writing_mode,
css__parse_z_index
};
+
+/** Mapping from property bytecode index to bytecode unit class mask. */
+const uint32_t property_unit_mask[CSS_N_PROPERTIES] = {
+ [CSS_PROP_AZIMUTH] = UNIT_MASK_AZIMUTH,
+ [CSS_PROP_BACKGROUND_ATTACHMENT] = UNIT_MASK_BACKGROUND_ATTACHMENT,
+ [CSS_PROP_BACKGROUND_COLOR] = UNIT_MASK_BACKGROUND_COLOR,
+ [CSS_PROP_BACKGROUND_IMAGE] = UNIT_MASK_BACKGROUND_IMAGE,
+ [CSS_PROP_BACKGROUND_POSITION] = UNIT_MASK_BACKGROUND_POSITION,
+ [CSS_PROP_BACKGROUND_REPEAT] = UNIT_MASK_BACKGROUND_REPEAT,
+ [CSS_PROP_BORDER_COLLAPSE] = UNIT_MASK_BORDER_COLLAPSE,
+ [CSS_PROP_BORDER_SPACING] = UNIT_MASK_BORDER_SPACING,
+ [CSS_PROP_BORDER_TOP_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_RIGHT_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_BOTTOM_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_LEFT_COLOR] = UNIT_MASK_BORDER_SIDE_COLOR,
+ [CSS_PROP_BORDER_TOP_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_RIGHT_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_BOTTOM_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_LEFT_STYLE] = UNIT_MASK_BORDER_SIDE_STYLE,
+ [CSS_PROP_BORDER_TOP_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_RIGHT_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_BOTTOM_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BORDER_LEFT_WIDTH] = UNIT_MASK_BORDER_SIDE_WIDTH,
+ [CSS_PROP_BOTTOM] = UNIT_MASK_BOTTOM,
+ [CSS_PROP_CAPTION_SIDE] = UNIT_MASK_CAPTION_SIDE,
+ [CSS_PROP_CLEAR] = UNIT_MASK_CLEAR,
+ [CSS_PROP_CLIP] = UNIT_MASK_CLIP,
+ [CSS_PROP_COLOR] = UNIT_MASK_COLOR,
+ [CSS_PROP_CONTENT] = UNIT_MASK_CONTENT,
+ [CSS_PROP_COUNTER_INCREMENT] = UNIT_MASK_COUNTER_INCREMENT,
+ [CSS_PROP_COUNTER_RESET] = UNIT_MASK_COUNTER_RESET,
+ [CSS_PROP_CUE_AFTER] = UNIT_MASK_CUE_AFTER,
+ [CSS_PROP_CUE_BEFORE] = UNIT_MASK_CUE_BEFORE,
+ [CSS_PROP_CURSOR] = UNIT_MASK_CURSOR,
+ [CSS_PROP_DIRECTION] = UNIT_MASK_DIRECTION,
+ [CSS_PROP_DISPLAY] = UNIT_MASK_DISPLAY,
+ [CSS_PROP_ELEVATION] = UNIT_MASK_ELEVATION,
+ [CSS_PROP_EMPTY_CELLS] = UNIT_MASK_EMPTY_CELLS,
+ [CSS_PROP_FLOAT] = UNIT_MASK_FLOAT,
+ [CSS_PROP_FONT_FAMILY] = UNIT_MASK_FONT_FAMILY,
+ [CSS_PROP_FONT_SIZE] = UNIT_MASK_FONT_SIZE,
+ [CSS_PROP_FONT_STYLE] = UNIT_MASK_FONT_STYLE,
+ [CSS_PROP_FONT_VARIANT] = UNIT_MASK_FONT_VARIANT,
+ [CSS_PROP_FONT_WEIGHT] = UNIT_MASK_FONT_WEIGHT,
+ [CSS_PROP_HEIGHT] = UNIT_MASK_HEIGHT,
+ [CSS_PROP_LEFT] = UNIT_MASK_LEFT,
+ [CSS_PROP_LETTER_SPACING] = UNIT_MASK_LETTER_SPACING,
+ [CSS_PROP_LINE_HEIGHT] = UNIT_MASK_LINE_HEIGHT,
+ [CSS_PROP_LIST_STYLE_IMAGE] = UNIT_MASK_LIST_STYLE_IMAGE,
+ [CSS_PROP_LIST_STYLE_POSITION] = UNIT_MASK_LIST_STYLE_POSITION,
+ [CSS_PROP_LIST_STYLE_TYPE] = UNIT_MASK_LIST_STYLE_TYPE,
+ [CSS_PROP_MARGIN_TOP] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_RIGHT] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_BOTTOM] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MARGIN_LEFT] = UNIT_MASK_MARGIN_SIDE,
+ [CSS_PROP_MAX_HEIGHT] = UNIT_MASK_MAX_HEIGHT,
+ [CSS_PROP_MAX_WIDTH] = UNIT_MASK_MAX_WIDTH,
+ [CSS_PROP_MIN_HEIGHT] = UNIT_MASK_MIN_HEIGHT,
+ [CSS_PROP_MIN_WIDTH] = UNIT_MASK_MIN_WIDTH,
+ [CSS_PROP_ORPHANS] = UNIT_MASK_ORPHANS,
+ [CSS_PROP_OUTLINE_COLOR] = UNIT_MASK_OUTLINE_COLOR,
+ [CSS_PROP_OUTLINE_STYLE] = UNIT_MASK_OUTLINE_STYLE,
+ [CSS_PROP_OUTLINE_WIDTH] = UNIT_MASK_OUTLINE_WIDTH,
+ [CSS_PROP_OVERFLOW_X] = UNIT_MASK_OVERFLOW_X,
+ [CSS_PROP_PADDING_TOP] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_RIGHT] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_BOTTOM] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PADDING_LEFT] = UNIT_MASK_PADDING_SIDE,
+ [CSS_PROP_PAGE_BREAK_AFTER] = UNIT_MASK_PAGE_BREAK_AFTER,
+ [CSS_PROP_PAGE_BREAK_BEFORE] = UNIT_MASK_PAGE_BREAK_BEFORE,
+ [CSS_PROP_PAGE_BREAK_INSIDE] = UNIT_MASK_PAGE_BREAK_INSIDE,
+ [CSS_PROP_PAUSE_AFTER] = UNIT_MASK_PAUSE_AFTER,
+ [CSS_PROP_PAUSE_BEFORE] = UNIT_MASK_PAUSE_BEFORE,
+ [CSS_PROP_PITCH_RANGE] = UNIT_MASK_PITCH_RANGE,
+ [CSS_PROP_PITCH] = UNIT_MASK_PITCH,
+ [CSS_PROP_PLAY_DURING] = UNIT_MASK_PLAY_DURING,
+ [CSS_PROP_POSITION] = UNIT_MASK_POSITION,
+ [CSS_PROP_QUOTES] = UNIT_MASK_QUOTES,
+ [CSS_PROP_RICHNESS] = UNIT_MASK_RICHNESS,
+ [CSS_PROP_RIGHT] = UNIT_MASK_RIGHT,
+ [CSS_PROP_SPEAK_HEADER] = UNIT_MASK_SPEAK_HEADER,
+ [CSS_PROP_SPEAK_NUMERAL] = UNIT_MASK_SPEAK_NUMERAL,
+ [CSS_PROP_SPEAK_PUNCTUATION] = UNIT_MASK_SPEAK_PUNCTUATION,
+ [CSS_PROP_SPEAK] = UNIT_MASK_SPEAK,
+ [CSS_PROP_SPEECH_RATE] = UNIT_MASK_SPEECH_RATE,
+ [CSS_PROP_STRESS] = UNIT_MASK_STRESS,
+ [CSS_PROP_TABLE_LAYOUT] = UNIT_MASK_TABLE_LAYOUT,
+ [CSS_PROP_TEXT_ALIGN] = UNIT_MASK_TEXT_ALIGN,
+ [CSS_PROP_TEXT_DECORATION] = UNIT_MASK_TEXT_DECORATION,
+ [CSS_PROP_TEXT_INDENT] = UNIT_MASK_TEXT_INDENT,
+ [CSS_PROP_TEXT_TRANSFORM] = UNIT_MASK_TEXT_TRANSFORM,
+ [CSS_PROP_TOP] = UNIT_MASK_TOP,
+ [CSS_PROP_UNICODE_BIDI] = UNIT_MASK_UNICODE_BIDI,
+ [CSS_PROP_VERTICAL_ALIGN] = UNIT_MASK_VERTICAL_ALIGN,
+ [CSS_PROP_VISIBILITY] = UNIT_MASK_VISIBILITY,
+ [CSS_PROP_VOICE_FAMILY] = UNIT_MASK_VOICE_FAMILY,
+ [CSS_PROP_VOLUME] = UNIT_MASK_VOLUME,
+ [CSS_PROP_WHITE_SPACE] = UNIT_MASK_WHITE_SPACE,
+ [CSS_PROP_WIDOWS] = UNIT_MASK_WIDOWS,
+ [CSS_PROP_WIDTH] = UNIT_MASK_WIDTH,
+ [CSS_PROP_WORD_SPACING] = UNIT_MASK_WORD_SPACING,
+ [CSS_PROP_Z_INDEX] = UNIT_MASK_Z_INDEX,
+ [CSS_PROP_OPACITY] = UNIT_MASK_OPACITY,
+ [CSS_PROP_BREAK_AFTER] = UNIT_MASK_BREAK_AFTER,
+ [CSS_PROP_BREAK_BEFORE] = UNIT_MASK_BREAK_BEFORE,
+ [CSS_PROP_BREAK_INSIDE] = UNIT_MASK_BREAK_INSIDE,
+ [CSS_PROP_COLUMN_COUNT] = UNIT_MASK_COLUMN_COUNT,
+ [CSS_PROP_COLUMN_FILL] = UNIT_MASK_COLUMN_FILL,
+ [CSS_PROP_COLUMN_GAP] = UNIT_MASK_COLUMN_GAP,
+ [CSS_PROP_COLUMN_RULE_COLOR] = UNIT_MASK_COLUMN_RULE_COLOR,
+ [CSS_PROP_COLUMN_RULE_STYLE] = UNIT_MASK_COLUMN_RULE_STYLE,
+ [CSS_PROP_COLUMN_RULE_WIDTH] = UNIT_MASK_COLUMN_RULE_WIDTH,
+ [CSS_PROP_COLUMN_SPAN] = UNIT_MASK_COLUMN_SPAN,
+ [CSS_PROP_COLUMN_WIDTH] = UNIT_MASK_COLUMN_WIDTH,
+ [CSS_PROP_WRITING_MODE] = UNIT_MASK_WRITING_MODE,
+ [CSS_PROP_OVERFLOW_Y] = UNIT_MASK_OVERFLOW_Y,
+ [CSS_PROP_BOX_SIZING] = UNIT_MASK_BOX_SIZING,
+ [CSS_PROP_ALIGN_CONTENT] = UNIT_MASK_ALIGN_CONTENT,
+ [CSS_PROP_ALIGN_ITEMS] = UNIT_MASK_ALIGN_ITEMS,
+ [CSS_PROP_ALIGN_SELF] = UNIT_MASK_ALIGN_SELF,
+ [CSS_PROP_FLEX_BASIS] = UNIT_MASK_FLEX_BASIS,
+ [CSS_PROP_FLEX_DIRECTION] = UNIT_MASK_FLEX_DIRECTION,
+ [CSS_PROP_FLEX_GROW] = UNIT_MASK_FLEX_GROW,
+ [CSS_PROP_FLEX_SHRINK] = UNIT_MASK_FLEX_SHRINK,
+ [CSS_PROP_FLEX_WRAP] = UNIT_MASK_FLEX_WRAP,
+ [CSS_PROP_JUSTIFY_CONTENT] = UNIT_MASK_JUSTIFY_CONTENT,
+ [CSS_PROP_ORDER] = UNIT_MASK_ORDER,
+};
diff --git a/src/parse/properties/properties.gen b/src/parse/properties/properties.gen
index 61dcd5e..e729285 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -22,35 +22,35 @@ empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: SHOW:0,EMPTY_CELLS_SHOW HIDE:0
float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT NONE:0,FLOAT_NONE IDENT:)
-font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+font_size:CSS_PROP_FONT_SIZE IDENT:( INHERIT: XX_SMALL:0,FONT_SIZE_XX_SMALL X_SMALL:0,FONT_SIZE_X_SMALL SMALL:0,FONT_SIZE_SMALL MEDIUM:0,FONT_SIZE_MEDIUM LARGE:0,FONT_SIZE_LARGE X_LARGE:0,FONT_SIZE_X_LARGE XX_LARGE:0,FONT_SIZE_XX_LARGE LARGER:0,FONT_SIZE_LARGER SMALLER:0,FONT_SIZE_SMALLER IDENT:) LENGTH_UNIT:( UNIT_PX:FONT_SIZE_DIMENSION MASK:UNIT_MASK_FONT_SIZE RANGE:<0 LENGTH_UNIT:)
font_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: NORMAL:0,FONT_STYLE_NORMAL ITALIC:0,FONT_STYLE_ITALIC OBLIQUE:0,FONT_STYLE_OBLIQUE IDENT:)
font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: NORMAL:0,FONT_VARIANT_NORMAL SMALL_CAPS:0,FONT_VARIANT_SMALL_CAPS IDENT:)
-height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+height:CSS_PROP_HEIGHT IDENT:( INHERIT: AUTO:0,HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:HEIGHT_SET MASK:UNIT_MASK_HEIGHT RANGE:<0 LENGTH_UNIT:)
-letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+letter_spacing:CSS_PROP_LETTER_SPACING IDENT:( INHERIT: NORMAL:0,LETTER_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:LETTER_SPACING_SET MASK:UNIT_MASK_LETTER_SPACING LENGTH_UNIT:)
-line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+line_height:CSS_PROP_LINE_HEIGHT IDENT:( INHERIT: NORMAL:0,LINE_HEIGHT_NORMAL IDENT:) NUMBER:( false:LINE_HEIGHT_NUMBER RANGE:num<0 NUMBER:) LENGTH_UNIT:( UNIT_PX:LINE_HEIGHT_DIMENSION MASK:UNIT_MASK_LINE_HEIGHT RANGE:<0 LENGTH_UNIT:)
border_top:BORDER_SIDE_TOP WRAP:css__parse_border_side
border_bottom:BORDER_SIDE_BOTTOM WRAP:css__parse_border_side
border_left:BORDER_SIDE_LEFT WRAP:css__parse_border_side
border_right:BORDER_SIDE_RIGHT WRAP:css__parse_border_side
-max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_height:CSS_PROP_MAX_HEIGHT IDENT:( INHERIT: NONE:0,MAX_HEIGHT_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_HEIGHT_SET MASK:UNIT_MASK_MAX_HEIGHT RANGE:<0 LENGTH_UNIT:)
-max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+max_width:CSS_PROP_MAX_WIDTH IDENT:( INHERIT: NONE:0,MAX_WIDTH_NONE IDENT:) LENGTH_UNIT:( UNIT_PX:MAX_WIDTH_SET MASK:UNIT_MASK_MAX_WIDTH RANGE:<0 LENGTH_UNIT:)
-min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_height:CSS_PROP_MIN_HEIGHT IDENT:( INHERIT: AUTO:0,MIN_HEIGHT_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_HEIGHT_SET MASK:UNIT_MASK_MIN_HEIGHT RANGE:<0 LENGTH_UNIT:)
-min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+min_width:CSS_PROP_MIN_WIDTH IDENT:( INHERIT: AUTO:0,MIN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MIN_WIDTH_SET MASK:UNIT_MASK_MIN_WIDTH RANGE:<0 LENGTH_UNIT:)
color:CSS_PROP_COLOR IDENT:INHERIT COLOR:COLOR_SET
#generic for padding_{top, bottom, left, right}.c
-padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+padding_side:op GENERIC: IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:PADDING_SET MASK:UNIT_MASK_PADDING_SIDE RANGE:<0 LENGTH_UNIT:)
padding_bottom:CSS_PROP_PADDING_BOTTOM WRAP:css__parse_padding_side
padding_left:CSS_PROP_PADDING_LEFT WRAP:css__parse_padding_side
@@ -59,7 +59,7 @@ padding_right:CSS_PROP_PADDING_RIGHT WRAP:css__parse_padding_side
#generic for margin_{top, bottom, left, right}.c
-margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+margin_side:op GENERIC IDENT:( INHERIT: AUTO:0,MARGIN_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:MARGIN_SET MASK:UNIT_MASK_MARGIN_SIDE LENGTH_UNIT:)
margin_top:CSS_PROP_MARGIN_TOP WRAP:css__parse_margin_side
margin_bottom:CSS_PROP_MARGIN_BOTTOM WRAP:css__parse_margin_side
@@ -67,7 +67,7 @@ margin_left:CSS_PROP_MARGIN_LEFT WRAP:css__parse_margin_side
margin_right:CSS_PROP_MARGIN_RIGHT WRAP:css__parse_margin_side
#generic for {top, bottom, left, right}.c
-side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+side:op GENERIC: IDENT:( INHERIT: AUTO:0,BOTTOM_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:BOTTOM_SET ALLOW:unit&(UNIT_LENGTH|UNIT_PCT) LENGTH_UNIT:)
top:CSS_PROP_TOP WRAP:css__parse_side
bottom:CSS_PROP_BOTTOM WRAP:css__parse_side
@@ -76,7 +76,7 @@ right:CSS_PROP_RIGHT WRAP:css__parse_side
#generic for border_{top, bottom, left, right}_width.c
-border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET DISALLOW:unit==UNIT_PCT||unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+border_side_width:op GENERIC: IDENT:( INHERIT: THIN:0,BORDER_WIDTH_THIN MEDIUM:0,BORDER_WIDTH_MEDIUM THICK:0,BORDER_WIDTH_THICK IDENT:) LENGTH_UNIT:( UNIT_PX:BORDER_WIDTH_SET MASK:UNIT_MASK_BORDER_SIDE_WIDTH RANGE:<0 LENGTH_UNIT:)
border_top_width:CSS_PROP_BORDER_TOP_WIDTH WRAP:css__parse_border_side_width
border_bottom_width:CSS_PROP_BORDER_BOTTOM_WIDTH WRAP:css__parse_border_side_width
@@ -140,11 +140,11 @@ page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_
page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
-pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_after:CSS_PROP_PAUSE_AFTER IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_AFTER_SET MASK:UNIT_MASK_PAUSE_AFTER RANGE:<0 LENGTH_UNIT:)
-pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET DISALLOW:(unit&UNIT_TIME)==false&&(unit&UNIT_PCT)==false RANGE:<0 LENGTH_UNIT:)
+pause_before:CSS_PROP_PAUSE_BEFORE IDENT:INHERIT LENGTH_UNIT:( UNIT_S:PAUSE_BEFORE_SET MASK:UNIT_MASK_PAUSE_BEFORE RANGE:<0 LENGTH_UNIT:)
-pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW:unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+pitch:CSS_PROP_PITCH IDENT:( INHERIT: X_LOW:0,PITCH_X_LOW LOW:0,PITCH_LOW MEDIUM:0,PITCH_MEDIUM HIGH:0,PITCH_HIGH X_HIGH:0,PITCH_X_HIGH IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY MASK:UNIT_MASK_PITCH RANGE:<0 LENGTH_UNIT:)
pitch_range:CSS_PROP_PITCH_RANGE IDENT:INHERIT NUMBER:( false:PITCH_RANGE_SET RANGE:num<0||num>F_100 NUMBER:)
@@ -168,26 +168,26 @@ table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: AUTO:0,TABLE_LAYOUT_AUTO FIX
text_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: LEFT:0,TEXT_ALIGN_LEFT RIGHT:0,TEXT_ALIGN_RIGHT CENTER:0,TEXT_ALIGN_CENTER JUSTIFY:0,TEXT_ALIGN_JUSTIFY LIBCSS_LEFT:0,TEXT_ALIGN_LIBCSS_LEFT LIBCSS_CENTER:0,TEXT_ALIGN_LIBCSS_CENTER LIBCSS_RIGHT:0,TEXT_ALIGN_LIBCSS_RIGHT IDENT:)
-text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+text_indent:CSS_PROP_TEXT_INDENT IDENT:INHERIT LENGTH_UNIT:( UNIT_PX:TEXT_INDENT_SET MASK:UNIT_MASK_TEXT_INDENT LENGTH_UNIT:)
text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: CAPITALIZE:0,TEXT_TRANSFORM_CAPITALIZE UPPERCASE:0,TEXT_TRANSFORM_UPPERCASE LOWERCASE:0,TEXT_TRANSFORM_LOWERCASE NONE:0,TEXT_TRANSFORM_NONE IDENT:)
unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: NORMAL:0,UNICODE_BIDI_NORMAL EMBED:0,UNICODE_BIDI_EMBED BIDI_OVERRIDE:0,UNICODE_BIDI_BIDI_OVERRIDE IDENT:)
-vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ LENGTH_UNIT:)
+vertical_align:CSS_PROP_VERTICAL_ALIGN IDENT:( INHERIT: BASELINE:0,VERTICAL_ALIGN_BASELINE SUB:0,VERTICAL_ALIGN_SUB SUPER:0,VERTICAL_ALIGN_SUPER TOP:0,VERTICAL_ALIGN_TOP TEXT_TOP:0,VERTICAL_ALIGN_TEXT_TOP MIDDLE:0,VERTICAL_ALIGN_MIDDLE BOTTOM:0,VERTICAL_ALIGN_BOTTOM TEXT_BOTTOM:0,VERTICAL_ALIGN_TEXT_BOTTOM IDENT:) LENGTH_UNIT:( UNIT_PX:VERTICAL_ALIGN_SET MASK:UNIT_MASK_VERTICAL_ALIGN LENGTH_UNIT:)
visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: VISIBLE:0,VISIBILITY_VISIBLE HIDDEN:0,VISIBILITY_HIDDEN COLLAPSE:0,VISIBILITY_COLLAPSE IDENT:)
-volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION ALLOW:unit&UNIT_PCT RANGE:<0 LENGTH_UNIT:)
+volume:CSS_PROP_VOLUME IDENT:( INHERIT: SILENT:0,VOLUME_SILENT X_SOFT:0,VOLUME_X_SOFT SOFT:0,VOLUME_SOFT MEDIUM:0,VOLUME_MEDIUM LOUD:0,VOLUME_LOUD X_LOUD:0,VOLUME_X_LOUD IDENT:) NUMBER:( false:VOLUME_NUMBER RANGE:num<0||num>F_100 NUMBER:) LENGTH_UNIT:( UNIT_PX:VOLUME_DIMENSION MASK:UNIT_MASK_VOLUME RANGE:<0 LENGTH_UNIT:)
white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: NORMAL:0,WHITE_SPACE_NORMAL PRE:0,WHITE_SPACE_PRE NOWRAP:0,WHITE_SPACE_NOWRAP PRE_WRAP:0,WHITE_SPACE_PRE_WRAP PRE_LINE:0,WHITE_SPACE_PRE_LINE IDENT:)
widows:CSS_PROP_WIDOWS IDENT:INHERIT NUMBER:( true:WIDOWS_SET RANGE:num<0 NUMBER:)
-width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+width:CSS_PROP_WIDTH IDENT:( INHERIT: AUTO:0,WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:WIDTH_SET MASK:UNIT_MASK_WIDTH RANGE:<0 LENGTH_UNIT:)
-word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+word_spacing:CSS_PROP_WORD_SPACING IDENT:( INHERIT: NORMAL:0,WORD_SPACING_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:WORD_SPACING_SET MASK:UNIT_MASK_WORD_SPACING LENGTH_UNIT:)
z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: AUTO:0,Z_INDEX_AUTO IDENT:) NUMBER:( true:Z_INDEX_SET NUMBER:)
@@ -202,7 +202,7 @@ column_count:CSS_PROP_COLUMN_COUNT IDENT:( INHERIT: AUTO:0,COLUMN_COUNT_AUTO IDE
column_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: BALANCE:0,COLUMN_FILL_BALANCE AUTO:0,COLUMN_FILL_AUTO IDENT:)
-column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+column_gap:CSS_PROP_COLUMN_GAP IDENT:( INHERIT: NORMAL:0,COLUMN_GAP_NORMAL IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_GAP_SET RANGE:<0 MASK:UNIT_MASK_COLUMN_GAP LENGTH_UNIT:)
column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: IDENT:) COLOR:COLUMN_RULE_COLOR_SET
@@ -212,7 +212,7 @@ column_rule_width:CSS_PROP_COLUMN_RULE_WIDTH WRAP:css__parse_border_side_width
column_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: NONE:0,COLUMN_SPAN_NONE ALL:0,COLUMN_SPAN_ALL IDENT:)
-column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ||unit&UNIT_PCT LENGTH_UNIT:)
+column_width:CSS_PROP_COLUMN_WIDTH IDENT:( INHERIT: AUTO:0,COLUMN_WIDTH_AUTO IDENT:) LENGTH_UNIT:( UNIT_PX:COLUMN_WIDTH_SET MASK:UNIT_MASK_COLUMN_WIDTH LENGTH_UNIT:)
writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR IDENT:)
@@ -224,7 +224,7 @@ align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: STRETCH:0,ALIGN_ITEMS_STRETCH
align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: STRETCH:0,ALIGN_SELF_STRETCH FLEX_START:0,ALIGN_SELF_FLEX_START FLEX_END:0,ALIGN_SELF_FLEX_END CENTER:0,ALIGN_SELF_CENTER BASELINE:0,ALIGN_SELF_BASELINE AUTO:0,ALIGN_SELF_AUTO IDENT:)
-flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET DISALLOW:unit&UNIT_ANGLE||unit&UNIT_TIME||unit&UNIT_FREQ RANGE:<0 LENGTH_UNIT:)
+flex_basis:CSS_PROP_FLEX_BASIS IDENT:( INHERIT: AUTO:0,FLEX_BASIS_AUTO CONTENT:0,FLEX_BASIS_CONTENT IDENT:) LENGTH_UNIT:( UNIT_PX:FLEX_BASIS_SET MASK:UNIT_MASK_FLEX_BASIS RANGE:<0 LENGTH_UNIT:)
flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: ROW:0,FLEX_DIRECTION_ROW ROW_REVERSE:0,FLEX_DIRECTION_ROW_REVERSE COLUMN:0,FLEX_DIRECTION_COLUMN COLUMN_REVERSE:0,FLEX_DIRECTION_COLUMN_REVERSE IDENT:)
diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h
index 1e085c5..1e7f821 100644
--- a/src/parse/properties/properties.h
+++ b/src/parse/properties/properties.h
@@ -458,4 +458,117 @@ css_error css__parse_z_index(css_language *c,
const parserutils_vector *vector, int *ctx,
css_style *result);
+/** Mapping from property bytecode index to bytecode unit class mask. */
+extern const uint32_t property_unit_mask[CSS_N_PROPERTIES];
+
+#define UNIT_MASK_AZIMUTH (UNIT_ANGLE)
+#define UNIT_MASK_BACKGROUND_ATTACHMENT (0)
+#define UNIT_MASK_BACKGROUND_COLOR (0)
+#define UNIT_MASK_BACKGROUND_IMAGE (0)
+#define UNIT_MASK_BACKGROUND_POSITION (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_BACKGROUND_REPEAT (0)
+#define UNIT_MASK_BORDER_COLLAPSE (0)
+#define UNIT_MASK_BORDER_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_BORDER_SIDE_COLOR (0)
+#define UNIT_MASK_BORDER_SIDE_STYLE (0)
+#define UNIT_MASK_BORDER_SIDE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_BOTTOM (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_CAPTION_SIDE (0)
+#define UNIT_MASK_CLEAR (0)
+#define UNIT_MASK_CLIP (UNIT_LENGTH)
+#define UNIT_MASK_COLOR (0)
+#define UNIT_MASK_CONTENT (0)
+#define UNIT_MASK_COUNTER_INCREMENT (0)
+#define UNIT_MASK_COUNTER_RESET (0)
+#define UNIT_MASK_CUE_AFTER (0)
+#define UNIT_MASK_CUE_BEFORE (0)
+#define UNIT_MASK_CURSOR (0)
+#define UNIT_MASK_DIRECTION (0)
+#define UNIT_MASK_DISPLAY (0)
+#define UNIT_MASK_ELEVATION (UNIT_ANGLE)
+#define UNIT_MASK_EMPTY_CELLS (0)
+#define UNIT_MASK_FLOAT (0)
+#define UNIT_MASK_FONT_FAMILY (0)
+#define UNIT_MASK_FONT_SIZE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_FONT_STYLE (0)
+#define UNIT_MASK_FONT_VARIANT (0)
+#define UNIT_MASK_FONT_WEIGHT (0)
+#define UNIT_MASK_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LEFT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LETTER_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_LINE_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_LIST_STYLE_IMAGE (0)
+#define UNIT_MASK_LIST_STYLE_POSITION (0)
+#define UNIT_MASK_LIST_STYLE_TYPE (0)
+#define UNIT_MASK_MARGIN_SIDE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MAX_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MAX_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MIN_HEIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_MIN_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_ORPHANS (0)
+#define UNIT_MASK_OUTLINE_COLOR (0)
+#define UNIT_MASK_OUTLINE_STYLE (0)
+#define UNIT_MASK_OUTLINE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_OVERFLOW_X (0)
+#define UNIT_MASK_PADDING_SIDE (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_PAGE_BREAK_AFTER (0)
+#define UNIT_MASK_PAGE_BREAK_BEFORE (0)
+#define UNIT_MASK_PAGE_BREAK_INSIDE (0)
+#define UNIT_MASK_PAUSE_AFTER (UNIT_TIME | UNIT_PCT)
+#define UNIT_MASK_PAUSE_BEFORE (UNIT_TIME | UNIT_PCT)
+#define UNIT_MASK_PITCH_RANGE (0)
+#define UNIT_MASK_PITCH (UNIT_FREQ)
+#define UNIT_MASK_PLAY_DURING (0)
+#define UNIT_MASK_POSITION (0)
+#define UNIT_MASK_QUOTES (0)
+#define UNIT_MASK_RICHNESS (0)
+#define UNIT_MASK_RIGHT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_SPEAK_HEADER (0)
+#define UNIT_MASK_SPEAK_NUMERAL (0)
+#define UNIT_MASK_SPEAK_PUNCTUATION (0)
+#define UNIT_MASK_SPEAK (0)
+#define UNIT_MASK_SPEECH_RATE (0)
+#define UNIT_MASK_STRESS (0)
+#define UNIT_MASK_TABLE_LAYOUT (0)
+#define UNIT_MASK_TEXT_ALIGN (0)
+#define UNIT_MASK_TEXT_DECORATION (0)
+#define UNIT_MASK_TEXT_INDENT (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_TEXT_TRANSFORM (0)
+#define UNIT_MASK_TOP (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_UNICODE_BIDI (0)
+#define UNIT_MASK_VERTICAL_ALIGN (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_VISIBILITY (0)
+#define UNIT_MASK_VOICE_FAMILY (0)
+#define UNIT_MASK_VOLUME (UNIT_PCT)
+#define UNIT_MASK_WHITE_SPACE (0)
+#define UNIT_MASK_WIDOWS (0)
+#define UNIT_MASK_WIDTH (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_WORD_SPACING (UNIT_LENGTH)
+#define UNIT_MASK_Z_INDEX (0)
+#define UNIT_MASK_OPACITY (0)
+#define UNIT_MASK_BREAK_AFTER (0)
+#define UNIT_MASK_BREAK_BEFORE (0)
+#define UNIT_MASK_BREAK_INSIDE (0)
+#define UNIT_MASK_COLUMN_COUNT (0)
+#define UNIT_MASK_COLUMN_FILL (0)
+#define UNIT_MASK_COLUMN_GAP (UNIT_LENGTH)
+#define UNIT_MASK_COLUMN_RULE_COLOR (0)
+#define UNIT_MASK_COLUMN_RULE_STYLE (0)
+#define UNIT_MASK_COLUMN_RULE_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_COLUMN_SPAN (0)
+#define UNIT_MASK_COLUMN_WIDTH (UNIT_LENGTH)
+#define UNIT_MASK_WRITING_MODE (0)
+#define UNIT_MASK_OVERFLOW_Y (0)
+#define UNIT_MASK_BOX_SIZING (0)
+#define UNIT_MASK_ALIGN_CONTENT (0)
+#define UNIT_MASK_ALIGN_ITEMS (0)
+#define UNIT_MASK_ALIGN_SELF (0)
+#define UNIT_MASK_FLEX_BASIS (UNIT_LENGTH | UNIT_PCT)
+#define UNIT_MASK_FLEX_DIRECTION (0)
+#define UNIT_MASK_FLEX_GROW (0)
+#define UNIT_MASK_FLEX_SHRINK (0)
+#define UNIT_MASK_FLEX_WRAP (0)
+#define UNIT_MASK_JUSTIFY_CONTENT (0)
+#define UNIT_MASK_ORDER (0)
+
#endif
diff --git a/test/data/parse/properties.dat b/test/data/parse/properties.dat
index 3dcb5a4..302b2dc 100644
--- a/test/data/parse/properties.dat
+++ b/test/data/parse/properties.dat
@@ -182,7 +182,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x0000b400 0x00000200
+| 0x02000000 0x0000b400 0x00000400
#reset
#data
@@ -190,7 +190,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0xffff4c00 0x00000200
+| 0x02000000 0xffff4c00 0x00000400
#reset
#data
@@ -198,7 +198,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x0000c800 0x00000201
+| 0x02000000 0x0000c800 0x00000401
#reset
#data
@@ -206,7 +206,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0x00000324 0x00000202
+| 0x02000000 0x00000324 0x00000402
#reset
#data
@@ -214,7 +214,7 @@
#errors
#expected
| 1 *
-| 0x02000000 0xfffffcdc 0x00000202
+| 0x02000000 0xfffffcdc 0x00000402
#reset
##
@@ -350,7 +350,7 @@
#errors
#expected
| 1 *
-| 0x02000004 0x00002800 0x00000100
+| 0x02000004 0x00002800 0x00000200
#reset
#data
@@ -358,7 +358,7 @@
#errors
#expected
| 1 *
-| 0x02000004 0x00000800 0x00000000
+| 0x02000004 0x00000800 0x00000100
#reset
#data
@@ -366,7 +366,7 @@
#errors
#expected
| 1 *
-| 0x02200004 0x00002800 0x00000100 0x00005000 0x00000100
+| 0x02200004 0x00002800 0x00000200 0x00005000 0x00000200
#reset
#data
@@ -374,7 +374,7 @@
#errors
#expected
| 1 *
-| 0x02200004 0x00002800 0x00000100 0x00000800 0x00000000
+| 0x02200004 0x00002800 0x00000200 0x00000800 0x00000100
#reset
#data
@@ -382,7 +382,7 @@
#errors
#expected
| 1 *
-| 0x02040004 0x00000800 0x00000000
+| 0x02040004 0x00000800 0x00000100
#reset
# possible quirk
@@ -391,7 +391,7 @@
##errors
##expected
#| 1 *
-#| 0x02040004 0x00000800 0x00000000
+#| 0x02040004 0x00000800 0x00000100
##reset
#data
@@ -399,7 +399,7 @@
#errors
#expected
| 1 *
-| 0x00a00004 0x00002800 0x00000100
+| 0x00a00004 0x00002800 0x00000200
#reset
#data
@@ -407,7 +407,7 @@
#errors
#expected
| 1 *
-| 0x02200404 0x00002800 0x00000100 0x00005000 0x00000100
+| 0x02200404 0x00002800 0x00000200 0x00005000 0x00000200
#reset
##
@@ -475,7 +475,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000c00 0x00000002 0x00000c00 0x00000002
+| 0x02000007 0x00000c00 0x00000102 0x00000c00 0x00000102
#reset
#data
@@ -483,7 +483,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000a00 0x00000002 0x00000a00 0x00000002
+| 0x02000007 0x00000a00 0x00000102 0x00000a00 0x00000102
#reset
#data
@@ -491,7 +491,7 @@
#errors
#expected
| 1 *
-| 0x02000007 0x00000c00 0x00000000 0x00000a00 0x00000002
+| 0x02000007 0x00000c00 0x00000100 0x00000a00 0x00000102
#reset
#data
@@ -499,7 +499,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000c00 0x00000002 0x00000c00 0x00000002
+| 0x02000407 0x00000c00 0x00000102 0x00000c00 0x00000102
#reset
#data
@@ -507,7 +507,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000a00 0x00000002 0x00000a00 0x00000002
+| 0x02000407 0x00000a00 0x00000102 0x00000a00 0x00000102
#reset
#data
@@ -515,7 +515,7 @@
#errors
#expected
| 1 *
-| 0x02000407 0x00000c00 0x00000000 0x00000a00 0x00000002
+| 0x02000407 0x00000c00 0x00000100 0x00000a00 0x00000102
#reset
##
@@ -688,7 +688,7 @@
#errors
#expected
| 1 *
-| 0x02000013 0x00000000 0x00000000
+| 0x02000013 0x00000000 0x00000100
#reset
#data
@@ -696,7 +696,7 @@
#errors
#expected
| 1 *
-| 0x02000010 0x00000800 0x00000000
+| 0x02000010 0x00000800 0x00000100
#reset
##
@@ -716,7 +716,7 @@
#errors
#expected
| 1 *
-| 0x02000014 0x00000300 0x00000002
+| 0x02000014 0x00000300 0x00000102
#reset
#data
@@ -724,7 +724,7 @@
#errors
#expected
| 1 *
-| 0x02000014 0x00010aab 0x00000100
+| 0x02000014 0x00010aab 0x00000200
#reset
##
@@ -800,7 +800,7 @@
#errors
#expected
| 1 *
-| 0x02c00017 0x00002800 0x00000000 0x00002800 0x00000000
+| 0x02c00017 0x00002800 0x00000100 0x00002800 0x00000100
#reset
#data
@@ -816,7 +816,7 @@
#errors
#expected
| 1 *
-| 0x02000017 0x00000400 0x00000000 0x00000800 0x00000000 0x00000c00 0x00000000 0x00001000 0x00000000
+| 0x02000017 0x00000400 0x00000100 0x00000800 0x00000100 0x00000c00 0x00000100 0x00001000 0x00000100
#reset
#data
@@ -824,7 +824,7 @@
#errors
#expected
| 1 *
-| 0x03200017 0x00000400 0x00000002 0x00000400 0x00000002
+| 0x03200017 0x00000400 0x00000102 0x00000400 0x00000102
#reset
#data
@@ -832,7 +832,7 @@
#errors
#expected
| 1 *
-| 0x02000017 0x00000000 0x00000000 0x00037000 0x00000000 0x000006cd 0x00000002 0x00000000 0x00000000
+| 0x02000017 0x00000000 0x00000100 0x00037000 0x00000100 0x000006cd 0x00000102 0x00000000 0x00000100
#reset
#data
@@ -848,7 +848,7 @@
#errors
#expected
| 1 *
-| 0x02c00417 0x00002800 0x00000000 0x00002800 0x00000000
+| 0x02c00417 0x00002800 0x00000100 0x00002800 0x00000100
#reset
#data
@@ -864,7 +864,7 @@
#errors
#expected
| 1 *
-| 0x02000417 0x00000400 0x00000000 0x00000800 0x00000000 0x00000c00 0x00000000 0x00001000 0x00000000
+| 0x02000417 0x00000400 0x00000100 0x00000800 0x00000100 0x00000c00 0x00000100 0x00001000 0x00000100
#reset
#data
@@ -872,7 +872,7 @@
#errors
#expected
| 1 *
-| 0x03200417 0x00000400 0x00000002 0x00000400 0x00000002
+| 0x03200417 0x00000400 0x00000102 0x00000400 0x00000102
#reset
#data
@@ -880,7 +880,7 @@
#errors
#expected
| 1 *
-| 0x02000417 0x00000000 0x00000000 0x00037000 0x00000000 0x000006cd 0x00000002 0x00000000 0x00000000
+| 0x02000417 0x00000000 0x00000100 0x00037000 0x00000100 0x000006cd 0x00000102 0x00000000 0x00000100
#reset
##
@@ -1708,7 +1708,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x0000b400 0x00000200
+| 0x02000021 0x0000b400 0x00000400
#reset
#data
@@ -1716,7 +1716,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0xffff4c00 0x00000200
+| 0x02000021 0xffff4c00 0x00000400
#reset
#data
@@ -1724,7 +1724,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x0000c800 0x00000201
+| 0x02000021 0x0000c800 0x00000401
#reset
#data
@@ -1732,7 +1732,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000021 0x00000324 0x00000202
+| 0x02000021 0x00000324 0x00000402
#reset
#data
@@ -1748,7 +1748,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000421 0x0000b400 0x00000200
+| 0x02000421 0x0000b400 0x00000400
#reset
##
@@ -1956,7 +1956,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x00003000 0x00000006
+| 0x02000025 0x00003000 0x00000106
#reset
#data
@@ -1964,7 +1964,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x00019000 0x00000000
+| 0x02000025 0x00019000 0x00000100
#reset
#data
@@ -1972,7 +1972,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000025 0x0001e000 0x00000100
+| 0x02000025 0x0001e000 0x00000200
#reset
##
@@ -2148,7 +2148,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000029 0x061a7fff 0x00000001
+| 0x02000029 0x061a7fff 0x00000101
#reset
#data
@@ -2156,7 +2156,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000029 0x00010aab 0x00000100
+| 0x02000029 0x00010aab 0x00000200
#reset
##
@@ -2176,7 +2176,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002a 0x00000200 0x00000003
+| 0x0200002a 0x00000200 0x00000103
#reset
#data
@@ -2184,7 +2184,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002a 0x00001000 0x00000100
+| 0x0200002a 0x00001000 0x00000200
#reset
##
@@ -2204,7 +2204,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200002b 0x00000152 0x00000004
+| 0x0200002b 0x00000152 0x00000104
#reset
#data
@@ -2212,7 +2212,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200042b 0x00000152 0x00000004
+| 0x0200042b 0x00000152 0x00000104
#reset
##
@@ -2240,7 +2240,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204002c 0x00003000 0x00000005
+| 0x0204002c 0x00003000 0x00000105
#reset
#data
@@ -2256,7 +2256,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204042c 0x00003000 0x00000005
+| 0x0204042c 0x00003000 0x00000105
#reset
#data
@@ -2264,7 +2264,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204002c 0x00008552 0x00000100
+| 0x0204002c 0x00008552 0x00000200
#reset
##
@@ -2475,7 +2475,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000030 0x00002800 0x00000007
+| 0x02000030 0x00002800 0x00000107
#reset
#data
@@ -2483,7 +2483,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000031 0x00000400 0x00000000
+| 0x02000031 0x00000400 0x00000100
#reset
#data
@@ -2491,7 +2491,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000032 0x00000800 0x00000002
+| 0x02000032 0x00000800 0x00000102
#reset
#data
@@ -2499,7 +2499,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000033 0x00001400 0x00000100
+| 0x02000033 0x00001400 0x00000200
#reset
##
@@ -2519,7 +2519,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000034 0x00019000 0x00000000
+| 0x02000034 0x00019000 0x00000100
#reset
#data
@@ -2527,7 +2527,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000434 0x00019000 0x00000000
+| 0x02000434 0x00019000 0x00000100
#reset
#data
@@ -2535,7 +2535,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000034 0x0000c800 0x00000100
+| 0x02000034 0x0000c800 0x00000200
#reset
##
@@ -2555,7 +2555,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000035 0x00019000 0x00000000
+| 0x02000035 0x00019000 0x00000100
#reset
#data
@@ -2563,7 +2563,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000035 0x0000c800 0x00000100
+| 0x02000035 0x0000c800 0x00000200
#reset
##
@@ -2575,7 +2575,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000036 0x00019000 0x00000000
+| 0x02000036 0x00019000 0x00000100
#reset
#data
@@ -2583,7 +2583,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000036 0x0000c800 0x00000100
+| 0x02000036 0x0000c800 0x00000200
#reset
##
@@ -2595,7 +2595,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000037 0x00019000 0x00000000
+| 0x02000037 0x00019000 0x00000100
#reset
#data
@@ -2603,7 +2603,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000037 0x0000c800 0x00000100
+| 0x02000037 0x0000c800 0x00000200
#reset
##
@@ -2763,7 +2763,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003b 0x00000c00 0x00000000
+| 0x0200003b 0x00000c00 0x00000100
#reset
#data
@@ -2771,7 +2771,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003b 0x00000000 0x00000000
+| 0x0200003b 0x00000000 0x00000100
#reset
##
@@ -2858,7 +2858,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003d 0x00002800 0x00000007
+| 0x0200003d 0x00002800 0x00000107
#reset
#data
@@ -2866,7 +2866,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003e 0x00000400 0x00000000
+| 0x0200003e 0x00000400 0x00000100
#reset
#data
@@ -2874,7 +2874,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200003f 0x00000800 0x00000002
+| 0x0200003f 0x00000800 0x00000102
#reset
#data
@@ -2882,7 +2882,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000040 0x00001400 0x00000100
+| 0x02000040 0x00001400 0x00000200
#reset
##
@@ -3002,7 +3002,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x00000000 0x00000401
+| 0x02000044 0x00000000 0x00000801
#reset
#data
@@ -3010,7 +3010,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x00019000 0x00000400
+| 0x02000044 0x00019000 0x00000800
#reset
#data
@@ -3018,7 +3018,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x000002cd 0x00000401
+| 0x02000044 0x000002cd 0x00000801
#reset
#data
@@ -3026,7 +3026,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000044 0x0001e000 0x00000100
+| 0x02000044 0x0001e000 0x00000200
#reset
##
@@ -3038,7 +3038,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x00000000 0x00000401
+| 0x02000045 0x00000000 0x00000801
#reset
#data
@@ -3046,7 +3046,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x00019000 0x00000400
+| 0x02000045 0x00019000 0x00000800
#reset
#data
@@ -3054,7 +3054,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x000002cd 0x00000401
+| 0x02000045 0x000002cd 0x00000801
#reset
#data
@@ -3062,7 +3062,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000045 0x0001e000 0x00000100
+| 0x02000045 0x0001e000 0x00000200
#reset
##
@@ -3150,7 +3150,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00000000 0x00000800
+| 0x02000047 0x00000000 0x00001000
#reset
#data
@@ -3158,7 +3158,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000447 0x00000000 0x00000800
+| 0x02000447 0x00000000 0x00001000
#reset
#data
@@ -3166,7 +3166,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00064000 0x00000800
+| 0x02000047 0x00064000 0x00001000
#reset
#data
@@ -3174,7 +3174,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000047 0x00000466 0x00000801
+| 0x02000047 0x00000466 0x00001001
#reset
##
@@ -3370,7 +3370,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200004c 0x00000200 0x00000003
+| 0x0200004c 0x00000200 0x00000103
#reset
#data
@@ -3378,7 +3378,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200004c 0x00001000 0x00000100
+| 0x0200004c 0x00001000 0x00000200
#reset
##
@@ -3738,7 +3738,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00000000 0x00000000
+| 0x02000056 0x00000000 0x00000100
#reset
#data
@@ -3746,7 +3746,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00003000 0x00000005
+| 0x02000056 0x00003000 0x00000105
#reset
#data
@@ -3754,7 +3754,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000056 0x00008552 0x00000100
+| 0x02000056 0x00008552 0x00000200
#reset
##
@@ -3810,7 +3810,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000058 0x00000200 0x00000003
+| 0x02000058 0x00000200 0x00000103
#reset
#data
@@ -3818,7 +3818,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000058 0x00001000 0x00000100
+| 0x02000058 0x00001000 0x00000200
#reset
##
@@ -3922,7 +3922,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200045a 0xffffd800 0x00000100
+| 0x0200045a 0xffffd800 0x00000200
#reset
#data
@@ -3930,7 +3930,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0xffffd800 0x00000100
+| 0x0200005a 0xffffd800 0x00000200
#reset
#data
@@ -3938,7 +3938,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0x00005000 0x00000100
+| 0x0200005a 0x00005000 0x00000200
#reset
#data
@@ -3946,7 +3946,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0x00001000 0x00000000
+| 0x0200005a 0x00001000 0x00000100
#reset
#data
@@ -3954,7 +3954,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200005a 0xfffff000 0x00000000
+| 0x0200005a 0xfffff000 0x00000100
#reset
##
@@ -4135,7 +4135,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204005d 0x00008552 0x00000100
+| 0x0204005d 0x00008552 0x00000200
#reset
# dunno if % can be tested here, cos it's a percentage of the inherited value
@@ -4144,7 +4144,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0204045d 0x00008552 0x00000100
+| 0x0204045d 0x00008552 0x00000200
#reset
##
@@ -4220,7 +4220,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000060 0x061a7fff 0x00000001
+| 0x02000060 0x061a7fff 0x00000101
#reset
#data
@@ -4228,7 +4228,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000060 0x00010aab 0x00000100
+| 0x02000060 0x00010aab 0x00000200
#reset
##
@@ -4248,7 +4248,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000061 0x00000066 0x00000002
+| 0x02000061 0x00000066 0x00000102
#reset
##
@@ -4540,7 +4540,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x02000069 0x00000066 0x00000002
+| 0x02000069 0x00000066 0x00000102
#reset
##
@@ -4688,7 +4688,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006c 0x00000c00 0x00000000
+| 0x0200006c 0x00000c00 0x00000100
#reset
#data
@@ -4696,7 +4696,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006c 0x00000000 0x00000000
+| 0x0200006c 0x00000000 0x00000100
#reset
##
@@ -4736,7 +4736,7 @@ p:before { content: open-quote url('http://picodrive.acornarcade.com/') " : " at
#errors
#expected
| 1 *
-| 0x0200006e 0x00000066 0x00000002
+| 0x0200006e 0x00000066 0x00000102
#reset
##
--
Cascading Style Sheets library
3 years
netsurf: branch master updated. release/3.10-82-g434f6c3
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/434f6c3fe7d1d2c6a3e6a...
...commit http://git.netsurf-browser.org/netsurf.git/commit/434f6c3fe7d1d2c6a3e6ae6...
...tree http://git.netsurf-browser.org/netsurf.git/tree/434f6c3fe7d1d2c6a3e6ae633...
The branch, master has been updated
via 434f6c3fe7d1d2c6a3e6ae6338608a4a4421ab1b (commit)
from de7244a17017c3aa35d05b4229e49f8959dcc92d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=434f6c3fe7d1d2c6a3e...
commit 434f6c3fe7d1d2c6a3e6ae6338608a4a4421ab1b
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
framebuffer: Fix internal font generated source for GCC 10.
diff --git a/tools/convert_font.c b/tools/convert_font.c
index 9f5734b..d22c859 100644
--- a/tools/convert_font.c
+++ b/tools/convert_font.c
@@ -290,14 +290,14 @@ static bool generate_font_header(const char *path, struct font_data *data)
for (s = 0; s < 4; s++) {
- fprintf(fp, "const uint8_t *%s_section_table;\n",
+ fprintf(fp, "extern const uint8_t *%s_section_table;\n",
var_lables[s]);
- fprintf(fp, "const uint16_t *%s_sections;\n",
+ fprintf(fp, "extern const uint16_t *%s_sections;\n",
var_lables[s]);
}
- fprintf(fp, "const uint8_t *font_glyph_data;\n");
+ fprintf(fp, "extern const uint8_t *font_glyph_data;\n");
fprintf(fp, "\n\n");
-----------------------------------------------------------------------
Summary of changes:
tools/convert_font.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/convert_font.c b/tools/convert_font.c
index 9f5734b..d22c859 100644
--- a/tools/convert_font.c
+++ b/tools/convert_font.c
@@ -290,14 +290,14 @@ static bool generate_font_header(const char *path, struct font_data *data)
for (s = 0; s < 4; s++) {
- fprintf(fp, "const uint8_t *%s_section_table;\n",
+ fprintf(fp, "extern const uint8_t *%s_section_table;\n",
var_lables[s]);
- fprintf(fp, "const uint16_t *%s_sections;\n",
+ fprintf(fp, "extern const uint16_t *%s_sections;\n",
var_lables[s]);
}
- fprintf(fp, "const uint8_t *font_glyph_data;\n");
+ fprintf(fp, "extern const uint8_t *font_glyph_data;\n");
fprintf(fp, "\n\n");
--
NetSurf Browser
3 years
libcss: branch master updated. release/0.9.1-1-g1c1cf39
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libcss.git/shortlog/1c1cf39d306428fe912608...
...commit http://git.netsurf-browser.org/libcss.git/commit/1c1cf39d306428fe91260842...
...tree http://git.netsurf-browser.org/libcss.git/tree/1c1cf39d306428fe9126084208...
The branch, master has been updated
via 1c1cf39d306428fe91260842082dfc9a66a6a236 (commit)
from 385769d6554d2d3a9c2c35a04cf5dde706cefb6b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libcss.git/commit/?id=1c1cf39d306428fe9126...
commit 1c1cf39d306428fe91260842082dfc9a66a6a236
Author: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
Commit: Michael Drake <Michael Drake tlsa(a)netsurf-browser.org>
select: computed: Squash use of uninitialised variable warning.
diff --git a/src/select/computed.c b/src/select/computed.c
index 4e5588a..a1b345b 100644
--- a/src/select/computed.c
+++ b/src/select/computed.c
@@ -1702,8 +1702,8 @@ css_error compute_absolute_length(css_computed_style *style,
css_error (*set)(css_computed_style *style, uint8_t type,
css_fixed len, css_unit unit))
{
+ css_unit unit = CSS_UNIT_PX;
css_fixed length;
- css_unit unit;
uint8_t type;
type = get(style, &length, &unit);
-----------------------------------------------------------------------
Summary of changes:
src/select/computed.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/select/computed.c b/src/select/computed.c
index 4e5588a..a1b345b 100644
--- a/src/select/computed.c
+++ b/src/select/computed.c
@@ -1702,8 +1702,8 @@ css_error compute_absolute_length(css_computed_style *style,
css_error (*set)(css_computed_style *style, uint8_t type,
css_fixed len, css_unit unit))
{
+ css_unit unit = CSS_UNIT_PX;
css_fixed length;
- css_unit unit;
uint8_t type;
type = get(style, &length, &unit);
--
Cascading Style Sheets library
3 years
netsurf: branch master updated. release/3.10-81-gde7244a
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/de7244a17017c3aa35d05...
...commit http://git.netsurf-browser.org/netsurf.git/commit/de7244a17017c3aa35d05b4...
...tree http://git.netsurf-browser.org/netsurf.git/tree/de7244a17017c3aa35d05b422...
The branch, master has been updated
via de7244a17017c3aa35d05b4229e49f8959dcc92d (commit)
from 59078c3f20ab76fce3358c2a101d3c7d0584935a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=de7244a17017c3aa35d...
commit de7244a17017c3aa35d05b4229e49f8959dcc92d
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
risc os: Don't let URL complete start consume URL bar drags.
diff --git a/frontends/riscos/toolbar.c b/frontends/riscos/toolbar.c
index b3acba5..c6a882a 100644
--- a/frontends/riscos/toolbar.c
+++ b/frontends/riscos/toolbar.c
@@ -1115,18 +1115,20 @@ bool ro_toolbar_click(wimp_pointer *pointer)
return true;
}
- /* Nothing else has handled this, so try passing it to the
- * URL Complete module.
- *
- * \TODO -- This should really move into the URL Bar module, as
- * URL Complete is really an extension to that.
- */
-
- if (toolbar->url != NULL && toolbar->url_display &&
- ro_gui_url_bar_test_for_text_field_click(toolbar->url,
- pointer)) {
- ro_gui_url_complete_start(toolbar);
- return true;
+ if (pointer->buttons != wimp_DRAG_SELECT &&
+ pointer->buttons != wimp_DRAG_ADJUST) {
+ /* Nothing else has handled this click, so try passing it to
+ * the URL Complete module.
+ *
+ * \TODO -- This should really move into the URL Bar module, as
+ * URL Complete is really an extension to that.
+ */
+ if (toolbar->url != NULL && toolbar->url_display &&
+ ro_gui_url_bar_test_for_text_field_click(
+ toolbar->url, pointer)) {
+ ro_gui_url_complete_start(toolbar);
+ return true;
+ }
}
return false;
-----------------------------------------------------------------------
Summary of changes:
frontends/riscos/toolbar.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/frontends/riscos/toolbar.c b/frontends/riscos/toolbar.c
index b3acba5..c6a882a 100644
--- a/frontends/riscos/toolbar.c
+++ b/frontends/riscos/toolbar.c
@@ -1115,18 +1115,20 @@ bool ro_toolbar_click(wimp_pointer *pointer)
return true;
}
- /* Nothing else has handled this, so try passing it to the
- * URL Complete module.
- *
- * \TODO -- This should really move into the URL Bar module, as
- * URL Complete is really an extension to that.
- */
-
- if (toolbar->url != NULL && toolbar->url_display &&
- ro_gui_url_bar_test_for_text_field_click(toolbar->url,
- pointer)) {
- ro_gui_url_complete_start(toolbar);
- return true;
+ if (pointer->buttons != wimp_DRAG_SELECT &&
+ pointer->buttons != wimp_DRAG_ADJUST) {
+ /* Nothing else has handled this click, so try passing it to
+ * the URL Complete module.
+ *
+ * \TODO -- This should really move into the URL Bar module, as
+ * URL Complete is really an extension to that.
+ */
+ if (toolbar->url != NULL && toolbar->url_display &&
+ ro_gui_url_bar_test_for_text_field_click(
+ toolbar->url, pointer)) {
+ ro_gui_url_complete_start(toolbar);
+ return true;
+ }
}
return false;
--
NetSurf Browser
3 years
netsurf: branch master updated. release/3.10-80-g59078c3
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/59078c3f20ab76fce3358...
...commit http://git.netsurf-browser.org/netsurf.git/commit/59078c3f20ab76fce3358c2...
...tree http://git.netsurf-browser.org/netsurf.git/tree/59078c3f20ab76fce3358c2a1...
The branch, master has been updated
via 59078c3f20ab76fce3358c2a101d3c7d0584935a (commit)
from 925a76bcba81bfc99a099a468884ec6e85950c00 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=59078c3f20ab76fce33...
commit 59078c3f20ab76fce3358c2a101d3c7d0584935a
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
risc os: URL bar: Fall back to URL drag if OS doesn't have text selection.
diff --git a/frontends/riscos/gui/url_bar.c b/frontends/riscos/gui/url_bar.c
index 63193a4..ec21e93 100644
--- a/frontends/riscos/gui/url_bar.c
+++ b/frontends/riscos/gui/url_bar.c
@@ -984,7 +984,7 @@ ro_gui_url_bar_click(struct url_bar *url_bar,
*/
if (pointer->buttons == wimp_DRAG_SELECT ||
pointer->buttons == wimp_DRAG_ADJUST) {
- if (ns_wimp_has_text_selection()) {
+ if (!ns_wimp_has_text_selection()) {
if (pointer->i == url_bar->text.icon) {
if (action != NULL) {
*action = TOOLBAR_URL_DRAG_URL;
-----------------------------------------------------------------------
Summary of changes:
frontends/riscos/gui/url_bar.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontends/riscos/gui/url_bar.c b/frontends/riscos/gui/url_bar.c
index 63193a4..ec21e93 100644
--- a/frontends/riscos/gui/url_bar.c
+++ b/frontends/riscos/gui/url_bar.c
@@ -984,7 +984,7 @@ ro_gui_url_bar_click(struct url_bar *url_bar,
*/
if (pointer->buttons == wimp_DRAG_SELECT ||
pointer->buttons == wimp_DRAG_ADJUST) {
- if (ns_wimp_has_text_selection()) {
+ if (!ns_wimp_has_text_selection()) {
if (pointer->i == url_bar->text.icon) {
if (action != NULL) {
*action = TOOLBAR_URL_DRAG_URL;
--
NetSurf Browser
3 years
netsurf: branch master updated. release/3.10-79-g925a76b
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/925a76bcba81bfc99a099...
...commit http://git.netsurf-browser.org/netsurf.git/commit/925a76bcba81bfc99a099a4...
...tree http://git.netsurf-browser.org/netsurf.git/tree/925a76bcba81bfc99a099a468...
The branch, master has been updated
via 925a76bcba81bfc99a099a468884ec6e85950c00 (commit)
from 3cead4e8670b4ceb3f5010bd2aaac5d5aa0bd009 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=925a76bcba81bfc99a0...
commit 925a76bcba81bfc99a099a468884ec6e85950c00
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
risc os: wimputils: Make text-selection helper static inline.
diff --git a/frontends/riscos/wimputils.h b/frontends/riscos/wimputils.h
index cb01f1b..b1bd880 100644
--- a/frontends/riscos/wimputils.h
+++ b/frontends/riscos/wimputils.h
@@ -70,7 +70,7 @@ typedef union vdu_var_list {
*
* \return true if text-selection is supported, false otherwise.
*/
-bool ns_wimp_has_text_selection(void)
+static inline bool ns_wimp_has_text_selection(void)
{
wimp_colour bg;
wimp_colour fg;
-----------------------------------------------------------------------
Summary of changes:
frontends/riscos/wimputils.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontends/riscos/wimputils.h b/frontends/riscos/wimputils.h
index cb01f1b..b1bd880 100644
--- a/frontends/riscos/wimputils.h
+++ b/frontends/riscos/wimputils.h
@@ -70,7 +70,7 @@ typedef union vdu_var_list {
*
* \return true if text-selection is supported, false otherwise.
*/
-bool ns_wimp_has_text_selection(void)
+static inline bool ns_wimp_has_text_selection(void)
{
wimp_colour bg;
wimp_colour fg;
--
NetSurf Browser
3 years
netsurf: branch master updated. release/3.10-78-g3cead4e
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/3cead4e8670b4ceb3f501...
...commit http://git.netsurf-browser.org/netsurf.git/commit/3cead4e8670b4ceb3f5010b...
...tree http://git.netsurf-browser.org/netsurf.git/tree/3cead4e8670b4ceb3f5010bd2...
The branch, master has been updated
via 3cead4e8670b4ceb3f5010bd2aaac5d5aa0bd009 (commit)
via f8eabec04b5c5823b405440561add3cc47282f11 (commit)
from 833c9957a1137f77e5ab647eeb1a9cf53798fd12 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=3cead4e8670b4ceb3f5...
commit 3cead4e8670b4ceb3f5010bd2aaac5d5aa0bd009
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
risc os: Don't swallow URL bar drags if the OS supports text-selection.
It should still be possible to drag save the URL from the favicon.
diff --git a/frontends/riscos/gui/url_bar.c b/frontends/riscos/gui/url_bar.c
index 15aab3e..63193a4 100644
--- a/frontends/riscos/gui/url_bar.c
+++ b/frontends/riscos/gui/url_bar.c
@@ -40,6 +40,7 @@
#include "riscos/url_suggest.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
+#include "riscos/wimputils.h"
#include "riscos/window.h"
#include "riscos/ucstables.h"
#include "riscos/filetype.h"
@@ -983,11 +984,13 @@ ro_gui_url_bar_click(struct url_bar *url_bar,
*/
if (pointer->buttons == wimp_DRAG_SELECT ||
pointer->buttons == wimp_DRAG_ADJUST) {
- if (pointer->i == url_bar->text.icon) {
- if (action != NULL) {
- *action = TOOLBAR_URL_DRAG_URL;
+ if (ns_wimp_has_text_selection()) {
+ if (pointer->i == url_bar->text.icon) {
+ if (action != NULL) {
+ *action = TOOLBAR_URL_DRAG_URL;
+ }
+ return true;
}
- return true;
}
if (is_point_in_box(&pos, &url_bar->favicon.extent)) {
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=f8eabec04b5c5823b40...
commit f8eabec04b5c5823b405440561add3cc47282f11
Author: Michael Drake <michael.drake(a)codethink.co.uk>
Commit: Michael Drake <michael.drake(a)codethink.co.uk>
risc os: wimputils: Helper to check OS support for text-selection.
diff --git a/frontends/riscos/wimputils.h b/frontends/riscos/wimputils.h
index 5225a72..cb01f1b 100644
--- a/frontends/riscos/wimputils.h
+++ b/frontends/riscos/wimputils.h
@@ -24,6 +24,9 @@
#define riscos_wimputils_h_
#include <oslib/wimp.h>
+#include <oslib/wimpreadsysinfo.h>
+
+#include "utils/log.h"
/* Magical union to permit aliasing of wimp_window_state and wimp_open
* Do not use this directly. Use the macros, instead. */
@@ -62,4 +65,27 @@ typedef union vdu_var_list {
#define PTR_OS_VDU_VAR_LIST(l) ((os_vdu_var_list *) (vdu_var_list *) (l))
+/**
+ * Check whether the OS supports text selection in writiable icons.
+ *
+ * \return true if text-selection is supported, false otherwise.
+ */
+bool ns_wimp_has_text_selection(void)
+{
+ wimp_colour bg;
+ wimp_colour fg;
+ os_error *error;
+ wimpreadsysinfotextselection_flags flags;
+
+ error = xwimpreadsysinfo_text_selection(&bg, &fg, &flags);
+ if (error) {
+ NSLOG(netsurf, WARNING,
+ "xwimpreadsysinfo_text_selection: 0x%x: %s",
+ error->errnum, error->errmess);
+ return false;
+ }
+
+ return (flags & wimpreadsysinfotextselectionflags_ENABLED);
+}
+
#endif
-----------------------------------------------------------------------
Summary of changes:
frontends/riscos/gui/url_bar.c | 11 +++++++----
frontends/riscos/wimputils.h | 26 ++++++++++++++++++++++++++
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/frontends/riscos/gui/url_bar.c b/frontends/riscos/gui/url_bar.c
index 15aab3e..63193a4 100644
--- a/frontends/riscos/gui/url_bar.c
+++ b/frontends/riscos/gui/url_bar.c
@@ -40,6 +40,7 @@
#include "riscos/url_suggest.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
+#include "riscos/wimputils.h"
#include "riscos/window.h"
#include "riscos/ucstables.h"
#include "riscos/filetype.h"
@@ -983,11 +984,13 @@ ro_gui_url_bar_click(struct url_bar *url_bar,
*/
if (pointer->buttons == wimp_DRAG_SELECT ||
pointer->buttons == wimp_DRAG_ADJUST) {
- if (pointer->i == url_bar->text.icon) {
- if (action != NULL) {
- *action = TOOLBAR_URL_DRAG_URL;
+ if (ns_wimp_has_text_selection()) {
+ if (pointer->i == url_bar->text.icon) {
+ if (action != NULL) {
+ *action = TOOLBAR_URL_DRAG_URL;
+ }
+ return true;
}
- return true;
}
if (is_point_in_box(&pos, &url_bar->favicon.extent)) {
diff --git a/frontends/riscos/wimputils.h b/frontends/riscos/wimputils.h
index 5225a72..cb01f1b 100644
--- a/frontends/riscos/wimputils.h
+++ b/frontends/riscos/wimputils.h
@@ -24,6 +24,9 @@
#define riscos_wimputils_h_
#include <oslib/wimp.h>
+#include <oslib/wimpreadsysinfo.h>
+
+#include "utils/log.h"
/* Magical union to permit aliasing of wimp_window_state and wimp_open
* Do not use this directly. Use the macros, instead. */
@@ -62,4 +65,27 @@ typedef union vdu_var_list {
#define PTR_OS_VDU_VAR_LIST(l) ((os_vdu_var_list *) (vdu_var_list *) (l))
+/**
+ * Check whether the OS supports text selection in writiable icons.
+ *
+ * \return true if text-selection is supported, false otherwise.
+ */
+bool ns_wimp_has_text_selection(void)
+{
+ wimp_colour bg;
+ wimp_colour fg;
+ os_error *error;
+ wimpreadsysinfotextselection_flags flags;
+
+ error = xwimpreadsysinfo_text_selection(&bg, &fg, &flags);
+ if (error) {
+ NSLOG(netsurf, WARNING,
+ "xwimpreadsysinfo_text_selection: 0x%x: %s",
+ error->errnum, error->errmess);
+ return false;
+ }
+
+ return (flags & wimpreadsysinfotextselectionflags_ENABLED);
+}
+
#endif
--
NetSurf Browser
3 years