summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bytecode/opcodes.h14
-rw-r--r--src/parse/properties/border_color.c14
-rw-r--r--src/parse/properties/css_property_parser_gen.c13
-rw-r--r--src/parse/properties/properties.gen4
-rw-r--r--src/parse/properties/utils.c33
-rw-r--r--src/parse/properties/utils.h2
-rw-r--r--src/parse/propstrings.c1
-rw-r--r--src/parse/propstrings.h2
-rw-r--r--src/select/computed.c58
-rw-r--r--src/select/properties/background_color.c2
-rw-r--r--src/select/properties/border_bottom_color.c2
-rw-r--r--src/select/properties/border_left_color.c2
-rw-r--r--src/select/properties/border_right_color.c2
-rw-r--r--src/select/properties/border_top_color.c2
-rw-r--r--src/select/properties/color.c25
-rw-r--r--src/select/properties/helpers.c9
-rw-r--r--src/select/properties/outline_color.c6
17 files changed, 129 insertions, 62 deletions
diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h
index 3fad172..991d099 100644
--- a/src/bytecode/opcodes.h
+++ b/src/bytecode/opcodes.h
@@ -35,6 +35,7 @@ enum op_background_attachment {
enum op_background_color {
BACKGROUND_COLOR_TRANSPARENT = 0x0000,
+ BACKGROUND_COLOR_CURRENT_COLOR = 0x0001,
BACKGROUND_COLOR_SET = 0x0080
};
@@ -72,8 +73,9 @@ enum op_border_spacing {
};
enum op_border_color {
- BORDER_COLOR_SET = 0x0080,
- BORDER_COLOR_TRANSPARENT = 0x0000
+ BORDER_COLOR_TRANSPARENT = 0x0000,
+ BORDER_COLOR_CURRENT_COLOR = 0x0001,
+ BORDER_COLOR_SET = 0x0080
};
enum op_border_style {
@@ -126,6 +128,8 @@ enum op_clip {
};
enum op_color {
+ COLOR_TRANSPARENT = 0x0000,
+ COLOR_CURRENT_COLOR = 0x0001,
COLOR_SET = 0x0080
};
@@ -366,8 +370,10 @@ enum op_orphans {
};
enum op_outline_color {
- OUTLINE_COLOR_SET = 0x0080,
- OUTLINE_COLOR_INVERT = 0x0000
+ OUTLINE_COLOR_TRANSPARENT = 0x0000,
+ OUTLINE_COLOR_CURRENT_COLOR = 0x0001,
+ OUTLINE_COLOR_INVERT = 0x0002,
+ OUTLINE_COLOR_SET = 0x0080
};
enum op_outline_style {
diff --git a/src/parse/properties/border_color.c b/src/parse/properties/border_color.c
index 074b457..7495ffc 100644
--- a/src/parse/properties/border_color.c
+++ b/src/parse/properties/border_color.c
@@ -37,7 +37,6 @@ css_error css__parse_border_color(css_language *c,
uint16_t side_val[4];
uint32_t side_color[4];
uint32_t side_count = 0;
- bool match;
css_error error;
/* Firstly, handle inherit */
@@ -74,18 +73,7 @@ css_error css__parse_border_color(css_language *c,
return CSS_INVALID;
}
- if ((token->type == CSS_TOKEN_IDENT) &&
- (lwc_string_caseless_isequal(token->idata,
- c->strings[TRANSPARENT],
- &match) == lwc_error_ok && match)) {
- side_val[side_count] = BORDER_COLOR_TRANSPARENT;
- parserutils_vector_iterate(vector, ctx);
- error = CSS_OK;
- } else {
- side_val[side_count] = BORDER_COLOR_SET;
- error = css__parse_colour_specifier(c, vector, ctx, &side_color[side_count]);
- }
-
+ error = css__parse_colour_specifier(c, vector, ctx, &side_val[side_count], &side_color[side_count]);
if (error == CSS_OK) {
side_count++;
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index ae1fa04..dec4745 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -268,27 +268,26 @@ void output_number(FILE *outputf, struct keyval *parseid, struct keyval_list *kv
void output_color(FILE *outputf, struct keyval *parseid, struct keyval_list *kvlist)
{
- struct keyval *ckv = kvlist->item[0];
-
fprintf(outputf,
"{\n"
+ "\t\tuint16_t value = 0;\n"
"\t\tuint32_t color = 0;\n"
"\t\t*ctx = orig_ctx;\n\n"
- "\t\terror = css__parse_colour_specifier(c, vector, ctx, &color);\n"
+ "\t\terror = css__parse_colour_specifier(c, vector, ctx, &value, &color);\n"
"\t\tif (error != CSS_OK) {\n"
"\t\t\t*ctx = orig_ctx;\n"
"\t\t\treturn error;\n"
"\t\t}\n\n"
- "\t\terror = css__stylesheet_style_appendOPV(result, %s, 0, %s);\n"
+ "\t\terror = css__stylesheet_style_appendOPV(result, %s, 0, value);\n"
"\t\tif (error != CSS_OK) {\n"
"\t\t\t*ctx = orig_ctx;\n"
"\t\t\treturn error;\n"
"\t\t}\n"
"\n"
- "\t\terror = css__stylesheet_style_append(result, color);\n"
+ "\t\tif (value == COLOR_SET)\n"
+ "\t\t\terror = css__stylesheet_style_append(result, color);\n"
"\t}\n\n",
- parseid->val,
- ckv->val);
+ parseid->val);
}
void output_length_unit(FILE *outputf, struct keyval *parseid, struct keyval_list *kvlist)
diff --git a/src/parse/properties/properties.gen b/src/parse/properties/properties.gen
index b0e84b8..016d7a0 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -93,7 +93,7 @@ border_left_style:CSS_PROP_BORDER_LEFT_STYLE WRAP:css__parse_border_side_style
border_right_style:CSS_PROP_BORDER_RIGHT_STYLE WRAP:css__parse_border_side_style
#generic for border_{top, bottom, left, right}_color.c
-border_side_color:op GENERIC: IDENT:( INHERIT: TRANSPARENT:0,BORDER_COLOR_TRANSPARENT IDENT:) COLOR:BORDER_COLOR_SET
+border_side_color:op GENERIC: IDENT:( INHERIT: IDENT:) COLOR:BORDER_COLOR_SET
border_top_color:CSS_PROP_BORDER_TOP_COLOR WRAP:css__parse_border_side_color
border_bottom_color:CSS_PROP_BORDER_BOTTOM_COLOR WRAP:css__parse_border_side_color
@@ -108,7 +108,7 @@ counter_reset:CSS_PROP_COUNTER_RESET IDENT:( INHERIT: NONE:0,COUNTER_RESET_NONE
background_attachment:CSS_PROP_BACKGROUND_ATTACHMENT IDENT:( INHERIT: FIXED:0,BACKGROUND_ATTACHMENT_FIXED SCROLL:0,BACKGROUND_ATTACHMENT_SCROLL IDENT:)
-background_color:CSS_PROP_BACKGROUND_COLOR IDENT:( INHERIT: TRANSPARENT:0,BACKGROUND_COLOR_TRANSPARENT IDENT:) COLOR:BACKGROUND_COLOR_SET
+background_color:CSS_PROP_BACKGROUND_COLOR IDENT:( INHERIT: IDENT:) COLOR:BACKGROUND_COLOR_SET
caption_side:CSS_PROP_CAPTION_SIDE IDENT:( INHERIT: TOP:0,CAPTION_SIDE_TOP BOTTOM:0,CAPTION_SIDE_BOTTOM IDENT:)
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index 860712d..934b3f6 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -342,6 +342,7 @@ static void HSL_to_RGB(css_fixed hue, css_fixed sat, css_fixed lit, uint8_t *r,
* \param c Parsing context
* \param vector Vector of tokens to process
* \param ctx Pointer to vector iteration context
+ * \param value Pointer to location to receive value
* \param result Pointer to location to receive result (AARRGGBB)
* \return CSS_OK on success,
* CSS_INVALID if the input is invalid
@@ -351,11 +352,10 @@ static void HSL_to_RGB(css_fixed hue, css_fixed sat, css_fixed lit, uint8_t *r,
*/
css_error css__parse_colour_specifier(css_language *c,
const parserutils_vector *vector, int *ctx,
- uint32_t *result)
+ uint16_t *value, uint32_t *result)
{
int orig_ctx = *ctx;
const css_token *token;
- uint8_t r = 0, g = 0, b = 0, a = 0xff;
bool match;
css_error error;
@@ -386,9 +386,17 @@ css_error css__parse_colour_specifier(css_language *c,
if ((lwc_string_caseless_isequal(
token->idata, c->strings[TRANSPARENT],
&match) == lwc_error_ok && match)) {
+ *value = COLOR_TRANSPARENT;
*result = 0; /* black transparent */
return CSS_OK;
+ } else if ((lwc_string_caseless_isequal(
+ token->idata, c->strings[CURRENTCOLOR],
+ &match) == lwc_error_ok && match)) {
+ *value = COLOR_CURRENT_COLOR;
+ *result = 0;
+ return CSS_OK;
}
+
error = css__parse_named_colour(c, token->idata, result);
if (error != CSS_OK && c->sheet->quirks_allowed) {
error = css__parse_hash_colour(token->idata, result);
@@ -397,34 +405,27 @@ css_error css__parse_colour_specifier(css_language *c,
}
if (error != CSS_OK)
- *ctx = orig_ctx;
-
- return error;
+ goto invalid;
} else if (token->type == CSS_TOKEN_HASH) {
error = css__parse_hash_colour(token->idata, result);
if (error != CSS_OK)
- *ctx = orig_ctx;
-
- return error;
+ goto invalid;
} else if (c->sheet->quirks_allowed &&
token->type == CSS_TOKEN_NUMBER) {
error = css__parse_hash_colour(token->idata, result);
if (error == CSS_OK)
c->sheet->quirks_used = true;
else
- *ctx = orig_ctx;
-
- return error;
+ goto invalid;
} else if (c->sheet->quirks_allowed &&
token->type == CSS_TOKEN_DIMENSION) {
error = css__parse_hash_colour(token->idata, result);
if (error == CSS_OK)
c->sheet->quirks_used = true;
else
- *ctx = orig_ctx;
-
- return error;
+ goto invalid;
} else if (token->type == CSS_TOKEN_FUNCTION) {
+ uint8_t r = 0, g = 0, b = 0, a = 0xff;
int colour_channels = 0;
if ((lwc_string_caseless_isequal(
@@ -641,9 +642,11 @@ css_error css__parse_colour_specifier(css_language *c,
} else {
goto invalid;
}
+
+ *result = (a << 24) | (r << 16) | (g << 8) | b;
}
- *result = (a << 24) | (r << 16) | (g << 8) | b;
+ *value = COLOR_SET;
return CSS_OK;
diff --git a/src/parse/properties/utils.h b/src/parse/properties/utils.h
index e5315bb..ab045bd 100644
--- a/src/parse/properties/utils.h
+++ b/src/parse/properties/utils.h
@@ -166,7 +166,7 @@ css_error css__parse_list_style_type_value(css_language *c,
css_error css__parse_colour_specifier(css_language *c,
const parserutils_vector *vector, int *ctx,
- uint32_t *result);
+ uint16_t *value, uint32_t *result);
css_error css__parse_named_colour(css_language *c, lwc_string *data,
uint32_t *result);
diff --git a/src/parse/propstrings.c b/src/parse/propstrings.c
index 354c794..9e81300 100644
--- a/src/parse/propstrings.c
+++ b/src/parse/propstrings.c
@@ -336,6 +336,7 @@ const stringmap_entry stringmap[LAST_KNOWN] = {
{ "-libcss-left", SLEN("-libcss-left") },
{ "-libcss-center", SLEN("-libcss-center") },
{ "-libcss-right", SLEN("-libcss-right") },
+ { "currentColor", SLEN("currentColor") },
{ "aliceblue", SLEN("aliceblue") },
{ "antiquewhite", SLEN("antiquewhite") },
diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h
index d3b7208..5a1662d 100644
--- a/src/parse/propstrings.h
+++ b/src/parse/propstrings.h
@@ -85,7 +85,7 @@ enum {
W_RESIZE, LIBCSS_TEXT, WAIT, HELP, PROGRESS, SERIF, SANS_SERIF, CURSIVE,
FANTASY, MONOSPACE, MALE, FEMALE, CHILD, MIX, UNDERLINE, OVERLINE,
LINE_THROUGH, BLINK, RGB, RGBA, HSL, HSLA, LIBCSS_LEFT, LIBCSS_CENTER,
- LIBCSS_RIGHT,
+ LIBCSS_RIGHT, CURRENTCOLOR,
/* Named colours */
FIRST_COLOUR,
diff --git a/src/select/computed.c b/src/select/computed.c
index 5479d2f..ee667e2 100644
--- a/src/select/computed.c
+++ b/src/select/computed.c
@@ -13,6 +13,11 @@
#include "select/propset.h"
#include "utils/utils.h"
+static css_error compute_absolute_color(css_computed_style *style,
+ uint8_t (*get)(const css_computed_style *style,
+ css_color *color),
+ css_error (*set)(css_computed_style *style,
+ uint8_t type, css_color color));
static css_error compute_border_colors(css_computed_style *style);
static css_error compute_absolute_border_width(css_computed_style *style,
@@ -375,6 +380,13 @@ css_error css__compute_absolute_values(const css_computed_style *parent,
if (error != CSS_OK)
return error;
+ /* Fix up background-color */
+ error = compute_absolute_color(style,
+ get_background_color,
+ set_background_color);
+ if (error != CSS_OK)
+ return error;
+
/* Fix up border-{top,right,bottom,left}-color */
error = compute_border_colors(style);
if (error != CSS_OK)
@@ -475,6 +487,13 @@ css_error css__compute_absolute_values(const css_computed_style *parent,
if (error != CSS_OK)
return error;
+ /* Fix up outline-color */
+ error = compute_absolute_color(style,
+ get_outline_color,
+ set_outline_color);
+ if (error != CSS_OK)
+ return error;
+
/* Fix up outline-width */
error = compute_absolute_border_side_width(style,
&ex_size.data.length,
@@ -500,7 +519,36 @@ css_error css__compute_absolute_values(const css_computed_style *parent,
******************************************************************************/
/**
- * Compute border colours, replacing any set to initial with
+ * Compute colour values, replacing any set to currentColor with
+ * the computed value of color.
+ *
+ * \param style The style to process
+ * \param get Accessor for colour value
+ * \param set Mutator for colour value
+ * \return CSS_OK on success
+ */
+css_error compute_absolute_color(css_computed_style *style,
+ uint8_t (*get)(const css_computed_style *style,
+ css_color *color),
+ css_error (*set)(css_computed_style *style,
+ uint8_t type, css_color color))
+{
+ css_color color;
+ css_error error = CSS_OK;
+
+ if (get(style, &color) == CSS_BACKGROUND_COLOR_CURRENT_COLOR) {
+ css_color computed_color;
+
+ css_computed_color(style, &computed_color);
+
+ error = set(style, CSS_BACKGROUND_COLOR_COLOR, computed_color);
+ }
+
+ return error;
+}
+
+/**
+ * Compute border colours, replacing any set to currentColor with
* the computed value of color.
*
* \param style The style to process
@@ -513,28 +561,28 @@ css_error compute_border_colors(css_computed_style *style)
css_computed_color(style, &color);
- if (get_border_top_color(style, &bcol) == CSS_BORDER_COLOR_INITIAL) {
+ if (get_border_top_color(style, &bcol) == CSS_BORDER_COLOR_CURRENT_COLOR) {
error = set_border_top_color(style,
CSS_BORDER_COLOR_COLOR, color);
if (error != CSS_OK)
return error;
}
- if (get_border_right_color(style, &bcol) == CSS_BORDER_COLOR_INITIAL) {
+ if (get_border_right_color(style, &bcol) == CSS_BORDER_COLOR_CURRENT_COLOR) {
error = set_border_right_color(style,
CSS_BORDER_COLOR_COLOR, color);
if (error != CSS_OK)
return error;
}
- if (get_border_bottom_color(style, &bcol) == CSS_BORDER_COLOR_INITIAL) {
+ if (get_border_bottom_color(style, &bcol) == CSS_BORDER_COLOR_CURRENT_COLOR) {
error = set_border_bottom_color(style,
CSS_BORDER_COLOR_COLOR, color);
if (error != CSS_OK)
return error;
}
- if (get_border_left_color(style, &bcol) == CSS_BORDER_COLOR_INITIAL) {
+ if (get_border_left_color(style, &bcol) == CSS_BORDER_COLOR_CURRENT_COLOR) {
error = set_border_left_color(style,
CSS_BORDER_COLOR_COLOR, color);
if (error != CSS_OK)
diff --git a/src/select/properties/background_color.c b/src/select/properties/background_color.c
index e71fc7d..07ba82e 100644
--- a/src/select/properties/background_color.c
+++ b/src/select/properties/background_color.c
@@ -29,7 +29,7 @@ css_error css__set_background_color_from_hint(const css_hint *hint,
css_error css__initial_background_color(css_select_state *state)
{
return set_background_color(state->computed,
- CSS_BACKGROUND_COLOR_TRANSPARENT, 0);
+ CSS_BACKGROUND_COLOR_COLOR, 0);
}
css_error css__compose_background_color(const css_computed_style *parent,
diff --git a/src/select/properties/border_bottom_color.c b/src/select/properties/border_bottom_color.c
index 0df95cc..2e63982 100644
--- a/src/select/properties/border_bottom_color.c
+++ b/src/select/properties/border_bottom_color.c
@@ -30,7 +30,7 @@ css_error css__set_border_bottom_color_from_hint(const css_hint *hint,
css_error css__initial_border_bottom_color(css_select_state *state)
{
return set_border_bottom_color(state->computed,
- CSS_BORDER_COLOR_INITIAL, 0);
+ CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
css_error css__compose_border_bottom_color(const css_computed_style *parent,
diff --git a/src/select/properties/border_left_color.c b/src/select/properties/border_left_color.c
index ea631ee..cf08257 100644
--- a/src/select/properties/border_left_color.c
+++ b/src/select/properties/border_left_color.c
@@ -30,7 +30,7 @@ css_error css__set_border_left_color_from_hint(const css_hint *hint,
css_error css__initial_border_left_color(css_select_state *state)
{
return set_border_left_color(state->computed,
- CSS_BORDER_COLOR_INITIAL, 0);
+ CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
css_error css__compose_border_left_color(const css_computed_style *parent,
diff --git a/src/select/properties/border_right_color.c b/src/select/properties/border_right_color.c
index 5f9b6ca..1829784 100644
--- a/src/select/properties/border_right_color.c
+++ b/src/select/properties/border_right_color.c
@@ -30,7 +30,7 @@ css_error css__set_border_right_color_from_hint(const css_hint *hint,
css_error css__initial_border_right_color(css_select_state *state)
{
return set_border_right_color(state->computed,
- CSS_BORDER_COLOR_INITIAL, 0);
+ CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
css_error css__compose_border_right_color(const css_computed_style *parent,
diff --git a/src/select/properties/border_top_color.c b/src/select/properties/border_top_color.c
index 328ce67..1517eea 100644
--- a/src/select/properties/border_top_color.c
+++ b/src/select/properties/border_top_color.c
@@ -28,7 +28,7 @@ css_error css__set_border_top_color_from_hint(const css_hint *hint,
css_error css__initial_border_top_color(css_select_state *state)
{
- return set_border_top_color(state->computed, CSS_BORDER_COLOR_INITIAL, 0);
+ return set_border_top_color(state->computed, CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
css_error css__compose_border_top_color(const css_computed_style *parent,
diff --git a/src/select/properties/color.c b/src/select/properties/color.c
index 3cd1e3d..dad2b9d 100644
--- a/src/select/properties/color.c
+++ b/src/select/properties/color.c
@@ -17,17 +17,30 @@
css_error css__cascade_color(uint32_t opv, css_style *style,
css_select_state *state)
{
+ bool inherit = isInherit(opv);
uint16_t value = CSS_COLOR_INHERIT;
css_color color = 0;
- if (isInherit(opv) == false) {
- value = CSS_COLOR_COLOR;
- color = *((css_color *) style->bytecode);
- advance_bytecode(style, sizeof(color));
+ if (inherit == false) {
+ switch (getValue(opv)) {
+ case COLOR_TRANSPARENT:
+ value = CSS_COLOR_COLOR;
+ break;
+ case COLOR_CURRENT_COLOR:
+ /* color: currentColor always computes to inherit */
+ value = CSS_COLOR_INHERIT;
+ inherit = true;
+ break;
+ case COLOR_SET:
+ value = CSS_COLOR_COLOR;
+ color = *((css_color *) style->bytecode);
+ advance_bytecode(style, sizeof(color));
+ break;
+ }
}
- if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
+ inherit)) {
return set_color(state->computed, value, color);
}
diff --git a/src/select/properties/helpers.c b/src/select/properties/helpers.c
index 9635dd8..3851b36 100644
--- a/src/select/properties/helpers.c
+++ b/src/select/properties/helpers.c
@@ -53,14 +53,17 @@ css_error css__cascade_bg_border_color(uint32_t opv, css_style *style,
css_color color = 0;
assert(CSS_BACKGROUND_COLOR_INHERIT == CSS_BORDER_COLOR_INHERIT);
- assert(CSS_BACKGROUND_COLOR_TRANSPARENT ==
- CSS_BORDER_COLOR_TRANSPARENT);
assert(CSS_BACKGROUND_COLOR_COLOR == CSS_BORDER_COLOR_COLOR);
+ assert(CSS_BACKGROUND_COLOR_CURRENT_COLOR ==
+ CSS_BORDER_COLOR_CURRENT_COLOR);
if (isInherit(opv) == false) {
switch (getValue(opv)) {
case BACKGROUND_COLOR_TRANSPARENT:
- value = CSS_BACKGROUND_COLOR_TRANSPARENT;
+ value = CSS_BACKGROUND_COLOR_COLOR;
+ break;
+ case BACKGROUND_COLOR_CURRENT_COLOR:
+ value = CSS_BACKGROUND_COLOR_CURRENT_COLOR;
break;
case BACKGROUND_COLOR_SET:
value = CSS_BACKGROUND_COLOR_COLOR;
diff --git a/src/select/properties/outline_color.c b/src/select/properties/outline_color.c
index dced1d8..36aafd7 100644
--- a/src/select/properties/outline_color.c
+++ b/src/select/properties/outline_color.c
@@ -22,6 +22,12 @@ css_error css__cascade_outline_color(uint32_t opv, css_style *style,
if (isInherit(opv) == false) {
switch (getValue(opv)) {
+ case OUTLINE_COLOR_TRANSPARENT:
+ value = CSS_OUTLINE_COLOR_COLOR;
+ break;
+ case OUTLINE_COLOR_CURRENT_COLOR:
+ value = CSS_OUTLINE_COLOR_CURRENT_COLOR;
+ break;
case OUTLINE_COLOR_SET:
value = CSS_OUTLINE_COLOR_COLOR;
color = *((css_color *) style->bytecode);