summaryrefslogtreecommitdiff
path: root/src/select
diff options
context:
space:
mode:
Diffstat (limited to 'src/select')
-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
9 files changed, 89 insertions, 19 deletions
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);