summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bytecode/bytecode.h112
-rw-r--r--src/bytecode/opcodes.h65
-rw-r--r--src/parse/font_face.c20
-rw-r--r--src/parse/font_face.h2
-rw-r--r--src/parse/important.c16
-rw-r--r--src/parse/important.h2
-rw-r--r--src/parse/language.c92
-rw-r--r--src/parse/language.h2
-rw-r--r--src/parse/mq.c86
-rw-r--r--src/parse/mq.h2
-rw-r--r--src/parse/parse.c2
-rw-r--r--src/parse/parse.h1
-rw-r--r--src/parse/properties/Makefile2
-rw-r--r--src/parse/properties/azimuth.c25
-rw-r--r--src/parse/properties/background.c25
-rw-r--r--src/parse/properties/background_position.c22
-rw-r--r--src/parse/properties/border.c4
-rw-r--r--src/parse/properties/border_color.c21
-rw-r--r--src/parse/properties/border_spacing.c19
-rw-r--r--src/parse/properties/border_style.c21
-rw-r--r--src/parse/properties/border_width.c21
-rw-r--r--src/parse/properties/clip.c19
-rw-r--r--src/parse/properties/column_rule.c16
-rw-r--r--src/parse/properties/columns.c13
-rw-r--r--src/parse/properties/content.c14
-rw-r--r--src/parse/properties/css_property_parser_gen.c57
-rw-r--r--src/parse/properties/cue.c20
-rw-r--r--src/parse/properties/cursor.c15
-rw-r--r--src/parse/properties/elevation.c22
-rw-r--r--src/parse/properties/fill_opacity.c82
-rw-r--r--src/parse/properties/flex.c25
-rw-r--r--src/parse/properties/flex_flow.c32
-rw-r--r--src/parse/properties/font.c74
-rw-r--r--src/parse/properties/font_family.c29
-rw-r--r--src/parse/properties/font_weight.c25
-rw-r--r--src/parse/properties/list_style.c34
-rw-r--r--src/parse/properties/list_style_type.c22
-rw-r--r--src/parse/properties/margin.c25
-rw-r--r--src/parse/properties/opacity.c14
-rw-r--r--src/parse/properties/outline.c34
-rw-r--r--src/parse/properties/overflow.c15
-rw-r--r--src/parse/properties/padding.c21
-rw-r--r--src/parse/properties/pause.c20
-rw-r--r--src/parse/properties/play_during.c22
-rw-r--r--src/parse/properties/properties.c132
-rw-r--r--src/parse/properties/properties.gen186
-rw-r--r--src/parse/properties/properties.h413
-rw-r--r--src/parse/properties/quotes.c16
-rw-r--r--src/parse/properties/stroke_opacity.c82
-rw-r--r--src/parse/properties/text_decoration.c11
-rw-r--r--src/parse/properties/utils.c177
-rw-r--r--src/parse/properties/utils.h53
-rw-r--r--src/parse/properties/voice_family.c17
-rw-r--r--src/parse/propstrings.c1172
-rw-r--r--src/parse/propstrings.h45
-rw-r--r--src/select/Makefile3
-rw-r--r--src/select/autogenerated_computed.h92
-rw-r--r--src/select/autogenerated_propget.h1634
-rw-r--r--src/select/autogenerated_propset.h982
-rw-r--r--src/select/bloom.h48
-rw-r--r--src/select/computed.c87
-rw-r--r--src/select/computed.h10
-rw-r--r--src/select/dispatch.c9
-rw-r--r--src/select/dispatch.h2
-rw-r--r--src/select/format_list_style.c1229
-rw-r--r--src/select/hash.c61
-rw-r--r--src/select/hash.h5
-rw-r--r--src/select/helpers.h48
-rw-r--r--src/select/mq.h225
-rw-r--r--src/select/overrides.py32
-rw-r--r--src/select/properties/Makefile2
-rw-r--r--src/select/properties/align_content.c23
-rw-r--r--src/select/properties/align_items.c23
-rw-r--r--src/select/properties/align_self.c23
-rw-r--r--src/select/properties/azimuth.c14
-rw-r--r--src/select/properties/background_attachment.c23
-rw-r--r--src/select/properties/background_color.c22
-rw-r--r--src/select/properties/background_image.c22
-rw-r--r--src/select/properties/background_position.c30
-rw-r--r--src/select/properties/background_repeat.c23
-rw-r--r--src/select/properties/border_bottom_color.c22
-rw-r--r--src/select/properties/border_bottom_style.c19
-rw-r--r--src/select/properties/border_bottom_width.c31
-rw-r--r--src/select/properties/border_collapse.c23
-rw-r--r--src/select/properties/border_left_color.c22
-rw-r--r--src/select/properties/border_left_style.c19
-rw-r--r--src/select/properties/border_left_width.c23
-rw-r--r--src/select/properties/border_right_color.c22
-rw-r--r--src/select/properties/border_right_style.c19
-rw-r--r--src/select/properties/border_right_width.c23
-rw-r--r--src/select/properties/border_spacing.c29
-rw-r--r--src/select/properties/border_top_color.c22
-rw-r--r--src/select/properties/border_top_style.c19
-rw-r--r--src/select/properties/border_top_width.c23
-rw-r--r--src/select/properties/bottom.c23
-rw-r--r--src/select/properties/box_sizing.c26
-rw-r--r--src/select/properties/break_after.c19
-rw-r--r--src/select/properties/break_before.c19
-rw-r--r--src/select/properties/break_inside.c23
-rw-r--r--src/select/properties/caption_side.c23
-rw-r--r--src/select/properties/clear.c23
-rw-r--r--src/select/properties/clip.c28
-rw-r--r--src/select/properties/color.c30
-rw-r--r--src/select/properties/column_count.c26
-rw-r--r--src/select/properties/column_fill.c23
-rw-r--r--src/select/properties/column_gap.c23
-rw-r--r--src/select/properties/column_rule_color.c29
-rw-r--r--src/select/properties/column_rule_style.c19
-rw-r--r--src/select/properties/column_rule_width.c23
-rw-r--r--src/select/properties/column_span.c23
-rw-r--r--src/select/properties/column_width.c27
-rw-r--r--src/select/properties/content.c51
-rw-r--r--src/select/properties/counter_increment.c48
-rw-r--r--src/select/properties/counter_reset.c48
-rw-r--r--src/select/properties/cue_after.c10
-rw-r--r--src/select/properties/cue_before.c10
-rw-r--r--src/select/properties/cursor.c52
-rw-r--r--src/select/properties/direction.c23
-rw-r--r--src/select/properties/display.c29
-rw-r--r--src/select/properties/elevation.c14
-rw-r--r--src/select/properties/empty_cells.c23
-rw-r--r--src/select/properties/fill_opacity.c73
-rw-r--r--src/select/properties/flex_basis.c27
-rw-r--r--src/select/properties/flex_direction.c23
-rw-r--r--src/select/properties/flex_grow.c26
-rw-r--r--src/select/properties/flex_shrink.c26
-rw-r--r--src/select/properties/flex_wrap.c25
-rw-r--r--src/select/properties/float.c23
-rw-r--r--src/select/properties/font_family.c61
-rw-r--r--src/select/properties/font_size.c27
-rw-r--r--src/select/properties/font_style.c23
-rw-r--r--src/select/properties/font_variant.c23
-rw-r--r--src/select/properties/font_weight.c23
-rw-r--r--src/select/properties/height.c23
-rw-r--r--src/select/properties/helpers.c87
-rw-r--r--src/select/properties/helpers.h137
-rw-r--r--src/select/properties/justify_content.c23
-rw-r--r--src/select/properties/left.c23
-rw-r--r--src/select/properties/letter_spacing.c23
-rw-r--r--src/select/properties/line_height.c27
-rw-r--r--src/select/properties/list_style_image.c22
-rw-r--r--src/select/properties/list_style_position.c23
-rw-r--r--src/select/properties/list_style_type.c135
-rw-r--r--src/select/properties/margin_bottom.c23
-rw-r--r--src/select/properties/margin_left.c23
-rw-r--r--src/select/properties/margin_right.c23
-rw-r--r--src/select/properties/margin_top.c23
-rw-r--r--src/select/properties/max_height.c23
-rw-r--r--src/select/properties/max_width.c23
-rw-r--r--src/select/properties/min_height.c23
-rw-r--r--src/select/properties/min_width.c23
-rw-r--r--src/select/properties/opacity.c28
-rw-r--r--src/select/properties/order.c26
-rw-r--r--src/select/properties/orphans.c22
-rw-r--r--src/select/properties/outline_color.c26
-rw-r--r--src/select/properties/outline_style.c19
-rw-r--r--src/select/properties/outline_width.c23
-rw-r--r--src/select/properties/overflow_x.c23
-rw-r--r--src/select/properties/overflow_y.c23
-rw-r--r--src/select/properties/padding_bottom.c23
-rw-r--r--src/select/properties/padding_left.c23
-rw-r--r--src/select/properties/padding_right.c23
-rw-r--r--src/select/properties/padding_top.c23
-rw-r--r--src/select/properties/page_break_after.c19
-rw-r--r--src/select/properties/page_break_before.c19
-rw-r--r--src/select/properties/page_break_inside.c19
-rw-r--r--src/select/properties/pause_after.c10
-rw-r--r--src/select/properties/pause_before.c10
-rw-r--r--src/select/properties/pitch.c14
-rw-r--r--src/select/properties/pitch_range.c10
-rw-r--r--src/select/properties/play_during.c14
-rw-r--r--src/select/properties/position.c26
-rw-r--r--src/select/properties/properties.h3
-rw-r--r--src/select/properties/quotes.c60
-rw-r--r--src/select/properties/richness.c10
-rw-r--r--src/select/properties/right.c23
-rw-r--r--src/select/properties/speak.c14
-rw-r--r--src/select/properties/speak_header.c14
-rw-r--r--src/select/properties/speak_numeral.c14
-rw-r--r--src/select/properties/speak_punctuation.c14
-rw-r--r--src/select/properties/speech_rate.c14
-rw-r--r--src/select/properties/stress.c10
-rw-r--r--src/select/properties/stroke_opacity.c73
-rw-r--r--src/select/properties/table_layout.c23
-rw-r--r--src/select/properties/text_align.c28
-rw-r--r--src/select/properties/text_decoration.c23
-rw-r--r--src/select/properties/text_indent.c23
-rw-r--r--src/select/properties/text_transform.c23
-rw-r--r--src/select/properties/top.c23
-rw-r--r--src/select/properties/unicode_bidi.c23
-rw-r--r--src/select/properties/vertical_align.c27
-rw-r--r--src/select/properties/visibility.c23
-rw-r--r--src/select/properties/voice_family.c14
-rw-r--r--src/select/properties/volume.c14
-rw-r--r--src/select/properties/white_space.c23
-rw-r--r--src/select/properties/widows.c22
-rw-r--r--src/select/properties/width.c23
-rw-r--r--src/select/properties/word_spacing.c23
-rw-r--r--src/select/properties/writing_mode.c27
-rw-r--r--src/select/properties/z_index.c26
-rw-r--r--src/select/select.c552
-rw-r--r--src/select/select.h21
-rw-r--r--src/select/select_config.py4
-rw-r--r--src/select/select_generator.py278
-rw-r--r--src/select/strings.c264
-rw-r--r--src/select/strings.h52
-rw-r--r--src/select/unit.c513
-rw-r--r--src/select/unit.h42
-rw-r--r--src/stylesheet.h44
209 files changed, 9309 insertions, 3827 deletions
diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h
index 22703f7..ccfdcac 100644
--- a/src/bytecode/bytecode.h
+++ b/src/bytecode/bytecode.h
@@ -18,54 +18,64 @@ typedef uint32_t css_code_t;
typedef enum css_properties_e opcode_t;
+enum flag_value {
+ FLAG_VALUE__NONE = 0,
+ FLAG_VALUE_INHERIT = 1,
+ FLAG_VALUE_INITIAL = 2,
+ FLAG_VALUE_REVERT = 3,
+ FLAG_VALUE_UNSET = 4,
+};
+
enum flag {
- FLAG_IMPORTANT = (1<<0),
- FLAG_INHERIT = (1<<1)
+ FLAG_IMPORTANT = (1 << 0),
+ FLAG_INHERIT = (FLAG_VALUE_INHERIT << 1),
+ FLAG_INITIAL = (FLAG_VALUE_INITIAL << 1),
+ FLAG_REVERT = (FLAG_VALUE_REVERT << 1),
+ FLAG_UNSET = (FLAG_VALUE_UNSET << 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_CH = (1u << 8) + 8,
+ UNIT_REM = (1u << 8) + 9,
+ UNIT_LH = (1u << 8) + 10,
+ UNIT_VH = (1u << 8) + 11,
+ UNIT_VW = (1u << 8) + 12,
+ UNIT_VI = (1u << 8) + 13,
+ UNIT_VB = (1u << 8) + 14,
+ UNIT_VMIN = (1u << 8) + 15,
+ UNIT_VMAX = (1u << 8) + 16,
+ UNIT_Q = (1u << 8) + 17,
+
+ 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;
@@ -96,12 +106,22 @@ static inline uint16_t getValue(css_code_t OPV)
static inline bool isImportant(css_code_t OPV)
{
- return getFlags(OPV) & 0x1;
+ return getFlags(OPV) & FLAG_IMPORTANT;
+}
+
+static inline enum flag_value getFlagValue(css_code_t OPV)
+{
+ return (getFlags(OPV) >> 1) & 0x7;
+}
+
+static inline bool hasFlagValue(css_code_t OPV)
+{
+ return getFlagValue(OPV) != FLAG_VALUE__NONE;
}
static inline bool isInherit(css_code_t OPV)
{
- return getFlags(OPV) & 0x2;
+ return getFlagValue(OPV) == FLAG_VALUE_INHERIT;
}
#endif
diff --git a/src/bytecode/opcodes.h b/src/bytecode/opcodes.h
index 82bf75f..7a1377b 100644
--- a/src/bytecode/opcodes.h
+++ b/src/bytecode/opcodes.h
@@ -29,11 +29,11 @@ enum op_align_items {
};
enum op_align_self {
- ALIGN_SELF_STRETCH = 0x0000,
- ALIGN_SELF_FLEX_START = 0x0001,
- ALIGN_SELF_FLEX_END = 0x0002,
- ALIGN_SELF_CENTER = 0x0003,
- ALIGN_SELF_BASELINE = 0x0004,
+ ALIGN_SELF_STRETCH = ALIGN_ITEMS_STRETCH,
+ ALIGN_SELF_FLEX_START = ALIGN_ITEMS_FLEX_START,
+ ALIGN_SELF_FLEX_END = ALIGN_ITEMS_FLEX_END,
+ ALIGN_SELF_CENTER = ALIGN_ITEMS_CENTER,
+ ALIGN_SELF_BASELINE = ALIGN_ITEMS_BASELINE,
ALIGN_SELF_AUTO = 0x0005
};
@@ -332,7 +332,9 @@ enum op_display {
DISPLAY_TABLE_CAPTION = 0x000e,
DISPLAY_NONE = 0x000f,
DISPLAY_FLEX = 0x0010,
- DISPLAY_INLINE_FLEX = 0x0011
+ DISPLAY_INLINE_FLEX = 0x0011,
+ DISPLAY_GRID = 0x0012,
+ DISPLAY_INLINE_GRID = 0x0013
};
enum op_elevation {
@@ -349,6 +351,11 @@ enum op_empty_cells {
EMPTY_CELLS_HIDE = 0x0001
};
+enum op_fill_opacity {
+ FILL_OPACITY_SET = 0x0080
+};
+
+
enum op_flex_basis {
FLEX_BASIS_AUTO = 0x0000,
FLEX_BASIS_CONTENT = 0x0001,
@@ -491,7 +498,44 @@ enum op_list_style_type {
LIST_STYLE_TYPE_GEORGIAN = 0x000b,
LIST_STYLE_TYPE_LOWER_ALPHA = 0x000c,
LIST_STYLE_TYPE_UPPER_ALPHA = 0x000d,
- LIST_STYLE_TYPE_NONE = 0x000e
+ LIST_STYLE_TYPE_NONE = 0x000e,
+ LIST_STYLE_TYPE_BINARY = 0x000f,
+ LIST_STYLE_TYPE_OCTAL = 0x0010,
+ LIST_STYLE_TYPE_LOWER_HEXADECIMAL = 0x0011,
+ LIST_STYLE_TYPE_UPPER_HEXADECIMAL = 0x0012,
+ LIST_STYLE_TYPE_ARABIC_INDIC = 0x0013,
+ LIST_STYLE_TYPE_LOWER_ARMENIAN = 0x0014,
+ LIST_STYLE_TYPE_UPPER_ARMENIAN = 0x0015,
+ LIST_STYLE_TYPE_BENGALI = 0x0016,
+ LIST_STYLE_TYPE_CAMBODIAN = 0x0017,
+ LIST_STYLE_TYPE_KHMER = 0x0018,
+ LIST_STYLE_TYPE_CJK_DECIMAL = 0x0019,
+ LIST_STYLE_TYPE_DEVANAGARI = 0x001a,
+ LIST_STYLE_TYPE_GUJARATI = 0x001b,
+ LIST_STYLE_TYPE_GURMUKHI = 0x001c,
+ LIST_STYLE_TYPE_HEBREW = 0x001d,
+ LIST_STYLE_TYPE_KANNADA = 0x001e,
+ LIST_STYLE_TYPE_LAO = 0x001f,
+ LIST_STYLE_TYPE_MALAYALAM = 0x0020,
+ LIST_STYLE_TYPE_MONGOLIAN = 0x0021,
+ LIST_STYLE_TYPE_MYANMAR = 0x0022,
+ LIST_STYLE_TYPE_ORIYA = 0x0023,
+ LIST_STYLE_TYPE_PERSIAN = 0x0024,
+ LIST_STYLE_TYPE_TAMIL = 0x0025,
+ LIST_STYLE_TYPE_TELUGU = 0x0026,
+ LIST_STYLE_TYPE_THAI = 0x0027,
+ LIST_STYLE_TYPE_TIBETAN = 0x0028,
+ LIST_STYLE_TYPE_CJK_EARTHLY_BRANCH = 0x0029,
+ LIST_STYLE_TYPE_CJK_HEAVENLY_STEM = 0x002a,
+ LIST_STYLE_TYPE_HIAGANA = 0x002b,
+ LIST_STYLE_TYPE_HIAGANA_IROHA = 0x002c,
+ LIST_STYLE_TYPE_KATAKANA = 0x002d,
+ LIST_STYLE_TYPE_KATAKANA_IROHA = 0x002e,
+ LIST_STYLE_TYPE_JAPANESE_INFORMAL = 0x002f,
+ LIST_STYLE_TYPE_JAPANESE_FORMAL = 0x0030,
+ LIST_STYLE_TYPE_KOREAN_HANGUL_FORMAL = 0x0031,
+ LIST_STYLE_TYPE_KOREAN_HANJA_INFORMAL = 0x0032,
+ LIST_STYLE_TYPE_KOREAN_HANJA_FORMAL = 0x0033
};
enum op_margin {
@@ -626,7 +670,8 @@ enum op_position {
POSITION_STATIC = 0x0000,
POSITION_RELATIVE = 0x0001,
POSITION_ABSOLUTE = 0x0002,
- POSITION_FIXED = 0x0003
+ POSITION_FIXED = 0x0003,
+ POSITION_STICKY = 0x0004
};
enum op_quotes {
@@ -681,6 +726,10 @@ enum op_stress {
STRESS_SET = 0x0080
};
+enum op_stroke_opacity {
+ STROKE_OPACITY_SET = 0x0080
+};
+
enum op_table_layout {
TABLE_LAYOUT_AUTO = 0x0000,
TABLE_LAYOUT_FIXED = 0x0001
diff --git a/src/parse/font_face.c b/src/parse/font_face.c
index f17d50e..055a118 100644
--- a/src/parse/font_face.c
+++ b/src/parse/font_face.c
@@ -41,7 +41,7 @@ static bool font_rule_font_family_reserved(css_language *c,
}
static css_error font_face_parse_font_family(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_font_face *font_face)
{
css_error error;
@@ -60,7 +60,7 @@ static css_error font_face_parse_font_family(css_language *c,
}
static css_error font_face_src_parse_format(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_font_face_format *format)
{
bool match;
@@ -120,7 +120,7 @@ static css_error font_face_src_parse_format(css_language *c,
}
static css_error font_face_src_parse_spec_or_name(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
lwc_string **location,
css_font_face_location_type *location_type,
css_font_face_format *format)
@@ -194,10 +194,10 @@ static css_error font_face_src_parse_spec_or_name(css_language *c,
}
static css_error font_face_parse_src(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_font_face *font_face)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error = CSS_OK;
const css_token *token;
css_font_face_src *srcs = NULL, *new_srcs = NULL;
@@ -258,10 +258,10 @@ cleanup:
}
static css_error font_face_parse_font_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_font_face *font_face)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error = CSS_OK;
const css_token *token;
enum css_font_style_e style = 0;
@@ -299,10 +299,10 @@ static css_error font_face_parse_font_style(css_language *c,
}
static css_error font_face_parse_font_weight(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_font_face *font_face)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error = CSS_OK;
const css_token *token;
enum css_font_weight_e weight = 0;
@@ -374,7 +374,7 @@ static css_error font_face_parse_font_weight(css_language *c,
*/
css_error css__parse_font_descriptor(css_language *c,
const css_token *descriptor, const parserutils_vector *vector,
- int *ctx, css_rule_font_face *rule)
+ int32_t *ctx, css_rule_font_face *rule)
{
css_font_face *font_face = rule->font_face;
css_error error;
diff --git a/src/parse/font_face.h b/src/parse/font_face.h
index 435380e..dc00ef1 100644
--- a/src/parse/font_face.h
+++ b/src/parse/font_face.h
@@ -17,6 +17,6 @@
css_error css__parse_font_descriptor(css_language *c,
const css_token *descriptor, const parserutils_vector *vector,
- int *ctx, struct css_rule_font_face *rule);
+ int32_t *ctx, struct css_rule_font_face *rule);
#endif
diff --git a/src/parse/important.c b/src/parse/important.c
index e0e8620..02aafc4 100644
--- a/src/parse/important.c
+++ b/src/parse/important.c
@@ -25,10 +25,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_important(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
uint8_t *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
bool match = false;
const css_token *token;
@@ -87,7 +87,7 @@ void css__make_style_important(css_style *style)
offset++;
/* Advance past any property-specific data */
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (op) {
case CSS_PROP_AZIMUTH:
if ((value & ~AZIMUTH_BEHIND) == AZIMUTH_ANGLE)
@@ -346,6 +346,16 @@ void css__make_style_important(css_style *style)
offset++; /* value */
break;
+ case CSS_PROP_FILL_OPACITY:
+ if (value == FILL_OPACITY_SET)
+ offset++; /* value */
+ break;
+
+ case CSS_PROP_STROKE_OPACITY:
+ if (value == STROKE_OPACITY_SET)
+ offset++; /* value */
+ break;
+
case CSS_PROP_ORDER:
if (value == ORDER_SET)
offset++; /* value */
diff --git a/src/parse/important.h b/src/parse/important.h
index ba5e118..e939c4b 100644
--- a/src/parse/important.h
+++ b/src/parse/important.h
@@ -12,7 +12,7 @@
#include "parse/language.h"
css_error css__parse_important(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
uint8_t *result);
void css__make_style_important(css_style *style);
diff --git a/src/parse/language.c b/src/parse/language.c
index 7fbfba7..936ab3d 100644
--- a/src/parse/language.c
+++ b/src/parse/language.c
@@ -50,6 +50,8 @@ static css_error handleEndBlock(css_language *c,
const parserutils_vector *vector);
static css_error handleBlockContent(css_language *c,
const parserutils_vector *vector);
+static css_error handleEndBlockContent(css_language *c,
+ const parserutils_vector *vector);
static css_error handleDeclaration(css_language *c,
const parserutils_vector *vector);
@@ -61,37 +63,37 @@ static css_error lookupNamespace(css_language *c,
/* Selector list parsing */
static css_error parseClass(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector_detail *specific);
static css_error parseAttrib(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector_detail *specific);
static css_error parseNth(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector_detail_value *value);
static css_error parsePseudo(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool in_not, css_selector_detail *specific);
static css_error parseSpecific(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool in_not, css_selector_detail *specific);
static css_error parseAppendSpecific(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **parent);
static css_error parseSelectorSpecifics(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **parent);
static css_error parseTypeSelector(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_qname *qname);
static css_error parseSimpleSelector(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **result);
static css_error parseCombinator(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_combinator *result);
static css_error parseSelector(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **result);
static css_error parseSelectorList(css_language *c,
const parserutils_vector *vector, css_rule *rule);
@@ -99,7 +101,7 @@ static css_error parseSelectorList(css_language *c,
/* Declaration parsing */
static css_error parseProperty(css_language *c,
const css_token *property, const parserutils_vector *vector,
- int *ctx, css_rule *rule);
+ int32_t *ctx, css_rule *rule);
/**
* Create a CSS language parser
@@ -219,6 +221,8 @@ css_error language_handle_event(css_parser_event type,
return handleEndBlock(language, tokens);
case CSS_PARSER_BLOCK_CONTENT:
return handleBlockContent(language, tokens);
+ case CSS_PARSER_END_BLOCK_CONTENT:
+ return handleEndBlockContent(language, tokens);
case CSS_PARSER_DECLARATION:
return handleDeclaration(language, tokens);
}
@@ -748,11 +752,45 @@ css_error handleBlockContent(css_language *c, const parserutils_vector *vector)
return CSS_OK;
}
+css_error handleEndBlockContent(css_language *c, const parserutils_vector *vector)
+{
+ context_entry *entry;
+ parserutils_error perror;
+ css_error ret;
+
+ /* First we call handleBlockContent() to deal with any intermediate
+ * tokens we have left
+ */
+ ret = handleBlockContent(c, vector);
+ if (ret != CSS_OK) {
+ return ret;
+ }
+
+ /* Our goal here is to ensure that the language parse stack is in the
+ * right state. We've encountered the end of a BlockContent such as
+ * @media ... { ... }
+ * and we need to ensure that the language stack reflects the end of
+ * that block, not any unfinished business within it such as
+ * @media ... { d }
+ */
+
+ entry = parserutils_stack_get_current(c->context);
+ while (entry != NULL && entry->type != CSS_PARSER_START_BLOCK) {
+ perror = parserutils_stack_pop(c->context, NULL);
+ if (perror != PARSERUTILS_OK) {
+ return css_error_from_parserutils_error(perror);
+ }
+ entry = parserutils_stack_get_current(c->context);
+ }
+
+ return CSS_OK;
+}
+
css_error handleDeclaration(css_language *c, const parserutils_vector *vector)
{
css_error error;
const css_token *token, *ident;
- int ctx = 0;
+ int32_t ctx = 0;
context_entry *entry;
css_rule *rule;
@@ -907,7 +945,7 @@ css_error lookupNamespace(css_language *c, lwc_string *prefix, lwc_string **uri)
******************************************************************************/
css_error parseClass(css_language *c, const parserutils_vector *vector,
- int *ctx, css_selector_detail *specific)
+ int32_t *ctx, css_selector_detail *specific)
{
css_qname qname;
css_selector_detail_value detail_value;
@@ -938,7 +976,7 @@ css_error parseClass(css_language *c, const parserutils_vector *vector,
}
css_error parseAttrib(css_language *c, const parserutils_vector *vector,
- int *ctx, css_selector_detail *specific)
+ int32_t *ctx, css_selector_detail *specific)
{
css_qname qname;
css_selector_detail_value detail_value;
@@ -1040,7 +1078,7 @@ css_error parseAttrib(css_language *c, const parserutils_vector *vector,
}
css_error parseNth(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector_detail_value *value)
{
const css_token *token;
@@ -1241,7 +1279,7 @@ css_error parseNth(css_language *c,
}
css_error parsePseudo(css_language *c, const parserutils_vector *vector,
- int *ctx, bool in_not, css_selector_detail *specific)
+ int32_t *ctx, bool in_not, css_selector_detail *specific)
{
static const struct
{
@@ -1421,7 +1459,7 @@ css_error parsePseudo(css_language *c, const parserutils_vector *vector,
}
css_error parseSpecific(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool in_not, css_selector_detail *specific)
{
css_error error;
@@ -1476,7 +1514,7 @@ css_error parseSpecific(css_language *c,
}
css_error parseAppendSpecific(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **parent)
{
css_error error;
@@ -1491,7 +1529,7 @@ css_error parseAppendSpecific(css_language *c,
}
css_error parseSelectorSpecifics(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **parent)
{
css_error error;
@@ -1513,7 +1551,7 @@ css_error parseSelectorSpecifics(css_language *c,
}
css_error parseTypeSelector(css_language *c, const parserutils_vector *vector,
- int *ctx, css_qname *qname)
+ int32_t *ctx, css_qname *qname)
{
const css_token *token;
css_error error;
@@ -1574,10 +1612,10 @@ css_error parseTypeSelector(css_language *c, const parserutils_vector *vector,
}
css_error parseSimpleSelector(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_selector **result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
css_selector *selector;
@@ -1640,7 +1678,7 @@ css_error parseSimpleSelector(css_language *c,
}
css_error parseCombinator(css_language *c, const parserutils_vector *vector,
- int *ctx, css_combinator *result)
+ int32_t *ctx, css_combinator *result)
{
const css_token *token;
css_combinator comb = CSS_COMBINATOR_NONE;
@@ -1681,7 +1719,7 @@ css_error parseCombinator(css_language *c, const parserutils_vector *vector,
}
css_error parseSelector(css_language *c, const parserutils_vector *vector,
- int *ctx, css_selector **result)
+ int32_t *ctx, css_selector **result)
{
css_error error;
const css_token *token = NULL;
@@ -1747,7 +1785,7 @@ css_error parseSelectorList(css_language *c, const parserutils_vector *vector,
css_error error;
const css_token *token = NULL;
css_selector *selector = NULL;
- int ctx = 0;
+ int32_t ctx = 0;
/* Strip any leading whitespace (can happen if in nested block) */
consumeWhitespace(vector, &ctx);
@@ -1805,7 +1843,7 @@ css_error parseSelectorList(css_language *c, const parserutils_vector *vector,
******************************************************************************/
css_error parseProperty(css_language *c, const css_token *property,
- const parserutils_vector *vector, int *ctx, css_rule *rule)
+ const parserutils_vector *vector, int32_t *ctx, css_rule *rule)
{
css_error error;
css_prop_handler handler = NULL;
diff --git a/src/parse/language.h b/src/parse/language.h
index 2ab4987..81a096a 100644
--- a/src/parse/language.h
+++ b/src/parse/language.h
@@ -64,7 +64,7 @@ css_error css__language_destroy(css_language *language);
* \param vector The vector to consume from
* \param ctx The vector's context
*/
-static inline void consumeWhitespace(const parserutils_vector *vector, int *ctx)
+static inline void consumeWhitespace(const parserutils_vector *vector, int32_t *ctx)
{
const css_token *token = NULL;
diff --git a/src/parse/mq.c b/src/parse/mq.c
index c6ebe84..5031e34 100644
--- a/src/parse/mq.c
+++ b/src/parse/mq.c
@@ -79,11 +79,11 @@ void css__mq_query_destroy(css_mq_query *media)
}
static css_error mq_parse_condition(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool permit_or, css_mq_cond **cond);
static css_error mq_parse_ratio(
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
const css_token *numerator, css_fixed *ratio)
{
const css_token *token;
@@ -260,7 +260,7 @@ static css_error mq_parse_range__convert_to_level_4(
}
static css_error mq_parse_range(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
const css_token *name_or_value,
css_mq_feature **feature)
{
@@ -443,7 +443,7 @@ static css_error mq_parse_range(lwc_string **strings,
}
static css_error mq_parse_media_feature(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_mq_feature **feature)
{
const css_token *name_or_value, *token;
@@ -565,7 +565,7 @@ static css_error mq_parse_media_feature(lwc_string **strings,
* CSS Syntax Module Level 3: 8.2
*/
static css_error mq_parse_consume_any_value(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool until, const char until_char)
{
const css_token *token;
@@ -627,7 +627,7 @@ static css_error mq_parse_consume_any_value(lwc_string **strings,
}
static css_error mq_parse_general_enclosed(lwc_string **strings,
- const parserutils_vector *vector, int *ctx)
+ const parserutils_vector *vector, int32_t *ctx)
{
const css_token *token;
css_error error;
@@ -671,7 +671,7 @@ static css_error mq_parse_general_enclosed(lwc_string **strings,
}
static css_error mq_parse_media_in_parens(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_mq_cond_or_feature **cond_or_feature)
{
const css_token *token;
@@ -754,7 +754,7 @@ static css_error mq_parse_media_in_parens(lwc_string **strings,
}
static css_error mq_parse_condition(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool permit_or, css_mq_cond **cond)
{
const css_token *token;
@@ -800,13 +800,13 @@ static css_error mq_parse_condition(lwc_string **strings,
}
result->negate = 1;
- result->nparts = 1;
result->parts = malloc(sizeof(*result->parts));
if (result->parts == NULL) {
css__mq_cond_or_feature_destroy(cond_or_feature);
css__mq_cond_destroy(result);
return CSS_NOMEM;
}
+ result->nparts = 1;
result->parts[0] = cond_or_feature;
*cond = result;
@@ -882,63 +882,84 @@ static css_error mq_parse_condition(lwc_string **strings,
/**
* Parse a media query type.
*/
-static uint64_t mq_parse_type(lwc_string **strings, lwc_string *type)
+static css_error mq_parse_type(lwc_string **strings, lwc_string *type,
+ uint64_t *result)
{
bool match;
+ css_error error = CSS_OK;
if (type == NULL) {
- return CSS_MEDIA_ALL;
+ *result = CSS_MEDIA_ALL;
} else if (lwc_string_caseless_isequal(
type, strings[AURAL],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_AURAL;
+ *result = CSS_MEDIA_AURAL;
} else if (lwc_string_caseless_isequal(
type, strings[BRAILLE],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_BRAILLE;
+ *result = CSS_MEDIA_BRAILLE;
} else if (lwc_string_caseless_isequal(
type, strings[EMBOSSED],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_EMBOSSED;
+ *result = CSS_MEDIA_EMBOSSED;
} else if (lwc_string_caseless_isequal(
type, strings[HANDHELD],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_HANDHELD;
+ *result = CSS_MEDIA_HANDHELD;
} else if (lwc_string_caseless_isequal(
type, strings[PRINT],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_PRINT;
+ *result = CSS_MEDIA_PRINT;
} else if (lwc_string_caseless_isequal(
type, strings[PROJECTION],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_PROJECTION;
+ *result = CSS_MEDIA_PROJECTION;
} else if (lwc_string_caseless_isequal(
type, strings[SCREEN],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_SCREEN;
+ *result = CSS_MEDIA_SCREEN;
} else if (lwc_string_caseless_isequal(
type, strings[SPEECH],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_SPEECH;
+ *result = CSS_MEDIA_SPEECH;
} else if (lwc_string_caseless_isequal(
type, strings[TTY],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_TTY;
+ *result = CSS_MEDIA_TTY;
} else if (lwc_string_caseless_isequal(
type, strings[TV],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_TV;
+ *result = CSS_MEDIA_TV;
} else if (lwc_string_caseless_isequal(
type, strings[ALL],
&match) == lwc_error_ok && match) {
- return CSS_MEDIA_ALL;
+ *result = CSS_MEDIA_ALL;
+ } else if (lwc_string_caseless_isequal(
+ type, strings[NOT],
+ &match) == lwc_error_ok && match) {
+ error = CSS_INVALID;
+ } else if (lwc_string_caseless_isequal(
+ type, strings[AND],
+ &match) == lwc_error_ok && match) {
+ error = CSS_INVALID;
+ } else if (lwc_string_caseless_isequal(
+ type, strings[OR],
+ &match) == lwc_error_ok && match) {
+ error = CSS_INVALID;
+ } else if (lwc_string_caseless_isequal(
+ type, strings[ONLY],
+ &match) == lwc_error_ok && match) {
+ error = CSS_INVALID;
+ } else {
+ /* Unknown type: same as not matching */
+ *result = 0;
}
- return 0;
+ return error;
}
static css_error mq_parse_media_query(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_mq_query **query)
{
const css_token *token;
@@ -963,7 +984,7 @@ static css_error mq_parse_media_query(lwc_string **strings,
lwc_string_caseless_isequal(token->idata,
strings[NOT], &match) == lwc_error_ok &&
match) {
- int old_ctx = *ctx;
+ int32_t old_ctx = *ctx;
parserutils_vector_iterate(vector, ctx);
consumeWhitespace(vector, ctx);
@@ -991,6 +1012,7 @@ static css_error mq_parse_media_query(lwc_string **strings,
return error;
}
+ result->type = CSS_MEDIA_ALL;
goto finished;
}
@@ -1016,7 +1038,11 @@ static css_error mq_parse_media_query(lwc_string **strings,
return CSS_INVALID;
}
- result->type = mq_parse_type(strings, token->idata);
+ error = mq_parse_type(strings, token->idata, &result->type);
+ if (error != CSS_OK) {
+ free(result);
+ return error;
+ }
consumeWhitespace(vector, ctx);
@@ -1041,10 +1067,6 @@ static css_error mq_parse_media_query(lwc_string **strings,
}
finished:
- if (result->type == 0) {
- result->type = CSS_MEDIA_ALL;
- }
-
*query = result;
return CSS_OK;
}
@@ -1078,7 +1100,7 @@ static css_error css__mq_parse__create_not_all(
}
css_error css__mq_parse_media_list(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_mq_query **media)
{
css_mq_query *result = NULL, *last = NULL;
@@ -1140,7 +1162,7 @@ static css_error css_parse_media_query_handle_event(
const parserutils_vector *tokens,
void *pw)
{
- int idx = 0;
+ int32_t idx = 0;
css_error err;
css_mq_query *media;
const css_token *tok;
diff --git a/src/parse/mq.h b/src/parse/mq.h
index 7a51578..ec19419 100644
--- a/src/parse/mq.h
+++ b/src/parse/mq.h
@@ -88,7 +88,7 @@ css_error css_parse_media_query(lwc_string **strings,
css_mq_query **media_out);
css_error css__mq_parse_media_list(lwc_string **strings,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_mq_query **media);
void css__mq_query_destroy(css_mq_query *media);
diff --git a/src/parse/parse.c b/src/parse/parse.c
index cbd8b56..d7cb357 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -1388,7 +1388,7 @@ css_error parseBlockContent(css_parser *parser)
#endif
if (parser->event != NULL) {
parser->event(
- CSS_PARSER_BLOCK_CONTENT,
+ CSS_PARSER_END_BLOCK_CONTENT,
parser->tokens,
parser->event_pw);
}
diff --git a/src/parse/parse.h b/src/parse/parse.h
index e65f055..1e040de 100644
--- a/src/parse/parse.h
+++ b/src/parse/parse.h
@@ -31,6 +31,7 @@ typedef enum css_parser_event {
CSS_PARSER_START_BLOCK,
CSS_PARSER_END_BLOCK,
CSS_PARSER_BLOCK_CONTENT,
+ CSS_PARSER_END_BLOCK_CONTENT,
CSS_PARSER_DECLARATION
} css_parser_event;
diff --git a/src/parse/properties/Makefile b/src/parse/properties/Makefile
index 6461dda..df84d49 100644
--- a/src/parse/properties/Makefile
+++ b/src/parse/properties/Makefile
@@ -45,6 +45,7 @@ DIR_SOURCES := \
cue.c \
cursor.c \
elevation.c \
+ fill_opacity.c \
flex.c \
flex_flow.c \
font.c \
@@ -61,6 +62,7 @@ DIR_SOURCES := \
play_during.c \
properties.c \
quotes.c \
+ stroke_opacity.c \
text_decoration.c \
utils.c \
voice_family.c
diff --git a/src/parse/properties/azimuth.c b/src/parse/properties/azimuth.c
index f54189b..a9265d1 100644
--- a/src/parse/properties/azimuth.c
+++ b/src/parse/properties/azimuth.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_azimuth(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
uint8_t flags = 0;
@@ -53,11 +53,30 @@ css_error css__parse_azimuth(css_language *c,
}
if (token->type == CSS_TOKEN_IDENT &&
- (lwc_string_caseless_isequal(token->idata, c->strings[INHERIT],
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[INHERIT],
&match) == lwc_error_ok && match)) {
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_INITIAL;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_REVERT;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_UNSET;
+ } else if (token->type == CSS_TOKEN_IDENT &&
(lwc_string_caseless_isequal(token->idata, c->strings[LEFTWARDS],
&match) == lwc_error_ok && match)) {
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/background.c b/src/parse/properties/background.c
index 01b995e..20aeb30 100644
--- a/src/parse/properties/background.c
+++ b/src/parse/properties/background.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_background(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error = CSS_OK;
@@ -45,31 +45,38 @@ css_error css__parse_background(css_language *c,
css_style * image_style;
css_style * position_style;
css_style * repeat_style;
-
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_BACKGROUND_ATTACHMENT);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BACKGROUND_ATTACHMENT);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BACKGROUND_COLOR);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BACKGROUND_COLOR);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BACKGROUND_IMAGE);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BACKGROUND_IMAGE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BACKGROUND_POSITION);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BACKGROUND_POSITION);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BACKGROUND_REPEAT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BACKGROUND_REPEAT);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/background_position.c b/src/parse/properties/background_position.c
index 6932c05..1d87e6a 100644
--- a/src/parse/properties/background_position.c
+++ b/src/parse/properties/background_position.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_background_position(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
uint8_t flags = 0;
@@ -54,6 +54,24 @@ css_error css__parse_background_position(css_language *c,
&match) == lwc_error_ok && match)) {
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_INITIAL;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_REVERT;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_UNSET;
} else {
int i;
diff --git a/src/parse/properties/border.c b/src/parse/properties/border.c
index 26cdbcd..be269ab 100644
--- a/src/parse/properties/border.c
+++ b/src/parse/properties/border.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
error = css__parse_border_side(c, vector, ctx, result, BORDER_SIDE_TOP);
diff --git a/src/parse/properties/border_color.c b/src/parse/properties/border_color.c
index 28d30b7..60b401e 100644
--- a/src/parse/properties/border_color.c
+++ b/src/parse/properties/border_color.c
@@ -28,15 +28,16 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
uint16_t side_val[4];
uint32_t side_color[4];
uint32_t side_count = 0;
+ enum flag_value flag_value;
css_error error;
/* Firstly, handle inherit */
@@ -44,20 +45,26 @@ css_error css__parse_border_color(css_language *c,
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_TOP_COLOR);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_TOP_COLOR);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_RIGHT_COLOR);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_RIGHT_COLOR);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_BOTTOM_COLOR);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_BOTTOM_COLOR);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_LEFT_COLOR);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_LEFT_COLOR);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/border_spacing.c b/src/parse/properties/border_spacing.c
index 2322a5a..e00fb27 100644
--- a/src/parse/properties/border_spacing.c
+++ b/src/parse/properties/border_spacing.c
@@ -28,15 +28,15 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_spacing(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
css_fixed length[2] = { 0 };
uint32_t unit[2] = { 0 };
- bool match;
+ enum flag_value flag_value;
/* length length? | IDENT(inherit) */
token = parserutils_vector_peek(vector, *ctx);
@@ -45,16 +45,13 @@ css_error css__parse_border_spacing(css_language *c,
return CSS_INVALID;
}
- if (token->type == CSS_TOKEN_IDENT &&
- (lwc_string_caseless_isequal(
- token->idata, c->strings[INHERIT],
- &match) == lwc_error_ok && match)) {
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
parserutils_vector_iterate(vector, ctx);
/* inherit */
- error = css__stylesheet_style_appendOPV(result,
- CSS_PROP_BORDER_SPACING,
- FLAG_INHERIT,
- 0);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_SPACING);
} else {
int num_lengths = 0;
diff --git a/src/parse/properties/border_style.c b/src/parse/properties/border_style.c
index a0d264d..4d54900 100644
--- a/src/parse/properties/border_style.c
+++ b/src/parse/properties/border_style.c
@@ -28,36 +28,43 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
uint16_t side_val[4];
uint32_t side_count = 0;
bool match;
css_error error;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_TOP_STYLE);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_TOP_STYLE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_RIGHT_STYLE);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_RIGHT_STYLE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_BOTTOM_STYLE);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_BOTTOM_STYLE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_LEFT_STYLE);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_LEFT_STYLE);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/border_width.c b/src/parse/properties/border_width.c
index bc911c9..b11ca05 100644
--- a/src/parse/properties/border_width.c
+++ b/src/parse/properties/border_width.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
uint16_t side_val[4];
@@ -40,26 +40,33 @@ css_error css__parse_border_width(css_language *c,
uint32_t side_count = 0;
bool match;
css_error error;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_TOP_WIDTH);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_TOP_WIDTH);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_RIGHT_WIDTH);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_RIGHT_WIDTH);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_BOTTOM_WIDTH);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_BOTTOM_WIDTH);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_BORDER_LEFT_WIDTH);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_BORDER_LEFT_WIDTH);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/clip.c b/src/parse/properties/clip.c
index 7862d4a..4bf653d 100644
--- a/src/parse/properties/clip.c
+++ b/src/parse/properties/clip.c
@@ -28,15 +28,16 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_clip(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
int num_lengths = 0;
css_fixed length[4] = { 0 };
uint32_t unit[4] = { 0 };
+ enum flag_value flag_value;
bool match;
/* FUNCTION(rect) [ [ IDENT(auto) | length ] CHAR(,)? ]{3}
@@ -48,14 +49,12 @@ css_error css__parse_clip(css_language *c,
return CSS_INVALID;
}
- if ((token->type == CSS_TOKEN_IDENT) &&
- (lwc_string_caseless_isequal(
- token->idata, c->strings[INHERIT],
- &match) == lwc_error_ok && match)) {
- error = css__stylesheet_style_appendOPV(result,
- CSS_PROP_CLIP,
- FLAG_INHERIT,
- 0);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result,
+ flag_value, CSS_PROP_CLIP);
+
} else if ((token->type == CSS_TOKEN_IDENT) &&
(lwc_string_caseless_isequal(
token->idata, c->strings[AUTO],
diff --git a/src/parse/properties/column_rule.c b/src/parse/properties/column_rule.c
index ba57565..7bfcad5 100644
--- a/src/parse/properties/column_rule.c
+++ b/src/parse/properties/column_rule.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_column_rule(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error;
@@ -41,26 +41,28 @@ css_error css__parse_column_rule(css_language *c,
css_style *color_style;
css_style *style_style;
css_style *width_style;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result,
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_COLUMN_RULE_COLOR);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result,
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_COLUMN_RULE_STYLE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result,
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_COLUMN_RULE_WIDTH);
-
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/columns.c b/src/parse/properties/columns.c
index b245740..277a305 100644
--- a/src/parse/properties/columns.c
+++ b/src/parse/properties/columns.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_columns(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error = CSS_OK;
@@ -39,19 +39,22 @@ css_error css__parse_columns(css_language *c,
bool count = true;
css_style *width_style;
css_style *count_style;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result,
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_COLUMN_WIDTH);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result,
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_COLUMN_COUNT);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/content.c b/src/parse/properties/content.c
index 10f221f..b32de22 100644
--- a/src/parse/properties/content.c
+++ b/src/parse/properties/content.c
@@ -29,12 +29,13 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_content(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
+ enum flag_value flag_value;
bool match;
/* IDENT(normal, none, inherit) | [ ... ]+ */
@@ -44,12 +45,11 @@ css_error css__parse_content(css_language *c,
return CSS_INVALID;
}
+ flag_value = get_css_flag_value(c, token);
- if ((token->type == CSS_TOKEN_IDENT) &&
- (lwc_string_caseless_isequal(token->idata,
- c->strings[INHERIT],
- &match) == lwc_error_ok && match)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_CONTENT);
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_CONTENT);
} else if ((token->type == CSS_TOKEN_IDENT) &&
(lwc_string_caseless_isequal(token->idata,
c->strings[NORMAL],
diff --git a/src/parse/properties/css_property_parser_gen.c b/src/parse/properties/css_property_parser_gen.c
index 0e6ce72..3e1d997 100644
--- a/src/parse/properties/css_property_parser_gen.c
+++ b/src/parse/properties/css_property_parser_gen.c
@@ -106,7 +106,7 @@ void output_header(FILE *outputf, const char *descriptor, struct keyval *parser_
" * If the input is invalid, then \\a *ctx remains unchanged.\n"
" */\n"
"css_error css__parse_%s(css_language *c,\n"
- " const parserutils_vector *vector, int *ctx,\n"
+ " const parserutils_vector *vector, int32_t *ctx,\n"
" css_style *result%s)\n"
"{\n",
descriptor,
@@ -120,7 +120,7 @@ void output_header(FILE *outputf, const char *descriptor, struct keyval *parser_
void output_token_type_check(FILE *outputf, bool do_token_check, struct keyval_list *IDENT, struct keyval_list *URI, struct keyval_list *NUMBER)
{
fprintf(outputf,
- " int orig_ctx = *ctx;\n"
+ " int32_t orig_ctx = *ctx;\n"
" css_error error;\n"
" const css_token *token;\n"
" bool match;\n\n"
@@ -169,18 +169,38 @@ void output_ident(FILE *outputf, bool only_ident, struct keyval *parseid, struct
"if (");
if (!only_ident) {
fprintf(outputf,
- "(token->type == CSS_TOKEN_IDENT) && ");
+ "(token->type == CSS_TOKEN_IDENT) &&\n\t\t\t");
}
fprintf(outputf,
- "(lwc_string_caseless_isequal(token->idata, c->strings[%s], &match) == lwc_error_ok && match)) {\n",
+ "(lwc_string_caseless_isequal(\n"
+ "\t\t\ttoken->idata, c->strings[%s],\n"
+ "\t\t\t&match) == lwc_error_ok && match)) {\n",
ckv->key);
if (strcmp(ckv->key,"INHERIT") == 0) {
fprintf(outputf,
- "\t\t\terror = css_stylesheet_style_inherit(result, %s);\n",
+ "\t\terror = css_stylesheet_style_inherit(result,\n"
+ "\t\t\t\t%s);\n\n",
+ parseid->val);
+ } else if (strcmp(ckv->key,"INITIAL") == 0) {
+ fprintf(outputf,
+ "\t\terror = css_stylesheet_style_initial(result,\n"
+ "\t\t\t\t%s);\n\n",
+ parseid->val);
+ } else if (strcmp(ckv->key,"REVERT") == 0) {
+ fprintf(outputf,
+ "\t\terror = css_stylesheet_style_revert(result,\n"
+ "\t\t\t\t%s);\n\n",
+ parseid->val);
+ } else if (strcmp(ckv->key,"UNSET") == 0) {
+ fprintf(outputf,
+ "\t\terror = css_stylesheet_style_unset(result,\n"
+ "\t\t\t\t%s);\n\n",
parseid->val);
} else {
fprintf(outputf,
- "\t\t\terror = css__stylesheet_style_appendOPV(result, %s, %s);\n",
+ "\t\terror = css__stylesheet_style_appendOPV(result,\n"
+ "\t\t\t\t%s,\n"
+ "\t\t\t\t%s);\n\n",
parseid->val,
ckv->val);
}
@@ -326,6 +346,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"
@@ -459,10 +486,22 @@ void output_wrap(FILE *outputf, struct keyval *parseid, struct keyval_list *WRAP
}
char str_INHERIT[] = "INHERIT";
+char str_INITIAL[] = "INITIAL";
+char str_REVERT[] = "REVERT";
+char str_UNSET[] = "UNSET";
struct keyval ident_inherit = {
.key = str_INHERIT,
};
+struct keyval ident_initial = {
+ .key = str_INITIAL,
+};
+struct keyval ident_unset = {
+ .key = str_UNSET,
+};
+struct keyval ident_revert = {
+ .key = str_REVERT,
+};
int main(int argc, char **argv)
{
@@ -547,6 +586,12 @@ int main(int argc, char **argv)
curlist = &base;
} else if (strcmp(rkv->val, str_INHERIT) == 0) {
IDENT.item[IDENT.count++] = &ident_inherit;
+ } else if (strcmp(rkv->val, str_INITIAL) == 0) {
+ IDENT.item[IDENT.count++] = &ident_initial;
+ } else if (strcmp(rkv->val, str_REVERT) == 0) {
+ IDENT.item[IDENT.count++] = &ident_revert;
+ } else if (strcmp(rkv->val, str_UNSET) == 0) {
+ IDENT.item[IDENT.count++] = &ident_unset;
}
} else if (strcmp(rkv->key, "IDENT_LIST") == 0) {
if (rkv->val[0] == '(') {
diff --git a/src/parse/properties/cue.c b/src/parse/properties/cue.c
index eef10d1..db64412 100644
--- a/src/parse/properties/cue.c
+++ b/src/parse/properties/cue.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_cue(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *first_token;
const css_token *token;
@@ -57,15 +57,23 @@ css_error css__parse_cue(css_language *c,
error = css__parse_cue_after(c, vector, ctx, result);
} else {
/* second token - might be useful */
- if (is_css_inherit(c, token)) {
- /* another inherit which is bogus */
+ enum flag_value flag_value;
+
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ /* another generic property reset value
+ * which is bogus */
error = CSS_INVALID;
} else {
error = css__parse_cue_after(c, vector, ctx, result);
if (error == CSS_OK) {
/* second token parsed */
- if (is_css_inherit(c, first_token)) {
- /* valid second token after inherit */
+ flag_value = get_css_flag_value(c, first_token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ /* valid second token after
+ * generic property reset value */
error = CSS_INVALID;
}
} else {
diff --git a/src/parse/properties/cursor.c b/src/parse/properties/cursor.c
index ad3ac47..b61d9a9 100644
--- a/src/parse/properties/cursor.c
+++ b/src/parse/properties/cursor.c
@@ -27,12 +27,13 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_cursor(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error = CSS_OK;
const css_token *token;
+ enum flag_value flag_value;
bool match;
/* [ (URI ',')* IDENT(auto, crosshair, default, pointer, move, e-resize,
@@ -48,11 +49,11 @@ css_error css__parse_cursor(css_language *c,
return CSS_INVALID;
}
- if ((token->type == CSS_TOKEN_IDENT) &&
- (lwc_string_caseless_isequal(token->idata,
- c->strings[INHERIT],
- &match) == lwc_error_ok && match)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_CURSOR);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_CURSOR);
} else {
bool first = true;
diff --git a/src/parse/properties/elevation.c b/src/parse/properties/elevation.c
index fea35a3..b456799 100644
--- a/src/parse/properties/elevation.c
+++ b/src/parse/properties/elevation.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_elevation(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
uint8_t flags = 0;
@@ -55,6 +55,24 @@ css_error css__parse_elevation(css_language *c,
flags = FLAG_INHERIT;
} else if (token->type == CSS_TOKEN_IDENT &&
(lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_INITIAL;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_REVERT;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ parserutils_vector_iterate(vector, ctx);
+ flags = FLAG_UNSET;
+ } else if (token->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
token->idata, c->strings[BELOW],
&match) == lwc_error_ok && match)) {
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/fill_opacity.c b/src/parse/properties/fill_opacity.c
new file mode 100644
index 0000000..caed86f
--- /dev/null
+++ b/src/parse/properties/fill_opacity.c
@@ -0,0 +1,82 @@
+/*
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+#include <assert.h>
+#include <string.h>
+
+#include "bytecode/bytecode.h"
+#include "bytecode/opcodes.h"
+#include "parse/properties/properties.h"
+#include "parse/properties/utils.h"
+
+/**
+ * Parse fill-opacity
+ *
+ * \param c Parsing context
+ * \param vector Vector of tokens to process
+ * \param ctx Pointer to vector iteration context
+ * \param result resulting style
+ * \return CSS_OK on success,
+ * CSS_NOMEM on memory exhaustion,
+ * CSS_INVALID if the input is not valid
+ *
+ * Post condition: \a *ctx is updated with the next token to process
+ * If the input is invalid, then \a *ctx remains unchanged.
+ */
+css_error css__parse_fill_opacity(css_language *c,
+ const parserutils_vector *vector, int32_t *ctx,
+ css_style *result)
+{
+ int32_t orig_ctx = *ctx;
+ css_error error;
+ const css_token *token;
+ enum flag_value flag_value;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if ((token == NULL) || ((token->type != CSS_TOKEN_IDENT) && (token->type != CSS_TOKEN_NUMBER))) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_FILL_OPACITY);
+
+ } else if (token->type == CSS_TOKEN_NUMBER) {
+ css_fixed num = 0;
+ size_t consumed = 0;
+
+ num = css__number_from_lwc_string(token->idata, false, &consumed);
+ /* Invalid if there are trailing characters */
+ if (consumed != lwc_string_length(token->idata)) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ /* Clamp to range [0,1] */
+ if (num < 0)
+ num = 0;
+ if (num > INTTOFIX(1))
+ num = INTTOFIX(1);
+
+ error = css__stylesheet_style_appendOPV(result, CSS_PROP_FILL_OPACITY, 0, FILL_OPACITY_SET);
+ if (error != CSS_OK) {
+ *ctx = orig_ctx;
+ return error;
+ }
+
+ error = css__stylesheet_style_append(result, num);
+ } else {
+ error = CSS_INVALID;
+ }
+
+ if (error != CSS_OK)
+ *ctx = orig_ctx;
+
+ return error;
+}
+
diff --git a/src/parse/properties/flex.c b/src/parse/properties/flex.c
index 9e284d9..a29309b 100644
--- a/src/parse/properties/flex.c
+++ b/src/parse/properties/flex.c
@@ -29,10 +29,10 @@
*/
css_error css__parse_flex(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error;
@@ -44,29 +44,30 @@ css_error css__parse_flex(css_language *c,
css_style *basis_style;
bool short_auto = false;
bool short_none = false;
+ enum flag_value flag_value;
bool match;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
-
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result,
+
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_FLEX_GROW);
- if (error != CSS_OK)
+ if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result,
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_FLEX_SHRINK);
-
- if (error != CSS_OK)
+ if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result,
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_FLEX_BASIS);
-
- if (error == CSS_OK)
+ if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
return error;
diff --git a/src/parse/properties/flex_flow.c b/src/parse/properties/flex_flow.c
index 6a83e15..a5e2926 100644
--- a/src/parse/properties/flex_flow.c
+++ b/src/parse/properties/flex_flow.c
@@ -29,10 +29,10 @@
*/
css_error css__parse_flex_flow(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error;
@@ -40,26 +40,28 @@ css_error css__parse_flex_flow(css_language *c,
bool wrap = true;
css_style *direction_style;
css_style *wrap_style;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
-
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result,
+
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_FLEX_DIRECTION);
- if (error != CSS_OK)
+ if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result,
+ error = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_FLEX_WRAP);
-
- if (error == CSS_OK)
+ if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
return error;
- }
+ }
/* allocate styles */
error = css__stylesheet_style_create(c->sheet, &direction_style);
@@ -107,15 +109,21 @@ css_error css__parse_flex_flow(css_language *c,
/* defaults */
if (direction) {
- error = css__stylesheet_style_appendOPV(direction_style,
+ error = css__stylesheet_style_appendOPV(direction_style,
CSS_PROP_FLEX_DIRECTION,
0, FLEX_DIRECTION_ROW);
+ if (error != CSS_OK) {
+ goto css__parse_flex_flow_cleanup;
+ }
}
if (wrap) {
- error = css__stylesheet_style_appendOPV(wrap_style,
+ error = css__stylesheet_style_appendOPV(wrap_style,
CSS_PROP_FLEX_WRAP,
0, FLEX_WRAP_NOWRAP);
+ if (error != CSS_OK) {
+ goto css__parse_flex_flow_cleanup;
+ }
}
error = css__stylesheet_merge_style(result, direction_style);
diff --git a/src/parse/properties/font.c b/src/parse/properties/font.c
index 9903f75..16a6cc4 100644
--- a/src/parse/properties/font.c
+++ b/src/parse/properties/font.c
@@ -13,6 +13,42 @@
#include "parse/properties/properties.h"
#include "parse/properties/utils.h"
+/**
+ * Convert css_unit to a bytecode unit.
+ */
+static inline uint32_t css__to_parse_unit(css_unit u)
+{
+ switch (u) {
+ case CSS_UNIT_PX: return UNIT_PX;
+ case CSS_UNIT_EX: return UNIT_EX;
+ case CSS_UNIT_EM: return UNIT_EM;
+ case CSS_UNIT_IN: return UNIT_IN;
+ case CSS_UNIT_CM: return UNIT_CM;
+ case CSS_UNIT_MM: return UNIT_MM;
+ case CSS_UNIT_PT: return UNIT_PT;
+ case CSS_UNIT_PC: return UNIT_PC;
+ case CSS_UNIT_CH: return UNIT_CH;
+ case CSS_UNIT_REM: return UNIT_REM;
+ case CSS_UNIT_LH: return UNIT_LH;
+ case CSS_UNIT_VH: return UNIT_VH;
+ case CSS_UNIT_VW: return UNIT_VW;
+ case CSS_UNIT_VI: return UNIT_VI;
+ case CSS_UNIT_VB: return UNIT_VB;
+ case CSS_UNIT_VMIN: return UNIT_VMIN;
+ case CSS_UNIT_VMAX: return UNIT_VMAX;
+ case CSS_UNIT_Q: return UNIT_Q;
+ case CSS_UNIT_PCT: return UNIT_PCT;
+ case CSS_UNIT_DEG: return UNIT_DEG;
+ case CSS_UNIT_GRAD: return UNIT_GRAD;
+ case CSS_UNIT_RAD: return UNIT_RAD;
+ case CSS_UNIT_MS: return UNIT_MS;
+ case CSS_UNIT_S: return UNIT_S;
+ case CSS_UNIT_HZ: return UNIT_HZ;
+ case CSS_UNIT_KHZ: return UNIT_KHZ;
+ }
+
+ return 0;
+}
static css_error parse_system_font(css_language *c,
css_style *result, css_system_font *system_font)
@@ -124,7 +160,9 @@ static css_error parse_system_font(css_language *c,
if (error != CSS_OK)
return error;
- error = css__stylesheet_style_vappend(result, 2, system_font->size.size, system_font->size.unit);
+ error = css__stylesheet_style_vappend(result, 2,
+ system_font->size.size,
+ css__to_parse_unit(system_font->size.unit));
if (error != CSS_OK)
return error;
@@ -133,7 +171,9 @@ static css_error parse_system_font(css_language *c,
if (error != CSS_OK)
return error;
- error = css__stylesheet_style_vappend(result, 2, system_font->line_height.size, system_font->line_height.unit);
+ error = css__stylesheet_style_vappend(result, 2,
+ system_font->line_height.size,
+ css__to_parse_unit(system_font->line_height.unit));
if (error != CSS_OK)
return error;
@@ -184,12 +224,12 @@ static css_error parse_system_font(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_font(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
const css_token *token;
css_error error;
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
css_system_font system_font;
@@ -203,6 +243,7 @@ css_error css__parse_font(css_language *c,
css_style *size_style;
css_style *line_height_style;
css_style *family_style;
+ enum flag_value flag_value;
int svw;
/* Firstly, handle inherit */
@@ -210,28 +251,36 @@ css_error css__parse_font(css_language *c,
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_FONT_STYLE);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_FONT_STYLE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_FONT_VARIANT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_FONT_VARIANT);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_FONT_WEIGHT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_FONT_WEIGHT);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_FONT_SIZE);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_FONT_SIZE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_LINE_HEIGHT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_LINE_HEIGHT);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_FONT_FAMILY);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_FONT_FAMILY);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
@@ -247,6 +296,9 @@ css_error css__parse_font(css_language *c,
error = parse_system_font(c, result, &system_font);
+ lwc_string_unref(system_font.family);
+ system_font.family = NULL;
+
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/font_family.c b/src/parse/properties/font_family.c
index 23c080b..2f8782e 100644
--- a/src/parse/properties/font_family.c
+++ b/src/parse/properties/font_family.c
@@ -99,10 +99,10 @@ static css_code_t font_family_value(css_language *c, const css_token *token, boo
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_font_family(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
bool match;
@@ -127,7 +127,30 @@ css_error css__parse_font_family(css_language *c,
(lwc_string_caseless_isequal(
token->idata, c->strings[INHERIT],
&match) == lwc_error_ok && match)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_FONT_FAMILY);
+ error = css_stylesheet_style_inherit(result,
+ CSS_PROP_FONT_FAMILY);
+
+ } else if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ error = css_stylesheet_style_initial(result,
+ CSS_PROP_FONT_FAMILY);
+
+ } else if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ error = css_stylesheet_style_revert(result,
+ CSS_PROP_FONT_FAMILY);
+
+ } else if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ error = css_stylesheet_style_unset(result,
+ CSS_PROP_FONT_FAMILY);
+
} else {
*ctx = orig_ctx;
diff --git a/src/parse/properties/font_weight.c b/src/parse/properties/font_weight.c
index 8e57e5f..77ec9a1 100644
--- a/src/parse/properties/font_weight.c
+++ b/src/parse/properties/font_weight.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_font_weight(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
uint8_t flags = 0;
@@ -47,10 +47,29 @@ css_error css__parse_font_weight(css_language *c,
return CSS_INVALID;
}
- if ((lwc_string_caseless_isequal(
+ if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
token->idata, c->strings[INHERIT],
&match) == lwc_error_ok && match)) {
flags |= FLAG_INHERIT;
+ } else if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_INITIAL;
+
+ } else if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_REVERT;
+
+ } else if ((token->type == CSS_TOKEN_IDENT) &&
+ (lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_UNSET;
+
} else if (token->type == CSS_TOKEN_NUMBER) {
size_t consumed = 0;
css_fixed num = css__number_from_lwc_string(token->idata,
diff --git a/src/parse/properties/list_style.c b/src/parse/properties/list_style.c
index f12fa2e..1cb373a 100644
--- a/src/parse/properties/list_style.c
+++ b/src/parse/properties/list_style.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_list_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error;
@@ -41,23 +41,28 @@ css_error css__parse_list_style(css_language *c,
css_style *image_style;
css_style *position_style;
css_style *type_style;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_LIST_STYLE_IMAGE);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_LIST_STYLE_IMAGE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_LIST_STYLE_POSITION);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_LIST_STYLE_POSITION);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_LIST_STYLE_TYPE);
-
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_LIST_STYLE_TYPE);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
@@ -122,20 +127,29 @@ css_error css__parse_list_style(css_language *c,
/* defaults */
if (image) {
error = css__stylesheet_style_appendOPV(image_style,
- CSS_PROP_LIST_STYLE_IMAGE,
+ CSS_PROP_LIST_STYLE_IMAGE,
0, LIST_STYLE_IMAGE_NONE);
+ if (error != CSS_OK) {
+ goto css__parse_list_style_cleanup;
+ }
}
if (position) {
error = css__stylesheet_style_appendOPV(position_style,
- CSS_PROP_LIST_STYLE_POSITION,
+ CSS_PROP_LIST_STYLE_POSITION,
0, LIST_STYLE_POSITION_OUTSIDE);
+ if (error != CSS_OK) {
+ goto css__parse_list_style_cleanup;
+ }
}
if (type) {
error = css__stylesheet_style_appendOPV(type_style,
- CSS_PROP_LIST_STYLE_TYPE,
+ CSS_PROP_LIST_STYLE_TYPE,
0, LIST_STYLE_TYPE_DISC);
+ if (error != CSS_OK) {
+ goto css__parse_list_style_cleanup;
+ }
}
diff --git a/src/parse/properties/list_style_type.c b/src/parse/properties/list_style_type.c
index ccaa133..eb7f363 100644
--- a/src/parse/properties/list_style_type.c
+++ b/src/parse/properties/list_style_type.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_list_style_type(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *ident;
uint8_t flags = 0;
@@ -49,10 +49,26 @@ css_error css__parse_list_style_type(css_language *c,
return CSS_INVALID;
}
- if ((lwc_string_caseless_isequal(
+ if (ident->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
ident->idata, c->strings[INHERIT],
&match) == lwc_error_ok && match)) {
flags |= FLAG_INHERIT;
+ } else if (ident->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ ident->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ flags = FLAG_INITIAL;
+ } else if (ident->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ ident->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ flags = FLAG_REVERT;
+ } else if (ident->type == CSS_TOKEN_IDENT &&
+ (lwc_string_caseless_isequal(
+ ident->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ flags = FLAG_UNSET;
} else {
error = css__parse_list_style_type_value(c, ident, &value);
if (error != CSS_OK) {
diff --git a/src/parse/properties/margin.c b/src/parse/properties/margin.c
index 7817d50..1ee56f7 100644
--- a/src/parse/properties/margin.c
+++ b/src/parse/properties/margin.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_margin(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
uint16_t side_val[4];
@@ -40,26 +40,33 @@ css_error css__parse_margin(css_language *c,
uint32_t side_count = 0;
bool match;
css_error error;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_MARGIN_TOP);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_MARGIN_TOP);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_MARGIN_RIGHT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_MARGIN_RIGHT);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_MARGIN_BOTTOM);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_MARGIN_BOTTOM);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_MARGIN_LEFT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_MARGIN_LEFT);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
@@ -70,7 +77,9 @@ css_error css__parse_margin(css_language *c,
do {
prev_ctx = *ctx;
- if ((token != NULL) && is_css_inherit(c, token)) {
+ flag_value = get_css_flag_value(c, token);
+
+ if ((token != NULL) && flag_value != FLAG_VALUE__NONE) {
*ctx = orig_ctx;
return CSS_INVALID;
}
diff --git a/src/parse/properties/opacity.c b/src/parse/properties/opacity.c
index e8b7c3e..22acd76 100644
--- a/src/parse/properties/opacity.c
+++ b/src/parse/properties/opacity.c
@@ -27,13 +27,13 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_opacity(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
- bool match;
+ enum flag_value flag_value;
token = parserutils_vector_iterate(vector, ctx);
if ((token == NULL) || ((token->type != CSS_TOKEN_IDENT) && (token->type != CSS_TOKEN_NUMBER))) {
@@ -41,8 +41,12 @@ css_error css__parse_opacity(css_language *c,
return CSS_INVALID;
}
- if ((token->type == CSS_TOKEN_IDENT) && (lwc_string_caseless_isequal(token->idata, c->strings[INHERIT], &match) == lwc_error_ok && match)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_OPACITY);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_OPACITY);
+
} else if (token->type == CSS_TOKEN_NUMBER) {
css_fixed num = 0;
size_t consumed = 0;
diff --git a/src/parse/properties/outline.c b/src/parse/properties/outline.c
index d9d9ec2..ac91ffd 100644
--- a/src/parse/properties/outline.c
+++ b/src/parse/properties/outline.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_outline(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error;
@@ -41,23 +41,28 @@ css_error css__parse_outline(css_language *c,
css_style *color_style;
css_style *style_style;
css_style *width_style;
+ enum flag_value flag_value;
/* Firstly, handle inherit */
token = parserutils_vector_peek(vector, *ctx);
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_OUTLINE_COLOR);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_OUTLINE_COLOR);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_OUTLINE_STYLE);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_OUTLINE_STYLE);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_OUTLINE_WIDTH);
-
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_OUTLINE_WIDTH);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
@@ -122,20 +127,29 @@ css_error css__parse_outline(css_language *c,
/* defaults */
if (color) {
error = css__stylesheet_style_appendOPV(color_style,
- CSS_PROP_OUTLINE_COLOR,
+ CSS_PROP_OUTLINE_COLOR,
0, OUTLINE_COLOR_INVERT);
+ if (error != CSS_OK) {
+ goto css__parse_outline_cleanup;
+ }
}
if (style) {
error = css__stylesheet_style_appendOPV(style_style,
- CSS_PROP_OUTLINE_STYLE,
+ CSS_PROP_OUTLINE_STYLE,
0, OUTLINE_STYLE_NONE);
+ if (error != CSS_OK) {
+ goto css__parse_outline_cleanup;
+ }
}
if (width) {
error = css__stylesheet_style_appendOPV(width_style,
- CSS_PROP_OUTLINE_WIDTH,
+ CSS_PROP_OUTLINE_WIDTH,
0, OUTLINE_WIDTH_MEDIUM);
+ if (error != CSS_OK) {
+ goto css__parse_outline_cleanup;
+ }
}
diff --git a/src/parse/properties/overflow.c b/src/parse/properties/overflow.c
index ca133ed..dbb373a 100644
--- a/src/parse/properties/overflow.c
+++ b/src/parse/properties/overflow.c
@@ -28,12 +28,13 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_overflow(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error1, error2 = CSS_OK;
const css_token *token;
+ enum flag_value flag_value;
bool match;
token = parserutils_vector_iterate(vector, ctx);
@@ -42,12 +43,12 @@ css_error css__parse_overflow(css_language *c,
return CSS_INVALID;
}
- if ((lwc_string_caseless_isequal(token->idata,
- c->strings[INHERIT], &match) == lwc_error_ok &&
- match)) {
- error1 = css_stylesheet_style_inherit(result,
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error1 = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_OVERFLOW_X);
- error2 = css_stylesheet_style_inherit(result,
+ error2 = css_stylesheet_style_flag_value(result, flag_value,
CSS_PROP_OVERFLOW_Y);
} else if ((lwc_string_caseless_isequal(token->idata,
diff --git a/src/parse/properties/padding.c b/src/parse/properties/padding.c
index 7f5b9f6..a87ffa5 100644
--- a/src/parse/properties/padding.c
+++ b/src/parse/properties/padding.c
@@ -28,15 +28,16 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_padding(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_fixed side_length[4];
uint32_t side_unit[4];
uint32_t side_count = 0;
+ enum flag_value flag_value;
css_error error;
/* Firstly, handle inherit */
@@ -44,20 +45,26 @@ css_error css__parse_padding(css_language *c,
if (token == NULL)
return CSS_INVALID;
- if (is_css_inherit(c, token)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_PADDING_TOP);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_PADDING_TOP);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_PADDING_RIGHT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_PADDING_RIGHT);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_PADDING_BOTTOM);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_PADDING_BOTTOM);
if (error != CSS_OK)
return error;
- error = css_stylesheet_style_inherit(result, CSS_PROP_PADDING_LEFT);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_PADDING_LEFT);
if (error == CSS_OK)
parserutils_vector_iterate(vector, ctx);
diff --git a/src/parse/properties/pause.c b/src/parse/properties/pause.c
index e45a8f4..e558337 100644
--- a/src/parse/properties/pause.c
+++ b/src/parse/properties/pause.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_pause(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *first_token;
const css_token *token;
@@ -57,15 +57,23 @@ css_error css__parse_pause(css_language *c,
error = css__parse_pause_after(c, vector, ctx, result);
} else {
/* second token - might be useful */
- if (is_css_inherit(c, token)) {
- /* another bogus inherit */
+ enum flag_value flag_value;
+
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ /* another generic property reset value
+ * which is bogus */
error = CSS_INVALID;
} else {
error = css__parse_pause_after(c, vector, ctx, result);
if (error == CSS_OK) {
/* second token parsed */
- if (is_css_inherit(c, first_token)) {
- /* valid second token after inherit */
+ flag_value = get_css_flag_value(c, first_token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ /* valid second token after
+ * generic property reset value */
error = CSS_INVALID;
}
} else {
diff --git a/src/parse/properties/play_during.c b/src/parse/properties/play_during.c
index 109ae64..da7f236 100644
--- a/src/parse/properties/play_during.c
+++ b/src/parse/properties/play_during.c
@@ -28,10 +28,10 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_play_during(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
uint8_t flags = 0;
@@ -54,14 +54,32 @@ css_error css__parse_play_during(css_language *c,
token->idata, c->strings[INHERIT],
&match) == lwc_error_ok && match)) {
flags |= FLAG_INHERIT;
+
+ } else if ((lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_INITIAL;
+
+ } else if ((lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_REVERT;
+
+ } else if ((lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match)) {
+ flags |= FLAG_UNSET;
+
} else if ((lwc_string_caseless_isequal(
token->idata, c->strings[NONE],
&match) == lwc_error_ok && match)) {
value = PLAY_DURING_NONE;
+
} else if ((lwc_string_caseless_isequal(
token->idata, c->strings[AUTO],
&match) == lwc_error_ok && match)) {
value = PLAY_DURING_AUTO;
+
} else {
*ctx = orig_ctx;
return CSS_INVALID;
diff --git a/src/parse/properties/properties.c b/src/parse/properties/properties.c
index 3f374fa..2cc849c 100644
--- a/src/parse/properties/properties.c
+++ b/src/parse/properties/properties.c
@@ -74,6 +74,7 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
css__parse_display,
css__parse_elevation,
css__parse_empty_cells,
+ css__parse_fill_opacity,
css__parse_flex,
css__parse_flex_basis,
css__parse_flex_direction,
@@ -140,6 +141,7 @@ const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP] =
css__parse_speak,
css__parse_speech_rate,
css__parse_stress,
+ css__parse_stroke_opacity,
css__parse_table_layout,
css__parse_text_align,
css__parse_text_decoration,
@@ -158,3 +160,133 @@ 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_FILL_OPACITY] = UNIT_MASK_FILL_OPACITY,
+ [CSS_PROP_STROKE_OPACITY] = UNIT_MASK_STROKE_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..b0e797c 100644
--- a/src/parse/properties/properties.gen
+++ b/src/parse/properties/properties.gen
@@ -1,56 +1,56 @@
##Common templates
#
-#property:CSS_PROP_ENUM IDENT:( INHERIT: IDENT:)
-#property:CSS_PROP_ENUM IDENT:INHERIT NUMBER:( false: RANGE: NUMBER:)
-#property:CSS_PROP_ENUM IDENT:INHERIT LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
-#property:CSS_PROP_ENUM IDENT:( INHERIT: IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
+#property:CSS_PROP_ENUM IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:)
+#property:CSS_PROP_ENUM IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) NUMBER:( false: RANGE: NUMBER:)
+#property:CSS_PROP_ENUM IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
+#property:CSS_PROP_ENUM IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) LENGTH_UNIT:( UNIT_HZ:PITCH_FREQUENCY ALLOW: DISALLOW: RANGE:<0 LENGTH_UNIT:)
#property:CSS_PROP_ENUM WRAP:
-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:)
+background_repeat:CSS_PROP_BACKGROUND_REPEAT IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
+border_collapse:CSS_PROP_BORDER_COLLAPSE IDENT:( INHERIT: INITIAL: REVERT: UNSET: COLLAPSE:0,BORDER_COLLAPSE_COLLAPSE SEPARATE:0,BORDER_COLLAPSE_SEPARATE IDENT:)
-cue_after:CSS_PROP_CUE_AFTER IDENT:( INHERIT: NONE:0,CUE_AFTER_NONE IDENT:) URI:CUE_AFTER_URI
+cue_after:CSS_PROP_CUE_AFTER IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,CUE_AFTER_NONE IDENT:) URI:CUE_AFTER_URI
-cue_before:CSS_PROP_CUE_BEFORE IDENT:( INHERIT: NONE:0,CUE_BEFORE_NONE IDENT:) URI:CUE_BEFORE_URI
+cue_before:CSS_PROP_CUE_BEFORE IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,CUE_BEFORE_NONE IDENT:) URI:CUE_BEFORE_URI
-direction:CSS_PROP_DIRECTION IDENT:( INHERIT: LTR:0,DIRECTION_LTR RTL:0,DIRECTION_RTL IDENT:)
+direction:CSS_PROP_DIRECTION IDENT:( INHERIT: INITIAL: REVERT: UNSET: LTR:0,DIRECTION_LTR RTL:0,DIRECTION_RTL IDENT:)
-display:CSS_PROP_DISPLAY IDENT:( INHERIT: INLINE:0,DISPLAY_INLINE BLOCK:0,DISPLAY_BLOCK LIST_ITEM:0,DISPLAY_LIST_ITEM RUN_IN:0,DISPLAY_RUN_IN INLINE_BLOCK:0,DISPLAY_INLINE_BLOCK TABLE:0,DISPLAY_TABLE INLINE_TABLE:0,DISPLAY_INLINE_TABLE TABLE_ROW_GROUP:0,DISPLAY_TABLE_ROW_GROUP TABLE_HEADER_GROUP:0,DISPLAY_TABLE_HEADER_GROUP TABLE_FOOTER_GROUP:0,DISPLAY_TABLE_FOOTER_GROUP TABLE_ROW:0,DISPLAY_TABLE_ROW TABLE_COLUMN_GROUP:0,DISPLAY_TABLE_COLUMN_GROUP TABLE_COLUMN:0,DISPLAY_TABLE_COLUMN TABLE_CELL:0,DISPLAY_TABLE_CELL TABLE_CAPTION:0,DISPLAY_TABLE_CAPTION NONE:0,DISPLAY_NONE FLEX:0,DISPLAY_FLEX INLINE_FLEX:0,DISPLAY_INLINE_FLEX IDENT:)
+display:CSS_PROP_DISPLAY IDENT:( INHERIT: INITIAL: REVERT: UNSET: INLINE:0,DISPLAY_INLINE BLOCK:0,DISPLAY_BLOCK LIST_ITEM:0,DISPLAY_LIST_ITEM RUN_IN:0,DISPLAY_RUN_IN INLINE_BLOCK:0,DISPLAY_INLINE_BLOCK TABLE:0,DISPLAY_TABLE INLINE_TABLE:0,DISPLAY_INLINE_TABLE TABLE_ROW_GROUP:0,DISPLAY_TABLE_ROW_GROUP TABLE_HEADER_GROUP:0,DISPLAY_TABLE_HEADER_GROUP TABLE_FOOTER_GROUP:0,DISPLAY_TABLE_FOOTER_GROUP TABLE_ROW:0,DISPLAY_TABLE_ROW TABLE_COLUMN_GROUP:0,DISPLAY_TABLE_COLUMN_GROUP TABLE_COLUMN:0,DISPLAY_TABLE_COLUMN TABLE_CELL:0,DISPLAY_TABLE_CELL TABLE_CAPTION:0,DISPLAY_TABLE_CAPTION NONE:0,DISPLAY_NONE FLEX:0,DISPLAY_FLEX INLINE_FLEX:0,DISPLAY_INLINE_FLEX GRID:0,DISPLAY_GRID INLINE_GRID:0,DISPLAY_INLINE_GRID IDENT:)
-empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: SHOW:0,EMPTY_CELLS_SHOW HIDE:0,EMPTY_CELLS_HIDE IDENT:)
+empty_cells:CSS_PROP_EMPTY_CELLS IDENT:( INHERIT: INITIAL: REVERT: UNSET: SHOW:0,EMPTY_CELLS_SHOW HIDE:0,EMPTY_CELLS_HIDE IDENT:)
-float:CSS_PROP_FLOAT IDENT:( INHERIT: LEFT:0,FLOAT_LEFT RIGHT:0,FLOAT_RIGHT NONE:0,FLOAT_NONE IDENT:)
+float:CSS_PROP_FLOAT IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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_style:CSS_PROP_FONT_STYLE IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
+font_variant:CSS_PROP_FONT_VARIANT IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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
+color:CSS_PROP_COLOR IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) 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: INITIAL: REVERT: UNSET: IDENT:) 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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
@@ -85,7 +85,7 @@ border_right_width:CSS_PROP_BORDER_RIGHT_WIDTH WRAP:css__parse_border_side_width
#generic for border_{top, bottom, left, right}_style.c
-border_side_style:op GENERIC: IDENT:( INHERIT: NONE:0,BORDER_STYLE_NONE HIDDEN:0,BORDER_STYLE_HIDDEN DOTTED:0,BORDER_STYLE_DOTTED DASHED:0,BORDER_STYLE_DASHED SOLID:0,BORDER_STYLE_SOLID LIBCSS_DOUBLE:0,BORDER_STYLE_DOUBLE GROOVE:0,BORDER_STYLE_GROOVE RIDGE:0,BORDER_STYLE_RIDGE INSET:0,BORDER_STYLE_INSET OUTSET:0,BORDER_STYLE_OUTSET IDENT:)
+border_side_style:op GENERIC: IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,BORDER_STYLE_NONE HIDDEN:0,BORDER_STYLE_HIDDEN DOTTED:0,BORDER_STYLE_DOTTED DASHED:0,BORDER_STYLE_DASHED SOLID:0,BORDER_STYLE_SOLID LIBCSS_DOUBLE:0,BORDER_STYLE_DOUBLE GROOVE:0,BORDER_STYLE_GROOVE RIDGE:0,BORDER_STYLE_RIDGE INSET:0,BORDER_STYLE_INSET OUTSET:0,BORDER_STYLE_OUTSET IDENT:)
border_top_style:CSS_PROP_BORDER_TOP_STYLE WRAP:css__parse_border_side_style
border_bottom_style:CSS_PROP_BORDER_BOTTOM_STYLE WRAP:css__parse_border_side_style
@@ -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: IDENT:) COLOR:BORDER_COLOR_SET
+border_side_color:op GENERIC: IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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
@@ -101,139 +101,139 @@ border_left_color:CSS_PROP_BORDER_LEFT_COLOR WRAP:css__parse_border_side_color
border_right_color:CSS_PROP_BORDER_RIGHT_COLOR WRAP:css__parse_border_side_color
-counter_increment:CSS_PROP_COUNTER_INCREMENT IDENT:( INHERIT: NONE:0,COUNTER_INCREMENT_NONE IDENT:) IDENT_LIST:( STRING_OPTNUM:COUNTER_INCREMENT_NAMED 1:COUNTER_INCREMENT_NONE IDENT_LIST:)
+counter_increment:CSS_PROP_COUNTER_INCREMENT IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,COUNTER_INCREMENT_NONE IDENT:) IDENT_LIST:( STRING_OPTNUM:COUNTER_INCREMENT_NAMED 1:COUNTER_INCREMENT_NONE IDENT_LIST:)
-counter_reset:CSS_PROP_COUNTER_RESET IDENT:( INHERIT: NONE:0,COUNTER_RESET_NONE IDENT:) IDENT_LIST:( STRING_OPTNUM:COUNTER_RESET_NAMED 0:COUNTER_RESET_NONE IDENT_LIST:)
+counter_reset:CSS_PROP_COUNTER_RESET IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,COUNTER_RESET_NONE IDENT:) IDENT_LIST:( STRING_OPTNUM:COUNTER_RESET_NAMED 0:COUNTER_RESET_NONE IDENT_LIST:)
-background_attachment:CSS_PROP_BACKGROUND_ATTACHMENT IDENT:( INHERIT: FIXED:0,BACKGROUND_ATTACHMENT_FIXED SCROLL:0,BACKGROUND_ATTACHMENT_SCROLL IDENT:)
+background_attachment:CSS_PROP_BACKGROUND_ATTACHMENT IDENT:( INHERIT: INITIAL: REVERT: UNSET: FIXED:0,BACKGROUND_ATTACHMENT_FIXED SCROLL:0,BACKGROUND_ATTACHMENT_SCROLL IDENT:)
-background_color:CSS_PROP_BACKGROUND_COLOR IDENT:( INHERIT: IDENT:) COLOR:BACKGROUND_COLOR_SET
+background_color:CSS_PROP_BACKGROUND_COLOR IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) COLOR:BACKGROUND_COLOR_SET
-caption_side:CSS_PROP_CAPTION_SIDE IDENT:( INHERIT: TOP:0,CAPTION_SIDE_TOP BOTTOM:0,CAPTION_SIDE_BOTTOM IDENT:)
+caption_side:CSS_PROP_CAPTION_SIDE IDENT:( INHERIT: INITIAL: REVERT: UNSET: TOP:0,CAPTION_SIDE_TOP BOTTOM:0,CAPTION_SIDE_BOTTOM IDENT:)
-clear:CSS_PROP_CLEAR IDENT:( INHERIT: RIGHT:0,CLEAR_RIGHT LEFT:0,CLEAR_LEFT BOTH:0,CLEAR_BOTH NONE:0,CLEAR_NONE IDENT:)
+clear:CSS_PROP_CLEAR IDENT:( INHERIT: INITIAL: REVERT: UNSET: RIGHT:0,CLEAR_RIGHT LEFT:0,CLEAR_LEFT BOTH:0,CLEAR_BOTH NONE:0,CLEAR_NONE IDENT:)
-background_image:CSS_PROP_BACKGROUND_IMAGE IDENT:( INHERIT: NONE:0,BACKGROUND_IMAGE_NONE IDENT:) URI:BACKGROUND_IMAGE_URI
+background_image:CSS_PROP_BACKGROUND_IMAGE IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,BACKGROUND_IMAGE_NONE IDENT:) URI:BACKGROUND_IMAGE_URI
-list_style_image:CSS_PROP_LIST_STYLE_IMAGE IDENT:( INHERIT: NONE:0,LIST_STYLE_IMAGE_NONE IDENT:) URI:LIST_STYLE_IMAGE_URI
+list_style_image:CSS_PROP_LIST_STYLE_IMAGE IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,LIST_STYLE_IMAGE_NONE IDENT:) URI:LIST_STYLE_IMAGE_URI
-list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: INSIDE:0,LIST_STYLE_POSITION_INSIDE OUTSIDE:0,LIST_STYLE_POSITION_OUTSIDE IDENT:)
+list_style_position:CSS_PROP_LIST_STYLE_POSITION IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: IDENT:) 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
+outline_color:CSS_PROP_OUTLINE_COLOR IDENT:( INHERIT: INITIAL: REVERT: UNSET: INVERT:0,OUTLINE_COLOR_INVERT IDENT:) COLOR:OUTLINE_COLOR_SET
-outline_style:CSS_PROP_OUTLINE_STYLE IDENT:( INHERIT: NONE:0,BORDER_STYLE_NONE DOTTED:0,BORDER_STYLE_DOTTED DASHED:0,BORDER_STYLE_DASHED SOLID:0,BORDER_STYLE_SOLID LIBCSS_DOUBLE:0,BORDER_STYLE_DOUBLE GROOVE:0,BORDER_STYLE_GROOVE RIDGE:0,BORDER_STYLE_RIDGE INSET:0,BORDER_STYLE_INSET OUTSET:0,BORDER_STYLE_OUTSET IDENT:)
+outline_style:CSS_PROP_OUTLINE_STYLE IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,BORDER_STYLE_NONE DOTTED:0,BORDER_STYLE_DOTTED DASHED:0,BORDER_STYLE_DASHED SOLID:0,BORDER_STYLE_SOLID LIBCSS_DOUBLE:0,BORDER_STYLE_DOUBLE GROOVE:0,BORDER_STYLE_GROOVE RIDGE:0,BORDER_STYLE_RIDGE INSET:0,BORDER_STYLE_INSET OUTSET:0,BORDER_STYLE_OUTSET IDENT:)
outline_width:CSS_PROP_OUTLINE_WIDTH WRAP:css__parse_border_side_width
-overflow_x:CSS_PROP_OVERFLOW_X IDENT:( INHERIT: VISIBLE:0,OVERFLOW_VISIBLE HIDDEN:0,OVERFLOW_HIDDEN SCROLL:0,OVERFLOW_SCROLL AUTO:0,OVERFLOW_AUTO IDENT:)
+overflow_x:CSS_PROP_OVERFLOW_X IDENT:( INHERIT: INITIAL: REVERT: UNSET: VISIBLE:0,OVERFLOW_VISIBLE HIDDEN:0,OVERFLOW_HIDDEN SCROLL:0,OVERFLOW_SCROLL AUTO:0,OVERFLOW_AUTO IDENT:)
-overflow_y:CSS_PROP_OVERFLOW_Y IDENT:( INHERIT: VISIBLE:0,OVERFLOW_VISIBLE HIDDEN:0,OVERFLOW_HIDDEN SCROLL:0,OVERFLOW_SCROLL AUTO:0,OVERFLOW_AUTO IDENT:)
+overflow_y:CSS_PROP_OVERFLOW_Y IDENT:( INHERIT: INITIAL: REVERT: UNSET: VISIBLE:0,OVERFLOW_VISIBLE HIDDEN:0,OVERFLOW_HIDDEN SCROLL:0,OVERFLOW_SCROLL AUTO:0,OVERFLOW_AUTO IDENT:)
-page_break_after:CSS_PROP_PAGE_BREAK_AFTER IDENT:( INHERIT: AUTO:0,PAGE_BREAK_AFTER_AUTO ALWAYS:0,PAGE_BREAK_AFTER_ALWAYS AVOID:0,PAGE_BREAK_AFTER_AVOID LEFT:0,PAGE_BREAK_AFTER_LEFT RIGHT:0,PAGE_BREAK_AFTER_RIGHT IDENT:)
+page_break_after:CSS_PROP_PAGE_BREAK_AFTER IDENT:( INHERIT: INITIAL: REVERT: UNSET: AUTO:0,PAGE_BREAK_AFTER_AUTO ALWAYS:0,PAGE_BREAK_AFTER_ALWAYS AVOID:0,PAGE_BREAK_AFTER_AVOID LEFT:0,PAGE_BREAK_AFTER_LEFT RIGHT:0,PAGE_BREAK_AFTER_RIGHT IDENT:)
-page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_BEFORE_AUTO ALWAYS:0,PAGE_BREAK_BEFORE_ALWAYS AVOID:0,PAGE_BREAK_BEFORE_AVOID LEFT:0,PAGE_BREAK_BEFORE_LEFT RIGHT:0,PAGE_BREAK_BEFORE_RIGHT IDENT:)
+page_break_before:CSS_PROP_PAGE_BREAK_BEFORE IDENT:( INHERIT: INITIAL: REVERT: UNSET: AUTO:0,PAGE_BREAK_BEFORE_AUTO ALWAYS:0,PAGE_BREAK_BEFORE_ALWAYS AVOID:0,PAGE_BREAK_BEFORE_AVOID LEFT:0,PAGE_BREAK_BEFORE_LEFT RIGHT:0,PAGE_BREAK_BEFORE_RIGHT IDENT:)
-page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: AUTO:0,PAGE_BREAK_INSIDE_AUTO AVOID:0,PAGE_BREAK_INSIDE_AVOID IDENT:)
+page_break_inside:CSS_PROP_PAGE_BREAK_INSIDE IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: IDENT:) 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: INITIAL: REVERT: UNSET: IDENT:) 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: INITIAL: REVERT: UNSET: 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:)
+pitch_range:CSS_PROP_PITCH_RANGE IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) 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:)
+position:CSS_PROP_POSITION IDENT:( INHERIT: INITIAL: REVERT: UNSET: LIBCSS_STATIC:0,POSITION_STATIC RELATIVE:0,POSITION_RELATIVE ABSOLUTE:0,POSITION_ABSOLUTE FIXED:0,POSITION_FIXED STICKY:0,POSITION_STICKY IDENT:)
-richness:CSS_PROP_RICHNESS IDENT:INHERIT NUMBER:( false:RICHNESS_SET RANGE:num<0||num>F_100 NUMBER:)
+richness:CSS_PROP_RICHNESS IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) 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:)
+speak:CSS_PROP_SPEAK IDENT:( INHERIT: INITIAL: REVERT: UNSET: NORMAL:0,SPEAK_NORMAL NONE:0,SPEAK_NONE SPELL_OUT:0,SPEAK_SPELL_OUT IDENT:)
-speak_header:CSS_PROP_SPEAK_HEADER IDENT:( INHERIT: ONCE:0,SPEAK_HEADER_ONCE ALWAYS:0,SPEAK_HEADER_ALWAYS IDENT:)
+speak_header:CSS_PROP_SPEAK_HEADER IDENT:( INHERIT: INITIAL: REVERT: UNSET: ONCE:0,SPEAK_HEADER_ONCE ALWAYS:0,SPEAK_HEADER_ALWAYS IDENT:)
-speak_numeral:CSS_PROP_SPEAK_NUMERAL IDENT:( INHERIT: DIGITS:0,SPEAK_NUMERAL_DIGITS CONTINUOUS:0,SPEAK_NUMERAL_CONTINUOUS IDENT:)
+speak_numeral:CSS_PROP_SPEAK_NUMERAL IDENT:( INHERIT: INITIAL: REVERT: UNSET: DIGITS:0,SPEAK_NUMERAL_DIGITS CONTINUOUS:0,SPEAK_NUMERAL_CONTINUOUS IDENT:)
-speak_punctuation:CSS_PROP_SPEAK_PUNCTUATION IDENT:( INHERIT: CODE:0,SPEAK_PUNCTUATION_CODE NONE:0,SPEAK_PUNCTUATION_NONE IDENT:)
+speak_punctuation:CSS_PROP_SPEAK_PUNCTUATION IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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:)
-stress:CSS_PROP_STRESS IDENT:INHERIT NUMBER:( false:STRESS_SET RANGE:num<0||num>INTTOFIX(100) NUMBER:)
+stress:CSS_PROP_STRESS IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) 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:)
+table_layout:CSS_PROP_TABLE_LAYOUT IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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_align:CSS_PROP_TEXT_ALIGN IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: IDENT:) 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:)
+text_transform:CSS_PROP_TEXT_TRANSFORM IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
+unicode_bidi:CSS_PROP_UNICODE_BIDI IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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:)
+visibility:CSS_PROP_VISIBILITY IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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:)
+white_space:CSS_PROP_WHITE_SPACE IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
+widows:CSS_PROP_WIDOWS IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) 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: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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:)
+z_index:CSS_PROP_Z_INDEX IDENT:( INHERIT: INITIAL: REVERT: UNSET: AUTO:0,Z_INDEX_AUTO IDENT:) 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_after:CSS_PROP_BREAK_AFTER IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
+break_before:CSS_PROP_BREAK_BEFORE IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
-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:)
+break_inside:CSS_PROP_BREAK_INSIDE IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: AUTO:0,COLUMN_COUNT_AUTO IDENT:) 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_fill:CSS_PROP_COLUMN_FILL IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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
+column_rule_color:CSS_PROP_COLUMN_RULE_COLOR IDENT:( INHERIT: INITIAL: REVERT: UNSET: IDENT:) COLOR:COLUMN_RULE_COLOR_SET
-column_rule_style:CSS_PROP_COLUMN_RULE_STYLE IDENT:( INHERIT: NONE:0,BORDER_STYLE_NONE HIDDEN:0,BORDER_STYLE_HIDDEN DOTTED:0,BORDER_STYLE_DOTTED DASHED:0,BORDER_STYLE_DASHED SOLID:0,BORDER_STYLE_SOLID LIBCSS_DOUBLE:0,BORDER_STYLE_DOUBLE GROOVE:0,BORDER_STYLE_GROOVE RIDGE:0,BORDER_STYLE_RIDGE INSET:0,BORDER_STYLE_INSET OUTSET:0,BORDER_STYLE_OUTSET IDENT:)
+column_rule_style:CSS_PROP_COLUMN_RULE_STYLE IDENT:( INHERIT: INITIAL: REVERT: UNSET: NONE:0,BORDER_STYLE_NONE HIDDEN:0,BORDER_STYLE_HIDDEN DOTTED:0,BORDER_STYLE_DOTTED DASHED:0,BORDER_STYLE_DASHED SOLID:0,BORDER_STYLE_SOLID LIBCSS_DOUBLE:0,BORDER_STYLE_DOUBLE GROOVE:0,BORDER_STYLE_GROOVE RIDGE:0,BORDER_STYLE_RIDGE INSET:0,BORDER_STYLE_INSET OUTSET:0,BORDER_STYLE_OUTSET IDENT:)
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_span:CSS_PROP_COLUMN_SPAN IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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:)
+writing_mode:CSS_PROP_WRITING_MODE IDENT:( INHERIT: INITIAL: REVERT: UNSET: HORIZONTAL_TB:0,WRITING_MODE_HORIZONTAL_TB VERTICAL_RL:0,WRITING_MODE_VERTICAL_RL VERTICAL_LR:0,WRITING_MODE_VERTICAL_LR IDENT:)
-box_sizing:CSS_PROP_BOX_SIZING IDENT:( INHERIT: CONTENT_BOX:0,BOX_SIZING_CONTENT_BOX BORDER_BOX:0,BOX_SIZING_BORDER_BOX IDENT:)
+box_sizing:CSS_PROP_BOX_SIZING IDENT:( INHERIT: INITIAL: REVERT: UNSET: CONTENT_BOX:0,BOX_SIZING_CONTENT_BOX BORDER_BOX:0,BOX_SIZING_BORDER_BOX IDENT:)
-align_content:CSS_PROP_ALIGN_CONTENT IDENT:( INHERIT: STRETCH:0,ALIGN_CONTENT_STRETCH FLEX_START:0,ALIGN_CONTENT_FLEX_START FLEX_END:0,ALIGN_CONTENT_FLEX_END CENTER:0,ALIGN_CONTENT_CENTER SPACE_BETWEEN:0,ALIGN_CONTENT_SPACE_BETWEEN SPACE_AROUND:0,ALIGN_CONTENT_SPACE_AROUND SPACE_EVENLY:0,ALIGN_CONTENT_SPACE_EVENLY IDENT:)
+align_content:CSS_PROP_ALIGN_CONTENT IDENT:( INHERIT: INITIAL: REVERT: UNSET: STRETCH:0,ALIGN_CONTENT_STRETCH FLEX_START:0,ALIGN_CONTENT_FLEX_START FLEX_END:0,ALIGN_CONTENT_FLEX_END CENTER:0,ALIGN_CONTENT_CENTER SPACE_BETWEEN:0,ALIGN_CONTENT_SPACE_BETWEEN SPACE_AROUND:0,ALIGN_CONTENT_SPACE_AROUND SPACE_EVENLY:0,ALIGN_CONTENT_SPACE_EVENLY IDENT:)
-align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: STRETCH:0,ALIGN_ITEMS_STRETCH FLEX_START:0,ALIGN_ITEMS_FLEX_START FLEX_END:0,ALIGN_ITEMS_FLEX_END CENTER:0,ALIGN_ITEMS_CENTER BASELINE:0,ALIGN_ITEMS_BASELINE IDENT:)
+align_items:CSS_PROP_ALIGN_ITEMS IDENT:( INHERIT: INITIAL: REVERT: UNSET: STRETCH:0,ALIGN_ITEMS_STRETCH FLEX_START:0,ALIGN_ITEMS_FLEX_START FLEX_END:0,ALIGN_ITEMS_FLEX_END CENTER:0,ALIGN_ITEMS_CENTER BASELINE:0,ALIGN_ITEMS_BASELINE IDENT:)
-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:)
+align_self:CSS_PROP_ALIGN_SELF IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: 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:)
+flex_direction:CSS_PROP_FLEX_DIRECTION IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: IDENT:) 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: INITIAL: REVERT: UNSET: IDENT:) 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:)
+flex_wrap:CSS_PROP_FLEX_WRAP IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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:)
+justify_content:CSS_PROP_JUSTIFY_CONTENT IDENT:( INHERIT: INITIAL: REVERT: UNSET: 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: INITIAL: REVERT: UNSET: IDENT:) NUMBER:( true:ORDER_SET NUMBER:)
diff --git a/src/parse/properties/properties.h b/src/parse/properties/properties.h
index 1e085c5..17b7f41 100644
--- a/src/parse/properties/properties.h
+++ b/src/parse/properties/properties.h
@@ -17,445 +17,566 @@
* Type of property handler function
*/
typedef css_error (*css_prop_handler)(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
extern const css_prop_handler property_handlers[LAST_PROP + 1 - FIRST_PROP];
css_error css__parse_align_content(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_align_items(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_align_self(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_azimuth(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_background(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_background_attachment(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_background_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_background_image(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_background_position(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_background_repeat(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_bottom(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_bottom_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_bottom_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_bottom_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_collapse(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_left(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_left_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_left_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_left_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_right(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_right_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_right_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_right_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_spacing(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_top(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_top_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_top_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_top_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_border_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_bottom(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_box_sizing(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_break_after(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_break_before(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_break_inside(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_caption_side(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_clear(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_clip(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_columns(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_count(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_fill(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_gap(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_rule(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_rule_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_rule_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_rule_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_span(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_column_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_content(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_counter_increment(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_counter_reset(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_cue(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_cue_after(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_cue_before(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_cursor(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_direction(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_display(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_elevation(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_empty_cells(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
+ css_style *result);
+css_error css__parse_fill_opacity(css_language *c,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex_basis(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex_direction(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex_flow(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex_grow(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex_shrink(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_flex_wrap(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_float(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_font(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_font_family(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_font_size(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_font_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_font_variant(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_font_weight(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_height(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_justify_content(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_left(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_letter_spacing(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_line_height(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_list_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_list_style_image(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_list_style_position(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_list_style_type(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_margin(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_margin_bottom(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_margin_left(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_margin_right(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_margin_top(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_max_height(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_max_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_min_height(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_min_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_opacity(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_order(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_orphans(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_outline(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_outline_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_outline_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_outline_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_overflow(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_overflow_x(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_overflow_y(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_padding(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_padding_bottom(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_padding_left(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_padding_right(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_padding_top(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_page_break_after(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_page_break_before(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_page_break_inside(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_pause(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_pause_after(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_pause_before(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_pitch_range(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_pitch(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_play_during(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_position(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_quotes(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_richness(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_right(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_speak_header(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_speak_numeral(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_speak_punctuation(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_speak(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_speech_rate(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_stress(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
+ css_style *result);
+css_error css__parse_stroke_opacity(css_language *c,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_table_layout(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_text_align(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_text_decoration(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_text_indent(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_text_transform(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_top(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_unicode_bidi(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_vertical_align(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_visibility(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_voice_family(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_volume(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_white_space(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_widows(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_word_spacing(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_writing_mode(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result);
css_error css__parse_z_index(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *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_FILL_OPACITY (0)
+#define UNIT_MASK_STROKE_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/parse/properties/quotes.c b/src/parse/properties/quotes.c
index 9d3c4c9..f5360a4 100644
--- a/src/parse/properties/quotes.c
+++ b/src/parse/properties/quotes.c
@@ -28,12 +28,13 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_quotes(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error = CSS_INVALID;
const css_token *token;
+ enum flag_value flag_value;
bool match;
/* [ STRING STRING ]+ | IDENT(none,inherit) */
@@ -45,11 +46,12 @@ css_error css__parse_quotes(css_language *c,
return CSS_INVALID;
}
- if ((token->type == CSS_TOKEN_IDENT) &&
- (lwc_string_caseless_isequal(token->idata,
- c->strings[INHERIT],
- &match) == lwc_error_ok && match)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_QUOTES);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_QUOTES);
+
} else if ((token->type == CSS_TOKEN_IDENT) &&
(lwc_string_caseless_isequal(token->idata,
c->strings[NONE],
diff --git a/src/parse/properties/stroke_opacity.c b/src/parse/properties/stroke_opacity.c
new file mode 100644
index 0000000..7c10998
--- /dev/null
+++ b/src/parse/properties/stroke_opacity.c
@@ -0,0 +1,82 @@
+/*
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+#include <assert.h>
+#include <string.h>
+
+#include "bytecode/bytecode.h"
+#include "bytecode/opcodes.h"
+#include "parse/properties/properties.h"
+#include "parse/properties/utils.h"
+
+/**
+ * Parse stroke-opacity
+ *
+ * \param c Parsing context
+ * \param vector Vector of tokens to process
+ * \param ctx Pointer to vector iteration context
+ * \param result resulting style
+ * \return CSS_OK on success,
+ * CSS_NOMEM on memory exhaustion,
+ * CSS_INVALID if the input is not valid
+ *
+ * Post condition: \a *ctx is updated with the next token to process
+ * If the input is invalid, then \a *ctx remains unchanged.
+ */
+css_error css__parse_stroke_opacity(css_language *c,
+ const parserutils_vector *vector, int32_t *ctx,
+ css_style *result)
+{
+ int32_t orig_ctx = *ctx;
+ css_error error;
+ const css_token *token;
+ enum flag_value flag_value;
+
+ token = parserutils_vector_iterate(vector, ctx);
+ if ((token == NULL) || ((token->type != CSS_TOKEN_IDENT) && (token->type != CSS_TOKEN_NUMBER))) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_STROKE_OPACITY);
+
+ } else if (token->type == CSS_TOKEN_NUMBER) {
+ css_fixed num = 0;
+ size_t consumed = 0;
+
+ num = css__number_from_lwc_string(token->idata, false, &consumed);
+ /* Invalid if there are trailing characters */
+ if (consumed != lwc_string_length(token->idata)) {
+ *ctx = orig_ctx;
+ return CSS_INVALID;
+ }
+
+ /* Clamp to range [0,1] */
+ if (num < 0)
+ num = 0;
+ if (num > INTTOFIX(1))
+ num = INTTOFIX(1);
+
+ error = css__stylesheet_style_appendOPV(result, CSS_PROP_STROKE_OPACITY, 0, STROKE_OPACITY_SET);
+ if (error != CSS_OK) {
+ *ctx = orig_ctx;
+ return error;
+ }
+
+ error = css__stylesheet_style_append(result, num);
+ } else {
+ error = CSS_INVALID;
+ }
+
+ if (error != CSS_OK)
+ *ctx = orig_ctx;
+
+ return error;
+}
+
diff --git a/src/parse/properties/text_decoration.c b/src/parse/properties/text_decoration.c
index a7bae24..4849a12 100644
--- a/src/parse/properties/text_decoration.c
+++ b/src/parse/properties/text_decoration.c
@@ -28,12 +28,13 @@
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_text_decoration(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error = CSS_INVALID;
const css_token *token;
+ enum flag_value flag_value;
bool match;
/* IDENT([ underline || overline || line-through || blink ])
@@ -44,10 +45,14 @@ css_error css__parse_text_decoration(css_language *c,
return CSS_INVALID;
}
+ flag_value = get_css_flag_value(c, token);
+
if (lwc_string_caseless_isequal(token->idata,
c->strings[INHERIT],
&match) == lwc_error_ok && match) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_TEXT_DECORATION);
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_TEXT_DECORATION);
+
} else if (lwc_string_caseless_isequal(token->idata,
c->strings[NONE],
&match) == lwc_error_ok && match) {
diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c
index 0e49853..e6ab872 100644
--- a/src/parse/properties/utils.c
+++ b/src/parse/properties/utils.c
@@ -29,77 +29,83 @@
css_error css__parse_list_style_type_value(css_language *c, const css_token *ident,
uint16_t *value)
{
- bool match;
-
/* IDENT (disc, circle, square, decimal, decimal-leading-zero,
* lower-roman, upper-roman, lower-greek, lower-latin,
* upper-latin, armenian, georgian, lower-alpha, upper-alpha,
* none)
*/
- if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[DISC],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_DISC;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[CIRCLE],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_CIRCLE;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[SQUARE],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_SQUARE;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[DECIMAL],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_DECIMAL;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[DECIMAL_LEADING_ZERO],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[LOWER_ROMAN],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_LOWER_ROMAN;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[UPPER_ROMAN],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_UPPER_ROMAN;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[LOWER_GREEK],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_LOWER_GREEK;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[LOWER_LATIN],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_LOWER_LATIN;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[UPPER_LATIN],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_UPPER_LATIN;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[ARMENIAN],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_ARMENIAN;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[GEORGIAN],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_GEORGIAN;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[LOWER_ALPHA],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_LOWER_ALPHA;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[UPPER_ALPHA],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_UPPER_ALPHA;
- } else if ((lwc_string_caseless_isequal(
- ident->idata, c->strings[NONE],
- &match) == lwc_error_ok && match)) {
- *value = LIST_STYLE_TYPE_NONE;
- } else
- return CSS_INVALID;
+ #define MAP_ENTRIES 52
+ bool match;
+ int midx;
+ const struct {
+ int stringid;
+ int value;
+ } mapping[MAP_ENTRIES] = {
+ { DISC, LIST_STYLE_TYPE_DISC },
+ { CIRCLE, LIST_STYLE_TYPE_CIRCLE },
+ { SQUARE, LIST_STYLE_TYPE_SQUARE },
+ { DECIMAL, LIST_STYLE_TYPE_DECIMAL },
+ { DECIMAL_LEADING_ZERO, LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO },
+ { LOWER_ROMAN, LIST_STYLE_TYPE_LOWER_ROMAN },
+ { UPPER_ROMAN, LIST_STYLE_TYPE_UPPER_ROMAN },
+ { LOWER_GREEK, LIST_STYLE_TYPE_LOWER_GREEK },
+ { LOWER_LATIN, LIST_STYLE_TYPE_LOWER_LATIN },
+ { UPPER_LATIN, LIST_STYLE_TYPE_UPPER_LATIN },
+ { ARMENIAN, LIST_STYLE_TYPE_ARMENIAN },
+ { GEORGIAN, LIST_STYLE_TYPE_GEORGIAN },
+ { LOWER_ALPHA, LIST_STYLE_TYPE_LOWER_ALPHA },
+ { UPPER_ALPHA, LIST_STYLE_TYPE_UPPER_ALPHA },
+ { NONE, LIST_STYLE_TYPE_NONE },
+ { BINARY, LIST_STYLE_TYPE_BINARY },
+ { OCTAL, LIST_STYLE_TYPE_OCTAL},
+ { LOWER_HEXADECIMAL, LIST_STYLE_TYPE_LOWER_HEXADECIMAL },
+ { UPPER_HEXADECIMAL, LIST_STYLE_TYPE_UPPER_HEXADECIMAL },
+ { ARABIC_INDIC, LIST_STYLE_TYPE_ARABIC_INDIC },
+ { LOWER_ARMENIAN, LIST_STYLE_TYPE_LOWER_ARMENIAN },
+ { UPPER_ARMENIAN, LIST_STYLE_TYPE_UPPER_ARMENIAN },
+ { BENGALI, LIST_STYLE_TYPE_BENGALI },
+ { CAMBODIAN, LIST_STYLE_TYPE_CAMBODIAN },
+ { KHMER, LIST_STYLE_TYPE_KHMER },
+ { CJK_DECIMAL, LIST_STYLE_TYPE_CJK_DECIMAL },
+ { DEVANAGARI, LIST_STYLE_TYPE_DEVANAGARI },
+ { GUJARATI, LIST_STYLE_TYPE_GUJARATI },
+ { GURMUKHI, LIST_STYLE_TYPE_GURMUKHI },
+ { HEBREW, LIST_STYLE_TYPE_HEBREW },
+ { KANNADA, LIST_STYLE_TYPE_KANNADA },
+ { LAO, LIST_STYLE_TYPE_LAO },
+ { MALAYALAM, LIST_STYLE_TYPE_MALAYALAM },
+ { MONGOLIAN, LIST_STYLE_TYPE_MONGOLIAN },
+ { MYANMAR, LIST_STYLE_TYPE_MYANMAR },
+ { ORIYA, LIST_STYLE_TYPE_ORIYA },
+ { PERSIAN, LIST_STYLE_TYPE_PERSIAN },
+ { TAMIL, LIST_STYLE_TYPE_TAMIL },
+ { TELUGU, LIST_STYLE_TYPE_TELUGU },
+ { THAI, LIST_STYLE_TYPE_THAI },
+ { TIBETAN, LIST_STYLE_TYPE_TIBETAN },
+ { CJK_EARTHLY_BRANCH, LIST_STYLE_TYPE_CJK_EARTHLY_BRANCH },
+ { CJK_HEAVENLY_STEM, LIST_STYLE_TYPE_CJK_HEAVENLY_STEM },
+ { HIAGANA, LIST_STYLE_TYPE_HIAGANA },
+ { HIAGANA_IROHA, LIST_STYLE_TYPE_HIAGANA_IROHA },
+ { KATAKANA, LIST_STYLE_TYPE_KATAKANA },
+ { KATAKANA_IROHA, LIST_STYLE_TYPE_KATAKANA_IROHA },
+ { JAPANESE_INFORMAL, LIST_STYLE_TYPE_JAPANESE_INFORMAL },
+ { JAPANESE_FORMAL, LIST_STYLE_TYPE_JAPANESE_FORMAL },
+ { KOREAN_HANGUL_FORMAL, LIST_STYLE_TYPE_KOREAN_HANGUL_FORMAL },
+ { KOREAN_HANJA_INFORMAL, LIST_STYLE_TYPE_KOREAN_HANJA_INFORMAL },
+ { KOREAN_HANJA_FORMAL, LIST_STYLE_TYPE_KOREAN_HANJA_FORMAL }
+ };
- return CSS_OK;
+ for (midx = 0; midx < MAP_ENTRIES; midx++) {
+ if ((lwc_string_caseless_isequal(
+ ident->idata,
+ c->strings[mapping[midx].stringid],
+ &match) == lwc_error_ok && match)) {
+ *value = mapping[midx].value;
+ return CSS_OK;
+ }
+ }
+
+ return CSS_INVALID;
}
@@ -120,10 +126,10 @@ css_error css__parse_list_style_type_value(css_language *c, const css_token *ide
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_side(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum border_side_e side)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx;
const css_token *token;
css_error error = CSS_OK;
@@ -360,10 +366,10 @@ static void HSL_to_RGB(css_fixed hue, css_fixed sat, css_fixed lit, uint8_t *r,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_colour_specifier(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
uint16_t *value, uint32_t *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
const css_token *token;
bool match;
css_error error;
@@ -907,11 +913,11 @@ css_error css__parse_hash_colour(lwc_string *data, uint32_t *result)
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_unit_specifier(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
uint32_t default_unit,
css_fixed *length, uint32_t *unit)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
const css_token *token;
css_fixed num;
size_t consumed = 0;
@@ -932,7 +938,7 @@ css_error css__parse_unit_specifier(css_language *c,
if (token->type == CSS_TOKEN_DIMENSION) {
size_t len = lwc_string_length(token->idata);
const char *data = lwc_string_data(token->idata);
- css_unit temp_unit = CSS_UNIT_PX;
+ uint32_t temp_unit = CSS_UNIT_PX;
error = css__parse_unit_keyword(data + consumed, len - consumed,
&temp_unit);
@@ -941,7 +947,7 @@ css_error css__parse_unit_specifier(css_language *c,
return error;
}
- *unit = (uint32_t) temp_unit;
+ *unit = temp_unit;
} else if (token->type == CSS_TOKEN_NUMBER) {
/* Non-zero values are permitted in quirks mode */
if (num != 0) {
@@ -960,8 +966,8 @@ css_error css__parse_unit_specifier(css_language *c,
* dimensions separated from their units by whitespace
* (e.g. "0 px")
*/
- int temp_ctx = *ctx;
- css_unit temp_unit;
+ int32_t temp_ctx = *ctx;
+ uint32_t temp_unit;
consumeWhitespace(vector, &temp_ctx);
@@ -975,7 +981,7 @@ css_error css__parse_unit_specifier(css_language *c,
if (error == CSS_OK) {
c->sheet->quirks_used = true;
*ctx = temp_ctx;
- *unit = (uint32_t) temp_unit;
+ *unit = temp_unit;
}
}
}
@@ -1026,12 +1032,8 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len, uint32_t *unit)
*unit = UNIT_DEG;
else if (strncasecmp(ptr, "rad", 3) == 0)
*unit = UNIT_RAD;
- else if (strncasecmp(ptr, "cap", 3) == 0)
- *unit = UNIT_CAP;
else if (strncasecmp(ptr, "rem", 3) == 0)
*unit = UNIT_REM;
- else if (strncasecmp(ptr, "rlh", 3) == 0)
- *unit = UNIT_RLH;
else if (strncasecmp(ptr, "dpi", 3) == 0)
*unit = UNIT_DPI;
else
@@ -1059,8 +1061,6 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len, uint32_t *unit)
*unit = UNIT_PC;
else if (strncasecmp(ptr, "ch", 2) == 0)
*unit = UNIT_CH;
- else if (strncasecmp(ptr, "ic", 2) == 0)
- *unit = UNIT_IC;
else if (strncasecmp(ptr, "lh", 2) == 0)
*unit = UNIT_LH;
else if (strncasecmp(ptr, "vh", 2) == 0)
@@ -1103,7 +1103,7 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len, uint32_t *unit)
* The resulting string's reference is passed to the caller
*/
css_error css__ident_list_or_string_to_string(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool (*reserved)(css_language *c, const css_token *ident),
lwc_string **result)
{
@@ -1117,7 +1117,7 @@ css_error css__ident_list_or_string_to_string(css_language *c,
token = parserutils_vector_iterate(vector, ctx);
*result = lwc_string_ref(token->idata);
return CSS_OK;
- } else if(token->type == CSS_TOKEN_IDENT) {
+ } else if(token->type == CSS_TOKEN_IDENT) {
return css__ident_list_to_string(c, vector, ctx, reserved,
result);
}
@@ -1141,11 +1141,11 @@ css_error css__ident_list_or_string_to_string(css_language *c,
* The resulting string's reference is passed to the caller
*/
css_error css__ident_list_to_string(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool (*reserved)(css_language *c, const css_token *ident),
lwc_string **result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
const css_token *token;
css_error error = CSS_OK;
parserutils_buffer *buffer;
@@ -1229,12 +1229,12 @@ cleanup:
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__comma_list_to_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool (*reserved)(css_language *c, const css_token *ident),
css_code_t (*get_value)(css_language *c, const css_token *token, bool first),
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
int prev_ctx = orig_ctx;
const css_token *token;
bool first = true;
@@ -1333,4 +1333,3 @@ cleanup:
return error;
}
-
diff --git a/src/parse/properties/utils.h b/src/parse/properties/utils.h
index e4c97c7..aab14e8 100644
--- a/src/parse/properties/utils.h
+++ b/src/parse/properties/utils.h
@@ -19,6 +19,35 @@ static inline bool is_css_inherit(css_language *c, const css_token *token)
&match) == lwc_error_ok && match));
}
+static inline enum flag_value get_css_flag_value(
+ css_language *c,
+ const css_token *token)
+{
+ if (token->type == CSS_TOKEN_IDENT) {
+ bool match;
+
+ if (lwc_string_caseless_isequal(
+ token->idata, c->strings[INHERIT],
+ &match) == lwc_error_ok && match) {
+ return FLAG_VALUE_INHERIT;
+ } else if (lwc_string_caseless_isequal(
+ token->idata, c->strings[INITIAL],
+ &match) == lwc_error_ok && match) {
+ return FLAG_VALUE_INITIAL;
+ } else if (lwc_string_caseless_isequal(
+ token->idata, c->strings[REVERT],
+ &match) == lwc_error_ok && match) {
+ return FLAG_VALUE_REVERT;
+ } else if (lwc_string_caseless_isequal(
+ token->idata, c->strings[UNSET],
+ &match) == lwc_error_ok && match) {
+ return FLAG_VALUE_UNSET;
+ }
+ }
+
+ return FLAG_VALUE__NONE;
+}
+
enum border_side_e { BORDER_SIDE_TOP = 0, BORDER_SIDE_RIGHT = 1, BORDER_SIDE_BOTTOM = 2, BORDER_SIDE_LEFT = 3 };
/**
@@ -37,7 +66,7 @@ enum border_side_e { BORDER_SIDE_TOP = 0, BORDER_SIDE_RIGHT = 1, BORDER_SIDE_BOT
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_side(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum border_side_e side);
/**
@@ -56,7 +85,7 @@ css_error css__parse_border_side(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_side_color(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum css_properties_e op);
/**
@@ -75,7 +104,7 @@ css_error css__parse_border_side_color(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_side_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum css_properties_e op);
@@ -95,7 +124,7 @@ css_error css__parse_border_side_style(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_border_side_width(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum css_properties_e op);
@@ -115,7 +144,7 @@ css_error css__parse_border_side_width(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_side(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum css_properties_e op);
@@ -134,7 +163,7 @@ css_error css__parse_side(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_margin_side(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum css_properties_e op);
/**
@@ -152,7 +181,7 @@ css_error css__parse_margin_side(css_language *c,
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_padding_side(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result, enum css_properties_e op);
@@ -165,7 +194,7 @@ css_error css__parse_list_style_type_value(css_language *c,
const css_token *token, uint16_t *value);
css_error css__parse_colour_specifier(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
uint16_t *value, uint32_t *result);
css_error css__parse_named_colour(css_language *c, lwc_string *data,
@@ -174,7 +203,7 @@ css_error css__parse_named_colour(css_language *c, lwc_string *data,
css_error css__parse_hash_colour(lwc_string *data, uint32_t *result);
css_error css__parse_unit_specifier(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
uint32_t default_unit,
css_fixed *length, uint32_t *unit);
@@ -182,17 +211,17 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len,
uint32_t *unit);
css_error css__ident_list_or_string_to_string(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool (*reserved)(css_language *c, const css_token *ident),
lwc_string **result);
css_error css__ident_list_to_string(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool (*reserved)(css_language *c, const css_token *ident),
lwc_string **result);
css_error css__comma_list_to_style(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
bool (*reserved)(css_language *c, const css_token *ident),
css_code_t (*get_value)(css_language *c,
const css_token *token,
diff --git a/src/parse/properties/voice_family.c b/src/parse/properties/voice_family.c
index 193cb6b..45d63f1 100644
--- a/src/parse/properties/voice_family.c
+++ b/src/parse/properties/voice_family.c
@@ -84,13 +84,13 @@ static css_code_t voice_family_value(css_language *c, const css_token *token, bo
* If the input is invalid, then \a *ctx remains unchanged.
*/
css_error css__parse_voice_family(css_language *c,
- const parserutils_vector *vector, int *ctx,
+ const parserutils_vector *vector, int32_t *ctx,
css_style *result)
{
- int orig_ctx = *ctx;
+ int32_t orig_ctx = *ctx;
css_error error;
const css_token *token;
- bool match;
+ enum flag_value flag_value;
/* [ IDENT+ | STRING ] [ ',' [ IDENT+ | STRING ] ]* | IDENT(inherit)
*
@@ -105,11 +105,12 @@ css_error css__parse_voice_family(css_language *c,
return CSS_INVALID;
}
- if (token->type == CSS_TOKEN_IDENT &&
- (lwc_string_caseless_isequal(
- token->idata, c->strings[INHERIT],
- &match) == lwc_error_ok && match)) {
- error = css_stylesheet_style_inherit(result, CSS_PROP_VOICE_FAMILY);
+ flag_value = get_css_flag_value(c, token);
+
+ if (flag_value != FLAG_VALUE__NONE) {
+ error = css_stylesheet_style_flag_value(result, flag_value,
+ CSS_PROP_VOICE_FAMILY);
+
} else {
*ctx = orig_ctx;
diff --git a/src/parse/propstrings.c b/src/parse/propstrings.c
index 3c9401b..c57bc1b 100644
--- a/src/parse/propstrings.c
+++ b/src/parse/propstrings.c
@@ -10,6 +10,10 @@
#include <assert.h>
+/** build string map entry with a string constant */
+#define SMAP(s) { s, (sizeof((s)) - 1) /* -1 for '\0' */ }
+
+
typedef struct stringmap_entry {
const char *data;
size_t len;
@@ -24,576 +28,620 @@ static css__propstrings_ctx css__propstrings;
/* Must be synchronised with enum in propstrings.h */
const stringmap_entry stringmap[LAST_KNOWN] = {
- { "*", SLEN("*") },
+ SMAP("*"),
- { ":", SLEN(":") },
- { ",", SLEN(",") },
- { ";", SLEN(";") },
- { "{", SLEN("{") },
- { "}", SLEN("}") },
- { "0", SLEN("0") },
+ SMAP(":"),
+ SMAP(","),
+ SMAP(";"),
+ SMAP("{"),
+ SMAP("}"),
+ SMAP("0"),
- { "charset", SLEN("charset") },
- { "import", SLEN("import") },
- { "media", SLEN("media") },
- { "namespace", SLEN("namespace") },
- { "font-face", SLEN("font-face") },
- { "page", SLEN("page") },
+ SMAP("charset"),
+ SMAP("import"),
+ SMAP("media"),
+ SMAP("namespace"),
+ SMAP("font-face"),
+ SMAP("page"),
- { "aural", SLEN("aural") },
- { "braille", SLEN("braille") },
- { "embossed", SLEN("embossed") },
- { "handheld", SLEN("handheld") },
- { "print", SLEN("print") },
- { "projection", SLEN("projection") },
- { "screen", SLEN("screen") },
- { "speech", SLEN("speech") },
- { "tty", SLEN("tty") },
- { "tv", SLEN("tv") },
- { "all", SLEN("all") },
+ SMAP("aural"),
+ SMAP("braille"),
+ SMAP("embossed"),
+ SMAP("handheld"),
+ SMAP("print"),
+ SMAP("projection"),
+ SMAP("screen"),
+ SMAP("speech"),
+ SMAP("tty"),
+ SMAP("tv"),
+ SMAP("all"),
- { "first-child", SLEN("first-child") },
- { "link", SLEN("link") },
- { "visited", SLEN("visited") },
- { "hover", SLEN("hover") },
- { "active", SLEN("active") },
- { "focus", SLEN("focus") },
- { "lang", SLEN("lang") },
- { "first", SLEN("first") },
- { "root", SLEN("root") },
- { "nth-child", SLEN("nth-child") },
- { "nth-last-child", SLEN("nth-last-child") },
- { "nth-of-type", SLEN("nth-of-type") },
- { "nth-last-of-type", SLEN("nth-last-of-type") },
- { "last-child", SLEN("last-child") },
- { "first-of-type", SLEN("first-of-type") },
- { "last-of-type", SLEN("last-of-type") },
- { "only-child", SLEN("only-child") },
- { "only-of-type", SLEN("only-of-type") },
- { "empty", SLEN("empty") },
- { "target", SLEN("target") },
- { "enabled", SLEN("enabled") },
- { "disabled", SLEN("disabled") },
- { "checked", SLEN("checked") },
- { "not", SLEN("not") },
+ SMAP("first-child"),
+ SMAP("link"),
+ SMAP("visited"),
+ SMAP("hover"),
+ SMAP("active"),
+ SMAP("focus"),
+ SMAP("lang"),
+ SMAP("first"),
+ SMAP("root"),
+ SMAP("nth-child"),
+ SMAP("nth-last-child"),
+ SMAP("nth-of-type"),
+ SMAP("nth-last-of-type"),
+ SMAP("last-child"),
+ SMAP("first-of-type"),
+ SMAP("last-of-type"),
+ SMAP("only-child"),
+ SMAP("only-of-type"),
+ SMAP("empty"),
+ SMAP("target"),
+ SMAP("enabled"),
+ SMAP("disabled"),
+ SMAP("checked"),
+ SMAP("not"),
- { "first-line", SLEN("first-line") },
- { "first-letter", SLEN("first-letter") },
- { "before", SLEN("before") },
- { "after", SLEN("after") },
+ SMAP("first-line"),
+ SMAP("first-letter"),
+ SMAP("before"),
+ SMAP("after"),
- { "align-content", SLEN("align-content") },
- { "align-items", SLEN("align-items") },
- { "align-self", SLEN("align-self") },
- { "azimuth", SLEN("azimuth") },
- { "background", SLEN("background") },
- { "background-attachment", SLEN("background-attachment") },
- { "background-color", SLEN("background-color") },
- { "background-image", SLEN("background-image") },
- { "background-position", SLEN("background-position") },
- { "background-repeat", SLEN("background-repeat") },
- { "border", SLEN("border") },
- { "border-bottom", SLEN("border-bottom") },
- { "border-bottom-color", SLEN("border-bottom-color") },
- { "border-bottom-style", SLEN("border-bottom-style") },
- { "border-bottom-width", SLEN("border-bottom-width") },
- { "border-collapse", SLEN("border-collapse") },
- { "border-color", SLEN("border-color") },
- { "border-left", SLEN("border-left") },
- { "border-left-color", SLEN("border-left-color") },
- { "border-left-style", SLEN("border-left-style") },
- { "border-left-width", SLEN("border-left-width") },
- { "border-right", SLEN("border-right") },
- { "border-right-color", SLEN("border-right-color") },
- { "border-right-style", SLEN("border-right-style") },
- { "border-right-width", SLEN("border-right-width") },
- { "border-spacing", SLEN("border-spacing") },
- { "border-style", SLEN("border-style") },
- { "border-top", SLEN("border-top") },
- { "border-top-color", SLEN("border-top-color") },
- { "border-top-style", SLEN("border-top-style") },
- { "border-top-width", SLEN("border-top-width") },
- { "border-width", SLEN("border-width") },
- { "bottom", SLEN("bottom") },
- { "box-sizing", SLEN("box-sizing") },
- { "break-after", SLEN("break-after") },
- { "break-before", SLEN("break-before") },
- { "break-inside", SLEN("break-inside") },
- { "caption-side", SLEN("caption-side") },
- { "clear", SLEN("clear") },
- { "clip", SLEN("clip") },
- { "color", SLEN("color") },
- { "columns", SLEN("columns") },
- { "column-count", SLEN("column-count") },
- { "column-fill", SLEN("column-fill") },
- { "column-gap", SLEN("column-gap") },
- { "column-rule", SLEN("column-rule") },
- { "column-rule-color", SLEN("column-rule-color") },
- { "column-rule-style", SLEN("column-rule-style") },
- { "column-rule-width", SLEN("column-rule_width") },
- { "column-span", SLEN("column-span") },
- { "column-width", SLEN("column-width") },
- { "content", SLEN("content") },
- { "counter-increment", SLEN("counter-increment") },
- { "counter-reset", SLEN("counter-reset") },
- { "cue", SLEN("cue") },
- { "cue-after", SLEN("cue-after") },
- { "cue-before", SLEN("cue-before") },
- { "cursor", SLEN("cursor") },
- { "direction", SLEN("direction") },
- { "display", SLEN("display") },
- { "elevation", SLEN("elevation") },
- { "empty-cells", SLEN("empty-cells") },
- { "flex", SLEN("flex") },
- { "flex-basis", SLEN("flex-basis") },
- { "flex-direction", SLEN("flex-direction") },
- { "flex-flow", SLEN("flex-flow") },
- { "flex-grow", SLEN("flex-grow") },
- { "flex-shrink", SLEN("flex-shrink") },
- { "flex-wrap", SLEN("flex-wrap") },
- { "float", SLEN("float") },
- { "font", SLEN("font") },
- { "font-family", SLEN("font-family") },
- { "font-size", SLEN("font-size") },
- { "font-style", SLEN("font-style") },
- { "font-variant", SLEN("font-variant") },
- { "font-weight", SLEN("font-weight") },
- { "height", SLEN("height") },
- { "justify-content", SLEN("justify-content") },
- { "left", SLEN("left") },
- { "letter-spacing", SLEN("letter-spacing") },
- { "line-height", SLEN("line-height") },
- { "list-style", SLEN("list-style") },
- { "list-style-image", SLEN("list-style-image") },
- { "list-style-position", SLEN("list-style-position") },
- { "list-style-type", SLEN("list-style-type") },
- { "margin", SLEN("margin") },
- { "margin-bottom", SLEN("margin-bottom") },
- { "margin-left", SLEN("margin-left") },
- { "margin-right", SLEN("margin-right") },
- { "margin-top", SLEN("margin-top") },
- { "max-height", SLEN("max-height") },
- { "max-width", SLEN("max-width") },
- { "min-height", SLEN("min-height") },
- { "min-width", SLEN("min-width") },
- { "opacity", SLEN("opacity") },
- { "order", SLEN("order") },
- { "orphans", SLEN("orphans") },
- { "outline", SLEN("outline") },
- { "outline-color", SLEN("outline-color") },
- { "outline-style", SLEN("outline-style") },
- { "outline-width", SLEN("outline-width") },
- { "overflow", SLEN("overflow") },
- { "overflow-x", SLEN("overflow-x") },
- { "overflow-y", SLEN("overflow-y") },
- { "padding", SLEN("padding") },
- { "padding-bottom", SLEN("padding-bottom") },
- { "padding-left", SLEN("padding-left") },
- { "padding-right", SLEN("padding-right") },
- { "padding-top", SLEN("padding-top") },
- { "page-break-after", SLEN("page-break-after") },
- { "page-break-before", SLEN("page-break-before") },
- { "page-break-inside", SLEN("page-break-inside") },
- { "pause", SLEN("pause") },
- { "pause-after", SLEN("pause-after") },
- { "pause-before", SLEN("pause-before") },
- { "pitch-range", SLEN("pitch-range") },
- { "pitch", SLEN("pitch") },
- { "play-during", SLEN("play-during") },
- { "position", SLEN("position") },
- { "quotes", SLEN("quotes") },
- { "richness", SLEN("richness") },
- { "right", SLEN("right") },
- { "speak-header", SLEN("speak-header") },
- { "speak-numeral", SLEN("speak-numeral") },
- { "speak-punctuation", SLEN("speak-punctuation") },
- { "speak", SLEN("speak") },
- { "speech-rate", SLEN("speech-rate") },
- { "stress", SLEN("stress") },
- { "table-layout", SLEN("table-layout") },
- { "text-align", SLEN("text-align") },
- { "text-decoration", SLEN("text-decoration") },
- { "text-indent", SLEN("text-indent") },
- { "text-transform", SLEN("text-transform") },
- { "top", SLEN("top") },
- { "unicode-bidi", SLEN("unicode-bidi") },
- { "vertical-align", SLEN("vertical-align") },
- { "visibility", SLEN("visibility") },
- { "voice-family", SLEN("voice-family") },
- { "volume", SLEN("volume") },
- { "white-space", SLEN("white-space") },
- { "widows", SLEN("widows") },
- { "width", SLEN("width") },
- { "word-spacing", SLEN("word-spacing") },
- { "writing-mode", SLEN("writing-mode") },
- { "z-index", SLEN("z-index") },
+ SMAP("align-content"),
+ SMAP("align-items"),
+ SMAP("align-self"),
+ SMAP("azimuth"),
+ SMAP("background"),
+ SMAP("background-attachment"),
+ SMAP("background-color"),
+ SMAP("background-image"),
+ SMAP("background-position"),
+ SMAP("background-repeat"),
+ SMAP("border"),
+ SMAP("border-bottom"),
+ SMAP("border-bottom-color"),
+ SMAP("border-bottom-style"),
+ SMAP("border-bottom-width"),
+ SMAP("border-collapse"),
+ SMAP("border-color"),
+ SMAP("border-left"),
+ SMAP("border-left-color"),
+ SMAP("border-left-style"),
+ SMAP("border-left-width"),
+ SMAP("border-right"),
+ SMAP("border-right-color"),
+ SMAP("border-right-style"),
+ SMAP("border-right-width"),
+ SMAP("border-spacing"),
+ SMAP("border-style"),
+ SMAP("border-top"),
+ SMAP("border-top-color"),
+ SMAP("border-top-style"),
+ SMAP("border-top-width"),
+ SMAP("border-width"),
+ SMAP("bottom"),
+ SMAP("box-sizing"),
+ SMAP("break-after"),
+ SMAP("break-before"),
+ SMAP("break-inside"),
+ SMAP("caption-side"),
+ SMAP("clear"),
+ SMAP("clip"),
+ SMAP("color"),
+ SMAP("columns"),
+ SMAP("column-count"),
+ SMAP("column-fill"),
+ SMAP("column-gap"),
+ SMAP("column-rule"),
+ SMAP("column-rule-color"),
+ SMAP("column-rule-style"),
+ SMAP("column-rule-width"),
+ SMAP("column-span"),
+ SMAP("column-width"),
+ SMAP("content"),
+ SMAP("counter-increment"),
+ SMAP("counter-reset"),
+ SMAP("cue"),
+ SMAP("cue-after"),
+ SMAP("cue-before"),
+ SMAP("cursor"),
+ SMAP("direction"),
+ SMAP("display"),
+ SMAP("elevation"),
+ SMAP("empty-cells"),
+ SMAP("fill-opacity"),
+ SMAP("flex"),
+ SMAP("flex-basis"),
+ SMAP("flex-direction"),
+ SMAP("flex-flow"),
+ SMAP("flex-grow"),
+ SMAP("flex-shrink"),
+ SMAP("flex-wrap"),
+ SMAP("float"),
+ SMAP("font"),
+ SMAP("font-family"),
+ SMAP("font-size"),
+ SMAP("font-style"),
+ SMAP("font-variant"),
+ SMAP("font-weight"),
+ SMAP("height"),
+ SMAP("justify-content"),
+ SMAP("left"),
+ SMAP("letter-spacing"),
+ SMAP("line-height"),
+ SMAP("list-style"),
+ SMAP("list-style-image"),
+ SMAP("list-style-position"),
+ SMAP("list-style-type"),
+ SMAP("margin"),
+ SMAP("margin-bottom"),
+ SMAP("margin-left"),
+ SMAP("margin-right"),
+ SMAP("margin-top"),
+ SMAP("max-height"),
+ SMAP("max-width"),
+ SMAP("min-height"),
+ SMAP("min-width"),
+ SMAP("opacity"),
+ SMAP("order"),
+ SMAP("orphans"),
+ SMAP("outline"),
+ SMAP("outline-color"),
+ SMAP("outline-style"),
+ SMAP("outline-width"),
+ SMAP("overflow"),
+ SMAP("overflow-x"),
+ SMAP("overflow-y"),
+ SMAP("padding"),
+ SMAP("padding-bottom"),
+ SMAP("padding-left"),
+ SMAP("padding-right"),
+ SMAP("padding-top"),
+ SMAP("page-break-after"),
+ SMAP("page-break-before"),
+ SMAP("page-break-inside"),
+ SMAP("pause"),
+ SMAP("pause-after"),
+ SMAP("pause-before"),
+ SMAP("pitch-range"),
+ SMAP("pitch"),
+ SMAP("play-during"),
+ SMAP("position"),
+ SMAP("quotes"),
+ SMAP("richness"),
+ SMAP("right"),
+ SMAP("speak-header"),
+ SMAP("speak-numeral"),
+ SMAP("speak-punctuation"),
+ SMAP("speak"),
+ SMAP("speech-rate"),
+ SMAP("stress"),
+ SMAP("stroke-opacity"),
+ SMAP("table-layout"),
+ SMAP("text-align"),
+ SMAP("text-decoration"),
+ SMAP("text-indent"),
+ SMAP("text-transform"),
+ SMAP("top"),
+ SMAP("unicode-bidi"),
+ SMAP("vertical-align"),
+ SMAP("visibility"),
+ SMAP("voice-family"),
+ SMAP("volume"),
+ SMAP("white-space"),
+ SMAP("widows"),
+ SMAP("width"),
+ SMAP("word-spacing"),
+ SMAP("writing-mode"),
+ SMAP("z-index"),
- { "inherit", SLEN("inherit") },
- { "important", SLEN("important") },
- { "none", SLEN("none") },
- { "both", SLEN("both") },
- { "fixed", SLEN("fixed") },
- { "scroll", SLEN("scroll") },
- { "transparent", SLEN("transparent") },
- { "no-repeat", SLEN("no-repeat") },
- { "repeat-x", SLEN("repeat-x") },
- { "repeat-y", SLEN("repeat-y") },
- { "repeat", SLEN("repeat") },
- { "hidden", SLEN("hidden") },
- { "dotted", SLEN("dotted") },
- { "dashed", SLEN("dashed") },
- { "solid", SLEN("solid") },
- { "double", SLEN("double") },
- { "groove", SLEN("groove") },
- { "ridge", SLEN("ridge") },
- { "inset", SLEN("inset") },
- { "outset", SLEN("outset") },
- { "thin", SLEN("thin") },
- { "medium", SLEN("medium") },
- { "thick", SLEN("thick") },
- { "collapse", SLEN("collapse") },
- { "separate", SLEN("separate") },
- { "auto", SLEN("auto") },
- { "ltr", SLEN("ltr") },
- { "rtl", SLEN("rtl") },
- { "inline", SLEN("inline") },
- { "block", SLEN("block") },
- { "list-item", SLEN("list-item") },
- { "run-in", SLEN("run-in") },
- { "inline-block", SLEN("inline-block") },
- { "table", SLEN("table") },
- { "inline-table", SLEN("inline-table") },
- { "table-row-group", SLEN("table-row-group") },
- { "table-header-group", SLEN("table-header-group") },
- { "table-footer-group", SLEN("table-footer-group") },
- { "table-row", SLEN("table-row") },
- { "table-column-group", SLEN("table-column-group") },
- { "table-column", SLEN("table-column") },
- { "table-cell", SLEN("table-cell") },
- { "table-caption", SLEN("table-caption") },
- { "below", SLEN("below") },
- { "level", SLEN("level") },
- { "above", SLEN("above") },
- { "higher", SLEN("higher") },
- { "lower", SLEN("lower") },
- { "show", SLEN("show") },
- { "hide", SLEN("hide") },
- { "xx-small", SLEN("xx-small") },
- { "x-small", SLEN("x-small") },
- { "small", SLEN("small") },
- { "large", SLEN("large") },
- { "x-large", SLEN("x-large") },
- { "xx-large", SLEN("xx-large") },
- { "larger", SLEN("larger") },
- { "smaller", SLEN("smaller") },
- { "normal", SLEN("normal") },
- { "italic", SLEN("italic") },
- { "oblique", SLEN("oblique") },
- { "small-caps", SLEN("small-caps") },
- { "bold", SLEN("bold") },
- { "bolder", SLEN("bolder") },
- { "lighter", SLEN("lighter") },
- { "inside", SLEN("inside") },
- { "outside", SLEN("outside") },
- { "disc", SLEN("disc") },
- { "circle", SLEN("circle") },
- { "square", SLEN("square") },
- { "decimal", SLEN("decimal") },
- { "decimal-leading-zero", SLEN("decimal-leading-zero") },
- { "lower-roman", SLEN("lower-roman") },
- { "upper-roman", SLEN("upper-roman") },
- { "lower-greek", SLEN("lower-greek") },
- { "lower-latin", SLEN("lower-latin") },
- { "upper-latin", SLEN("upper-latin") },
- { "armenian", SLEN("armenian") },
- { "georgian", SLEN("georgian") },
- { "lower-alpha", SLEN("lower-alpha") },
- { "upper-alpha", SLEN("upper-alpha") },
- { "invert", SLEN("invert") },
- { "visible", SLEN("visible") },
- { "always", SLEN("always") },
- { "avoid", SLEN("avoid") },
- { "x-low", SLEN("x-low") },
- { "low", SLEN("low") },
- { "high", SLEN("high") },
- { "x-high", SLEN("x-high") },
- { "static", SLEN("static") },
- { "relative", SLEN("relative") },
- { "absolute", SLEN("absolute") },
- { "once", SLEN("once") },
- { "digits", SLEN("digits") },
- { "continuous", SLEN("continuous") },
- { "code", SLEN("code") },
- { "spell-out", SLEN("spell-out") },
- { "x-slow", SLEN("x-slow") },
- { "slow", SLEN("slow") },
- { "fast", SLEN("fast") },
- { "x-fast", SLEN("x-fast") },
- { "faster", SLEN("faster") },
- { "slower", SLEN("slower") },
- { "center", SLEN("center") },
- { "justify", SLEN("justify") },
- { "capitalize", SLEN("capitalize") },
- { "uppercase", SLEN("uppercase") },
- { "lowercase", SLEN("lowercase") },
- { "embed", SLEN("embed") },
- { "bidi-override", SLEN("bidi-override") },
- { "baseline", SLEN("baseline") },
- { "sub", SLEN("sub") },
- { "super", SLEN("super") },
- { "text-top", SLEN("text-top") },
- { "middle", SLEN("middle") },
- { "text-bottom", SLEN("text-bottom") },
- { "silent", SLEN("silent") },
- { "x-soft", SLEN("x-soft") },
- { "soft", SLEN("soft") },
- { "loud", SLEN("loud") },
- { "x-loud", SLEN("x-loud") },
- { "pre", SLEN("pre") },
- { "nowrap", SLEN("nowrap") },
- { "pre-wrap", SLEN("pre-wrap") },
- { "pre-line", SLEN("pre-line") },
- { "leftwards", SLEN("leftwards") },
- { "rightwards", SLEN("rightwards") },
- { "left-side", SLEN("left-side") },
- { "far-left", SLEN("far-left") },
- { "center-left", SLEN("center-left") },
- { "center-right", SLEN("center-right") },
- { "far-right", SLEN("far-right") },
- { "right-side", SLEN("right-side") },
- { "behind", SLEN("behind") },
- { "rect", SLEN("rect") },
- { "open-quote", SLEN("open-quote") },
- { "close-quote", SLEN("close-quote") },
- { "no-open-quote", SLEN("no-open-quote") },
- { "no-close-quote", SLEN("no-close-quote") },
- { "attr", SLEN("attr") },
- { "counter", SLEN("counter") },
- { "counters", SLEN("counters") },
- { "crosshair", SLEN("crosshair") },
- { "default", SLEN("default") },
- { "pointer", SLEN("pointer") },
- { "move", SLEN("move") },
- { "e-resize", SLEN("e-resize") },
- { "ne-resize", SLEN("ne-resize") },
- { "nw-resize", SLEN("nw-resize") },
- { "n-resize", SLEN("n-resize") },
- { "se-resize", SLEN("se-resize") },
- { "sw-resize", SLEN("sw-resize") },
- { "s-resize", SLEN("s-resize") },
- { "w-resize", SLEN("w-resize") },
- { "text", SLEN("text") },
- { "wait", SLEN("wait") },
- { "help", SLEN("help") },
- { "progress", SLEN("progress") },
- { "serif", SLEN("serif") },
- { "sans-serif", SLEN("sans-serif") },
- { "cursive", SLEN("cursive") },
- { "fantasy", SLEN("fantasy") },
- { "monospace", SLEN("monospace") },
- { "male", SLEN("male") },
- { "female", SLEN("female") },
- { "child", SLEN("child") },
- { "mix", SLEN("mix") },
- { "underline", SLEN("underline") },
- { "overline", SLEN("overline") },
- { "line-through", SLEN("line-through") },
- { "blink", SLEN("blink") },
- { "rgb", SLEN("rgb") },
- { "rgba", SLEN("rgba") },
- { "hsl", SLEN("hsl") },
- { "hsla", SLEN("hsla") },
- { "-libcss-left", SLEN("-libcss-left") },
- { "-libcss-center", SLEN("-libcss-center") },
- { "-libcss-right", SLEN("-libcss-right") },
- { "currentColor", SLEN("currentColor") },
- { "odd", SLEN("odd") },
- { "even", SLEN("even") },
- { "src", SLEN("src") },
- { "local", SLEN("local") },
- { "initial", SLEN("initial") },
- { "format", SLEN("format") },
- { "woff", SLEN("woff") },
- { "truetype", SLEN("truetype") },
- { "opentype", SLEN("opentype") },
- { "embedded-opentype", SLEN("embedded-opentype") },
- { "svg", SLEN("svg") },
- { "column", SLEN("column") },
- { "avoid-page", SLEN("avoid_page") },
- { "avoid-column", SLEN("avoid-column") },
- { "balance", SLEN("balance") },
- { "horizontal-tb", SLEN("horizontal-tb") },
- { "vertical-rl", SLEN("vertical-rl") },
- { "vertical-lr", SLEN("vertical-lr") },
- { "content-box", SLEN("content-box") },
- { "border-box", SLEN("border-box") },
- { "stretch", SLEN("stretch") },
- { "inline-flex", SLEN("inline-flex") },
- { "flex-start", SLEN("flex-start") },
- { "flex-end", SLEN("flex-end") },
- { "space-between", SLEN("space-between") },
- { "space-around", SLEN("space-around") },
- { "space-evenly", SLEN("space-evenly") },
- { "row", SLEN("row") },
- { "row-reverse", SLEN("row-reverse") },
- { "column-reverse", SLEN("column-reverse") },
- { "wrap", SLEN("wrap") },
- { "wrap-reverse", SLEN("wrap-reverse") },
- { "and", SLEN("and") },
- { "or", SLEN("or") },
- { "only", SLEN("only") },
- { "infinite", SLEN("infinite") },
+ SMAP("inherit"),
+ SMAP("unset"),
+ SMAP("important"),
+ SMAP("none"),
+ SMAP("both"),
+ SMAP("fixed"),
+ SMAP("scroll"),
+ SMAP("transparent"),
+ SMAP("no-repeat"),
+ SMAP("repeat-x"),
+ SMAP("repeat-y"),
+ SMAP("repeat"),
+ SMAP("hidden"),
+ SMAP("dotted"),
+ SMAP("dashed"),
+ SMAP("solid"),
+ SMAP("double"),
+ SMAP("groove"),
+ SMAP("ridge"),
+ SMAP("inset"),
+ SMAP("outset"),
+ SMAP("thin"),
+ SMAP("medium"),
+ SMAP("thick"),
+ SMAP("collapse"),
+ SMAP("separate"),
+ SMAP("auto"),
+ SMAP("ltr"),
+ SMAP("rtl"),
+ SMAP("inline"),
+ SMAP("block"),
+ SMAP("list-item"),
+ SMAP("run-in"),
+ SMAP("inline-block"),
+ SMAP("table"),
+ SMAP("inline-table"),
+ SMAP("table-row-group"),
+ SMAP("table-header-group"),
+ SMAP("table-footer-group"),
+ SMAP("table-row"),
+ SMAP("table-column-group"),
+ SMAP("table-column"),
+ SMAP("table-cell"),
+ SMAP("table-caption"),
+ SMAP("below"),
+ SMAP("level"),
+ SMAP("above"),
+ SMAP("higher"),
+ SMAP("lower"),
+ SMAP("show"),
+ SMAP("hide"),
+ SMAP("xx-small"),
+ SMAP("x-small"),
+ SMAP("small"),
+ SMAP("large"),
+ SMAP("x-large"),
+ SMAP("xx-large"),
+ SMAP("larger"),
+ SMAP("smaller"),
+ SMAP("normal"),
+ SMAP("italic"),
+ SMAP("oblique"),
+ SMAP("small-caps"),
+ SMAP("bold"),
+ SMAP("bolder"),
+ SMAP("lighter"),
+ SMAP("inside"),
+ SMAP("outside"),
+ SMAP("disc"),
+ SMAP("circle"),
+ SMAP("square"),
+ SMAP("decimal"),
+ SMAP("decimal-leading-zero"),
+ SMAP("lower-roman"),
+ SMAP("upper-roman"),
+ SMAP("lower-greek"),
+ SMAP("lower-latin"),
+ SMAP("upper-latin"),
+ SMAP("armenian"),
+ SMAP("georgian"),
+ SMAP("lower-alpha"),
+ SMAP("upper-alpha"),
+ SMAP("binary"),
+ SMAP("octal"),
+ SMAP("lower-hexadecimal"),
+ SMAP("upper-hexadecimal"),
+ SMAP("arabic-indic"),
+ SMAP("lower-armenian"),
+ SMAP("upper-armenian"),
+ SMAP("bengali"),
+ SMAP("cambodian"),
+ SMAP("khmer"),
+ SMAP("cjk-decimal"),
+ SMAP("devanagari"),
+ SMAP("gujarati"),
+ SMAP("gurmukhi"),
+ SMAP("hebrew"),
+ SMAP("kannada"),
+ SMAP("lao"),
+ SMAP("malayalam"),
+ SMAP("mongolian"),
+ SMAP("myanmar"),
+ SMAP("oriya"),
+ SMAP("persian"),
+ SMAP("tamil"),
+ SMAP("telugu"),
+ SMAP("thai"),
+ SMAP("tibetan"),
+ SMAP("cjk-earthly-branch"),
+ SMAP("cjk-heavenly-stem"),
+ SMAP("hiragana"),
+ SMAP("hiragana-iroha"),
+ SMAP("katakana"),
+ SMAP("katakana-iroha"),
+ SMAP("japanese-informal"),
+ SMAP("japanese-formal"),
+ SMAP("korean-hangul-formal"),
+ SMAP("korean-hanja-informal"),
+ SMAP("korean-hanja-formal"),
+ SMAP("invert"),
+ SMAP("visible"),
+ SMAP("always"),
+ SMAP("avoid"),
+ SMAP("x-low"),
+ SMAP("low"),
+ SMAP("high"),
+ SMAP("x-high"),
+ SMAP("static"),
+ SMAP("relative"),
+ SMAP("absolute"),
+ SMAP("once"),
+ SMAP("digits"),
+ SMAP("continuous"),
+ SMAP("code"),
+ SMAP("spell-out"),
+ SMAP("x-slow"),
+ SMAP("slow"),
+ SMAP("fast"),
+ SMAP("x-fast"),
+ SMAP("faster"),
+ SMAP("slower"),
+ SMAP("center"),
+ SMAP("justify"),
+ SMAP("capitalize"),
+ SMAP("uppercase"),
+ SMAP("lowercase"),
+ SMAP("embed"),
+ SMAP("bidi-override"),
+ SMAP("baseline"),
+ SMAP("sub"),
+ SMAP("super"),
+ SMAP("text-top"),
+ SMAP("middle"),
+ SMAP("text-bottom"),
+ SMAP("silent"),
+ SMAP("x-soft"),
+ SMAP("soft"),
+ SMAP("loud"),
+ SMAP("x-loud"),
+ SMAP("pre"),
+ SMAP("nowrap"),
+ SMAP("pre-wrap"),
+ SMAP("pre-line"),
+ SMAP("leftwards"),
+ SMAP("rightwards"),
+ SMAP("left-side"),
+ SMAP("far-left"),
+ SMAP("center-left"),
+ SMAP("center-right"),
+ SMAP("far-right"),
+ SMAP("right-side"),
+ SMAP("behind"),
+ SMAP("rect"),
+ SMAP("open-quote"),
+ SMAP("close-quote"),
+ SMAP("no-open-quote"),
+ SMAP("no-close-quote"),
+ SMAP("attr"),
+ SMAP("counter"),
+ SMAP("counters"),
+ SMAP("crosshair"),
+ SMAP("default"),
+ SMAP("pointer"),
+ SMAP("move"),
+ SMAP("e-resize"),
+ SMAP("ne-resize"),
+ SMAP("nw-resize"),
+ SMAP("n-resize"),
+ SMAP("se-resize"),
+ SMAP("sw-resize"),
+ SMAP("s-resize"),
+ SMAP("w-resize"),
+ SMAP("text"),
+ SMAP("wait"),
+ SMAP("help"),
+ SMAP("progress"),
+ SMAP("serif"),
+ SMAP("sans-serif"),
+ SMAP("cursive"),
+ SMAP("fantasy"),
+ SMAP("monospace"),
+ SMAP("male"),
+ SMAP("female"),
+ SMAP("child"),
+ SMAP("mix"),
+ SMAP("underline"),
+ SMAP("overline"),
+ SMAP("line-through"),
+ SMAP("blink"),
+ SMAP("rgb"),
+ SMAP("rgba"),
+ SMAP("hsl"),
+ SMAP("hsla"),
+ SMAP("-libcss-left"),
+ SMAP("-libcss-center"),
+ SMAP("-libcss-right"),
+ SMAP("currentColor"),
+ SMAP("odd"),
+ SMAP("even"),
+ SMAP("src"),
+ SMAP("local"),
+ SMAP("initial"),
+ SMAP("revert"),
+ SMAP("format"),
+ SMAP("woff"),
+ SMAP("truetype"),
+ SMAP("opentype"),
+ SMAP("embedded-opentype"),
+ SMAP("svg"),
+ SMAP("column"),
+ SMAP("avoid-page"),
+ SMAP("avoid-column"),
+ SMAP("balance"),
+ SMAP("horizontal-tb"),
+ SMAP("vertical-rl"),
+ SMAP("vertical-lr"),
+ SMAP("content-box"),
+ SMAP("border-box"),
+ SMAP("stretch"),
+ SMAP("inline-flex"),
+ SMAP("flex-start"),
+ SMAP("flex-end"),
+ SMAP("space-between"),
+ SMAP("space-around"),
+ SMAP("space-evenly"),
+ SMAP("row"),
+ SMAP("row-reverse"),
+ SMAP("column-reverse"),
+ SMAP("wrap"),
+ SMAP("wrap-reverse"),
+ SMAP("and"),
+ SMAP("or"),
+ SMAP("only"),
+ SMAP("infinite"),
+ SMAP("grid"),
+ SMAP("inline-grid"),
+ SMAP("sticky"),
- { "aliceblue", SLEN("aliceblue") },
- { "antiquewhite", SLEN("antiquewhite") },
- { "aqua", SLEN("aqua") },
- { "aquamarine", SLEN("aquamarine") },
- { "azure", SLEN("azure") },
- { "beige", SLEN("beige") },
- { "bisque", SLEN("bisque") },
- { "black", SLEN("black") },
- { "blanchedalmond", SLEN("blanchedalmond") },
- { "blue", SLEN("blue") },
- { "blueviolet", SLEN("blueviolet") },
- { "brown", SLEN("brown") },
- { "burlywood", SLEN("burlywood") },
- { "cadetblue", SLEN("cadetblue") },
- { "chartreuse", SLEN("chartreuse") },
- { "chocolate", SLEN("chocolate") },
- { "coral", SLEN("coral") },
- { "cornflowerblue", SLEN("cornflowerblue") },
- { "cornsilk", SLEN("cornsilk") },
- { "crimson", SLEN("crimson") },
- { "cyan", SLEN("cyan") },
- { "darkblue", SLEN("darkblue") },
- { "darkcyan", SLEN("darkcyan") },
- { "darkgoldenrod", SLEN("darkgoldenrod") },
- { "darkgray", SLEN("darkgray") },
- { "darkgreen", SLEN("darkgreen") },
- { "darkgrey", SLEN("darkgrey") },
- { "darkkhaki", SLEN("darkkhaki") },
- { "darkmagenta", SLEN("darkmagenta") },
- { "darkolivegreen", SLEN("darkolivegreen") },
- { "darkorange", SLEN("darkorange") },
- { "darkorchid", SLEN("darkorchid") },
- { "darkred", SLEN("darkred") },
- { "darksalmon", SLEN("darksalmon") },
- { "darkseagreen", SLEN("darkseagreen") },
- { "darkslateblue", SLEN("darkslateblue") },
- { "darkslategray", SLEN("darkslategray") },
- { "darkslategrey", SLEN("darkslategrey") },
- { "darkturquoise", SLEN("darkturquoise") },
- { "darkviolet", SLEN("darkviolet") },
- { "deeppink", SLEN("deeppink") },
- { "deepskyblue", SLEN("deepskyblue") },
- { "dimgray", SLEN("dimgray") },
- { "dimgrey", SLEN("dimgrey") },
- { "dodgerblue", SLEN("dodgerblue") },
- { "feldspar", SLEN("feldspar") },
- { "firebrick", SLEN("firebrick") },
- { "floralwhite", SLEN("floralwhite") },
- { "forestgreen", SLEN("forestgreen") },
- { "fuchsia", SLEN("fuchsia") },
- { "gainsboro", SLEN("gainsboro") },
- { "ghostwhite", SLEN("ghostwhite") },
- { "gold", SLEN("gold") },
- { "goldenrod", SLEN("goldenrod") },
- { "gray", SLEN("gray") },
- { "green", SLEN("green") },
- { "greenyellow", SLEN("greenyellow") },
- { "grey", SLEN("grey") },
- { "honeydew", SLEN("honeydew") },
- { "hotpink", SLEN("hotpink") },
- { "indianred", SLEN("indianred") },
- { "indigo", SLEN("indigo") },
- { "ivory", SLEN("ivory") },
- { "khaki", SLEN("khaki") },
- { "lavender", SLEN("lavender") },
- { "lavenderblush", SLEN("lavenderblush") },
- { "lawngreen", SLEN("lawngreen") },
- { "lemonchiffon", SLEN("lemonchiffon") },
- { "lightblue", SLEN("lightblue") },
- { "lightcoral", SLEN("lightcoral") },
- { "lightcyan", SLEN("lightcyan") },
- { "lightgoldenrodyellow", SLEN("lightgoldenrodyellow") },
- { "lightgray", SLEN("lightgray") },
- { "lightgreen", SLEN("lightgreen") },
- { "lightgrey", SLEN("lightgrey") },
- { "lightpink", SLEN("lightpink") },
- { "lightsalmon", SLEN("lightsalmon") },
- { "lightseagreen", SLEN("lightseagreen") },
- { "lightskyblue", SLEN("lightskyblue") },
- { "lightslateblue", SLEN("lightslateblue") },
- { "lightslategray", SLEN("lightslategray") },
- { "lightslategrey", SLEN("lightslategrey") },
- { "lightsteelblue", SLEN("lightsteelblue") },
- { "lightyellow", SLEN("lightyellow") },
- { "lime", SLEN("lime") },
- { "limegreen", SLEN("limegreen") },
- { "linen", SLEN("linen") },
- { "magenta", SLEN("magenta") },
- { "maroon", SLEN("maroon") },
- { "mediumaquamarine", SLEN("mediumaquamarine") },
- { "mediumblue", SLEN("mediumblue") },
- { "mediumorchid", SLEN("mediumorchid") },
- { "mediumpurple", SLEN("mediumpurple") },
- { "mediumseagreen", SLEN("mediumseagreen") },
- { "mediumslateblue", SLEN("mediumslateblue") },
- { "mediumspringgreen", SLEN("mediumspringgreen") },
- { "mediumturquoise", SLEN("mediumturquoise") },
- { "mediumvioletred", SLEN("mediumvioletred") },
- { "midnightblue", SLEN("midnightblue") },
- { "mintcream", SLEN("mintcream") },
- { "mistyrose", SLEN("mistyrose") },
- { "moccasin", SLEN("moccasin") },
- { "navajowhite", SLEN("navajowhite") },
- { "navy", SLEN("navy") },
- { "oldlace", SLEN("oldlace") },
- { "olive", SLEN("olive") },
- { "olivedrab", SLEN("olivedrab") },
- { "orange", SLEN("orange") },
- { "orangered", SLEN("orangered") },
- { "orchid", SLEN("orchid") },
- { "palegoldenrod", SLEN("palegoldenrod") },
- { "palegreen", SLEN("palegreen") },
- { "paleturquoise", SLEN("paleturquoise") },
- { "palevioletred", SLEN("palevioletred") },
- { "papayawhip", SLEN("papayawhip") },
- { "peachpuff", SLEN("peachpuff") },
- { "peru", SLEN("peru") },
- { "pink", SLEN("pink") },
- { "plum", SLEN("plum") },
- { "powderblue", SLEN("powderblue") },
- { "purple", SLEN("purple") },
- { "red", SLEN("red") },
- { "rosybrown", SLEN("rosybrown") },
- { "royalblue", SLEN("royalblue") },
- { "saddlebrown", SLEN("saddlebrown") },
- { "salmon", SLEN("salmon") },
- { "sandybrown", SLEN("sandybrown") },
- { "seagreen", SLEN("seagreen") },
- { "seashell", SLEN("seashell") },
- { "sienna", SLEN("sienna") },
- { "silver", SLEN("silver") },
- { "skyblue", SLEN("skyblue") },
- { "slateblue", SLEN("slateblue") },
- { "slategray", SLEN("slategray") },
- { "slategrey", SLEN("slategrey") },
- { "snow", SLEN("snow") },
- { "springgreen", SLEN("springgreen") },
- { "steelblue", SLEN("steelblue") },
- { "tan", SLEN("tan") },
- { "teal", SLEN("teal") },
- { "thistle", SLEN("thistle") },
- { "tomato", SLEN("tomato") },
- { "turquoise", SLEN("turquoise") },
- { "violet", SLEN("violet") },
- { "violetred", SLEN("violetred") },
- { "wheat", SLEN("wheat") },
- { "white", SLEN("white") },
- { "whitesmoke", SLEN("whitesmoke") },
- { "yellow", SLEN("yellow") },
- { "yellowgreen", SLEN("yellowgreen") }
+ SMAP("aliceblue"),
+ SMAP("antiquewhite"),
+ SMAP("aqua"),
+ SMAP("aquamarine"),
+ SMAP("azure"),
+ SMAP("beige"),
+ SMAP("bisque"),
+ SMAP("black"),
+ SMAP("blanchedalmond"),
+ SMAP("blue"),
+ SMAP("blueviolet"),
+ SMAP("brown"),
+ SMAP("burlywood"),
+ SMAP("cadetblue"),
+ SMAP("chartreuse"),
+ SMAP("chocolate"),
+ SMAP("coral"),
+ SMAP("cornflowerblue"),
+ SMAP("cornsilk"),
+ SMAP("crimson"),
+ SMAP("cyan"),
+ SMAP("darkblue"),
+ SMAP("darkcyan"),
+ SMAP("darkgoldenrod"),
+ SMAP("darkgray"),
+ SMAP("darkgreen"),
+ SMAP("darkgrey"),
+ SMAP("darkkhaki"),
+ SMAP("darkmagenta"),
+ SMAP("darkolivegreen"),
+ SMAP("darkorange"),
+ SMAP("darkorchid"),
+ SMAP("darkred"),
+ SMAP("darksalmon"),
+ SMAP("darkseagreen"),
+ SMAP("darkslateblue"),
+ SMAP("darkslategray"),
+ SMAP("darkslategrey"),
+ SMAP("darkturquoise"),
+ SMAP("darkviolet"),
+ SMAP("deeppink"),
+ SMAP("deepskyblue"),
+ SMAP("dimgray"),
+ SMAP("dimgrey"),
+ SMAP("dodgerblue"),
+ SMAP("feldspar"),
+ SMAP("firebrick"),
+ SMAP("floralwhite"),
+ SMAP("forestgreen"),
+ SMAP("fuchsia"),
+ SMAP("gainsboro"),
+ SMAP("ghostwhite"),
+ SMAP("gold"),
+ SMAP("goldenrod"),
+ SMAP("gray"),
+ SMAP("green"),
+ SMAP("greenyellow"),
+ SMAP("grey"),
+ SMAP("honeydew"),
+ SMAP("hotpink"),
+ SMAP("indianred"),
+ SMAP("indigo"),
+ SMAP("ivory"),
+ SMAP("khaki"),
+ SMAP("lavender"),
+ SMAP("lavenderblush"),
+ SMAP("lawngreen"),
+ SMAP("lemonchiffon"),
+ SMAP("lightblue"),
+ SMAP("lightcoral"),
+ SMAP("lightcyan"),
+ SMAP("lightgoldenrodyellow"),
+ SMAP("lightgray"),
+ SMAP("lightgreen"),
+ SMAP("lightgrey"),
+ SMAP("lightpink"),
+ SMAP("lightsalmon"),
+ SMAP("lightseagreen"),
+ SMAP("lightskyblue"),
+ SMAP("lightslateblue"),
+ SMAP("lightslategray"),
+ SMAP("lightslategrey"),
+ SMAP("lightsteelblue"),
+ SMAP("lightyellow"),
+ SMAP("lime"),
+ SMAP("limegreen"),
+ SMAP("linen"),
+ SMAP("magenta"),
+ SMAP("maroon"),
+ SMAP("mediumaquamarine"),
+ SMAP("mediumblue"),
+ SMAP("mediumorchid"),
+ SMAP("mediumpurple"),
+ SMAP("mediumseagreen"),
+ SMAP("mediumslateblue"),
+ SMAP("mediumspringgreen"),
+ SMAP("mediumturquoise"),
+ SMAP("mediumvioletred"),
+ SMAP("midnightblue"),
+ SMAP("mintcream"),
+ SMAP("mistyrose"),
+ SMAP("moccasin"),
+ SMAP("navajowhite"),
+ SMAP("navy"),
+ SMAP("oldlace"),
+ SMAP("olive"),
+ SMAP("olivedrab"),
+ SMAP("orange"),
+ SMAP("orangered"),
+ SMAP("orchid"),
+ SMAP("palegoldenrod"),
+ SMAP("palegreen"),
+ SMAP("paleturquoise"),
+ SMAP("palevioletred"),
+ SMAP("papayawhip"),
+ SMAP("peachpuff"),
+ SMAP("peru"),
+ SMAP("pink"),
+ SMAP("plum"),
+ SMAP("powderblue"),
+ SMAP("purple"),
+ SMAP("red"),
+ SMAP("rosybrown"),
+ SMAP("royalblue"),
+ SMAP("saddlebrown"),
+ SMAP("salmon"),
+ SMAP("sandybrown"),
+ SMAP("seagreen"),
+ SMAP("seashell"),
+ SMAP("sienna"),
+ SMAP("silver"),
+ SMAP("skyblue"),
+ SMAP("slateblue"),
+ SMAP("slategray"),
+ SMAP("slategrey"),
+ SMAP("snow"),
+ SMAP("springgreen"),
+ SMAP("steelblue"),
+ SMAP("tan"),
+ SMAP("teal"),
+ SMAP("thistle"),
+ SMAP("tomato"),
+ SMAP("turquoise"),
+ SMAP("violet"),
+ SMAP("violetred"),
+ SMAP("wheat"),
+ SMAP("white"),
+ SMAP("whitesmoke"),
+ SMAP("yellow"),
+ SMAP("yellowgreen")
};
diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h
index 24b681b..8491e72 100644
--- a/src/parse/propstrings.h
+++ b/src/parse/propstrings.h
@@ -51,27 +51,28 @@ enum {
COLUMN_COUNT, COLUMN_FILL, COLUMN_GAP, COLUMN_RULE, COLUMN_RULE_COLOR,
COLUMN_RULE_STYLE, COLUMN_RULE_WIDTH, COLUMN_SPAN, COLUMN_WIDTH,
CONTENT, COUNTER_INCREMENT, COUNTER_RESET, CUE, CUE_AFTER, CUE_BEFORE,
- CURSOR, DIRECTION, DISPLAY, ELEVATION, EMPTY_CELLS, FLEX, FLEX_BASIS,
- FLEX_DIRECTION, FLEX_FLOW, FLEX_GROW, FLEX_SHRINK, FLEX_WRAP,
- LIBCSS_FLOAT, FONT, FONT_FAMILY, FONT_SIZE, FONT_STYLE, FONT_VARIANT,
- FONT_WEIGHT, HEIGHT, JUSTIFY_CONTENT, LEFT, LETTER_SPACING, LINE_HEIGHT,
- LIST_STYLE, LIST_STYLE_IMAGE, LIST_STYLE_POSITION, LIST_STYLE_TYPE,
- MARGIN, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP,
- MAX_HEIGHT, MAX_WIDTH, MIN_HEIGHT, MIN_WIDTH, OPACITY, ORDER, ORPHANS,
- OUTLINE, OUTLINE_COLOR, OUTLINE_STYLE, OUTLINE_WIDTH, OVERFLOW,
- OVERFLOW_X, OVERFLOW_Y, PADDING, PADDING_BOTTOM, PADDING_LEFT,
- PADDING_RIGHT, PADDING_TOP, PAGE_BREAK_AFTER, PAGE_BREAK_BEFORE,
- PAGE_BREAK_INSIDE, PAUSE, PAUSE_AFTER, PAUSE_BEFORE, PITCH_RANGE, PITCH,
- PLAY_DURING, POSITION, QUOTES, RICHNESS, RIGHT, SPEAK_HEADER,
- SPEAK_NUMERAL, SPEAK_PUNCTUATION, SPEAK, SPEECH_RATE, STRESS,
- TABLE_LAYOUT, TEXT_ALIGN, TEXT_DECORATION, TEXT_INDENT, TEXT_TRANSFORM,
- TOP, UNICODE_BIDI, VERTICAL_ALIGN, VISIBILITY, VOICE_FAMILY, VOLUME,
- WHITE_SPACE, WIDOWS, WIDTH, WORD_SPACING, WRITING_MODE, Z_INDEX,
+ CURSOR, DIRECTION, DISPLAY, ELEVATION, EMPTY_CELLS, FILL_OPACITY, FLEX,
+ FLEX_BASIS, FLEX_DIRECTION, FLEX_FLOW, FLEX_GROW, FLEX_SHRINK,
+ FLEX_WRAP, LIBCSS_FLOAT, FONT, FONT_FAMILY, FONT_SIZE, FONT_STYLE,
+ FONT_VARIANT, FONT_WEIGHT, HEIGHT, JUSTIFY_CONTENT, LEFT,
+ LETTER_SPACING, LINE_HEIGHT, LIST_STYLE, LIST_STYLE_IMAGE,
+ LIST_STYLE_POSITION, LIST_STYLE_TYPE, MARGIN, MARGIN_BOTTOM,
+ MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MAX_HEIGHT, MAX_WIDTH,
+ MIN_HEIGHT, MIN_WIDTH, OPACITY, ORDER, ORPHANS, OUTLINE, OUTLINE_COLOR,
+ OUTLINE_STYLE, OUTLINE_WIDTH, OVERFLOW, OVERFLOW_X, OVERFLOW_Y, PADDING,
+ PADDING_BOTTOM, PADDING_LEFT, PADDING_RIGHT, PADDING_TOP,
+ PAGE_BREAK_AFTER, PAGE_BREAK_BEFORE, PAGE_BREAK_INSIDE, PAUSE,
+ PAUSE_AFTER, PAUSE_BEFORE, PITCH_RANGE, PITCH, PLAY_DURING, POSITION,
+ QUOTES, RICHNESS, RIGHT, SPEAK_HEADER, SPEAK_NUMERAL, SPEAK_PUNCTUATION,
+ SPEAK, SPEECH_RATE, STRESS, STROKE_OPACITY, TABLE_LAYOUT, TEXT_ALIGN,
+ TEXT_DECORATION, TEXT_INDENT, TEXT_TRANSFORM, TOP, UNICODE_BIDI,
+ VERTICAL_ALIGN, VISIBILITY, VOICE_FAMILY, VOLUME, WHITE_SPACE, WIDOWS,
+ WIDTH, WORD_SPACING, WRITING_MODE, Z_INDEX,
LAST_PROP = Z_INDEX,
/* Other keywords */
- INHERIT, IMPORTANT, NONE, BOTH, FIXED, SCROLL, TRANSPARENT,
+ INHERIT, UNSET, IMPORTANT, NONE, BOTH, FIXED, SCROLL, TRANSPARENT,
NO_REPEAT, REPEAT_X, REPEAT_Y, REPEAT, HIDDEN, DOTTED, DASHED,
SOLID, LIBCSS_DOUBLE, GROOVE, RIDGE, INSET, OUTSET, THIN, MEDIUM, THICK,
COLLAPSE, SEPARATE, AUTO, LTR, RTL, INLINE, BLOCK, LIST_ITEM, RUN_IN,
@@ -83,6 +84,13 @@ enum {
LIGHTER, INSIDE, OUTSIDE, DISC, CIRCLE, SQUARE, DECIMAL,
DECIMAL_LEADING_ZERO, LOWER_ROMAN, UPPER_ROMAN, LOWER_GREEK,
LOWER_LATIN, UPPER_LATIN, ARMENIAN, GEORGIAN, LOWER_ALPHA, UPPER_ALPHA,
+ BINARY, OCTAL, LOWER_HEXADECIMAL, UPPER_HEXADECIMAL, ARABIC_INDIC,
+ LOWER_ARMENIAN, UPPER_ARMENIAN, BENGALI, CAMBODIAN, KHMER, CJK_DECIMAL,
+ DEVANAGARI, GUJARATI, GURMUKHI, HEBREW, KANNADA, LAO, MALAYALAM,
+ MONGOLIAN, MYANMAR, ORIYA, PERSIAN, TAMIL, TELUGU, THAI, TIBETAN,
+ CJK_EARTHLY_BRANCH, CJK_HEAVENLY_STEM, HIAGANA, HIAGANA_IROHA,
+ KATAKANA, KATAKANA_IROHA, JAPANESE_INFORMAL, JAPANESE_FORMAL,
+ KOREAN_HANGUL_FORMAL, KOREAN_HANJA_INFORMAL, KOREAN_HANJA_FORMAL,
INVERT, VISIBLE, ALWAYS, AVOID, X_LOW, LOW, HIGH, X_HIGH, LIBCSS_STATIC,
RELATIVE, ABSOLUTE, ONCE, DIGITS, CONTINUOUS, CODE, SPELL_OUT, X_SLOW,
SLOW, FAST, X_FAST, FASTER, SLOWER, CENTER, JUSTIFY, CAPITALIZE,
@@ -96,12 +104,13 @@ 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, CURRENTCOLOR, ODD, EVEN, SRC, LOCAL, INITIAL,
+ LIBCSS_RIGHT, CURRENTCOLOR, ODD, EVEN, SRC, LOCAL, INITIAL, REVERT,
FORMAT, WOFF, TRUETYPE, OPENTYPE, EMBEDDED_OPENTYPE, SVG, COLUMN,
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,
+ GRID, INLINE_GRID, STICKY,
/* Named colours */
FIRST_COLOUR,
diff --git a/src/select/Makefile b/src/select/Makefile
index 025ad39..e237d46 100644
--- a/src/select/Makefile
+++ b/src/select/Makefile
@@ -1,7 +1,8 @@
# Sources
+.PHONY: select_generator
select_generator:
python3 src/select/select_generator.py
-DIR_SOURCES := arena.c computed.c dispatch.c hash.c select.c font_face.c
+DIR_SOURCES := arena.c computed.c dispatch.c hash.c select.c strings.c font_face.c format_list_style.c unit.c
include $(NSBUILD)/Makefile.subdir
diff --git a/src/select/autogenerated_computed.h b/src/select/autogenerated_computed.h
index 4d21fad..40005c1 100644
--- a/src/select/autogenerated_computed.h
+++ b/src/select/autogenerated_computed.h
@@ -52,6 +52,7 @@ struct css_computed_style_i {
* direction 2
* display 5
* empty_cells 2
+ * fill_opacity 1 4
* flex_basis 2 + 5 4
* flex_direction 3
* flex_grow 1 4
@@ -69,7 +70,7 @@ struct css_computed_style_i {
* line_height 2 + 5 4
* list_style_image 1 sizeof(ptr)
* list_style_position 2
- * list_style_type 4
+ * list_style_type 6
* margin_bottom 2 + 5 4
* margin_left 2 + 5 4
* margin_right 2 + 5 4
@@ -95,6 +96,7 @@ struct css_computed_style_i {
* page_break_inside 2
* position 3
* right 2 + 5 4
+ * stroke_opacity 1 4
* table_layout 2
* text_align 4
* text_decoration 5
@@ -140,66 +142,67 @@ struct css_computed_style_i {
* quotes 1 sizeof(ptr)
*
* --- --- ---
- * 460 bits 228 + 8sizeof(ptr) bytes
+ * 464 bits 236 + 8sizeof(ptr) bytes
* ===================
- * 286 + 8sizeof(ptr) bytes
+ * 294 + 8sizeof(ptr) bytes
*
* Bit allocations:
*
- * 0 ccccccccoooooooobbbbbbbbrrrrrrrr
- * column_rule_width; outline_width; border_left_width; border_bottom_width
+ * 0 bbbbbbbboooooooorrrrrrrrdddddddd
+ * border_top_width; border_right_width; border_left_width; border_bottom_width
*
- * 1 vvvvvvvvvbbbbbbbboooooooolllllll
- * vertical_align; border_top_width; border_right_width; letter_spacing
+ * 1 fffffffffooooooooccccccccwwwwwww
+ * font_size; outline_width; column_rule_width; word_spacing
*
- * 2 ccccccccccccccccccccccccccpppppp
- * clip; padding_top
+ * 2 cccccccccccccccccccccccccctttttt
+ * clip; text_indent
*
- * 3 mmmmmmmaaaaaaarrrrrrrttttttddddd
- * max_width; margin_bottom; margin_left; text_indent; display
+ * 3 cccccccooooooobbbbbbbppppppttttt
+ * column_width; column_gap; bottom; padding_top; text_decoration
*
- * 4 wwwwwwwfffffffcccccccllllllloooo
- * word_spacing; flex_basis; column_gap; left; font_weight
+ * 4 wwwwwwwtttttttrrrrrrrmmmmmmmeeee
+ * width; top; right; min_width; text_align
*
- * 5 wwwwwwwhhhhhhhlllllllcccccccoooo
- * width; height; line_height; column_width; outline_style
+ * 5 mmmmmmmaaaaaaaxxxxxxxrrrrrrroooo
+ * min_height; max_width; max_height; margin_top; outline_style
*
- * 6 tttttttmmmmmmmiiiiiiiaaaaaaabbbb
- * top; max_height; min_width; margin_right; border_top_style
+ * 6 mmmmmmmaaaaaaarrrrrrrlllllllffff
+ * margin_right; margin_left; margin_bottom; line_height; font_weight
*
- * 7 rrrrrrrbbbbbbbmmmmmmmaaaaaaacccc
- * right; bottom; min_height; margin_top; column_rule_style
+ * 7 llllllleeeeeeehhhhhhhfffffffcccc
+ * letter_spacing; left; height; flex_basis; column_rule_style
*
- * 8 ppppppaaaaaaddddddtttttcccccbbbb
- * padding_left; padding_right; padding_bottom; text_decoration; cursor;
- * border_right_style
+ * 8 ppppppaaaaaaddddddlllllliiiiiwww
+ * padding_right; padding_left; padding_bottom; list_style_type; display;
+ * white_space
*
- * 9 aaafffpppllliiiooovvvttteeeggguu
- * align_items; font_family; page_break_before; align_self; align_content;
- * overflow_x; overflow_y; text_transform; flex_direction; page_break_after;
- * unicode_bidi
+ * 9 cccccbbbbrrrreeeeooooddddllllttt
+ * cursor; break_inside; break_before; break_after; border_top_style;
+ * border_right_style; border_left_style; text_transform
*
- * 10 jjjpppcccwwwbbddeeffooaallggkkrr
- * justify_content; position; clear; white_space; box_sizing; direction;
- * empty_cells; flex_wrap; column_rule_color; background_attachment;
- * column_span; page_break_inside; background_color; border_left_color
+ * 10 bbbaaallliiizzwwvvuuttppoossffnn
+ * background_repeat; align_self; align_items; align_content; z_index;
+ * writing_mode; visibility; unicode_bidi; table_layout; page_break_inside;
+ * outline_color; list_style_position; font_variant; font_style
*
- * 11 ffbbooccnnllwwrrvvuummddaattzzee
- * font_style; border_bottom_color; border_top_color; caption_side;
- * font_variant; column_count; writing_mode; border_collapse; visibility;
- * outline_color; column_fill; border_right_color; float; table_layout;
- * z_index; content
+ * 11 fflleeddccoouummnnaabbrriittppBB
+ * float; flex_wrap; empty_cells; direction; content; column_span;
+ * column_rule_color; column_fill; column_count; caption_side; box_sizing;
+ * border_top_color; border_right_color; border_left_color; border_collapse;
+ * border_bottom_color
*
- * 12 bbbbbbbbbbbaaaaaaaaaaafffffffffc
- * border_spacing; background_position; font_size; color
+ * 12 bbbbbbbbbbbaaaaaaaaaaavvvvvvvvvw
+ * border_spacing; background_position; vertical_align; widows
*
- * 13 bbbbrrrrllllttttooooddddeeeeaaai
- * break_after; break_before; list_style_type; text_align; border_left_style;
- * border_bottom_style; break_inside; background_repeat; list_style_image
+ * 13 bbbbpppaaagggooovvvjjjffflllcccs
+ * border_bottom_style; position; page_break_before; page_break_after;
+ * overflow_y; overflow_x; justify_content; font_family; flex_direction; clear;
+ * stroke_opacity
*
- * 14 llcbqopwfrue....................
- * list_style_position; counter_increment; background_image; quotes; order;
- * opacity; widows; flex_grow; orphans; counter_reset; flex_shrink
+ * 14 bbaaqorplfeicuCk................
+ * background_color; background_attachment; quotes; orphans; order; opacity;
+ * list_style_image; flex_shrink; flex_grow; fill_opacity; counter_reset;
+ * counter_increment; color; background_image
*/
uint32_t bits[15];
@@ -228,6 +231,7 @@ struct css_computed_style_i {
css_color column_rule_color;
css_fixed column_rule_width;
css_fixed column_width;
+ css_fixed fill_opacity;
css_fixed flex_basis;
css_fixed flex_grow;
css_fixed flex_shrink;
@@ -255,6 +259,7 @@ struct css_computed_style_i {
css_fixed padding_right;
css_fixed padding_top;
css_fixed right;
+ css_fixed stroke_opacity;
css_fixed text_indent;
css_fixed top;
css_fixed vertical_align;
@@ -262,7 +267,6 @@ struct css_computed_style_i {
css_fixed width;
css_fixed word_spacing;
int32_t z_index;
-
};
struct css_computed_style {
diff --git a/src/select/autogenerated_propget.h b/src/select/autogenerated_propget.h
index f1b6092..d1f7ffb 100644
--- a/src/select/autogenerated_propget.h
+++ b/src/select/autogenerated_propget.h
@@ -6,9 +6,18 @@
*/
-#define ALIGN_CONTENT_INDEX 9
-#define ALIGN_CONTENT_SHIFT 17
-#define ALIGN_CONTENT_MASK 0xe0000
+#define ALIGN_CONTENT_INDEX 10
+#define ALIGN_CONTENT_SHIFT 20
+#define ALIGN_CONTENT_MASK 0x700000
+static inline uint8_t get_align_content_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[ALIGN_CONTENT_INDEX];
+ bits &= ALIGN_CONTENT_MASK;
+ bits >>= ALIGN_CONTENT_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_align_content(const css_computed_style *style)
{
uint32_t bits = style->i.bits[ALIGN_CONTENT_INDEX];
@@ -23,9 +32,18 @@ static inline uint8_t get_align_content(const css_computed_style *style)
#undef ALIGN_CONTENT_SHIFT
#undef ALIGN_CONTENT_MASK
-#define ALIGN_ITEMS_INDEX 9
-#define ALIGN_ITEMS_SHIFT 29
-#define ALIGN_ITEMS_MASK 0xe0000000
+#define ALIGN_ITEMS_INDEX 10
+#define ALIGN_ITEMS_SHIFT 23
+#define ALIGN_ITEMS_MASK 0x3800000
+static inline uint8_t get_align_items_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[ALIGN_ITEMS_INDEX];
+ bits &= ALIGN_ITEMS_MASK;
+ bits >>= ALIGN_ITEMS_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_align_items(const css_computed_style *style)
{
uint32_t bits = style->i.bits[ALIGN_ITEMS_INDEX];
@@ -40,9 +58,18 @@ static inline uint8_t get_align_items(const css_computed_style *style)
#undef ALIGN_ITEMS_SHIFT
#undef ALIGN_ITEMS_MASK
-#define ALIGN_SELF_INDEX 9
-#define ALIGN_SELF_SHIFT 20
-#define ALIGN_SELF_MASK 0x700000
+#define ALIGN_SELF_INDEX 10
+#define ALIGN_SELF_SHIFT 26
+#define ALIGN_SELF_MASK 0x1c000000
+static inline uint8_t get_align_self_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[ALIGN_SELF_INDEX];
+ bits &= ALIGN_SELF_MASK;
+ bits >>= ALIGN_SELF_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_align_self(const css_computed_style *style)
{
uint32_t bits = style->i.bits[ALIGN_SELF_INDEX];
@@ -57,9 +84,19 @@ static inline uint8_t get_align_self(const css_computed_style *style)
#undef ALIGN_SELF_SHIFT
#undef ALIGN_SELF_MASK
-#define BACKGROUND_ATTACHMENT_INDEX 10
-#define BACKGROUND_ATTACHMENT_SHIFT 8
-#define BACKGROUND_ATTACHMENT_MASK 0x300
+#define BACKGROUND_ATTACHMENT_INDEX 14
+#define BACKGROUND_ATTACHMENT_SHIFT 28
+#define BACKGROUND_ATTACHMENT_MASK 0x30000000
+static inline uint8_t get_background_attachment_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BACKGROUND_ATTACHMENT_INDEX];
+ bits &= BACKGROUND_ATTACHMENT_MASK;
+ bits >>= BACKGROUND_ATTACHMENT_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_background_attachment(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BACKGROUND_ATTACHMENT_INDEX];
@@ -74,9 +111,18 @@ static inline uint8_t get_background_attachment(const css_computed_style *style)
#undef BACKGROUND_ATTACHMENT_SHIFT
#undef BACKGROUND_ATTACHMENT_MASK
-#define BACKGROUND_COLOR_INDEX 10
-#define BACKGROUND_COLOR_SHIFT 2
-#define BACKGROUND_COLOR_MASK 0xc
+#define BACKGROUND_COLOR_INDEX 14
+#define BACKGROUND_COLOR_SHIFT 30
+#define BACKGROUND_COLOR_MASK 0xc0000000
+static inline uint8_t get_background_color_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BACKGROUND_COLOR_INDEX];
+ bits &= BACKGROUND_COLOR_MASK;
+ bits >>= BACKGROUND_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_background_color(const css_computed_style *style,
css_color *color)
{
@@ -94,8 +140,17 @@ static inline uint8_t get_background_color(const css_computed_style *style,
#undef BACKGROUND_COLOR_MASK
#define BACKGROUND_IMAGE_INDEX 14
-#define BACKGROUND_IMAGE_SHIFT 28
-#define BACKGROUND_IMAGE_MASK 0x10000000
+#define BACKGROUND_IMAGE_SHIFT 16
+#define BACKGROUND_IMAGE_MASK 0x10000
+static inline uint8_t get_background_image_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BACKGROUND_IMAGE_INDEX];
+ bits &= BACKGROUND_IMAGE_MASK;
+ bits >>= BACKGROUND_IMAGE_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_background_image(const css_computed_style *style,
lwc_string **string)
{
@@ -115,6 +170,16 @@ static inline uint8_t get_background_image(const css_computed_style *style,
#define BACKGROUND_POSITION_INDEX 12
#define BACKGROUND_POSITION_SHIFT 10
#define BACKGROUND_POSITION_MASK 0x1ffc00
+static inline uint8_t get_background_position_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BACKGROUND_POSITION_INDEX];
+ bits &= BACKGROUND_POSITION_MASK;
+ bits >>= BACKGROUND_POSITION_SHIFT;
+
+ /* 11bits: aaaaabbbbbt : unit_a | unit_b | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_background_position(const css_computed_style *style,
css_fixed *length_a, css_unit *unit_a, css_fixed *length_b,
css_unit *unit_b)
@@ -137,9 +202,19 @@ static inline uint8_t get_background_position(const css_computed_style *style,
#undef BACKGROUND_POSITION_SHIFT
#undef BACKGROUND_POSITION_MASK
-#define BACKGROUND_REPEAT_INDEX 13
-#define BACKGROUND_REPEAT_SHIFT 1
-#define BACKGROUND_REPEAT_MASK 0xe
+#define BACKGROUND_REPEAT_INDEX 10
+#define BACKGROUND_REPEAT_SHIFT 29
+#define BACKGROUND_REPEAT_MASK 0xe0000000
+static inline uint8_t get_background_repeat_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BACKGROUND_REPEAT_INDEX];
+ bits &= BACKGROUND_REPEAT_MASK;
+ bits >>= BACKGROUND_REPEAT_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_background_repeat(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BACKGROUND_REPEAT_INDEX];
@@ -155,8 +230,18 @@ static inline uint8_t get_background_repeat(const css_computed_style *style)
#undef BACKGROUND_REPEAT_MASK
#define BORDER_BOTTOM_COLOR_INDEX 11
-#define BORDER_BOTTOM_COLOR_SHIFT 28
-#define BORDER_BOTTOM_COLOR_MASK 0x30000000
+#define BORDER_BOTTOM_COLOR_SHIFT 0
+#define BORDER_BOTTOM_COLOR_MASK 0x3
+static inline uint8_t get_border_bottom_color_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_BOTTOM_COLOR_INDEX];
+ bits &= BORDER_BOTTOM_COLOR_MASK;
+ bits >>= BORDER_BOTTOM_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_border_bottom_color(const css_computed_style *style,
css_color *color)
{
@@ -174,8 +259,18 @@ static inline uint8_t get_border_bottom_color(const css_computed_style *style,
#undef BORDER_BOTTOM_COLOR_MASK
#define BORDER_BOTTOM_STYLE_INDEX 13
-#define BORDER_BOTTOM_STYLE_SHIFT 8
-#define BORDER_BOTTOM_STYLE_MASK 0xf00
+#define BORDER_BOTTOM_STYLE_SHIFT 28
+#define BORDER_BOTTOM_STYLE_MASK 0xf0000000
+static inline uint8_t get_border_bottom_style_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_BOTTOM_STYLE_INDEX];
+ bits &= BORDER_BOTTOM_STYLE_MASK;
+ bits >>= BORDER_BOTTOM_STYLE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_border_bottom_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BORDER_BOTTOM_STYLE_INDEX];
@@ -193,6 +288,16 @@ static inline uint8_t get_border_bottom_style(const css_computed_style *style)
#define BORDER_BOTTOM_WIDTH_INDEX 0
#define BORDER_BOTTOM_WIDTH_SHIFT 0
#define BORDER_BOTTOM_WIDTH_MASK 0xff
+static inline uint8_t get_border_bottom_width_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_BOTTOM_WIDTH_INDEX];
+ bits &= BORDER_BOTTOM_WIDTH_MASK;
+ bits >>= BORDER_BOTTOM_WIDTH_SHIFT;
+
+ /* 8bits: uuuuuttt : unit | type */
+ return (bits & 0x7);
+}
static inline uint8_t get_border_bottom_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -213,8 +318,17 @@ static inline uint8_t get_border_bottom_width(const css_computed_style *style,
#undef BORDER_BOTTOM_WIDTH_MASK
#define BORDER_COLLAPSE_INDEX 11
-#define BORDER_COLLAPSE_SHIFT 16
-#define BORDER_COLLAPSE_MASK 0x30000
+#define BORDER_COLLAPSE_SHIFT 2
+#define BORDER_COLLAPSE_MASK 0xc
+static inline uint8_t get_border_collapse_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BORDER_COLLAPSE_INDEX];
+ bits &= BORDER_COLLAPSE_MASK;
+ bits >>= BORDER_COLLAPSE_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_border_collapse(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BORDER_COLLAPSE_INDEX];
@@ -229,9 +343,19 @@ static inline uint8_t get_border_collapse(const css_computed_style *style)
#undef BORDER_COLLAPSE_SHIFT
#undef BORDER_COLLAPSE_MASK
-#define BORDER_LEFT_COLOR_INDEX 10
-#define BORDER_LEFT_COLOR_SHIFT 0
-#define BORDER_LEFT_COLOR_MASK 0x3
+#define BORDER_LEFT_COLOR_INDEX 11
+#define BORDER_LEFT_COLOR_SHIFT 4
+#define BORDER_LEFT_COLOR_MASK 0x30
+static inline uint8_t get_border_left_color_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_LEFT_COLOR_INDEX];
+ bits &= BORDER_LEFT_COLOR_MASK;
+ bits >>= BORDER_LEFT_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_border_left_color(const css_computed_style *style,
css_color *color)
{
@@ -248,9 +372,19 @@ static inline uint8_t get_border_left_color(const css_computed_style *style,
#undef BORDER_LEFT_COLOR_SHIFT
#undef BORDER_LEFT_COLOR_MASK
-#define BORDER_LEFT_STYLE_INDEX 13
-#define BORDER_LEFT_STYLE_SHIFT 12
-#define BORDER_LEFT_STYLE_MASK 0xf000
+#define BORDER_LEFT_STYLE_INDEX 9
+#define BORDER_LEFT_STYLE_SHIFT 3
+#define BORDER_LEFT_STYLE_MASK 0x78
+static inline uint8_t get_border_left_style_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_LEFT_STYLE_INDEX];
+ bits &= BORDER_LEFT_STYLE_MASK;
+ bits >>= BORDER_LEFT_STYLE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_border_left_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BORDER_LEFT_STYLE_INDEX];
@@ -268,6 +402,16 @@ static inline uint8_t get_border_left_style(const css_computed_style *style)
#define BORDER_LEFT_WIDTH_INDEX 0
#define BORDER_LEFT_WIDTH_SHIFT 8
#define BORDER_LEFT_WIDTH_MASK 0xff00
+static inline uint8_t get_border_left_width_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_LEFT_WIDTH_INDEX];
+ bits &= BORDER_LEFT_WIDTH_MASK;
+ bits >>= BORDER_LEFT_WIDTH_SHIFT;
+
+ /* 8bits: uuuuuttt : unit | type */
+ return (bits & 0x7);
+}
static inline uint8_t get_border_left_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -288,8 +432,18 @@ static inline uint8_t get_border_left_width(const css_computed_style *style,
#undef BORDER_LEFT_WIDTH_MASK
#define BORDER_RIGHT_COLOR_INDEX 11
-#define BORDER_RIGHT_COLOR_SHIFT 8
-#define BORDER_RIGHT_COLOR_MASK 0x300
+#define BORDER_RIGHT_COLOR_SHIFT 6
+#define BORDER_RIGHT_COLOR_MASK 0xc0
+static inline uint8_t get_border_right_color_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_RIGHT_COLOR_INDEX];
+ bits &= BORDER_RIGHT_COLOR_MASK;
+ bits >>= BORDER_RIGHT_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_border_right_color(const css_computed_style *style,
css_color *color)
{
@@ -306,9 +460,19 @@ static inline uint8_t get_border_right_color(const css_computed_style *style,
#undef BORDER_RIGHT_COLOR_SHIFT
#undef BORDER_RIGHT_COLOR_MASK
-#define BORDER_RIGHT_STYLE_INDEX 8
-#define BORDER_RIGHT_STYLE_SHIFT 0
-#define BORDER_RIGHT_STYLE_MASK 0xf
+#define BORDER_RIGHT_STYLE_INDEX 9
+#define BORDER_RIGHT_STYLE_SHIFT 7
+#define BORDER_RIGHT_STYLE_MASK 0x780
+static inline uint8_t get_border_right_style_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_RIGHT_STYLE_INDEX];
+ bits &= BORDER_RIGHT_STYLE_MASK;
+ bits >>= BORDER_RIGHT_STYLE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_border_right_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BORDER_RIGHT_STYLE_INDEX];
@@ -323,9 +487,19 @@ static inline uint8_t get_border_right_style(const css_computed_style *style)
#undef BORDER_RIGHT_STYLE_SHIFT
#undef BORDER_RIGHT_STYLE_MASK
-#define BORDER_RIGHT_WIDTH_INDEX 1
-#define BORDER_RIGHT_WIDTH_SHIFT 7
-#define BORDER_RIGHT_WIDTH_MASK 0x7f80
+#define BORDER_RIGHT_WIDTH_INDEX 0
+#define BORDER_RIGHT_WIDTH_SHIFT 16
+#define BORDER_RIGHT_WIDTH_MASK 0xff0000
+static inline uint8_t get_border_right_width_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[BORDER_RIGHT_WIDTH_INDEX];
+ bits &= BORDER_RIGHT_WIDTH_MASK;
+ bits >>= BORDER_RIGHT_WIDTH_SHIFT;
+
+ /* 8bits: uuuuuttt : unit | type */
+ return (bits & 0x7);
+}
static inline uint8_t get_border_right_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -348,6 +522,15 @@ static inline uint8_t get_border_right_width(const css_computed_style *style,
#define BORDER_SPACING_INDEX 12
#define BORDER_SPACING_SHIFT 21
#define BORDER_SPACING_MASK 0xffe00000
+static inline uint8_t get_border_spacing_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BORDER_SPACING_INDEX];
+ bits &= BORDER_SPACING_MASK;
+ bits >>= BORDER_SPACING_SHIFT;
+
+ /* 11bits: aaaaabbbbbt : unit_a | unit_b | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_border_spacing(const css_computed_style *style,
css_fixed *length_a, css_unit *unit_a, css_fixed *length_b,
css_unit *unit_b)
@@ -371,8 +554,17 @@ static inline uint8_t get_border_spacing(const css_computed_style *style,
#undef BORDER_SPACING_MASK
#define BORDER_TOP_COLOR_INDEX 11
-#define BORDER_TOP_COLOR_SHIFT 26
-#define BORDER_TOP_COLOR_MASK 0xc000000
+#define BORDER_TOP_COLOR_SHIFT 8
+#define BORDER_TOP_COLOR_MASK 0x300
+static inline uint8_t get_border_top_color_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BORDER_TOP_COLOR_INDEX];
+ bits &= BORDER_TOP_COLOR_MASK;
+ bits >>= BORDER_TOP_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_border_top_color(const css_computed_style *style,
css_color *color)
{
@@ -389,9 +581,18 @@ static inline uint8_t get_border_top_color(const css_computed_style *style,
#undef BORDER_TOP_COLOR_SHIFT
#undef BORDER_TOP_COLOR_MASK
-#define BORDER_TOP_STYLE_INDEX 6
-#define BORDER_TOP_STYLE_SHIFT 0
-#define BORDER_TOP_STYLE_MASK 0xf
+#define BORDER_TOP_STYLE_INDEX 9
+#define BORDER_TOP_STYLE_SHIFT 11
+#define BORDER_TOP_STYLE_MASK 0x7800
+static inline uint8_t get_border_top_style_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BORDER_TOP_STYLE_INDEX];
+ bits &= BORDER_TOP_STYLE_MASK;
+ bits >>= BORDER_TOP_STYLE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_border_top_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BORDER_TOP_STYLE_INDEX];
@@ -406,9 +607,18 @@ static inline uint8_t get_border_top_style(const css_computed_style *style)
#undef BORDER_TOP_STYLE_SHIFT
#undef BORDER_TOP_STYLE_MASK
-#define BORDER_TOP_WIDTH_INDEX 1
-#define BORDER_TOP_WIDTH_SHIFT 15
-#define BORDER_TOP_WIDTH_MASK 0x7f8000
+#define BORDER_TOP_WIDTH_INDEX 0
+#define BORDER_TOP_WIDTH_SHIFT 24
+#define BORDER_TOP_WIDTH_MASK 0xff000000
+static inline uint8_t get_border_top_width_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BORDER_TOP_WIDTH_INDEX];
+ bits &= BORDER_TOP_WIDTH_MASK;
+ bits >>= BORDER_TOP_WIDTH_SHIFT;
+
+ /* 8bits: uuuuuttt : unit | type */
+ return (bits & 0x7);
+}
static inline uint8_t get_border_top_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -428,42 +638,49 @@ static inline uint8_t get_border_top_width(const css_computed_style *style,
#undef BORDER_TOP_WIDTH_SHIFT
#undef BORDER_TOP_WIDTH_MASK
-#define BOTTOM_INDEX 7
-#define BOTTOM_SHIFT 18
-#define BOTTOM_MASK 0x1fc0000
-static inline uint8_t get_bottom(
- const css_computed_style *style,
- css_fixed *length, css_unit *unit)
+#define BOTTOM_INDEX 3
+#define BOTTOM_SHIFT 11
+#define BOTTOM_MASK 0x3f800
+static inline uint8_t get_bottom_bits(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BOTTOM_INDEX];
bits &= BOTTOM_MASK;
bits >>= BOTTOM_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- if ((bits & 0x3) == CSS_BOTTOM_SET) {
- *length = style->i.bottom;
- *unit = bits >> 2;
- }
-
+
+ /* 7bits: uuuuutt : unit | type */
return (bits & 0x3);
}
-static inline uint8_t get_bottom_bits(
- const css_computed_style *style)
+static inline uint8_t get_bottom(const css_computed_style *style, css_fixed
+ *length, css_unit *unit)
{
uint32_t bits = style->i.bits[BOTTOM_INDEX];
bits &= BOTTOM_MASK;
bits >>= BOTTOM_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- return bits;
+
+ /* 7bits: uuuuutt : unit | type */
+ if ((bits & 0x3) == CSS_BOTTOM_SET) {
+ *length = style->i.bottom;
+ *unit = bits >> 2;
+ }
+
+ return (bits & 0x3);
}
#undef BOTTOM_INDEX
#undef BOTTOM_SHIFT
#undef BOTTOM_MASK
-#define BOX_SIZING_INDEX 10
-#define BOX_SIZING_SHIFT 18
-#define BOX_SIZING_MASK 0xc0000
+#define BOX_SIZING_INDEX 11
+#define BOX_SIZING_SHIFT 10
+#define BOX_SIZING_MASK 0xc00
+static inline uint8_t get_box_sizing_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BOX_SIZING_INDEX];
+ bits &= BOX_SIZING_MASK;
+ bits >>= BOX_SIZING_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_box_sizing(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BOX_SIZING_INDEX];
@@ -478,9 +695,18 @@ static inline uint8_t get_box_sizing(const css_computed_style *style)
#undef BOX_SIZING_SHIFT
#undef BOX_SIZING_MASK
-#define BREAK_AFTER_INDEX 13
-#define BREAK_AFTER_SHIFT 28
-#define BREAK_AFTER_MASK 0xf0000000
+#define BREAK_AFTER_INDEX 9
+#define BREAK_AFTER_SHIFT 15
+#define BREAK_AFTER_MASK 0x78000
+static inline uint8_t get_break_after_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BREAK_AFTER_INDEX];
+ bits &= BREAK_AFTER_MASK;
+ bits >>= BREAK_AFTER_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_break_after(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BREAK_AFTER_INDEX];
@@ -495,9 +721,18 @@ static inline uint8_t get_break_after(const css_computed_style *style)
#undef BREAK_AFTER_SHIFT
#undef BREAK_AFTER_MASK
-#define BREAK_BEFORE_INDEX 13
-#define BREAK_BEFORE_SHIFT 24
-#define BREAK_BEFORE_MASK 0xf000000
+#define BREAK_BEFORE_INDEX 9
+#define BREAK_BEFORE_SHIFT 19
+#define BREAK_BEFORE_MASK 0x780000
+static inline uint8_t get_break_before_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BREAK_BEFORE_INDEX];
+ bits &= BREAK_BEFORE_MASK;
+ bits >>= BREAK_BEFORE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_break_before(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BREAK_BEFORE_INDEX];
@@ -512,9 +747,18 @@ static inline uint8_t get_break_before(const css_computed_style *style)
#undef BREAK_BEFORE_SHIFT
#undef BREAK_BEFORE_MASK
-#define BREAK_INSIDE_INDEX 13
-#define BREAK_INSIDE_SHIFT 4
-#define BREAK_INSIDE_MASK 0xf0
+#define BREAK_INSIDE_INDEX 9
+#define BREAK_INSIDE_SHIFT 23
+#define BREAK_INSIDE_MASK 0x7800000
+static inline uint8_t get_break_inside_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[BREAK_INSIDE_INDEX];
+ bits &= BREAK_INSIDE_MASK;
+ bits >>= BREAK_INSIDE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_break_inside(const css_computed_style *style)
{
uint32_t bits = style->i.bits[BREAK_INSIDE_INDEX];
@@ -530,8 +774,17 @@ static inline uint8_t get_break_inside(const css_computed_style *style)
#undef BREAK_INSIDE_MASK
#define CAPTION_SIDE_INDEX 11
-#define CAPTION_SIDE_SHIFT 24
-#define CAPTION_SIDE_MASK 0x3000000
+#define CAPTION_SIDE_SHIFT 12
+#define CAPTION_SIDE_MASK 0x3000
+static inline uint8_t get_caption_side_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[CAPTION_SIDE_INDEX];
+ bits &= CAPTION_SIDE_MASK;
+ bits >>= CAPTION_SIDE_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_caption_side(const css_computed_style *style)
{
uint32_t bits = style->i.bits[CAPTION_SIDE_INDEX];
@@ -546,9 +799,18 @@ static inline uint8_t get_caption_side(const css_computed_style *style)
#undef CAPTION_SIDE_SHIFT
#undef CAPTION_SIDE_MASK
-#define CLEAR_INDEX 10
-#define CLEAR_SHIFT 23
-#define CLEAR_MASK 0x3800000
+#define CLEAR_INDEX 13
+#define CLEAR_SHIFT 1
+#define CLEAR_MASK 0xe
+static inline uint8_t get_clear_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[CLEAR_INDEX];
+ bits &= CLEAR_MASK;
+ bits >>= CLEAR_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_clear(const css_computed_style *style)
{
uint32_t bits = style->i.bits[CLEAR_INDEX];
@@ -566,6 +828,16 @@ static inline uint8_t get_clear(const css_computed_style *style)
#define CLIP_INDEX 2
#define CLIP_SHIFT 6
#define CLIP_MASK 0xffffffc0
+static inline uint8_t get_clip_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[CLIP_INDEX];
+ bits &= CLIP_MASK;
+ bits >>= CLIP_SHIFT;
+
+ /* 26bits: aaaaabbbbbcccccdddddtttttt : unit_a | unit_b | unit_c |
+ unit_d | type */
+ return (bits & 0x3f);
+}
static inline uint8_t get_clip(
const css_computed_style *style,
css_computed_clip_rect *rect)
@@ -605,9 +877,18 @@ static inline uint8_t get_clip(
#undef CLIP_SHIFT
#undef CLIP_MASK
-#define COLOR_INDEX 12
-#define COLOR_SHIFT 0
-#define COLOR_MASK 0x1
+#define COLOR_INDEX 14
+#define COLOR_SHIFT 17
+#define COLOR_MASK 0x20000
+static inline uint8_t get_color_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COLOR_INDEX];
+ bits &= COLOR_MASK;
+ bits >>= COLOR_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_color(const css_computed_style *style, css_color
*color)
{
@@ -625,8 +906,17 @@ static inline uint8_t get_color(const css_computed_style *style, css_color
#undef COLOR_MASK
#define COLUMN_COUNT_INDEX 11
-#define COLUMN_COUNT_SHIFT 20
-#define COLUMN_COUNT_MASK 0x300000
+#define COLUMN_COUNT_SHIFT 14
+#define COLUMN_COUNT_MASK 0xc000
+static inline uint8_t get_column_count_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_COUNT_INDEX];
+ bits &= COLUMN_COUNT_MASK;
+ bits >>= COLUMN_COUNT_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_column_count(const css_computed_style *style, int32_t
*integer)
{
@@ -644,8 +934,17 @@ static inline uint8_t get_column_count(const css_computed_style *style, int32_t
#undef COLUMN_COUNT_MASK
#define COLUMN_FILL_INDEX 11
-#define COLUMN_FILL_SHIFT 10
-#define COLUMN_FILL_MASK 0xc00
+#define COLUMN_FILL_SHIFT 16
+#define COLUMN_FILL_MASK 0x30000
+static inline uint8_t get_column_fill_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_FILL_INDEX];
+ bits &= COLUMN_FILL_MASK;
+ bits >>= COLUMN_FILL_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_column_fill(const css_computed_style *style)
{
uint32_t bits = style->i.bits[COLUMN_FILL_INDEX];
@@ -660,9 +959,18 @@ static inline uint8_t get_column_fill(const css_computed_style *style)
#undef COLUMN_FILL_SHIFT
#undef COLUMN_FILL_MASK
-#define COLUMN_GAP_INDEX 4
-#define COLUMN_GAP_SHIFT 11
-#define COLUMN_GAP_MASK 0x3f800
+#define COLUMN_GAP_INDEX 3
+#define COLUMN_GAP_SHIFT 18
+#define COLUMN_GAP_MASK 0x1fc0000
+static inline uint8_t get_column_gap_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_GAP_INDEX];
+ bits &= COLUMN_GAP_MASK;
+ bits >>= COLUMN_GAP_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_column_gap(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -682,9 +990,19 @@ static inline uint8_t get_column_gap(const css_computed_style *style, css_fixed
#undef COLUMN_GAP_SHIFT
#undef COLUMN_GAP_MASK
-#define COLUMN_RULE_COLOR_INDEX 10
-#define COLUMN_RULE_COLOR_SHIFT 10
-#define COLUMN_RULE_COLOR_MASK 0xc00
+#define COLUMN_RULE_COLOR_INDEX 11
+#define COLUMN_RULE_COLOR_SHIFT 18
+#define COLUMN_RULE_COLOR_MASK 0xc0000
+static inline uint8_t get_column_rule_color_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_RULE_COLOR_INDEX];
+ bits &= COLUMN_RULE_COLOR_MASK;
+ bits >>= COLUMN_RULE_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_column_rule_color(const css_computed_style *style,
css_color *color)
{
@@ -704,6 +1022,16 @@ static inline uint8_t get_column_rule_color(const css_computed_style *style,
#define COLUMN_RULE_STYLE_INDEX 7
#define COLUMN_RULE_STYLE_SHIFT 0
#define COLUMN_RULE_STYLE_MASK 0xf
+static inline uint8_t get_column_rule_style_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_RULE_STYLE_INDEX];
+ bits &= COLUMN_RULE_STYLE_MASK;
+ bits >>= COLUMN_RULE_STYLE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_column_rule_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[COLUMN_RULE_STYLE_INDEX];
@@ -718,9 +1046,19 @@ static inline uint8_t get_column_rule_style(const css_computed_style *style)
#undef COLUMN_RULE_STYLE_SHIFT
#undef COLUMN_RULE_STYLE_MASK
-#define COLUMN_RULE_WIDTH_INDEX 0
-#define COLUMN_RULE_WIDTH_SHIFT 24
-#define COLUMN_RULE_WIDTH_MASK 0xff000000
+#define COLUMN_RULE_WIDTH_INDEX 1
+#define COLUMN_RULE_WIDTH_SHIFT 7
+#define COLUMN_RULE_WIDTH_MASK 0x7f80
+static inline uint8_t get_column_rule_width_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_RULE_WIDTH_INDEX];
+ bits &= COLUMN_RULE_WIDTH_MASK;
+ bits >>= COLUMN_RULE_WIDTH_SHIFT;
+
+ /* 8bits: uuuuuttt : unit | type */
+ return (bits & 0x7);
+}
static inline uint8_t get_column_rule_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -740,9 +1078,18 @@ static inline uint8_t get_column_rule_width(const css_computed_style *style,
#undef COLUMN_RULE_WIDTH_SHIFT
#undef COLUMN_RULE_WIDTH_MASK
-#define COLUMN_SPAN_INDEX 10
-#define COLUMN_SPAN_SHIFT 6
-#define COLUMN_SPAN_MASK 0xc0
+#define COLUMN_SPAN_INDEX 11
+#define COLUMN_SPAN_SHIFT 20
+#define COLUMN_SPAN_MASK 0x300000
+static inline uint8_t get_column_span_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_SPAN_INDEX];
+ bits &= COLUMN_SPAN_MASK;
+ bits >>= COLUMN_SPAN_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_column_span(const css_computed_style *style)
{
uint32_t bits = style->i.bits[COLUMN_SPAN_INDEX];
@@ -757,9 +1104,18 @@ static inline uint8_t get_column_span(const css_computed_style *style)
#undef COLUMN_SPAN_SHIFT
#undef COLUMN_SPAN_MASK
-#define COLUMN_WIDTH_INDEX 5
-#define COLUMN_WIDTH_SHIFT 4
-#define COLUMN_WIDTH_MASK 0x7f0
+#define COLUMN_WIDTH_INDEX 3
+#define COLUMN_WIDTH_SHIFT 25
+#define COLUMN_WIDTH_MASK 0xfe000000
+static inline uint8_t get_column_width_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COLUMN_WIDTH_INDEX];
+ bits &= COLUMN_WIDTH_MASK;
+ bits >>= COLUMN_WIDTH_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_column_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -780,8 +1136,17 @@ static inline uint8_t get_column_width(const css_computed_style *style,
#undef COLUMN_WIDTH_MASK
#define CONTENT_INDEX 11
-#define CONTENT_SHIFT 0
-#define CONTENT_MASK 0x3
+#define CONTENT_SHIFT 22
+#define CONTENT_MASK 0xc00000
+static inline uint8_t get_content_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[CONTENT_INDEX];
+ bits &= CONTENT_MASK;
+ bits >>= CONTENT_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_content(const css_computed_style *style, const
css_computed_content_item **content_item)
{
@@ -801,8 +1166,18 @@ static inline uint8_t get_content(const css_computed_style *style, const
#undef CONTENT_MASK
#define COUNTER_INCREMENT_INDEX 14
-#define COUNTER_INCREMENT_SHIFT 29
-#define COUNTER_INCREMENT_MASK 0x20000000
+#define COUNTER_INCREMENT_SHIFT 18
+#define COUNTER_INCREMENT_MASK 0x40000
+static inline uint8_t get_counter_increment_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[COUNTER_INCREMENT_INDEX];
+ bits &= COUNTER_INCREMENT_MASK;
+ bits >>= COUNTER_INCREMENT_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_counter_increment(const css_computed_style *style,
const css_computed_counter **counter_arr)
{
@@ -820,8 +1195,17 @@ static inline uint8_t get_counter_increment(const css_computed_style *style,
#undef COUNTER_INCREMENT_MASK
#define COUNTER_RESET_INDEX 14
-#define COUNTER_RESET_SHIFT 21
-#define COUNTER_RESET_MASK 0x200000
+#define COUNTER_RESET_SHIFT 19
+#define COUNTER_RESET_MASK 0x80000
+static inline uint8_t get_counter_reset_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[COUNTER_RESET_INDEX];
+ bits &= COUNTER_RESET_MASK;
+ bits >>= COUNTER_RESET_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_counter_reset(const css_computed_style *style, const
css_computed_counter **counter_arr)
{
@@ -838,9 +1222,18 @@ static inline uint8_t get_counter_reset(const css_computed_style *style, const
#undef COUNTER_RESET_SHIFT
#undef COUNTER_RESET_MASK
-#define CURSOR_INDEX 8
-#define CURSOR_SHIFT 4
-#define CURSOR_MASK 0x1f0
+#define CURSOR_INDEX 9
+#define CURSOR_SHIFT 27
+#define CURSOR_MASK 0xf8000000
+static inline uint8_t get_cursor_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[CURSOR_INDEX];
+ bits &= CURSOR_MASK;
+ bits >>= CURSOR_SHIFT;
+
+ /* 5bits: ttttt : type */
+ return (bits & 0x1f);
+}
static inline uint8_t get_cursor(const css_computed_style *style, lwc_string
***string_arr)
{
@@ -857,9 +1250,18 @@ static inline uint8_t get_cursor(const css_computed_style *style, lwc_string
#undef CURSOR_SHIFT
#undef CURSOR_MASK
-#define DIRECTION_INDEX 10
-#define DIRECTION_SHIFT 16
-#define DIRECTION_MASK 0x30000
+#define DIRECTION_INDEX 11
+#define DIRECTION_SHIFT 24
+#define DIRECTION_MASK 0x3000000
+static inline uint8_t get_direction_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[DIRECTION_INDEX];
+ bits &= DIRECTION_MASK;
+ bits >>= DIRECTION_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_direction(const css_computed_style *style)
{
uint32_t bits = style->i.bits[DIRECTION_INDEX];
@@ -874,9 +1276,18 @@ static inline uint8_t get_direction(const css_computed_style *style)
#undef DIRECTION_SHIFT
#undef DIRECTION_MASK
-#define DISPLAY_INDEX 3
-#define DISPLAY_SHIFT 0
-#define DISPLAY_MASK 0x1f
+#define DISPLAY_INDEX 8
+#define DISPLAY_SHIFT 3
+#define DISPLAY_MASK 0xf8
+static inline uint8_t get_display_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[DISPLAY_INDEX];
+ bits &= DISPLAY_MASK;
+ bits >>= DISPLAY_SHIFT;
+
+ /* 5bits: ttttt : type */
+ return (bits & 0x1f);
+}
static inline uint8_t get_display(const css_computed_style *style)
{
uint32_t bits = style->i.bits[DISPLAY_INDEX];
@@ -891,9 +1302,18 @@ static inline uint8_t get_display(const css_computed_style *style)
#undef DISPLAY_SHIFT
#undef DISPLAY_MASK
-#define EMPTY_CELLS_INDEX 10
-#define EMPTY_CELLS_SHIFT 14
-#define EMPTY_CELLS_MASK 0xc000
+#define EMPTY_CELLS_INDEX 11
+#define EMPTY_CELLS_SHIFT 26
+#define EMPTY_CELLS_MASK 0xc000000
+static inline uint8_t get_empty_cells_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[EMPTY_CELLS_INDEX];
+ bits &= EMPTY_CELLS_MASK;
+ bits >>= EMPTY_CELLS_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_empty_cells(const css_computed_style *style)
{
uint32_t bits = style->i.bits[EMPTY_CELLS_INDEX];
@@ -908,9 +1328,48 @@ static inline uint8_t get_empty_cells(const css_computed_style *style)
#undef EMPTY_CELLS_SHIFT
#undef EMPTY_CELLS_MASK
-#define FLEX_BASIS_INDEX 4
-#define FLEX_BASIS_SHIFT 18
-#define FLEX_BASIS_MASK 0x1fc0000
+#define FILL_OPACITY_INDEX 14
+#define FILL_OPACITY_SHIFT 20
+#define FILL_OPACITY_MASK 0x100000
+static inline uint8_t get_fill_opacity_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FILL_OPACITY_INDEX];
+ bits &= FILL_OPACITY_MASK;
+ bits >>= FILL_OPACITY_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
+static inline uint8_t get_fill_opacity(const css_computed_style *style,
+ css_fixed *fixed)
+{
+ uint32_t bits = style->i.bits[FILL_OPACITY_INDEX];
+ bits &= FILL_OPACITY_MASK;
+ bits >>= FILL_OPACITY_SHIFT;
+
+ /* 1bit: t : type */
+ if ((bits & 0x1) == CSS_FILL_OPACITY_SET) {
+ *fixed = style->i.fill_opacity;
+ }
+
+ return (bits & 0x1);
+}
+#undef FILL_OPACITY_INDEX
+#undef FILL_OPACITY_SHIFT
+#undef FILL_OPACITY_MASK
+
+#define FLEX_BASIS_INDEX 7
+#define FLEX_BASIS_SHIFT 4
+#define FLEX_BASIS_MASK 0x7f0
+static inline uint8_t get_flex_basis_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FLEX_BASIS_INDEX];
+ bits &= FLEX_BASIS_MASK;
+ bits >>= FLEX_BASIS_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_flex_basis(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -930,9 +1389,18 @@ static inline uint8_t get_flex_basis(const css_computed_style *style, css_fixed
#undef FLEX_BASIS_SHIFT
#undef FLEX_BASIS_MASK
-#define FLEX_DIRECTION_INDEX 9
-#define FLEX_DIRECTION_SHIFT 5
-#define FLEX_DIRECTION_MASK 0xe0
+#define FLEX_DIRECTION_INDEX 13
+#define FLEX_DIRECTION_SHIFT 4
+#define FLEX_DIRECTION_MASK 0x70
+static inline uint8_t get_flex_direction_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FLEX_DIRECTION_INDEX];
+ bits &= FLEX_DIRECTION_MASK;
+ bits >>= FLEX_DIRECTION_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_flex_direction(const css_computed_style *style)
{
uint32_t bits = style->i.bits[FLEX_DIRECTION_INDEX];
@@ -948,8 +1416,17 @@ static inline uint8_t get_flex_direction(const css_computed_style *style)
#undef FLEX_DIRECTION_MASK
#define FLEX_GROW_INDEX 14
-#define FLEX_GROW_SHIFT 23
-#define FLEX_GROW_MASK 0x800000
+#define FLEX_GROW_SHIFT 21
+#define FLEX_GROW_MASK 0x200000
+static inline uint8_t get_flex_grow_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FLEX_GROW_INDEX];
+ bits &= FLEX_GROW_MASK;
+ bits >>= FLEX_GROW_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_flex_grow(const css_computed_style *style, css_fixed
*fixed)
{
@@ -969,8 +1446,17 @@ static inline uint8_t get_flex_grow(const css_computed_style *style, css_fixed
#undef FLEX_GROW_MASK
#define FLEX_SHRINK_INDEX 14
-#define FLEX_SHRINK_SHIFT 20
-#define FLEX_SHRINK_MASK 0x100000
+#define FLEX_SHRINK_SHIFT 22
+#define FLEX_SHRINK_MASK 0x400000
+static inline uint8_t get_flex_shrink_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FLEX_SHRINK_INDEX];
+ bits &= FLEX_SHRINK_MASK;
+ bits >>= FLEX_SHRINK_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_flex_shrink(const css_computed_style *style,
css_fixed *fixed)
{
@@ -989,9 +1475,18 @@ static inline uint8_t get_flex_shrink(const css_computed_style *style,
#undef FLEX_SHRINK_SHIFT
#undef FLEX_SHRINK_MASK
-#define FLEX_WRAP_INDEX 10
-#define FLEX_WRAP_SHIFT 12
-#define FLEX_WRAP_MASK 0x3000
+#define FLEX_WRAP_INDEX 11
+#define FLEX_WRAP_SHIFT 28
+#define FLEX_WRAP_MASK 0x30000000
+static inline uint8_t get_flex_wrap_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FLEX_WRAP_INDEX];
+ bits &= FLEX_WRAP_MASK;
+ bits >>= FLEX_WRAP_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_flex_wrap(const css_computed_style *style)
{
uint32_t bits = style->i.bits[FLEX_WRAP_INDEX];
@@ -1007,8 +1502,17 @@ static inline uint8_t get_flex_wrap(const css_computed_style *style)
#undef FLEX_WRAP_MASK
#define FLOAT_INDEX 11
-#define FLOAT_SHIFT 6
-#define FLOAT_MASK 0xc0
+#define FLOAT_SHIFT 30
+#define FLOAT_MASK 0xc0000000
+static inline uint8_t get_float_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FLOAT_INDEX];
+ bits &= FLOAT_MASK;
+ bits >>= FLOAT_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_float(const css_computed_style *style)
{
uint32_t bits = style->i.bits[FLOAT_INDEX];
@@ -1023,9 +1527,18 @@ static inline uint8_t get_float(const css_computed_style *style)
#undef FLOAT_SHIFT
#undef FLOAT_MASK
-#define FONT_FAMILY_INDEX 9
-#define FONT_FAMILY_SHIFT 26
-#define FONT_FAMILY_MASK 0x1c000000
+#define FONT_FAMILY_INDEX 13
+#define FONT_FAMILY_SHIFT 7
+#define FONT_FAMILY_MASK 0x380
+static inline uint8_t get_font_family_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FONT_FAMILY_INDEX];
+ bits &= FONT_FAMILY_MASK;
+ bits >>= FONT_FAMILY_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_font_family(const css_computed_style *style,
lwc_string ***string_arr)
{
@@ -1042,9 +1555,18 @@ static inline uint8_t get_font_family(const css_computed_style *style,
#undef FONT_FAMILY_SHIFT
#undef FONT_FAMILY_MASK
-#define FONT_SIZE_INDEX 12
-#define FONT_SIZE_SHIFT 1
-#define FONT_SIZE_MASK 0x3fe
+#define FONT_SIZE_INDEX 1
+#define FONT_SIZE_SHIFT 23
+#define FONT_SIZE_MASK 0xff800000
+static inline uint8_t get_font_size_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FONT_SIZE_INDEX];
+ bits &= FONT_SIZE_MASK;
+ bits >>= FONT_SIZE_SHIFT;
+
+ /* 9bits: uuuuutttt : unit | type */
+ return (bits & 0xf);
+}
static inline uint8_t get_font_size(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1064,9 +1586,18 @@ static inline uint8_t get_font_size(const css_computed_style *style, css_fixed
#undef FONT_SIZE_SHIFT
#undef FONT_SIZE_MASK
-#define FONT_STYLE_INDEX 11
-#define FONT_STYLE_SHIFT 30
-#define FONT_STYLE_MASK 0xc0000000
+#define FONT_STYLE_INDEX 10
+#define FONT_STYLE_SHIFT 0
+#define FONT_STYLE_MASK 0x3
+static inline uint8_t get_font_style_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FONT_STYLE_INDEX];
+ bits &= FONT_STYLE_MASK;
+ bits >>= FONT_STYLE_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_font_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[FONT_STYLE_INDEX];
@@ -1081,9 +1612,18 @@ static inline uint8_t get_font_style(const css_computed_style *style)
#undef FONT_STYLE_SHIFT
#undef FONT_STYLE_MASK
-#define FONT_VARIANT_INDEX 11
-#define FONT_VARIANT_SHIFT 22
-#define FONT_VARIANT_MASK 0xc00000
+#define FONT_VARIANT_INDEX 10
+#define FONT_VARIANT_SHIFT 2
+#define FONT_VARIANT_MASK 0xc
+static inline uint8_t get_font_variant_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FONT_VARIANT_INDEX];
+ bits &= FONT_VARIANT_MASK;
+ bits >>= FONT_VARIANT_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_font_variant(const css_computed_style *style)
{
uint32_t bits = style->i.bits[FONT_VARIANT_INDEX];
@@ -1098,9 +1638,18 @@ static inline uint8_t get_font_variant(const css_computed_style *style)
#undef FONT_VARIANT_SHIFT
#undef FONT_VARIANT_MASK
-#define FONT_WEIGHT_INDEX 4
+#define FONT_WEIGHT_INDEX 6
#define FONT_WEIGHT_SHIFT 0
#define FONT_WEIGHT_MASK 0xf
+static inline uint8_t get_font_weight_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[FONT_WEIGHT_INDEX];
+ bits &= FONT_WEIGHT_MASK;
+ bits >>= FONT_WEIGHT_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_font_weight(const css_computed_style *style)
{
uint32_t bits = style->i.bits[FONT_WEIGHT_INDEX];
@@ -1115,9 +1664,18 @@ static inline uint8_t get_font_weight(const css_computed_style *style)
#undef FONT_WEIGHT_SHIFT
#undef FONT_WEIGHT_MASK
-#define HEIGHT_INDEX 5
-#define HEIGHT_SHIFT 18
-#define HEIGHT_MASK 0x1fc0000
+#define HEIGHT_INDEX 7
+#define HEIGHT_SHIFT 11
+#define HEIGHT_MASK 0x3f800
+static inline uint8_t get_height_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[HEIGHT_INDEX];
+ bits &= HEIGHT_MASK;
+ bits >>= HEIGHT_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_height(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1137,9 +1695,18 @@ static inline uint8_t get_height(const css_computed_style *style, css_fixed
#undef HEIGHT_SHIFT
#undef HEIGHT_MASK
-#define JUSTIFY_CONTENT_INDEX 10
-#define JUSTIFY_CONTENT_SHIFT 29
-#define JUSTIFY_CONTENT_MASK 0xe0000000
+#define JUSTIFY_CONTENT_INDEX 13
+#define JUSTIFY_CONTENT_SHIFT 10
+#define JUSTIFY_CONTENT_MASK 0x1c00
+static inline uint8_t get_justify_content_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[JUSTIFY_CONTENT_INDEX];
+ bits &= JUSTIFY_CONTENT_MASK;
+ bits >>= JUSTIFY_CONTENT_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_justify_content(const css_computed_style *style)
{
uint32_t bits = style->i.bits[JUSTIFY_CONTENT_INDEX];
@@ -1154,42 +1721,49 @@ static inline uint8_t get_justify_content(const css_computed_style *style)
#undef JUSTIFY_CONTENT_SHIFT
#undef JUSTIFY_CONTENT_MASK
-#define LEFT_INDEX 4
-#define LEFT_SHIFT 4
-#define LEFT_MASK 0x7f0
-static inline uint8_t get_left(
- const css_computed_style *style,
- css_fixed *length, css_unit *unit)
+#define LEFT_INDEX 7
+#define LEFT_SHIFT 18
+#define LEFT_MASK 0x1fc0000
+static inline uint8_t get_left_bits(const css_computed_style *style)
{
uint32_t bits = style->i.bits[LEFT_INDEX];
bits &= LEFT_MASK;
bits >>= LEFT_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- if ((bits & 0x3) == CSS_LEFT_SET) {
- *length = style->i.left;
- *unit = bits >> 2;
- }
-
+
+ /* 7bits: uuuuutt : unit | type */
return (bits & 0x3);
}
-static inline uint8_t get_left_bits(
- const css_computed_style *style)
+static inline uint8_t get_left(const css_computed_style *style, css_fixed
+ *length, css_unit *unit)
{
uint32_t bits = style->i.bits[LEFT_INDEX];
bits &= LEFT_MASK;
bits >>= LEFT_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- return bits;
+
+ /* 7bits: uuuuutt : unit | type */
+ if ((bits & 0x3) == CSS_LEFT_SET) {
+ *length = style->i.left;
+ *unit = bits >> 2;
+ }
+
+ return (bits & 0x3);
}
#undef LEFT_INDEX
#undef LEFT_SHIFT
#undef LEFT_MASK
-#define LETTER_SPACING_INDEX 1
-#define LETTER_SPACING_SHIFT 0
-#define LETTER_SPACING_MASK 0x7f
+#define LETTER_SPACING_INDEX 7
+#define LETTER_SPACING_SHIFT 25
+#define LETTER_SPACING_MASK 0xfe000000
+static inline uint8_t get_letter_spacing_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[LETTER_SPACING_INDEX];
+ bits &= LETTER_SPACING_MASK;
+ bits >>= LETTER_SPACING_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_letter_spacing(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1209,9 +1783,18 @@ static inline uint8_t get_letter_spacing(const css_computed_style *style,
#undef LETTER_SPACING_SHIFT
#undef LETTER_SPACING_MASK
-#define LINE_HEIGHT_INDEX 5
-#define LINE_HEIGHT_SHIFT 11
-#define LINE_HEIGHT_MASK 0x3f800
+#define LINE_HEIGHT_INDEX 6
+#define LINE_HEIGHT_SHIFT 4
+#define LINE_HEIGHT_MASK 0x7f0
+static inline uint8_t get_line_height_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[LINE_HEIGHT_INDEX];
+ bits &= LINE_HEIGHT_MASK;
+ bits >>= LINE_HEIGHT_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_line_height(
const css_computed_style *style,
css_fixed *length, css_unit *unit)
@@ -1236,9 +1819,18 @@ static inline uint8_t get_line_height(
#undef LINE_HEIGHT_SHIFT
#undef LINE_HEIGHT_MASK
-#define LIST_STYLE_IMAGE_INDEX 13
-#define LIST_STYLE_IMAGE_SHIFT 0
-#define LIST_STYLE_IMAGE_MASK 0x1
+#define LIST_STYLE_IMAGE_INDEX 14
+#define LIST_STYLE_IMAGE_SHIFT 23
+#define LIST_STYLE_IMAGE_MASK 0x800000
+static inline uint8_t get_list_style_image_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[LIST_STYLE_IMAGE_INDEX];
+ bits &= LIST_STYLE_IMAGE_MASK;
+ bits >>= LIST_STYLE_IMAGE_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_list_style_image(const css_computed_style *style,
lwc_string **string)
{
@@ -1255,9 +1847,19 @@ static inline uint8_t get_list_style_image(const css_computed_style *style,
#undef LIST_STYLE_IMAGE_SHIFT
#undef LIST_STYLE_IMAGE_MASK
-#define LIST_STYLE_POSITION_INDEX 14
-#define LIST_STYLE_POSITION_SHIFT 30
-#define LIST_STYLE_POSITION_MASK 0xc0000000
+#define LIST_STYLE_POSITION_INDEX 10
+#define LIST_STYLE_POSITION_SHIFT 4
+#define LIST_STYLE_POSITION_MASK 0x30
+static inline uint8_t get_list_style_position_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[LIST_STYLE_POSITION_INDEX];
+ bits &= LIST_STYLE_POSITION_MASK;
+ bits >>= LIST_STYLE_POSITION_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_list_style_position(const css_computed_style *style)
{
uint32_t bits = style->i.bits[LIST_STYLE_POSITION_INDEX];
@@ -1272,26 +1874,44 @@ static inline uint8_t get_list_style_position(const css_computed_style *style)
#undef LIST_STYLE_POSITION_SHIFT
#undef LIST_STYLE_POSITION_MASK
-#define LIST_STYLE_TYPE_INDEX 13
-#define LIST_STYLE_TYPE_SHIFT 20
-#define LIST_STYLE_TYPE_MASK 0xf00000
+#define LIST_STYLE_TYPE_INDEX 8
+#define LIST_STYLE_TYPE_SHIFT 8
+#define LIST_STYLE_TYPE_MASK 0x3f00
+static inline uint8_t get_list_style_type_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[LIST_STYLE_TYPE_INDEX];
+ bits &= LIST_STYLE_TYPE_MASK;
+ bits >>= LIST_STYLE_TYPE_SHIFT;
+
+ /* 6bits: tttttt : type */
+ return (bits & 0x3f);
+}
static inline uint8_t get_list_style_type(const css_computed_style *style)
{
uint32_t bits = style->i.bits[LIST_STYLE_TYPE_INDEX];
bits &= LIST_STYLE_TYPE_MASK;
bits >>= LIST_STYLE_TYPE_SHIFT;
- /* 4bits: tttt : type */
+ /* 6bits: tttttt : type */
- return (bits & 0xf);
+ return (bits & 0x3f);
}
#undef LIST_STYLE_TYPE_INDEX
#undef LIST_STYLE_TYPE_SHIFT
#undef LIST_STYLE_TYPE_MASK
-#define MARGIN_BOTTOM_INDEX 3
-#define MARGIN_BOTTOM_SHIFT 18
-#define MARGIN_BOTTOM_MASK 0x1fc0000
+#define MARGIN_BOTTOM_INDEX 6
+#define MARGIN_BOTTOM_SHIFT 11
+#define MARGIN_BOTTOM_MASK 0x3f800
+static inline uint8_t get_margin_bottom_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MARGIN_BOTTOM_INDEX];
+ bits &= MARGIN_BOTTOM_MASK;
+ bits >>= MARGIN_BOTTOM_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_margin_bottom(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1311,9 +1931,18 @@ static inline uint8_t get_margin_bottom(const css_computed_style *style,
#undef MARGIN_BOTTOM_SHIFT
#undef MARGIN_BOTTOM_MASK
-#define MARGIN_LEFT_INDEX 3
-#define MARGIN_LEFT_SHIFT 11
-#define MARGIN_LEFT_MASK 0x3f800
+#define MARGIN_LEFT_INDEX 6
+#define MARGIN_LEFT_SHIFT 18
+#define MARGIN_LEFT_MASK 0x1fc0000
+static inline uint8_t get_margin_left_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MARGIN_LEFT_INDEX];
+ bits &= MARGIN_LEFT_MASK;
+ bits >>= MARGIN_LEFT_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_margin_left(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1334,8 +1963,17 @@ static inline uint8_t get_margin_left(const css_computed_style *style,
#undef MARGIN_LEFT_MASK
#define MARGIN_RIGHT_INDEX 6
-#define MARGIN_RIGHT_SHIFT 4
-#define MARGIN_RIGHT_MASK 0x7f0
+#define MARGIN_RIGHT_SHIFT 25
+#define MARGIN_RIGHT_MASK 0xfe000000
+static inline uint8_t get_margin_right_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MARGIN_RIGHT_INDEX];
+ bits &= MARGIN_RIGHT_MASK;
+ bits >>= MARGIN_RIGHT_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_margin_right(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1355,9 +1993,18 @@ static inline uint8_t get_margin_right(const css_computed_style *style,
#undef MARGIN_RIGHT_SHIFT
#undef MARGIN_RIGHT_MASK
-#define MARGIN_TOP_INDEX 7
+#define MARGIN_TOP_INDEX 5
#define MARGIN_TOP_SHIFT 4
#define MARGIN_TOP_MASK 0x7f0
+static inline uint8_t get_margin_top_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MARGIN_TOP_INDEX];
+ bits &= MARGIN_TOP_MASK;
+ bits >>= MARGIN_TOP_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_margin_top(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1377,9 +2024,18 @@ static inline uint8_t get_margin_top(const css_computed_style *style, css_fixed
#undef MARGIN_TOP_SHIFT
#undef MARGIN_TOP_MASK
-#define MAX_HEIGHT_INDEX 6
-#define MAX_HEIGHT_SHIFT 18
-#define MAX_HEIGHT_MASK 0x1fc0000
+#define MAX_HEIGHT_INDEX 5
+#define MAX_HEIGHT_SHIFT 11
+#define MAX_HEIGHT_MASK 0x3f800
+static inline uint8_t get_max_height_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MAX_HEIGHT_INDEX];
+ bits &= MAX_HEIGHT_MASK;
+ bits >>= MAX_HEIGHT_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_max_height(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1399,9 +2055,18 @@ static inline uint8_t get_max_height(const css_computed_style *style, css_fixed
#undef MAX_HEIGHT_SHIFT
#undef MAX_HEIGHT_MASK
-#define MAX_WIDTH_INDEX 3
-#define MAX_WIDTH_SHIFT 25
-#define MAX_WIDTH_MASK 0xfe000000
+#define MAX_WIDTH_INDEX 5
+#define MAX_WIDTH_SHIFT 18
+#define MAX_WIDTH_MASK 0x1fc0000
+static inline uint8_t get_max_width_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MAX_WIDTH_INDEX];
+ bits &= MAX_WIDTH_MASK;
+ bits >>= MAX_WIDTH_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_max_width(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1421,9 +2086,18 @@ static inline uint8_t get_max_width(const css_computed_style *style, css_fixed
#undef MAX_WIDTH_SHIFT
#undef MAX_WIDTH_MASK
-#define MIN_HEIGHT_INDEX 7
-#define MIN_HEIGHT_SHIFT 11
-#define MIN_HEIGHT_MASK 0x3f800
+#define MIN_HEIGHT_INDEX 5
+#define MIN_HEIGHT_SHIFT 25
+#define MIN_HEIGHT_MASK 0xfe000000
+static inline uint8_t get_min_height_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MIN_HEIGHT_INDEX];
+ bits &= MIN_HEIGHT_MASK;
+ bits >>= MIN_HEIGHT_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_min_height(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1443,9 +2117,18 @@ static inline uint8_t get_min_height(const css_computed_style *style, css_fixed
#undef MIN_HEIGHT_SHIFT
#undef MIN_HEIGHT_MASK
-#define MIN_WIDTH_INDEX 6
-#define MIN_WIDTH_SHIFT 11
-#define MIN_WIDTH_MASK 0x3f800
+#define MIN_WIDTH_INDEX 4
+#define MIN_WIDTH_SHIFT 4
+#define MIN_WIDTH_MASK 0x7f0
+static inline uint8_t get_min_width_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[MIN_WIDTH_INDEX];
+ bits &= MIN_WIDTH_MASK;
+ bits >>= MIN_WIDTH_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_min_width(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -1466,8 +2149,17 @@ static inline uint8_t get_min_width(const css_computed_style *style, css_fixed
#undef MIN_WIDTH_MASK
#define OPACITY_INDEX 14
-#define OPACITY_SHIFT 25
-#define OPACITY_MASK 0x2000000
+#define OPACITY_SHIFT 24
+#define OPACITY_MASK 0x1000000
+static inline uint8_t get_opacity_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[OPACITY_INDEX];
+ bits &= OPACITY_MASK;
+ bits >>= OPACITY_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_opacity(const css_computed_style *style, css_fixed
*fixed)
{
@@ -1487,8 +2179,17 @@ static inline uint8_t get_opacity(const css_computed_style *style, css_fixed
#undef OPACITY_MASK
#define ORDER_INDEX 14
-#define ORDER_SHIFT 26
-#define ORDER_MASK 0x4000000
+#define ORDER_SHIFT 25
+#define ORDER_MASK 0x2000000
+static inline uint8_t get_order_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[ORDER_INDEX];
+ bits &= ORDER_MASK;
+ bits >>= ORDER_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_order(const css_computed_style *style, int32_t
*integer)
{
@@ -1508,8 +2209,17 @@ static inline uint8_t get_order(const css_computed_style *style, int32_t
#undef ORDER_MASK
#define ORPHANS_INDEX 14
-#define ORPHANS_SHIFT 22
-#define ORPHANS_MASK 0x400000
+#define ORPHANS_SHIFT 26
+#define ORPHANS_MASK 0x4000000
+static inline uint8_t get_orphans_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[ORPHANS_INDEX];
+ bits &= ORPHANS_MASK;
+ bits >>= ORPHANS_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_orphans(const css_computed_style *style, int32_t
*integer)
{
@@ -1526,9 +2236,18 @@ static inline uint8_t get_orphans(const css_computed_style *style, int32_t
#undef ORPHANS_SHIFT
#undef ORPHANS_MASK
-#define OUTLINE_COLOR_INDEX 11
-#define OUTLINE_COLOR_SHIFT 12
-#define OUTLINE_COLOR_MASK 0x3000
+#define OUTLINE_COLOR_INDEX 10
+#define OUTLINE_COLOR_SHIFT 6
+#define OUTLINE_COLOR_MASK 0xc0
+static inline uint8_t get_outline_color_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[OUTLINE_COLOR_INDEX];
+ bits &= OUTLINE_COLOR_MASK;
+ bits >>= OUTLINE_COLOR_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_outline_color(const css_computed_style *style,
css_color *color)
{
@@ -1550,6 +2269,15 @@ static inline uint8_t get_outline_color(const css_computed_style *style,
#define OUTLINE_STYLE_INDEX 5
#define OUTLINE_STYLE_SHIFT 0
#define OUTLINE_STYLE_MASK 0xf
+static inline uint8_t get_outline_style_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[OUTLINE_STYLE_INDEX];
+ bits &= OUTLINE_STYLE_MASK;
+ bits >>= OUTLINE_STYLE_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_outline_style(const css_computed_style *style)
{
uint32_t bits = style->i.bits[OUTLINE_STYLE_INDEX];
@@ -1564,9 +2292,18 @@ static inline uint8_t get_outline_style(const css_computed_style *style)
#undef OUTLINE_STYLE_SHIFT
#undef OUTLINE_STYLE_MASK
-#define OUTLINE_WIDTH_INDEX 0
-#define OUTLINE_WIDTH_SHIFT 16
-#define OUTLINE_WIDTH_MASK 0xff0000
+#define OUTLINE_WIDTH_INDEX 1
+#define OUTLINE_WIDTH_SHIFT 15
+#define OUTLINE_WIDTH_MASK 0x7f8000
+static inline uint8_t get_outline_width_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[OUTLINE_WIDTH_INDEX];
+ bits &= OUTLINE_WIDTH_MASK;
+ bits >>= OUTLINE_WIDTH_SHIFT;
+
+ /* 8bits: uuuuuttt : unit | type */
+ return (bits & 0x7);
+}
static inline uint8_t get_outline_width(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1586,9 +2323,18 @@ static inline uint8_t get_outline_width(const css_computed_style *style,
#undef OUTLINE_WIDTH_SHIFT
#undef OUTLINE_WIDTH_MASK
-#define OVERFLOW_X_INDEX 9
-#define OVERFLOW_X_SHIFT 14
-#define OVERFLOW_X_MASK 0x1c000
+#define OVERFLOW_X_INDEX 13
+#define OVERFLOW_X_SHIFT 13
+#define OVERFLOW_X_MASK 0xe000
+static inline uint8_t get_overflow_x_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[OVERFLOW_X_INDEX];
+ bits &= OVERFLOW_X_MASK;
+ bits >>= OVERFLOW_X_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_overflow_x(const css_computed_style *style)
{
uint32_t bits = style->i.bits[OVERFLOW_X_INDEX];
@@ -1603,9 +2349,18 @@ static inline uint8_t get_overflow_x(const css_computed_style *style)
#undef OVERFLOW_X_SHIFT
#undef OVERFLOW_X_MASK
-#define OVERFLOW_Y_INDEX 9
-#define OVERFLOW_Y_SHIFT 11
-#define OVERFLOW_Y_MASK 0x3800
+#define OVERFLOW_Y_INDEX 13
+#define OVERFLOW_Y_SHIFT 16
+#define OVERFLOW_Y_MASK 0x70000
+static inline uint8_t get_overflow_y_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[OVERFLOW_Y_INDEX];
+ bits &= OVERFLOW_Y_MASK;
+ bits >>= OVERFLOW_Y_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_overflow_y(const css_computed_style *style)
{
uint32_t bits = style->i.bits[OVERFLOW_Y_INDEX];
@@ -1623,6 +2378,15 @@ static inline uint8_t get_overflow_y(const css_computed_style *style)
#define PADDING_BOTTOM_INDEX 8
#define PADDING_BOTTOM_SHIFT 14
#define PADDING_BOTTOM_MASK 0xfc000
+static inline uint8_t get_padding_bottom_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[PADDING_BOTTOM_INDEX];
+ bits &= PADDING_BOTTOM_MASK;
+ bits >>= PADDING_BOTTOM_SHIFT;
+
+ /* 6bits: uuuuut : unit | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_padding_bottom(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1643,8 +2407,17 @@ static inline uint8_t get_padding_bottom(const css_computed_style *style,
#undef PADDING_BOTTOM_MASK
#define PADDING_LEFT_INDEX 8
-#define PADDING_LEFT_SHIFT 26
-#define PADDING_LEFT_MASK 0xfc000000
+#define PADDING_LEFT_SHIFT 20
+#define PADDING_LEFT_MASK 0x3f00000
+static inline uint8_t get_padding_left_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[PADDING_LEFT_INDEX];
+ bits &= PADDING_LEFT_MASK;
+ bits >>= PADDING_LEFT_SHIFT;
+
+ /* 6bits: uuuuut : unit | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_padding_left(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1665,8 +2438,17 @@ static inline uint8_t get_padding_left(const css_computed_style *style,
#undef PADDING_LEFT_MASK
#define PADDING_RIGHT_INDEX 8
-#define PADDING_RIGHT_SHIFT 20
-#define PADDING_RIGHT_MASK 0x3f00000
+#define PADDING_RIGHT_SHIFT 26
+#define PADDING_RIGHT_MASK 0xfc000000
+static inline uint8_t get_padding_right_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[PADDING_RIGHT_INDEX];
+ bits &= PADDING_RIGHT_MASK;
+ bits >>= PADDING_RIGHT_SHIFT;
+
+ /* 6bits: uuuuut : unit | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_padding_right(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1686,9 +2468,18 @@ static inline uint8_t get_padding_right(const css_computed_style *style,
#undef PADDING_RIGHT_SHIFT
#undef PADDING_RIGHT_MASK
-#define PADDING_TOP_INDEX 2
-#define PADDING_TOP_SHIFT 0
-#define PADDING_TOP_MASK 0x3f
+#define PADDING_TOP_INDEX 3
+#define PADDING_TOP_SHIFT 5
+#define PADDING_TOP_MASK 0x7e0
+static inline uint8_t get_padding_top_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[PADDING_TOP_INDEX];
+ bits &= PADDING_TOP_MASK;
+ bits >>= PADDING_TOP_SHIFT;
+
+ /* 6bits: uuuuut : unit | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_padding_top(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1708,9 +2499,18 @@ static inline uint8_t get_padding_top(const css_computed_style *style,
#undef PADDING_TOP_SHIFT
#undef PADDING_TOP_MASK
-#define PAGE_BREAK_AFTER_INDEX 9
-#define PAGE_BREAK_AFTER_SHIFT 2
-#define PAGE_BREAK_AFTER_MASK 0x1c
+#define PAGE_BREAK_AFTER_INDEX 13
+#define PAGE_BREAK_AFTER_SHIFT 19
+#define PAGE_BREAK_AFTER_MASK 0x380000
+static inline uint8_t get_page_break_after_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[PAGE_BREAK_AFTER_INDEX];
+ bits &= PAGE_BREAK_AFTER_MASK;
+ bits >>= PAGE_BREAK_AFTER_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_page_break_after(const css_computed_style *style)
{
uint32_t bits = style->i.bits[PAGE_BREAK_AFTER_INDEX];
@@ -1725,9 +2525,19 @@ static inline uint8_t get_page_break_after(const css_computed_style *style)
#undef PAGE_BREAK_AFTER_SHIFT
#undef PAGE_BREAK_AFTER_MASK
-#define PAGE_BREAK_BEFORE_INDEX 9
-#define PAGE_BREAK_BEFORE_SHIFT 23
-#define PAGE_BREAK_BEFORE_MASK 0x3800000
+#define PAGE_BREAK_BEFORE_INDEX 13
+#define PAGE_BREAK_BEFORE_SHIFT 22
+#define PAGE_BREAK_BEFORE_MASK 0x1c00000
+static inline uint8_t get_page_break_before_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[PAGE_BREAK_BEFORE_INDEX];
+ bits &= PAGE_BREAK_BEFORE_MASK;
+ bits >>= PAGE_BREAK_BEFORE_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_page_break_before(const css_computed_style *style)
{
uint32_t bits = style->i.bits[PAGE_BREAK_BEFORE_INDEX];
@@ -1743,8 +2553,18 @@ static inline uint8_t get_page_break_before(const css_computed_style *style)
#undef PAGE_BREAK_BEFORE_MASK
#define PAGE_BREAK_INSIDE_INDEX 10
-#define PAGE_BREAK_INSIDE_SHIFT 4
-#define PAGE_BREAK_INSIDE_MASK 0x30
+#define PAGE_BREAK_INSIDE_SHIFT 8
+#define PAGE_BREAK_INSIDE_MASK 0x300
+static inline uint8_t get_page_break_inside_bits(const css_computed_style
+ *style)
+{
+ uint32_t bits = style->i.bits[PAGE_BREAK_INSIDE_INDEX];
+ bits &= PAGE_BREAK_INSIDE_MASK;
+ bits >>= PAGE_BREAK_INSIDE_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_page_break_inside(const css_computed_style *style)
{
uint32_t bits = style->i.bits[PAGE_BREAK_INSIDE_INDEX];
@@ -1759,9 +2579,18 @@ static inline uint8_t get_page_break_inside(const css_computed_style *style)
#undef PAGE_BREAK_INSIDE_SHIFT
#undef PAGE_BREAK_INSIDE_MASK
-#define POSITION_INDEX 10
-#define POSITION_SHIFT 26
-#define POSITION_MASK 0x1c000000
+#define POSITION_INDEX 13
+#define POSITION_SHIFT 25
+#define POSITION_MASK 0xe000000
+static inline uint8_t get_position_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[POSITION_INDEX];
+ bits &= POSITION_MASK;
+ bits >>= POSITION_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_position(const css_computed_style *style)
{
uint32_t bits = style->i.bits[POSITION_INDEX];
@@ -1779,6 +2608,15 @@ static inline uint8_t get_position(const css_computed_style *style)
#define QUOTES_INDEX 14
#define QUOTES_SHIFT 27
#define QUOTES_MASK 0x8000000
+static inline uint8_t get_quotes_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[QUOTES_INDEX];
+ bits &= QUOTES_MASK;
+ bits >>= QUOTES_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_quotes(const css_computed_style *style, lwc_string
***string_arr)
{
@@ -1795,42 +2633,79 @@ static inline uint8_t get_quotes(const css_computed_style *style, lwc_string
#undef QUOTES_SHIFT
#undef QUOTES_MASK
-#define RIGHT_INDEX 7
-#define RIGHT_SHIFT 25
-#define RIGHT_MASK 0xfe000000
-static inline uint8_t get_right(
- const css_computed_style *style,
- css_fixed *length, css_unit *unit)
+#define RIGHT_INDEX 4
+#define RIGHT_SHIFT 11
+#define RIGHT_MASK 0x3f800
+static inline uint8_t get_right_bits(const css_computed_style *style)
{
uint32_t bits = style->i.bits[RIGHT_INDEX];
bits &= RIGHT_MASK;
bits >>= RIGHT_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- if ((bits & 0x3) == CSS_RIGHT_SET) {
- *length = style->i.right;
- *unit = bits >> 2;
- }
-
+
+ /* 7bits: uuuuutt : unit | type */
return (bits & 0x3);
}
-static inline uint8_t get_right_bits(
- const css_computed_style *style)
+static inline uint8_t get_right(const css_computed_style *style, css_fixed
+ *length, css_unit *unit)
{
uint32_t bits = style->i.bits[RIGHT_INDEX];
bits &= RIGHT_MASK;
bits >>= RIGHT_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- return bits;
+
+ /* 7bits: uuuuutt : unit | type */
+ if ((bits & 0x3) == CSS_RIGHT_SET) {
+ *length = style->i.right;
+ *unit = bits >> 2;
+ }
+
+ return (bits & 0x3);
}
#undef RIGHT_INDEX
#undef RIGHT_SHIFT
#undef RIGHT_MASK
-#define TABLE_LAYOUT_INDEX 11
-#define TABLE_LAYOUT_SHIFT 4
-#define TABLE_LAYOUT_MASK 0x30
+#define STROKE_OPACITY_INDEX 13
+#define STROKE_OPACITY_SHIFT 0
+#define STROKE_OPACITY_MASK 0x1
+static inline uint8_t get_stroke_opacity_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[STROKE_OPACITY_INDEX];
+ bits &= STROKE_OPACITY_MASK;
+ bits >>= STROKE_OPACITY_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
+static inline uint8_t get_stroke_opacity(const css_computed_style *style,
+ css_fixed *fixed)
+{
+ uint32_t bits = style->i.bits[STROKE_OPACITY_INDEX];
+ bits &= STROKE_OPACITY_MASK;
+ bits >>= STROKE_OPACITY_SHIFT;
+
+ /* 1bit: t : type */
+ if ((bits & 0x1) == CSS_STROKE_OPACITY_SET) {
+ *fixed = style->i.stroke_opacity;
+ }
+
+ return (bits & 0x1);
+}
+#undef STROKE_OPACITY_INDEX
+#undef STROKE_OPACITY_SHIFT
+#undef STROKE_OPACITY_MASK
+
+#define TABLE_LAYOUT_INDEX 10
+#define TABLE_LAYOUT_SHIFT 10
+#define TABLE_LAYOUT_MASK 0xc00
+static inline uint8_t get_table_layout_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[TABLE_LAYOUT_INDEX];
+ bits &= TABLE_LAYOUT_MASK;
+ bits >>= TABLE_LAYOUT_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_table_layout(const css_computed_style *style)
{
uint32_t bits = style->i.bits[TABLE_LAYOUT_INDEX];
@@ -1845,9 +2720,18 @@ static inline uint8_t get_table_layout(const css_computed_style *style)
#undef TABLE_LAYOUT_SHIFT
#undef TABLE_LAYOUT_MASK
-#define TEXT_ALIGN_INDEX 13
-#define TEXT_ALIGN_SHIFT 16
-#define TEXT_ALIGN_MASK 0xf0000
+#define TEXT_ALIGN_INDEX 4
+#define TEXT_ALIGN_SHIFT 0
+#define TEXT_ALIGN_MASK 0xf
+static inline uint8_t get_text_align_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[TEXT_ALIGN_INDEX];
+ bits &= TEXT_ALIGN_MASK;
+ bits >>= TEXT_ALIGN_SHIFT;
+
+ /* 4bits: tttt : type */
+ return (bits & 0xf);
+}
static inline uint8_t get_text_align(const css_computed_style *style)
{
uint32_t bits = style->i.bits[TEXT_ALIGN_INDEX];
@@ -1862,9 +2746,18 @@ static inline uint8_t get_text_align(const css_computed_style *style)
#undef TEXT_ALIGN_SHIFT
#undef TEXT_ALIGN_MASK
-#define TEXT_DECORATION_INDEX 8
-#define TEXT_DECORATION_SHIFT 9
-#define TEXT_DECORATION_MASK 0x3e00
+#define TEXT_DECORATION_INDEX 3
+#define TEXT_DECORATION_SHIFT 0
+#define TEXT_DECORATION_MASK 0x1f
+static inline uint8_t get_text_decoration_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[TEXT_DECORATION_INDEX];
+ bits &= TEXT_DECORATION_MASK;
+ bits >>= TEXT_DECORATION_SHIFT;
+
+ /* 5bits: ttttt : type */
+ return (bits & 0x1f);
+}
static inline uint8_t get_text_decoration(const css_computed_style *style)
{
uint32_t bits = style->i.bits[TEXT_DECORATION_INDEX];
@@ -1879,9 +2772,18 @@ static inline uint8_t get_text_decoration(const css_computed_style *style)
#undef TEXT_DECORATION_SHIFT
#undef TEXT_DECORATION_MASK
-#define TEXT_INDENT_INDEX 3
-#define TEXT_INDENT_SHIFT 5
-#define TEXT_INDENT_MASK 0x7e0
+#define TEXT_INDENT_INDEX 2
+#define TEXT_INDENT_SHIFT 0
+#define TEXT_INDENT_MASK 0x3f
+static inline uint8_t get_text_indent_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[TEXT_INDENT_INDEX];
+ bits &= TEXT_INDENT_MASK;
+ bits >>= TEXT_INDENT_SHIFT;
+
+ /* 6bits: uuuuut : unit | type */
+ return (bits & 0x1);
+}
static inline uint8_t get_text_indent(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1902,8 +2804,17 @@ static inline uint8_t get_text_indent(const css_computed_style *style,
#undef TEXT_INDENT_MASK
#define TEXT_TRANSFORM_INDEX 9
-#define TEXT_TRANSFORM_SHIFT 8
-#define TEXT_TRANSFORM_MASK 0x700
+#define TEXT_TRANSFORM_SHIFT 0
+#define TEXT_TRANSFORM_MASK 0x7
+static inline uint8_t get_text_transform_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[TEXT_TRANSFORM_INDEX];
+ bits &= TEXT_TRANSFORM_MASK;
+ bits >>= TEXT_TRANSFORM_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_text_transform(const css_computed_style *style)
{
uint32_t bits = style->i.bits[TEXT_TRANSFORM_INDEX];
@@ -1918,42 +2829,49 @@ static inline uint8_t get_text_transform(const css_computed_style *style)
#undef TEXT_TRANSFORM_SHIFT
#undef TEXT_TRANSFORM_MASK
-#define TOP_INDEX 6
-#define TOP_SHIFT 25
-#define TOP_MASK 0xfe000000
-static inline uint8_t get_top(
- const css_computed_style *style,
- css_fixed *length, css_unit *unit)
+#define TOP_INDEX 4
+#define TOP_SHIFT 18
+#define TOP_MASK 0x1fc0000
+static inline uint8_t get_top_bits(const css_computed_style *style)
{
uint32_t bits = style->i.bits[TOP_INDEX];
bits &= TOP_MASK;
bits >>= TOP_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- if ((bits & 0x3) == CSS_TOP_SET) {
- *length = style->i.top;
- *unit = bits >> 2;
- }
-
+
+ /* 7bits: uuuuutt : unit | type */
return (bits & 0x3);
}
-static inline uint8_t get_top_bits(
- const css_computed_style *style)
+static inline uint8_t get_top(const css_computed_style *style, css_fixed
+ *length, css_unit *unit)
{
uint32_t bits = style->i.bits[TOP_INDEX];
bits &= TOP_MASK;
bits >>= TOP_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- return bits;
+
+ /* 7bits: uuuuutt : unit | type */
+ if ((bits & 0x3) == CSS_TOP_SET) {
+ *length = style->i.top;
+ *unit = bits >> 2;
+ }
+
+ return (bits & 0x3);
}
#undef TOP_INDEX
#undef TOP_SHIFT
#undef TOP_MASK
-#define UNICODE_BIDI_INDEX 9
-#define UNICODE_BIDI_SHIFT 0
-#define UNICODE_BIDI_MASK 0x3
+#define UNICODE_BIDI_INDEX 10
+#define UNICODE_BIDI_SHIFT 12
+#define UNICODE_BIDI_MASK 0x3000
+static inline uint8_t get_unicode_bidi_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[UNICODE_BIDI_INDEX];
+ bits &= UNICODE_BIDI_MASK;
+ bits >>= UNICODE_BIDI_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_unicode_bidi(const css_computed_style *style)
{
uint32_t bits = style->i.bits[UNICODE_BIDI_INDEX];
@@ -1968,9 +2886,18 @@ static inline uint8_t get_unicode_bidi(const css_computed_style *style)
#undef UNICODE_BIDI_SHIFT
#undef UNICODE_BIDI_MASK
-#define VERTICAL_ALIGN_INDEX 1
-#define VERTICAL_ALIGN_SHIFT 23
-#define VERTICAL_ALIGN_MASK 0xff800000
+#define VERTICAL_ALIGN_INDEX 12
+#define VERTICAL_ALIGN_SHIFT 1
+#define VERTICAL_ALIGN_MASK 0x3fe
+static inline uint8_t get_vertical_align_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[VERTICAL_ALIGN_INDEX];
+ bits &= VERTICAL_ALIGN_MASK;
+ bits >>= VERTICAL_ALIGN_SHIFT;
+
+ /* 9bits: uuuuutttt : unit | type */
+ return (bits & 0xf);
+}
static inline uint8_t get_vertical_align(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -1990,9 +2917,18 @@ static inline uint8_t get_vertical_align(const css_computed_style *style,
#undef VERTICAL_ALIGN_SHIFT
#undef VERTICAL_ALIGN_MASK
-#define VISIBILITY_INDEX 11
+#define VISIBILITY_INDEX 10
#define VISIBILITY_SHIFT 14
#define VISIBILITY_MASK 0xc000
+static inline uint8_t get_visibility_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[VISIBILITY_INDEX];
+ bits &= VISIBILITY_MASK;
+ bits >>= VISIBILITY_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_visibility(const css_computed_style *style)
{
uint32_t bits = style->i.bits[VISIBILITY_INDEX];
@@ -2007,9 +2943,18 @@ static inline uint8_t get_visibility(const css_computed_style *style)
#undef VISIBILITY_SHIFT
#undef VISIBILITY_MASK
-#define WHITE_SPACE_INDEX 10
-#define WHITE_SPACE_SHIFT 20
-#define WHITE_SPACE_MASK 0x700000
+#define WHITE_SPACE_INDEX 8
+#define WHITE_SPACE_SHIFT 0
+#define WHITE_SPACE_MASK 0x7
+static inline uint8_t get_white_space_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[WHITE_SPACE_INDEX];
+ bits &= WHITE_SPACE_MASK;
+ bits >>= WHITE_SPACE_SHIFT;
+
+ /* 3bits: ttt : type */
+ return (bits & 0x7);
+}
static inline uint8_t get_white_space(const css_computed_style *style)
{
uint32_t bits = style->i.bits[WHITE_SPACE_INDEX];
@@ -2024,9 +2969,18 @@ static inline uint8_t get_white_space(const css_computed_style *style)
#undef WHITE_SPACE_SHIFT
#undef WHITE_SPACE_MASK
-#define WIDOWS_INDEX 14
-#define WIDOWS_SHIFT 24
-#define WIDOWS_MASK 0x1000000
+#define WIDOWS_INDEX 12
+#define WIDOWS_SHIFT 0
+#define WIDOWS_MASK 0x1
+static inline uint8_t get_widows_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[WIDOWS_INDEX];
+ bits &= WIDOWS_MASK;
+ bits >>= WIDOWS_SHIFT;
+
+ /* 1bit: t : type */
+ return (bits & 0x1);
+}
static inline uint8_t get_widows(const css_computed_style *style, int32_t
*integer)
{
@@ -2043,9 +2997,18 @@ static inline uint8_t get_widows(const css_computed_style *style, int32_t
#undef WIDOWS_SHIFT
#undef WIDOWS_MASK
-#define WIDTH_INDEX 5
+#define WIDTH_INDEX 4
#define WIDTH_SHIFT 25
#define WIDTH_MASK 0xfe000000
+static inline uint8_t get_width_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[WIDTH_INDEX];
+ bits &= WIDTH_MASK;
+ bits >>= WIDTH_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_width(const css_computed_style *style, css_fixed
*length, css_unit *unit)
{
@@ -2065,9 +3028,18 @@ static inline uint8_t get_width(const css_computed_style *style, css_fixed
#undef WIDTH_SHIFT
#undef WIDTH_MASK
-#define WORD_SPACING_INDEX 4
-#define WORD_SPACING_SHIFT 25
-#define WORD_SPACING_MASK 0xfe000000
+#define WORD_SPACING_INDEX 1
+#define WORD_SPACING_SHIFT 0
+#define WORD_SPACING_MASK 0x7f
+static inline uint8_t get_word_spacing_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[WORD_SPACING_INDEX];
+ bits &= WORD_SPACING_MASK;
+ bits >>= WORD_SPACING_SHIFT;
+
+ /* 7bits: uuuuutt : unit | type */
+ return (bits & 0x3);
+}
static inline uint8_t get_word_spacing(const css_computed_style *style,
css_fixed *length, css_unit *unit)
{
@@ -2087,9 +3059,18 @@ static inline uint8_t get_word_spacing(const css_computed_style *style,
#undef WORD_SPACING_SHIFT
#undef WORD_SPACING_MASK
-#define WRITING_MODE_INDEX 11
-#define WRITING_MODE_SHIFT 18
-#define WRITING_MODE_MASK 0xc0000
+#define WRITING_MODE_INDEX 10
+#define WRITING_MODE_SHIFT 16
+#define WRITING_MODE_MASK 0x30000
+static inline uint8_t get_writing_mode_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[WRITING_MODE_INDEX];
+ bits &= WRITING_MODE_MASK;
+ bits >>= WRITING_MODE_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_writing_mode(const css_computed_style *style)
{
uint32_t bits = style->i.bits[WRITING_MODE_INDEX];
@@ -2104,9 +3085,18 @@ static inline uint8_t get_writing_mode(const css_computed_style *style)
#undef WRITING_MODE_SHIFT
#undef WRITING_MODE_MASK
-#define Z_INDEX_INDEX 11
-#define Z_INDEX_SHIFT 2
-#define Z_INDEX_MASK 0xc
+#define Z_INDEX_INDEX 10
+#define Z_INDEX_SHIFT 18
+#define Z_INDEX_MASK 0xc0000
+static inline uint8_t get_z_index_bits(const css_computed_style *style)
+{
+ uint32_t bits = style->i.bits[Z_INDEX_INDEX];
+ bits &= Z_INDEX_MASK;
+ bits >>= Z_INDEX_SHIFT;
+
+ /* 2bits: tt : type */
+ return (bits & 0x3);
+}
static inline uint8_t get_z_index(const css_computed_style *style, int32_t
*integer)
{
diff --git a/src/select/autogenerated_propset.h b/src/select/autogenerated_propset.h
index 2854896..198bc1e 100644
--- a/src/select/autogenerated_propset.h
+++ b/src/select/autogenerated_propset.h
@@ -8,16 +8,14 @@
/** Default values are 'initial value', unless the property is inherited,
* in which case it is 'inherit'. */
-#define ALIGN_CONTENT_INDEX 9
-#define ALIGN_CONTENT_SHIFT 17
-#define ALIGN_CONTENT_MASK 0xe0000
+#define ALIGN_CONTENT_INDEX 10
+#define ALIGN_CONTENT_SHIFT 20
+#define ALIGN_CONTENT_MASK 0x700000
static inline css_error set_align_content(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[ALIGN_CONTENT_INDEX];
+ uint32_t *bits = &style->i.bits[ALIGN_CONTENT_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~ALIGN_CONTENT_MASK) | (((uint32_t)type & 0x7) <<
@@ -29,15 +27,13 @@ static inline css_error set_align_content(css_computed_style *style, uint8_t
#undef ALIGN_CONTENT_SHIFT
#undef ALIGN_CONTENT_MASK
-#define ALIGN_ITEMS_INDEX 9
-#define ALIGN_ITEMS_SHIFT 29
-#define ALIGN_ITEMS_MASK 0xe0000000
+#define ALIGN_ITEMS_INDEX 10
+#define ALIGN_ITEMS_SHIFT 23
+#define ALIGN_ITEMS_MASK 0x3800000
static inline css_error set_align_items(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[ALIGN_ITEMS_INDEX];
+ uint32_t *bits = &style->i.bits[ALIGN_ITEMS_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~ALIGN_ITEMS_MASK) | (((uint32_t)type & 0x7) <<
@@ -49,15 +45,13 @@ static inline css_error set_align_items(css_computed_style *style, uint8_t type)
#undef ALIGN_ITEMS_SHIFT
#undef ALIGN_ITEMS_MASK
-#define ALIGN_SELF_INDEX 9
-#define ALIGN_SELF_SHIFT 20
-#define ALIGN_SELF_MASK 0x700000
+#define ALIGN_SELF_INDEX 10
+#define ALIGN_SELF_SHIFT 26
+#define ALIGN_SELF_MASK 0x1c000000
static inline css_error set_align_self(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[ALIGN_SELF_INDEX];
+ uint32_t *bits = &style->i.bits[ALIGN_SELF_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~ALIGN_SELF_MASK) | (((uint32_t)type & 0x7) <<
@@ -69,16 +63,14 @@ static inline css_error set_align_self(css_computed_style *style, uint8_t type)
#undef ALIGN_SELF_SHIFT
#undef ALIGN_SELF_MASK
-#define BACKGROUND_ATTACHMENT_INDEX 10
-#define BACKGROUND_ATTACHMENT_SHIFT 8
-#define BACKGROUND_ATTACHMENT_MASK 0x300
+#define BACKGROUND_ATTACHMENT_INDEX 14
+#define BACKGROUND_ATTACHMENT_SHIFT 28
+#define BACKGROUND_ATTACHMENT_MASK 0x30000000
static inline css_error set_background_attachment(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BACKGROUND_ATTACHMENT_INDEX];
+ uint32_t *bits = &style->i.bits[BACKGROUND_ATTACHMENT_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BACKGROUND_ATTACHMENT_MASK) | (((uint32_t)type & 0x3)
@@ -90,16 +82,14 @@ static inline css_error set_background_attachment(css_computed_style *style,
#undef BACKGROUND_ATTACHMENT_SHIFT
#undef BACKGROUND_ATTACHMENT_MASK
-#define BACKGROUND_COLOR_INDEX 10
-#define BACKGROUND_COLOR_SHIFT 2
-#define BACKGROUND_COLOR_MASK 0xc
+#define BACKGROUND_COLOR_INDEX 14
+#define BACKGROUND_COLOR_SHIFT 30
+#define BACKGROUND_COLOR_MASK 0xc0000000
static inline css_error set_background_color(css_computed_style *style, uint8_t
type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BACKGROUND_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[BACKGROUND_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BACKGROUND_COLOR_MASK) | (((uint32_t)type & 0x3) <<
@@ -114,15 +104,13 @@ static inline css_error set_background_color(css_computed_style *style, uint8_t
#undef BACKGROUND_COLOR_MASK
#define BACKGROUND_IMAGE_INDEX 14
-#define BACKGROUND_IMAGE_SHIFT 28
-#define BACKGROUND_IMAGE_MASK 0x10000000
+#define BACKGROUND_IMAGE_SHIFT 16
+#define BACKGROUND_IMAGE_MASK 0x10000
static inline css_error set_background_image(css_computed_style *style, uint8_t
type, lwc_string *string)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BACKGROUND_IMAGE_INDEX];
+ uint32_t *bits = &style->i.bits[BACKGROUND_IMAGE_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~BACKGROUND_IMAGE_MASK) | (((uint32_t)type & 0x1) <<
@@ -153,9 +141,7 @@ static inline css_error set_background_position(css_computed_style *style,
uint8_t type, css_fixed length_a, css_unit unit_a, css_fixed
length_b, css_unit unit_b)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BACKGROUND_POSITION_INDEX];
+ uint32_t *bits = &style->i.bits[BACKGROUND_POSITION_INDEX];
/* 11bits: aaaaabbbbbt : unit_a | unit_b | type */
*bits = (*bits & ~BACKGROUND_POSITION_MASK) | ((((uint32_t)type & 0x1)
@@ -172,16 +158,14 @@ static inline css_error set_background_position(css_computed_style *style,
#undef BACKGROUND_POSITION_SHIFT
#undef BACKGROUND_POSITION_MASK
-#define BACKGROUND_REPEAT_INDEX 13
-#define BACKGROUND_REPEAT_SHIFT 1
-#define BACKGROUND_REPEAT_MASK 0xe
+#define BACKGROUND_REPEAT_INDEX 10
+#define BACKGROUND_REPEAT_SHIFT 29
+#define BACKGROUND_REPEAT_MASK 0xe0000000
static inline css_error set_background_repeat(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BACKGROUND_REPEAT_INDEX];
+ uint32_t *bits = &style->i.bits[BACKGROUND_REPEAT_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~BACKGROUND_REPEAT_MASK) | (((uint32_t)type & 0x7) <<
@@ -194,15 +178,13 @@ static inline css_error set_background_repeat(css_computed_style *style,
#undef BACKGROUND_REPEAT_MASK
#define BORDER_BOTTOM_COLOR_INDEX 11
-#define BORDER_BOTTOM_COLOR_SHIFT 28
-#define BORDER_BOTTOM_COLOR_MASK 0x30000000
+#define BORDER_BOTTOM_COLOR_SHIFT 0
+#define BORDER_BOTTOM_COLOR_MASK 0x3
static inline css_error set_border_bottom_color(css_computed_style *style,
uint8_t type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_BOTTOM_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_BOTTOM_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BORDER_BOTTOM_COLOR_MASK) | (((uint32_t)type & 0x3)
@@ -217,15 +199,13 @@ static inline css_error set_border_bottom_color(css_computed_style *style,
#undef BORDER_BOTTOM_COLOR_MASK
#define BORDER_BOTTOM_STYLE_INDEX 13
-#define BORDER_BOTTOM_STYLE_SHIFT 8
-#define BORDER_BOTTOM_STYLE_MASK 0xf00
+#define BORDER_BOTTOM_STYLE_SHIFT 28
+#define BORDER_BOTTOM_STYLE_MASK 0xf0000000
static inline css_error set_border_bottom_style(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_BOTTOM_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_BOTTOM_STYLE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BORDER_BOTTOM_STYLE_MASK) | (((uint32_t)type & 0xf)
@@ -244,9 +224,7 @@ static inline css_error set_border_bottom_style(css_computed_style *style,
static inline css_error set_border_bottom_width(css_computed_style *style,
uint8_t type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_BOTTOM_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_BOTTOM_WIDTH_INDEX];
/* 8bits: uuuuuttt : unit | type */
*bits = (*bits & ~BORDER_BOTTOM_WIDTH_MASK) | ((((uint32_t)type & 0x7)
@@ -261,15 +239,13 @@ static inline css_error set_border_bottom_width(css_computed_style *style,
#undef BORDER_BOTTOM_WIDTH_MASK
#define BORDER_COLLAPSE_INDEX 11
-#define BORDER_COLLAPSE_SHIFT 16
-#define BORDER_COLLAPSE_MASK 0x30000
+#define BORDER_COLLAPSE_SHIFT 2
+#define BORDER_COLLAPSE_MASK 0xc
static inline css_error set_border_collapse(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_COLLAPSE_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_COLLAPSE_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BORDER_COLLAPSE_MASK) | (((uint32_t)type & 0x3) <<
@@ -281,16 +257,14 @@ static inline css_error set_border_collapse(css_computed_style *style, uint8_t
#undef BORDER_COLLAPSE_SHIFT
#undef BORDER_COLLAPSE_MASK
-#define BORDER_LEFT_COLOR_INDEX 10
-#define BORDER_LEFT_COLOR_SHIFT 0
-#define BORDER_LEFT_COLOR_MASK 0x3
+#define BORDER_LEFT_COLOR_INDEX 11
+#define BORDER_LEFT_COLOR_SHIFT 4
+#define BORDER_LEFT_COLOR_MASK 0x30
static inline css_error set_border_left_color(css_computed_style *style,
uint8_t type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_LEFT_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_LEFT_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BORDER_LEFT_COLOR_MASK) | (((uint32_t)type & 0x3) <<
@@ -304,16 +278,14 @@ static inline css_error set_border_left_color(css_computed_style *style,
#undef BORDER_LEFT_COLOR_SHIFT
#undef BORDER_LEFT_COLOR_MASK
-#define BORDER_LEFT_STYLE_INDEX 13
-#define BORDER_LEFT_STYLE_SHIFT 12
-#define BORDER_LEFT_STYLE_MASK 0xf000
+#define BORDER_LEFT_STYLE_INDEX 9
+#define BORDER_LEFT_STYLE_SHIFT 3
+#define BORDER_LEFT_STYLE_MASK 0x78
static inline css_error set_border_left_style(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_LEFT_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_LEFT_STYLE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BORDER_LEFT_STYLE_MASK) | (((uint32_t)type & 0xf) <<
@@ -332,9 +304,7 @@ static inline css_error set_border_left_style(css_computed_style *style,
static inline css_error set_border_left_width(css_computed_style *style,
uint8_t type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_LEFT_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_LEFT_WIDTH_INDEX];
/* 8bits: uuuuuttt : unit | type */
*bits = (*bits & ~BORDER_LEFT_WIDTH_MASK) | ((((uint32_t)type & 0x7) | (
@@ -349,15 +319,13 @@ static inline css_error set_border_left_width(css_computed_style *style,
#undef BORDER_LEFT_WIDTH_MASK
#define BORDER_RIGHT_COLOR_INDEX 11
-#define BORDER_RIGHT_COLOR_SHIFT 8
-#define BORDER_RIGHT_COLOR_MASK 0x300
+#define BORDER_RIGHT_COLOR_SHIFT 6
+#define BORDER_RIGHT_COLOR_MASK 0xc0
static inline css_error set_border_right_color(css_computed_style *style,
uint8_t type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_RIGHT_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_RIGHT_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BORDER_RIGHT_COLOR_MASK) | (((uint32_t)type & 0x3) <<
@@ -371,16 +339,14 @@ static inline css_error set_border_right_color(css_computed_style *style,
#undef BORDER_RIGHT_COLOR_SHIFT
#undef BORDER_RIGHT_COLOR_MASK
-#define BORDER_RIGHT_STYLE_INDEX 8
-#define BORDER_RIGHT_STYLE_SHIFT 0
-#define BORDER_RIGHT_STYLE_MASK 0xf
+#define BORDER_RIGHT_STYLE_INDEX 9
+#define BORDER_RIGHT_STYLE_SHIFT 7
+#define BORDER_RIGHT_STYLE_MASK 0x780
static inline css_error set_border_right_style(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_RIGHT_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_RIGHT_STYLE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BORDER_RIGHT_STYLE_MASK) | (((uint32_t)type & 0xf) <<
@@ -392,16 +358,14 @@ static inline css_error set_border_right_style(css_computed_style *style,
#undef BORDER_RIGHT_STYLE_SHIFT
#undef BORDER_RIGHT_STYLE_MASK
-#define BORDER_RIGHT_WIDTH_INDEX 1
-#define BORDER_RIGHT_WIDTH_SHIFT 7
-#define BORDER_RIGHT_WIDTH_MASK 0x7f80
+#define BORDER_RIGHT_WIDTH_INDEX 0
+#define BORDER_RIGHT_WIDTH_SHIFT 16
+#define BORDER_RIGHT_WIDTH_MASK 0xff0000
static inline css_error set_border_right_width(css_computed_style *style,
uint8_t type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_RIGHT_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_RIGHT_WIDTH_INDEX];
/* 8bits: uuuuuttt : unit | type */
*bits = (*bits & ~BORDER_RIGHT_WIDTH_MASK) | ((((uint32_t)type & 0x7) |
@@ -423,9 +387,7 @@ static inline css_error set_border_spacing(css_computed_style *style, uint8_t
type, css_fixed length_a, css_unit unit_a, css_fixed length_b,
css_unit unit_b)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_SPACING_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_SPACING_INDEX];
/* 11bits: aaaaabbbbbt : unit_a | unit_b | type */
*bits = (*bits & ~BORDER_SPACING_MASK) | ((((uint32_t)type & 0x1) | (
@@ -442,15 +404,13 @@ static inline css_error set_border_spacing(css_computed_style *style, uint8_t
#undef BORDER_SPACING_MASK
#define BORDER_TOP_COLOR_INDEX 11
-#define BORDER_TOP_COLOR_SHIFT 26
-#define BORDER_TOP_COLOR_MASK 0xc000000
+#define BORDER_TOP_COLOR_SHIFT 8
+#define BORDER_TOP_COLOR_MASK 0x300
static inline css_error set_border_top_color(css_computed_style *style, uint8_t
type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_TOP_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_TOP_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BORDER_TOP_COLOR_MASK) | (((uint32_t)type & 0x3) <<
@@ -464,16 +424,14 @@ static inline css_error set_border_top_color(css_computed_style *style, uint8_t
#undef BORDER_TOP_COLOR_SHIFT
#undef BORDER_TOP_COLOR_MASK
-#define BORDER_TOP_STYLE_INDEX 6
-#define BORDER_TOP_STYLE_SHIFT 0
-#define BORDER_TOP_STYLE_MASK 0xf
+#define BORDER_TOP_STYLE_INDEX 9
+#define BORDER_TOP_STYLE_SHIFT 11
+#define BORDER_TOP_STYLE_MASK 0x7800
static inline css_error set_border_top_style(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_TOP_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_TOP_STYLE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BORDER_TOP_STYLE_MASK) | (((uint32_t)type & 0xf) <<
@@ -485,16 +443,14 @@ static inline css_error set_border_top_style(css_computed_style *style, uint8_t
#undef BORDER_TOP_STYLE_SHIFT
#undef BORDER_TOP_STYLE_MASK
-#define BORDER_TOP_WIDTH_INDEX 1
-#define BORDER_TOP_WIDTH_SHIFT 15
-#define BORDER_TOP_WIDTH_MASK 0x7f8000
+#define BORDER_TOP_WIDTH_INDEX 0
+#define BORDER_TOP_WIDTH_SHIFT 24
+#define BORDER_TOP_WIDTH_MASK 0xff000000
static inline css_error set_border_top_width(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BORDER_TOP_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[BORDER_TOP_WIDTH_INDEX];
/* 8bits: uuuuuttt : unit | type */
*bits = (*bits & ~BORDER_TOP_WIDTH_MASK) | ((((uint32_t)type & 0x7) | (
@@ -508,16 +464,14 @@ static inline css_error set_border_top_width(css_computed_style *style, uint8_t
#undef BORDER_TOP_WIDTH_SHIFT
#undef BORDER_TOP_WIDTH_MASK
-#define BOTTOM_INDEX 7
-#define BOTTOM_SHIFT 18
-#define BOTTOM_MASK 0x1fc0000
+#define BOTTOM_INDEX 3
+#define BOTTOM_SHIFT 11
+#define BOTTOM_MASK 0x3f800
static inline css_error set_bottom(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BOTTOM_INDEX];
+ uint32_t *bits = &style->i.bits[BOTTOM_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~BOTTOM_MASK) | ((((uint32_t)type & 0x3) | (unit <<
@@ -531,15 +485,13 @@ static inline css_error set_bottom(css_computed_style *style, uint8_t type,
#undef BOTTOM_SHIFT
#undef BOTTOM_MASK
-#define BOX_SIZING_INDEX 10
-#define BOX_SIZING_SHIFT 18
-#define BOX_SIZING_MASK 0xc0000
+#define BOX_SIZING_INDEX 11
+#define BOX_SIZING_SHIFT 10
+#define BOX_SIZING_MASK 0xc00
static inline css_error set_box_sizing(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BOX_SIZING_INDEX];
+ uint32_t *bits = &style->i.bits[BOX_SIZING_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~BOX_SIZING_MASK) | (((uint32_t)type & 0x3) <<
@@ -551,15 +503,13 @@ static inline css_error set_box_sizing(css_computed_style *style, uint8_t type)
#undef BOX_SIZING_SHIFT
#undef BOX_SIZING_MASK
-#define BREAK_AFTER_INDEX 13
-#define BREAK_AFTER_SHIFT 28
-#define BREAK_AFTER_MASK 0xf0000000
+#define BREAK_AFTER_INDEX 9
+#define BREAK_AFTER_SHIFT 15
+#define BREAK_AFTER_MASK 0x78000
static inline css_error set_break_after(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BREAK_AFTER_INDEX];
+ uint32_t *bits = &style->i.bits[BREAK_AFTER_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BREAK_AFTER_MASK) | (((uint32_t)type & 0xf) <<
@@ -571,16 +521,14 @@ static inline css_error set_break_after(css_computed_style *style, uint8_t type)
#undef BREAK_AFTER_SHIFT
#undef BREAK_AFTER_MASK
-#define BREAK_BEFORE_INDEX 13
-#define BREAK_BEFORE_SHIFT 24
-#define BREAK_BEFORE_MASK 0xf000000
+#define BREAK_BEFORE_INDEX 9
+#define BREAK_BEFORE_SHIFT 19
+#define BREAK_BEFORE_MASK 0x780000
static inline css_error set_break_before(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BREAK_BEFORE_INDEX];
+ uint32_t *bits = &style->i.bits[BREAK_BEFORE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BREAK_BEFORE_MASK) | (((uint32_t)type & 0xf) <<
@@ -592,16 +540,14 @@ static inline css_error set_break_before(css_computed_style *style, uint8_t
#undef BREAK_BEFORE_SHIFT
#undef BREAK_BEFORE_MASK
-#define BREAK_INSIDE_INDEX 13
-#define BREAK_INSIDE_SHIFT 4
-#define BREAK_INSIDE_MASK 0xf0
+#define BREAK_INSIDE_INDEX 9
+#define BREAK_INSIDE_SHIFT 23
+#define BREAK_INSIDE_MASK 0x7800000
static inline css_error set_break_inside(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[BREAK_INSIDE_INDEX];
+ uint32_t *bits = &style->i.bits[BREAK_INSIDE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~BREAK_INSIDE_MASK) | (((uint32_t)type & 0xf) <<
@@ -614,15 +560,13 @@ static inline css_error set_break_inside(css_computed_style *style, uint8_t
#undef BREAK_INSIDE_MASK
#define CAPTION_SIDE_INDEX 11
-#define CAPTION_SIDE_SHIFT 24
-#define CAPTION_SIDE_MASK 0x3000000
+#define CAPTION_SIDE_SHIFT 12
+#define CAPTION_SIDE_MASK 0x3000
static inline css_error set_caption_side(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[CAPTION_SIDE_INDEX];
+ uint32_t *bits = &style->i.bits[CAPTION_SIDE_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~CAPTION_SIDE_MASK) | (((uint32_t)type & 0x3) <<
@@ -634,15 +578,13 @@ static inline css_error set_caption_side(css_computed_style *style, uint8_t
#undef CAPTION_SIDE_SHIFT
#undef CAPTION_SIDE_MASK
-#define CLEAR_INDEX 10
-#define CLEAR_SHIFT 23
-#define CLEAR_MASK 0x3800000
+#define CLEAR_INDEX 13
+#define CLEAR_SHIFT 1
+#define CLEAR_MASK 0xe
static inline css_error set_clear(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[CLEAR_INDEX];
+ uint32_t *bits = &style->i.bits[CLEAR_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~CLEAR_MASK) | (((uint32_t)type & 0x7) << CLEAR_SHIFT);
@@ -696,16 +638,14 @@ static inline css_error set_clip(
#undef CLIP_SHIFT
#undef CLIP_MASK
-#define COLOR_INDEX 12
-#define COLOR_SHIFT 0
-#define COLOR_MASK 0x1
+#define COLOR_INDEX 14
+#define COLOR_SHIFT 17
+#define COLOR_MASK 0x20000
static inline css_error set_color(css_computed_style *style, uint8_t type,
css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[COLOR_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~COLOR_MASK) | (((uint32_t)type & 0x1) << COLOR_SHIFT);
@@ -719,15 +659,13 @@ static inline css_error set_color(css_computed_style *style, uint8_t type,
#undef COLOR_MASK
#define COLUMN_COUNT_INDEX 11
-#define COLUMN_COUNT_SHIFT 20
-#define COLUMN_COUNT_MASK 0x300000
+#define COLUMN_COUNT_SHIFT 14
+#define COLUMN_COUNT_MASK 0xc000
static inline css_error set_column_count(css_computed_style *style, uint8_t
type, int32_t integer)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_COUNT_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_COUNT_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~COLUMN_COUNT_MASK) | (((uint32_t)type & 0x3) <<
@@ -742,14 +680,12 @@ static inline css_error set_column_count(css_computed_style *style, uint8_t
#undef COLUMN_COUNT_MASK
#define COLUMN_FILL_INDEX 11
-#define COLUMN_FILL_SHIFT 10
-#define COLUMN_FILL_MASK 0xc00
+#define COLUMN_FILL_SHIFT 16
+#define COLUMN_FILL_MASK 0x30000
static inline css_error set_column_fill(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_FILL_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_FILL_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~COLUMN_FILL_MASK) | (((uint32_t)type & 0x3) <<
@@ -761,16 +697,14 @@ static inline css_error set_column_fill(css_computed_style *style, uint8_t type)
#undef COLUMN_FILL_SHIFT
#undef COLUMN_FILL_MASK
-#define COLUMN_GAP_INDEX 4
-#define COLUMN_GAP_SHIFT 11
-#define COLUMN_GAP_MASK 0x3f800
+#define COLUMN_GAP_INDEX 3
+#define COLUMN_GAP_SHIFT 18
+#define COLUMN_GAP_MASK 0x1fc0000
static inline css_error set_column_gap(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_GAP_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_GAP_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~COLUMN_GAP_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -784,16 +718,14 @@ static inline css_error set_column_gap(css_computed_style *style, uint8_t type,
#undef COLUMN_GAP_SHIFT
#undef COLUMN_GAP_MASK
-#define COLUMN_RULE_COLOR_INDEX 10
-#define COLUMN_RULE_COLOR_SHIFT 10
-#define COLUMN_RULE_COLOR_MASK 0xc00
+#define COLUMN_RULE_COLOR_INDEX 11
+#define COLUMN_RULE_COLOR_SHIFT 18
+#define COLUMN_RULE_COLOR_MASK 0xc0000
static inline css_error set_column_rule_color(css_computed_style *style,
uint8_t type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_RULE_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_RULE_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~COLUMN_RULE_COLOR_MASK) | (((uint32_t)type & 0x3) <<
@@ -814,9 +746,7 @@ static inline css_error set_column_rule_color(css_computed_style *style,
static inline css_error set_column_rule_style(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_RULE_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_RULE_STYLE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~COLUMN_RULE_STYLE_MASK) | (((uint32_t)type & 0xf) <<
@@ -828,16 +758,14 @@ static inline css_error set_column_rule_style(css_computed_style *style,
#undef COLUMN_RULE_STYLE_SHIFT
#undef COLUMN_RULE_STYLE_MASK
-#define COLUMN_RULE_WIDTH_INDEX 0
-#define COLUMN_RULE_WIDTH_SHIFT 24
-#define COLUMN_RULE_WIDTH_MASK 0xff000000
+#define COLUMN_RULE_WIDTH_INDEX 1
+#define COLUMN_RULE_WIDTH_SHIFT 7
+#define COLUMN_RULE_WIDTH_MASK 0x7f80
static inline css_error set_column_rule_width(css_computed_style *style,
uint8_t type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_RULE_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_RULE_WIDTH_INDEX];
/* 8bits: uuuuuttt : unit | type */
*bits = (*bits & ~COLUMN_RULE_WIDTH_MASK) | ((((uint32_t)type & 0x7) | (
@@ -851,15 +779,13 @@ static inline css_error set_column_rule_width(css_computed_style *style,
#undef COLUMN_RULE_WIDTH_SHIFT
#undef COLUMN_RULE_WIDTH_MASK
-#define COLUMN_SPAN_INDEX 10
-#define COLUMN_SPAN_SHIFT 6
-#define COLUMN_SPAN_MASK 0xc0
+#define COLUMN_SPAN_INDEX 11
+#define COLUMN_SPAN_SHIFT 20
+#define COLUMN_SPAN_MASK 0x300000
static inline css_error set_column_span(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_SPAN_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_SPAN_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~COLUMN_SPAN_MASK) | (((uint32_t)type & 0x3) <<
@@ -871,16 +797,14 @@ static inline css_error set_column_span(css_computed_style *style, uint8_t type)
#undef COLUMN_SPAN_SHIFT
#undef COLUMN_SPAN_MASK
-#define COLUMN_WIDTH_INDEX 5
-#define COLUMN_WIDTH_SHIFT 4
-#define COLUMN_WIDTH_MASK 0x7f0
+#define COLUMN_WIDTH_INDEX 3
+#define COLUMN_WIDTH_SHIFT 25
+#define COLUMN_WIDTH_MASK 0xfe000000
static inline css_error set_column_width(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COLUMN_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[COLUMN_WIDTH_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~COLUMN_WIDTH_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -895,8 +819,8 @@ static inline css_error set_column_width(css_computed_style *style, uint8_t
#undef COLUMN_WIDTH_MASK
#define CONTENT_INDEX 11
-#define CONTENT_SHIFT 0
-#define CONTENT_MASK 0x3
+#define CONTENT_SHIFT 22
+#define CONTENT_MASK 0xc00000
static inline css_error set_content(
css_computed_style *style, uint8_t type,
css_computed_content_item *content)
@@ -978,15 +902,13 @@ static inline css_error set_content(
#undef CONTENT_MASK
#define COUNTER_INCREMENT_INDEX 14
-#define COUNTER_INCREMENT_SHIFT 29
-#define COUNTER_INCREMENT_MASK 0x20000000
+#define COUNTER_INCREMENT_SHIFT 18
+#define COUNTER_INCREMENT_MASK 0x40000
static inline css_error set_counter_increment(css_computed_style *style,
uint8_t type, css_computed_counter *counter_arr)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COUNTER_INCREMENT_INDEX];
+ uint32_t *bits = &style->i.bits[COUNTER_INCREMENT_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~COUNTER_INCREMENT_MASK) | (((uint32_t)type & 0x1) <<
@@ -1016,15 +938,13 @@ static inline css_error set_counter_increment(css_computed_style *style,
#undef COUNTER_INCREMENT_MASK
#define COUNTER_RESET_INDEX 14
-#define COUNTER_RESET_SHIFT 21
-#define COUNTER_RESET_MASK 0x200000
+#define COUNTER_RESET_SHIFT 19
+#define COUNTER_RESET_MASK 0x80000
static inline css_error set_counter_reset(css_computed_style *style, uint8_t
type, css_computed_counter *counter_arr)
{
- uint32_t *bits;
-
- bits = &style->i.bits[COUNTER_RESET_INDEX];
+ uint32_t *bits = &style->i.bits[COUNTER_RESET_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~COUNTER_RESET_MASK) | (((uint32_t)type & 0x1) <<
@@ -1053,16 +973,14 @@ static inline css_error set_counter_reset(css_computed_style *style, uint8_t
#undef COUNTER_RESET_SHIFT
#undef COUNTER_RESET_MASK
-#define CURSOR_INDEX 8
-#define CURSOR_SHIFT 4
-#define CURSOR_MASK 0x1f0
+#define CURSOR_INDEX 9
+#define CURSOR_SHIFT 27
+#define CURSOR_MASK 0xf8000000
static inline css_error set_cursor(css_computed_style *style, uint8_t type,
lwc_string **string_arr)
{
- uint32_t *bits;
-
- bits = &style->i.bits[CURSOR_INDEX];
+ uint32_t *bits = &style->i.bits[CURSOR_INDEX];
/* 5bits: ttttt : type */
*bits = (*bits & ~CURSOR_MASK) | (((uint32_t)type & 0x1f) <<
@@ -1091,15 +1009,13 @@ static inline css_error set_cursor(css_computed_style *style, uint8_t type,
#undef CURSOR_SHIFT
#undef CURSOR_MASK
-#define DIRECTION_INDEX 10
-#define DIRECTION_SHIFT 16
-#define DIRECTION_MASK 0x30000
+#define DIRECTION_INDEX 11
+#define DIRECTION_SHIFT 24
+#define DIRECTION_MASK 0x3000000
static inline css_error set_direction(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[DIRECTION_INDEX];
+ uint32_t *bits = &style->i.bits[DIRECTION_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~DIRECTION_MASK) | (((uint32_t)type & 0x3) <<
@@ -1111,15 +1027,13 @@ static inline css_error set_direction(css_computed_style *style, uint8_t type)
#undef DIRECTION_SHIFT
#undef DIRECTION_MASK
-#define DISPLAY_INDEX 3
-#define DISPLAY_SHIFT 0
-#define DISPLAY_MASK 0x1f
+#define DISPLAY_INDEX 8
+#define DISPLAY_SHIFT 3
+#define DISPLAY_MASK 0xf8
static inline css_error set_display(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[DISPLAY_INDEX];
+ uint32_t *bits = &style->i.bits[DISPLAY_INDEX];
/* 5bits: ttttt : type */
*bits = (*bits & ~DISPLAY_MASK) | (((uint32_t)type & 0x1f) <<
@@ -1131,15 +1045,13 @@ static inline css_error set_display(css_computed_style *style, uint8_t type)
#undef DISPLAY_SHIFT
#undef DISPLAY_MASK
-#define EMPTY_CELLS_INDEX 10
-#define EMPTY_CELLS_SHIFT 14
-#define EMPTY_CELLS_MASK 0xc000
+#define EMPTY_CELLS_INDEX 11
+#define EMPTY_CELLS_SHIFT 26
+#define EMPTY_CELLS_MASK 0xc000000
static inline css_error set_empty_cells(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[EMPTY_CELLS_INDEX];
+ uint32_t *bits = &style->i.bits[EMPTY_CELLS_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~EMPTY_CELLS_MASK) | (((uint32_t)type & 0x3) <<
@@ -1151,16 +1063,35 @@ static inline css_error set_empty_cells(css_computed_style *style, uint8_t type)
#undef EMPTY_CELLS_SHIFT
#undef EMPTY_CELLS_MASK
-#define FLEX_BASIS_INDEX 4
-#define FLEX_BASIS_SHIFT 18
-#define FLEX_BASIS_MASK 0x1fc0000
+#define FILL_OPACITY_INDEX 14
+#define FILL_OPACITY_SHIFT 20
+#define FILL_OPACITY_MASK 0x100000
+
+static inline css_error set_fill_opacity(css_computed_style *style, uint8_t
+ type, css_fixed fixed)
+{
+ uint32_t *bits = &style->i.bits[FILL_OPACITY_INDEX];
+
+ /* 1bit: t : type */
+ *bits = (*bits & ~FILL_OPACITY_MASK) | (((uint32_t)type & 0x1) <<
+ FILL_OPACITY_SHIFT);
+
+ style->i.fill_opacity = fixed;
+
+ return CSS_OK;
+}
+#undef FILL_OPACITY_INDEX
+#undef FILL_OPACITY_SHIFT
+#undef FILL_OPACITY_MASK
+
+#define FLEX_BASIS_INDEX 7
+#define FLEX_BASIS_SHIFT 4
+#define FLEX_BASIS_MASK 0x7f0
static inline css_error set_flex_basis(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FLEX_BASIS_INDEX];
+ uint32_t *bits = &style->i.bits[FLEX_BASIS_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~FLEX_BASIS_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1174,16 +1105,14 @@ static inline css_error set_flex_basis(css_computed_style *style, uint8_t type,
#undef FLEX_BASIS_SHIFT
#undef FLEX_BASIS_MASK
-#define FLEX_DIRECTION_INDEX 9
-#define FLEX_DIRECTION_SHIFT 5
-#define FLEX_DIRECTION_MASK 0xe0
+#define FLEX_DIRECTION_INDEX 13
+#define FLEX_DIRECTION_SHIFT 4
+#define FLEX_DIRECTION_MASK 0x70
static inline css_error set_flex_direction(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FLEX_DIRECTION_INDEX];
+ uint32_t *bits = &style->i.bits[FLEX_DIRECTION_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~FLEX_DIRECTION_MASK) | (((uint32_t)type & 0x7) <<
@@ -1196,15 +1125,13 @@ static inline css_error set_flex_direction(css_computed_style *style, uint8_t
#undef FLEX_DIRECTION_MASK
#define FLEX_GROW_INDEX 14
-#define FLEX_GROW_SHIFT 23
-#define FLEX_GROW_MASK 0x800000
+#define FLEX_GROW_SHIFT 21
+#define FLEX_GROW_MASK 0x200000
static inline css_error set_flex_grow(css_computed_style *style, uint8_t type,
css_fixed fixed)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FLEX_GROW_INDEX];
+ uint32_t *bits = &style->i.bits[FLEX_GROW_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~FLEX_GROW_MASK) | (((uint32_t)type & 0x1) <<
@@ -1219,15 +1146,13 @@ static inline css_error set_flex_grow(css_computed_style *style, uint8_t type,
#undef FLEX_GROW_MASK
#define FLEX_SHRINK_INDEX 14
-#define FLEX_SHRINK_SHIFT 20
-#define FLEX_SHRINK_MASK 0x100000
+#define FLEX_SHRINK_SHIFT 22
+#define FLEX_SHRINK_MASK 0x400000
static inline css_error set_flex_shrink(css_computed_style *style, uint8_t
type, css_fixed fixed)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FLEX_SHRINK_INDEX];
+ uint32_t *bits = &style->i.bits[FLEX_SHRINK_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~FLEX_SHRINK_MASK) | (((uint32_t)type & 0x1) <<
@@ -1241,15 +1166,13 @@ static inline css_error set_flex_shrink(css_computed_style *style, uint8_t
#undef FLEX_SHRINK_SHIFT
#undef FLEX_SHRINK_MASK
-#define FLEX_WRAP_INDEX 10
-#define FLEX_WRAP_SHIFT 12
-#define FLEX_WRAP_MASK 0x3000
+#define FLEX_WRAP_INDEX 11
+#define FLEX_WRAP_SHIFT 28
+#define FLEX_WRAP_MASK 0x30000000
static inline css_error set_flex_wrap(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FLEX_WRAP_INDEX];
+ uint32_t *bits = &style->i.bits[FLEX_WRAP_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~FLEX_WRAP_MASK) | (((uint32_t)type & 0x3) <<
@@ -1262,14 +1185,12 @@ static inline css_error set_flex_wrap(css_computed_style *style, uint8_t type)
#undef FLEX_WRAP_MASK
#define FLOAT_INDEX 11
-#define FLOAT_SHIFT 6
-#define FLOAT_MASK 0xc0
+#define FLOAT_SHIFT 30
+#define FLOAT_MASK 0xc0000000
static inline css_error set_float(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FLOAT_INDEX];
+ uint32_t *bits = &style->i.bits[FLOAT_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~FLOAT_MASK) | (((uint32_t)type & 0x3) << FLOAT_SHIFT);
@@ -1280,16 +1201,14 @@ static inline css_error set_float(css_computed_style *style, uint8_t type)
#undef FLOAT_SHIFT
#undef FLOAT_MASK
-#define FONT_FAMILY_INDEX 9
-#define FONT_FAMILY_SHIFT 26
-#define FONT_FAMILY_MASK 0x1c000000
+#define FONT_FAMILY_INDEX 13
+#define FONT_FAMILY_SHIFT 7
+#define FONT_FAMILY_MASK 0x380
static inline css_error set_font_family(css_computed_style *style, uint8_t
type, lwc_string **string_arr)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FONT_FAMILY_INDEX];
+ uint32_t *bits = &style->i.bits[FONT_FAMILY_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~FONT_FAMILY_MASK) | (((uint32_t)type & 0x7) <<
@@ -1318,16 +1237,14 @@ static inline css_error set_font_family(css_computed_style *style, uint8_t
#undef FONT_FAMILY_SHIFT
#undef FONT_FAMILY_MASK
-#define FONT_SIZE_INDEX 12
-#define FONT_SIZE_SHIFT 1
-#define FONT_SIZE_MASK 0x3fe
+#define FONT_SIZE_INDEX 1
+#define FONT_SIZE_SHIFT 23
+#define FONT_SIZE_MASK 0xff800000
static inline css_error set_font_size(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FONT_SIZE_INDEX];
+ uint32_t *bits = &style->i.bits[FONT_SIZE_INDEX];
/* 9bits: uuuuutttt : unit | type */
*bits = (*bits & ~FONT_SIZE_MASK) | ((((uint32_t)type & 0xf) | (unit <<
@@ -1341,15 +1258,13 @@ static inline css_error set_font_size(css_computed_style *style, uint8_t type,
#undef FONT_SIZE_SHIFT
#undef FONT_SIZE_MASK
-#define FONT_STYLE_INDEX 11
-#define FONT_STYLE_SHIFT 30
-#define FONT_STYLE_MASK 0xc0000000
+#define FONT_STYLE_INDEX 10
+#define FONT_STYLE_SHIFT 0
+#define FONT_STYLE_MASK 0x3
static inline css_error set_font_style(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FONT_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[FONT_STYLE_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~FONT_STYLE_MASK) | (((uint32_t)type & 0x3) <<
@@ -1361,16 +1276,14 @@ static inline css_error set_font_style(css_computed_style *style, uint8_t type)
#undef FONT_STYLE_SHIFT
#undef FONT_STYLE_MASK
-#define FONT_VARIANT_INDEX 11
-#define FONT_VARIANT_SHIFT 22
-#define FONT_VARIANT_MASK 0xc00000
+#define FONT_VARIANT_INDEX 10
+#define FONT_VARIANT_SHIFT 2
+#define FONT_VARIANT_MASK 0xc
static inline css_error set_font_variant(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FONT_VARIANT_INDEX];
+ uint32_t *bits = &style->i.bits[FONT_VARIANT_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~FONT_VARIANT_MASK) | (((uint32_t)type & 0x3) <<
@@ -1382,15 +1295,13 @@ static inline css_error set_font_variant(css_computed_style *style, uint8_t
#undef FONT_VARIANT_SHIFT
#undef FONT_VARIANT_MASK
-#define FONT_WEIGHT_INDEX 4
+#define FONT_WEIGHT_INDEX 6
#define FONT_WEIGHT_SHIFT 0
#define FONT_WEIGHT_MASK 0xf
static inline css_error set_font_weight(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[FONT_WEIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[FONT_WEIGHT_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~FONT_WEIGHT_MASK) | (((uint32_t)type & 0xf) <<
@@ -1402,16 +1313,14 @@ static inline css_error set_font_weight(css_computed_style *style, uint8_t type)
#undef FONT_WEIGHT_SHIFT
#undef FONT_WEIGHT_MASK
-#define HEIGHT_INDEX 5
-#define HEIGHT_SHIFT 18
-#define HEIGHT_MASK 0x1fc0000
+#define HEIGHT_INDEX 7
+#define HEIGHT_SHIFT 11
+#define HEIGHT_MASK 0x3f800
static inline css_error set_height(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[HEIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[HEIGHT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~HEIGHT_MASK) | ((((uint32_t)type & 0x3) | (unit <<
@@ -1425,16 +1334,14 @@ static inline css_error set_height(css_computed_style *style, uint8_t type,
#undef HEIGHT_SHIFT
#undef HEIGHT_MASK
-#define JUSTIFY_CONTENT_INDEX 10
-#define JUSTIFY_CONTENT_SHIFT 29
-#define JUSTIFY_CONTENT_MASK 0xe0000000
+#define JUSTIFY_CONTENT_INDEX 13
+#define JUSTIFY_CONTENT_SHIFT 10
+#define JUSTIFY_CONTENT_MASK 0x1c00
static inline css_error set_justify_content(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[JUSTIFY_CONTENT_INDEX];
+ uint32_t *bits = &style->i.bits[JUSTIFY_CONTENT_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~JUSTIFY_CONTENT_MASK) | (((uint32_t)type & 0x7) <<
@@ -1446,16 +1353,14 @@ static inline css_error set_justify_content(css_computed_style *style, uint8_t
#undef JUSTIFY_CONTENT_SHIFT
#undef JUSTIFY_CONTENT_MASK
-#define LEFT_INDEX 4
-#define LEFT_SHIFT 4
-#define LEFT_MASK 0x7f0
+#define LEFT_INDEX 7
+#define LEFT_SHIFT 18
+#define LEFT_MASK 0x1fc0000
static inline css_error set_left(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[LEFT_INDEX];
+ uint32_t *bits = &style->i.bits[LEFT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~LEFT_MASK) | ((((uint32_t)type & 0x3) | (unit << 2))
@@ -1469,16 +1374,14 @@ static inline css_error set_left(css_computed_style *style, uint8_t type,
#undef LEFT_SHIFT
#undef LEFT_MASK
-#define LETTER_SPACING_INDEX 1
-#define LETTER_SPACING_SHIFT 0
-#define LETTER_SPACING_MASK 0x7f
+#define LETTER_SPACING_INDEX 7
+#define LETTER_SPACING_SHIFT 25
+#define LETTER_SPACING_MASK 0xfe000000
static inline css_error set_letter_spacing(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[LETTER_SPACING_INDEX];
+ uint32_t *bits = &style->i.bits[LETTER_SPACING_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~LETTER_SPACING_MASK) | ((((uint32_t)type & 0x3) | (
@@ -1492,16 +1395,14 @@ static inline css_error set_letter_spacing(css_computed_style *style, uint8_t
#undef LETTER_SPACING_SHIFT
#undef LETTER_SPACING_MASK
-#define LINE_HEIGHT_INDEX 5
-#define LINE_HEIGHT_SHIFT 11
-#define LINE_HEIGHT_MASK 0x3f800
+#define LINE_HEIGHT_INDEX 6
+#define LINE_HEIGHT_SHIFT 4
+#define LINE_HEIGHT_MASK 0x7f0
static inline css_error set_line_height(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[LINE_HEIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[LINE_HEIGHT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~LINE_HEIGHT_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1515,16 +1416,14 @@ static inline css_error set_line_height(css_computed_style *style, uint8_t
#undef LINE_HEIGHT_SHIFT
#undef LINE_HEIGHT_MASK
-#define LIST_STYLE_IMAGE_INDEX 13
-#define LIST_STYLE_IMAGE_SHIFT 0
-#define LIST_STYLE_IMAGE_MASK 0x1
+#define LIST_STYLE_IMAGE_INDEX 14
+#define LIST_STYLE_IMAGE_SHIFT 23
+#define LIST_STYLE_IMAGE_MASK 0x800000
static inline css_error set_list_style_image(css_computed_style *style, uint8_t
type, lwc_string *string)
{
- uint32_t *bits;
-
- bits = &style->i.bits[LIST_STYLE_IMAGE_INDEX];
+ uint32_t *bits = &style->i.bits[LIST_STYLE_IMAGE_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~LIST_STYLE_IMAGE_MASK) | (((uint32_t)type & 0x1) <<
@@ -1547,16 +1446,14 @@ static inline css_error set_list_style_image(css_computed_style *style, uint8_t
#undef LIST_STYLE_IMAGE_SHIFT
#undef LIST_STYLE_IMAGE_MASK
-#define LIST_STYLE_POSITION_INDEX 14
-#define LIST_STYLE_POSITION_SHIFT 30
-#define LIST_STYLE_POSITION_MASK 0xc0000000
+#define LIST_STYLE_POSITION_INDEX 10
+#define LIST_STYLE_POSITION_SHIFT 4
+#define LIST_STYLE_POSITION_MASK 0x30
static inline css_error set_list_style_position(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[LIST_STYLE_POSITION_INDEX];
+ uint32_t *bits = &style->i.bits[LIST_STYLE_POSITION_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~LIST_STYLE_POSITION_MASK) | (((uint32_t)type & 0x3)
@@ -1568,19 +1465,17 @@ static inline css_error set_list_style_position(css_computed_style *style,
#undef LIST_STYLE_POSITION_SHIFT
#undef LIST_STYLE_POSITION_MASK
-#define LIST_STYLE_TYPE_INDEX 13
-#define LIST_STYLE_TYPE_SHIFT 20
-#define LIST_STYLE_TYPE_MASK 0xf00000
+#define LIST_STYLE_TYPE_INDEX 8
+#define LIST_STYLE_TYPE_SHIFT 8
+#define LIST_STYLE_TYPE_MASK 0x3f00
static inline css_error set_list_style_type(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[LIST_STYLE_TYPE_INDEX];
+ uint32_t *bits = &style->i.bits[LIST_STYLE_TYPE_INDEX];
- /* 4bits: tttt : type */
- *bits = (*bits & ~LIST_STYLE_TYPE_MASK) | (((uint32_t)type & 0xf) <<
+ /* 6bits: tttttt : type */
+ *bits = (*bits & ~LIST_STYLE_TYPE_MASK) | (((uint32_t)type & 0x3f) <<
LIST_STYLE_TYPE_SHIFT);
return CSS_OK;
@@ -1589,16 +1484,14 @@ static inline css_error set_list_style_type(css_computed_style *style, uint8_t
#undef LIST_STYLE_TYPE_SHIFT
#undef LIST_STYLE_TYPE_MASK
-#define MARGIN_BOTTOM_INDEX 3
-#define MARGIN_BOTTOM_SHIFT 18
-#define MARGIN_BOTTOM_MASK 0x1fc0000
+#define MARGIN_BOTTOM_INDEX 6
+#define MARGIN_BOTTOM_SHIFT 11
+#define MARGIN_BOTTOM_MASK 0x3f800
static inline css_error set_margin_bottom(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MARGIN_BOTTOM_INDEX];
+ uint32_t *bits = &style->i.bits[MARGIN_BOTTOM_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MARGIN_BOTTOM_MASK) | ((((uint32_t)type & 0x3) | (
@@ -1612,16 +1505,14 @@ static inline css_error set_margin_bottom(css_computed_style *style, uint8_t
#undef MARGIN_BOTTOM_SHIFT
#undef MARGIN_BOTTOM_MASK
-#define MARGIN_LEFT_INDEX 3
-#define MARGIN_LEFT_SHIFT 11
-#define MARGIN_LEFT_MASK 0x3f800
+#define MARGIN_LEFT_INDEX 6
+#define MARGIN_LEFT_SHIFT 18
+#define MARGIN_LEFT_MASK 0x1fc0000
static inline css_error set_margin_left(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MARGIN_LEFT_INDEX];
+ uint32_t *bits = &style->i.bits[MARGIN_LEFT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MARGIN_LEFT_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1636,15 +1527,13 @@ static inline css_error set_margin_left(css_computed_style *style, uint8_t
#undef MARGIN_LEFT_MASK
#define MARGIN_RIGHT_INDEX 6
-#define MARGIN_RIGHT_SHIFT 4
-#define MARGIN_RIGHT_MASK 0x7f0
+#define MARGIN_RIGHT_SHIFT 25
+#define MARGIN_RIGHT_MASK 0xfe000000
static inline css_error set_margin_right(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MARGIN_RIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[MARGIN_RIGHT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MARGIN_RIGHT_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1658,16 +1547,14 @@ static inline css_error set_margin_right(css_computed_style *style, uint8_t
#undef MARGIN_RIGHT_SHIFT
#undef MARGIN_RIGHT_MASK
-#define MARGIN_TOP_INDEX 7
+#define MARGIN_TOP_INDEX 5
#define MARGIN_TOP_SHIFT 4
#define MARGIN_TOP_MASK 0x7f0
static inline css_error set_margin_top(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MARGIN_TOP_INDEX];
+ uint32_t *bits = &style->i.bits[MARGIN_TOP_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MARGIN_TOP_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1681,16 +1568,14 @@ static inline css_error set_margin_top(css_computed_style *style, uint8_t type,
#undef MARGIN_TOP_SHIFT
#undef MARGIN_TOP_MASK
-#define MAX_HEIGHT_INDEX 6
-#define MAX_HEIGHT_SHIFT 18
-#define MAX_HEIGHT_MASK 0x1fc0000
+#define MAX_HEIGHT_INDEX 5
+#define MAX_HEIGHT_SHIFT 11
+#define MAX_HEIGHT_MASK 0x3f800
static inline css_error set_max_height(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MAX_HEIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[MAX_HEIGHT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MAX_HEIGHT_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1704,16 +1589,14 @@ static inline css_error set_max_height(css_computed_style *style, uint8_t type,
#undef MAX_HEIGHT_SHIFT
#undef MAX_HEIGHT_MASK
-#define MAX_WIDTH_INDEX 3
-#define MAX_WIDTH_SHIFT 25
-#define MAX_WIDTH_MASK 0xfe000000
+#define MAX_WIDTH_INDEX 5
+#define MAX_WIDTH_SHIFT 18
+#define MAX_WIDTH_MASK 0x1fc0000
static inline css_error set_max_width(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MAX_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[MAX_WIDTH_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MAX_WIDTH_MASK) | ((((uint32_t)type & 0x3) | (unit <<
@@ -1727,16 +1610,14 @@ static inline css_error set_max_width(css_computed_style *style, uint8_t type,
#undef MAX_WIDTH_SHIFT
#undef MAX_WIDTH_MASK
-#define MIN_HEIGHT_INDEX 7
-#define MIN_HEIGHT_SHIFT 11
-#define MIN_HEIGHT_MASK 0x3f800
+#define MIN_HEIGHT_INDEX 5
+#define MIN_HEIGHT_SHIFT 25
+#define MIN_HEIGHT_MASK 0xfe000000
static inline css_error set_min_height(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MIN_HEIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[MIN_HEIGHT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MIN_HEIGHT_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -1750,16 +1631,14 @@ static inline css_error set_min_height(css_computed_style *style, uint8_t type,
#undef MIN_HEIGHT_SHIFT
#undef MIN_HEIGHT_MASK
-#define MIN_WIDTH_INDEX 6
-#define MIN_WIDTH_SHIFT 11
-#define MIN_WIDTH_MASK 0x3f800
+#define MIN_WIDTH_INDEX 4
+#define MIN_WIDTH_SHIFT 4
+#define MIN_WIDTH_MASK 0x7f0
static inline css_error set_min_width(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[MIN_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[MIN_WIDTH_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~MIN_WIDTH_MASK) | ((((uint32_t)type & 0x3) | (unit <<
@@ -1774,15 +1653,13 @@ static inline css_error set_min_width(css_computed_style *style, uint8_t type,
#undef MIN_WIDTH_MASK
#define OPACITY_INDEX 14
-#define OPACITY_SHIFT 25
-#define OPACITY_MASK 0x2000000
+#define OPACITY_SHIFT 24
+#define OPACITY_MASK 0x1000000
static inline css_error set_opacity(css_computed_style *style, uint8_t type,
css_fixed fixed)
{
- uint32_t *bits;
-
- bits = &style->i.bits[OPACITY_INDEX];
+ uint32_t *bits = &style->i.bits[OPACITY_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~OPACITY_MASK) | (((uint32_t)type & 0x1) <<
@@ -1797,15 +1674,13 @@ static inline css_error set_opacity(css_computed_style *style, uint8_t type,
#undef OPACITY_MASK
#define ORDER_INDEX 14
-#define ORDER_SHIFT 26
-#define ORDER_MASK 0x4000000
+#define ORDER_SHIFT 25
+#define ORDER_MASK 0x2000000
static inline css_error set_order(css_computed_style *style, uint8_t type,
int32_t integer)
{
- uint32_t *bits;
-
- bits = &style->i.bits[ORDER_INDEX];
+ uint32_t *bits = &style->i.bits[ORDER_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~ORDER_MASK) | (((uint32_t)type & 0x1) << ORDER_SHIFT);
@@ -1819,15 +1694,13 @@ static inline css_error set_order(css_computed_style *style, uint8_t type,
#undef ORDER_MASK
#define ORPHANS_INDEX 14
-#define ORPHANS_SHIFT 22
-#define ORPHANS_MASK 0x400000
+#define ORPHANS_SHIFT 26
+#define ORPHANS_MASK 0x4000000
static inline css_error set_orphans(css_computed_style *style, uint8_t type,
int32_t integer)
{
- uint32_t *bits;
-
- bits = &style->i.bits[ORPHANS_INDEX];
+ uint32_t *bits = &style->i.bits[ORPHANS_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~ORPHANS_MASK) | (((uint32_t)type & 0x1) <<
@@ -1841,16 +1714,14 @@ static inline css_error set_orphans(css_computed_style *style, uint8_t type,
#undef ORPHANS_SHIFT
#undef ORPHANS_MASK
-#define OUTLINE_COLOR_INDEX 11
-#define OUTLINE_COLOR_SHIFT 12
-#define OUTLINE_COLOR_MASK 0x3000
+#define OUTLINE_COLOR_INDEX 10
+#define OUTLINE_COLOR_SHIFT 6
+#define OUTLINE_COLOR_MASK 0xc0
static inline css_error set_outline_color(css_computed_style *style, uint8_t
type, css_color color)
{
- uint32_t *bits;
-
- bits = &style->i.bits[OUTLINE_COLOR_INDEX];
+ uint32_t *bits = &style->i.bits[OUTLINE_COLOR_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~OUTLINE_COLOR_MASK) | (((uint32_t)type & 0x3) <<
@@ -1871,9 +1742,7 @@ static inline css_error set_outline_color(css_computed_style *style, uint8_t
static inline css_error set_outline_style(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[OUTLINE_STYLE_INDEX];
+ uint32_t *bits = &style->i.bits[OUTLINE_STYLE_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~OUTLINE_STYLE_MASK) | (((uint32_t)type & 0xf) <<
@@ -1885,16 +1754,14 @@ static inline css_error set_outline_style(css_computed_style *style, uint8_t
#undef OUTLINE_STYLE_SHIFT
#undef OUTLINE_STYLE_MASK
-#define OUTLINE_WIDTH_INDEX 0
-#define OUTLINE_WIDTH_SHIFT 16
-#define OUTLINE_WIDTH_MASK 0xff0000
+#define OUTLINE_WIDTH_INDEX 1
+#define OUTLINE_WIDTH_SHIFT 15
+#define OUTLINE_WIDTH_MASK 0x7f8000
static inline css_error set_outline_width(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[OUTLINE_WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[OUTLINE_WIDTH_INDEX];
/* 8bits: uuuuuttt : unit | type */
*bits = (*bits & ~OUTLINE_WIDTH_MASK) | ((((uint32_t)type & 0x7) | (
@@ -1908,15 +1775,13 @@ static inline css_error set_outline_width(css_computed_style *style, uint8_t
#undef OUTLINE_WIDTH_SHIFT
#undef OUTLINE_WIDTH_MASK
-#define OVERFLOW_X_INDEX 9
-#define OVERFLOW_X_SHIFT 14
-#define OVERFLOW_X_MASK 0x1c000
+#define OVERFLOW_X_INDEX 13
+#define OVERFLOW_X_SHIFT 13
+#define OVERFLOW_X_MASK 0xe000
static inline css_error set_overflow_x(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[OVERFLOW_X_INDEX];
+ uint32_t *bits = &style->i.bits[OVERFLOW_X_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~OVERFLOW_X_MASK) | (((uint32_t)type & 0x7) <<
@@ -1928,15 +1793,13 @@ static inline css_error set_overflow_x(css_computed_style *style, uint8_t type)
#undef OVERFLOW_X_SHIFT
#undef OVERFLOW_X_MASK
-#define OVERFLOW_Y_INDEX 9
-#define OVERFLOW_Y_SHIFT 11
-#define OVERFLOW_Y_MASK 0x3800
+#define OVERFLOW_Y_INDEX 13
+#define OVERFLOW_Y_SHIFT 16
+#define OVERFLOW_Y_MASK 0x70000
static inline css_error set_overflow_y(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[OVERFLOW_Y_INDEX];
+ uint32_t *bits = &style->i.bits[OVERFLOW_Y_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~OVERFLOW_Y_MASK) | (((uint32_t)type & 0x7) <<
@@ -1955,9 +1818,7 @@ static inline css_error set_overflow_y(css_computed_style *style, uint8_t type)
static inline css_error set_padding_bottom(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PADDING_BOTTOM_INDEX];
+ uint32_t *bits = &style->i.bits[PADDING_BOTTOM_INDEX];
/* 6bits: uuuuut : unit | type */
*bits = (*bits & ~PADDING_BOTTOM_MASK) | ((((uint32_t)type & 0x1) | (
@@ -1972,15 +1833,13 @@ static inline css_error set_padding_bottom(css_computed_style *style, uint8_t
#undef PADDING_BOTTOM_MASK
#define PADDING_LEFT_INDEX 8
-#define PADDING_LEFT_SHIFT 26
-#define PADDING_LEFT_MASK 0xfc000000
+#define PADDING_LEFT_SHIFT 20
+#define PADDING_LEFT_MASK 0x3f00000
static inline css_error set_padding_left(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PADDING_LEFT_INDEX];
+ uint32_t *bits = &style->i.bits[PADDING_LEFT_INDEX];
/* 6bits: uuuuut : unit | type */
*bits = (*bits & ~PADDING_LEFT_MASK) | ((((uint32_t)type & 0x1) | (unit
@@ -1995,15 +1854,13 @@ static inline css_error set_padding_left(css_computed_style *style, uint8_t
#undef PADDING_LEFT_MASK
#define PADDING_RIGHT_INDEX 8
-#define PADDING_RIGHT_SHIFT 20
-#define PADDING_RIGHT_MASK 0x3f00000
+#define PADDING_RIGHT_SHIFT 26
+#define PADDING_RIGHT_MASK 0xfc000000
static inline css_error set_padding_right(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PADDING_RIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[PADDING_RIGHT_INDEX];
/* 6bits: uuuuut : unit | type */
*bits = (*bits & ~PADDING_RIGHT_MASK) | ((((uint32_t)type & 0x1) | (
@@ -2017,16 +1874,14 @@ static inline css_error set_padding_right(css_computed_style *style, uint8_t
#undef PADDING_RIGHT_SHIFT
#undef PADDING_RIGHT_MASK
-#define PADDING_TOP_INDEX 2
-#define PADDING_TOP_SHIFT 0
-#define PADDING_TOP_MASK 0x3f
+#define PADDING_TOP_INDEX 3
+#define PADDING_TOP_SHIFT 5
+#define PADDING_TOP_MASK 0x7e0
static inline css_error set_padding_top(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PADDING_TOP_INDEX];
+ uint32_t *bits = &style->i.bits[PADDING_TOP_INDEX];
/* 6bits: uuuuut : unit | type */
*bits = (*bits & ~PADDING_TOP_MASK) | ((((uint32_t)type & 0x1) | (unit
@@ -2040,16 +1895,14 @@ static inline css_error set_padding_top(css_computed_style *style, uint8_t
#undef PADDING_TOP_SHIFT
#undef PADDING_TOP_MASK
-#define PAGE_BREAK_AFTER_INDEX 9
-#define PAGE_BREAK_AFTER_SHIFT 2
-#define PAGE_BREAK_AFTER_MASK 0x1c
+#define PAGE_BREAK_AFTER_INDEX 13
+#define PAGE_BREAK_AFTER_SHIFT 19
+#define PAGE_BREAK_AFTER_MASK 0x380000
static inline css_error set_page_break_after(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PAGE_BREAK_AFTER_INDEX];
+ uint32_t *bits = &style->i.bits[PAGE_BREAK_AFTER_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~PAGE_BREAK_AFTER_MASK) | (((uint32_t)type & 0x7) <<
@@ -2061,16 +1914,14 @@ static inline css_error set_page_break_after(css_computed_style *style, uint8_t
#undef PAGE_BREAK_AFTER_SHIFT
#undef PAGE_BREAK_AFTER_MASK
-#define PAGE_BREAK_BEFORE_INDEX 9
-#define PAGE_BREAK_BEFORE_SHIFT 23
-#define PAGE_BREAK_BEFORE_MASK 0x3800000
+#define PAGE_BREAK_BEFORE_INDEX 13
+#define PAGE_BREAK_BEFORE_SHIFT 22
+#define PAGE_BREAK_BEFORE_MASK 0x1c00000
static inline css_error set_page_break_before(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PAGE_BREAK_BEFORE_INDEX];
+ uint32_t *bits = &style->i.bits[PAGE_BREAK_BEFORE_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~PAGE_BREAK_BEFORE_MASK) | (((uint32_t)type & 0x7) <<
@@ -2083,15 +1934,13 @@ static inline css_error set_page_break_before(css_computed_style *style,
#undef PAGE_BREAK_BEFORE_MASK
#define PAGE_BREAK_INSIDE_INDEX 10
-#define PAGE_BREAK_INSIDE_SHIFT 4
-#define PAGE_BREAK_INSIDE_MASK 0x30
+#define PAGE_BREAK_INSIDE_SHIFT 8
+#define PAGE_BREAK_INSIDE_MASK 0x300
static inline css_error set_page_break_inside(css_computed_style *style,
uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[PAGE_BREAK_INSIDE_INDEX];
+ uint32_t *bits = &style->i.bits[PAGE_BREAK_INSIDE_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~PAGE_BREAK_INSIDE_MASK) | (((uint32_t)type & 0x3) <<
@@ -2103,15 +1952,13 @@ static inline css_error set_page_break_inside(css_computed_style *style,
#undef PAGE_BREAK_INSIDE_SHIFT
#undef PAGE_BREAK_INSIDE_MASK
-#define POSITION_INDEX 10
-#define POSITION_SHIFT 26
-#define POSITION_MASK 0x1c000000
+#define POSITION_INDEX 13
+#define POSITION_SHIFT 25
+#define POSITION_MASK 0xe000000
static inline css_error set_position(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[POSITION_INDEX];
+ uint32_t *bits = &style->i.bits[POSITION_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~POSITION_MASK) | (((uint32_t)type & 0x7) <<
@@ -2130,9 +1977,7 @@ static inline css_error set_position(css_computed_style *style, uint8_t type)
static inline css_error set_quotes(css_computed_style *style, uint8_t type,
lwc_string **string_arr)
{
- uint32_t *bits;
-
- bits = &style->i.bits[QUOTES_INDEX];
+ uint32_t *bits = &style->i.bits[QUOTES_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~QUOTES_MASK) | (((uint32_t)type & 0x1) <<
@@ -2161,16 +2006,14 @@ static inline css_error set_quotes(css_computed_style *style, uint8_t type,
#undef QUOTES_SHIFT
#undef QUOTES_MASK
-#define RIGHT_INDEX 7
-#define RIGHT_SHIFT 25
-#define RIGHT_MASK 0xfe000000
+#define RIGHT_INDEX 4
+#define RIGHT_SHIFT 11
+#define RIGHT_MASK 0x3f800
static inline css_error set_right(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[RIGHT_INDEX];
+ uint32_t *bits = &style->i.bits[RIGHT_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~RIGHT_MASK) | ((((uint32_t)type & 0x3) | (unit << 2))
@@ -2184,16 +2027,35 @@ static inline css_error set_right(css_computed_style *style, uint8_t type,
#undef RIGHT_SHIFT
#undef RIGHT_MASK
-#define TABLE_LAYOUT_INDEX 11
-#define TABLE_LAYOUT_SHIFT 4
-#define TABLE_LAYOUT_MASK 0x30
+#define STROKE_OPACITY_INDEX 13
+#define STROKE_OPACITY_SHIFT 0
+#define STROKE_OPACITY_MASK 0x1
+
+static inline css_error set_stroke_opacity(css_computed_style *style, uint8_t
+ type, css_fixed fixed)
+{
+ uint32_t *bits = &style->i.bits[STROKE_OPACITY_INDEX];
+
+ /* 1bit: t : type */
+ *bits = (*bits & ~STROKE_OPACITY_MASK) | (((uint32_t)type & 0x1) <<
+ STROKE_OPACITY_SHIFT);
+
+ style->i.stroke_opacity = fixed;
+
+ return CSS_OK;
+}
+#undef STROKE_OPACITY_INDEX
+#undef STROKE_OPACITY_SHIFT
+#undef STROKE_OPACITY_MASK
+
+#define TABLE_LAYOUT_INDEX 10
+#define TABLE_LAYOUT_SHIFT 10
+#define TABLE_LAYOUT_MASK 0xc00
static inline css_error set_table_layout(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[TABLE_LAYOUT_INDEX];
+ uint32_t *bits = &style->i.bits[TABLE_LAYOUT_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~TABLE_LAYOUT_MASK) | (((uint32_t)type & 0x3) <<
@@ -2205,15 +2067,13 @@ static inline css_error set_table_layout(css_computed_style *style, uint8_t
#undef TABLE_LAYOUT_SHIFT
#undef TABLE_LAYOUT_MASK
-#define TEXT_ALIGN_INDEX 13
-#define TEXT_ALIGN_SHIFT 16
-#define TEXT_ALIGN_MASK 0xf0000
+#define TEXT_ALIGN_INDEX 4
+#define TEXT_ALIGN_SHIFT 0
+#define TEXT_ALIGN_MASK 0xf
static inline css_error set_text_align(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[TEXT_ALIGN_INDEX];
+ uint32_t *bits = &style->i.bits[TEXT_ALIGN_INDEX];
/* 4bits: tttt : type */
*bits = (*bits & ~TEXT_ALIGN_MASK) | (((uint32_t)type & 0xf) <<
@@ -2225,16 +2085,14 @@ static inline css_error set_text_align(css_computed_style *style, uint8_t type)
#undef TEXT_ALIGN_SHIFT
#undef TEXT_ALIGN_MASK
-#define TEXT_DECORATION_INDEX 8
-#define TEXT_DECORATION_SHIFT 9
-#define TEXT_DECORATION_MASK 0x3e00
+#define TEXT_DECORATION_INDEX 3
+#define TEXT_DECORATION_SHIFT 0
+#define TEXT_DECORATION_MASK 0x1f
static inline css_error set_text_decoration(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[TEXT_DECORATION_INDEX];
+ uint32_t *bits = &style->i.bits[TEXT_DECORATION_INDEX];
/* 5bits: ttttt : type */
*bits = (*bits & ~TEXT_DECORATION_MASK) | (((uint32_t)type & 0x1f) <<
@@ -2246,16 +2104,14 @@ static inline css_error set_text_decoration(css_computed_style *style, uint8_t
#undef TEXT_DECORATION_SHIFT
#undef TEXT_DECORATION_MASK
-#define TEXT_INDENT_INDEX 3
-#define TEXT_INDENT_SHIFT 5
-#define TEXT_INDENT_MASK 0x7e0
+#define TEXT_INDENT_INDEX 2
+#define TEXT_INDENT_SHIFT 0
+#define TEXT_INDENT_MASK 0x3f
static inline css_error set_text_indent(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[TEXT_INDENT_INDEX];
+ uint32_t *bits = &style->i.bits[TEXT_INDENT_INDEX];
/* 6bits: uuuuut : unit | type */
*bits = (*bits & ~TEXT_INDENT_MASK) | ((((uint32_t)type & 0x1) | (unit
@@ -2270,15 +2126,13 @@ static inline css_error set_text_indent(css_computed_style *style, uint8_t
#undef TEXT_INDENT_MASK
#define TEXT_TRANSFORM_INDEX 9
-#define TEXT_TRANSFORM_SHIFT 8
-#define TEXT_TRANSFORM_MASK 0x700
+#define TEXT_TRANSFORM_SHIFT 0
+#define TEXT_TRANSFORM_MASK 0x7
static inline css_error set_text_transform(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[TEXT_TRANSFORM_INDEX];
+ uint32_t *bits = &style->i.bits[TEXT_TRANSFORM_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~TEXT_TRANSFORM_MASK) | (((uint32_t)type & 0x7) <<
@@ -2290,16 +2144,14 @@ static inline css_error set_text_transform(css_computed_style *style, uint8_t
#undef TEXT_TRANSFORM_SHIFT
#undef TEXT_TRANSFORM_MASK
-#define TOP_INDEX 6
-#define TOP_SHIFT 25
-#define TOP_MASK 0xfe000000
+#define TOP_INDEX 4
+#define TOP_SHIFT 18
+#define TOP_MASK 0x1fc0000
static inline css_error set_top(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[TOP_INDEX];
+ uint32_t *bits = &style->i.bits[TOP_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~TOP_MASK) | ((((uint32_t)type & 0x3) | (unit << 2))
@@ -2313,16 +2165,14 @@ static inline css_error set_top(css_computed_style *style, uint8_t type,
#undef TOP_SHIFT
#undef TOP_MASK
-#define UNICODE_BIDI_INDEX 9
-#define UNICODE_BIDI_SHIFT 0
-#define UNICODE_BIDI_MASK 0x3
+#define UNICODE_BIDI_INDEX 10
+#define UNICODE_BIDI_SHIFT 12
+#define UNICODE_BIDI_MASK 0x3000
static inline css_error set_unicode_bidi(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[UNICODE_BIDI_INDEX];
+ uint32_t *bits = &style->i.bits[UNICODE_BIDI_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~UNICODE_BIDI_MASK) | (((uint32_t)type & 0x3) <<
@@ -2334,16 +2184,14 @@ static inline css_error set_unicode_bidi(css_computed_style *style, uint8_t
#undef UNICODE_BIDI_SHIFT
#undef UNICODE_BIDI_MASK
-#define VERTICAL_ALIGN_INDEX 1
-#define VERTICAL_ALIGN_SHIFT 23
-#define VERTICAL_ALIGN_MASK 0xff800000
+#define VERTICAL_ALIGN_INDEX 12
+#define VERTICAL_ALIGN_SHIFT 1
+#define VERTICAL_ALIGN_MASK 0x3fe
static inline css_error set_vertical_align(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[VERTICAL_ALIGN_INDEX];
+ uint32_t *bits = &style->i.bits[VERTICAL_ALIGN_INDEX];
/* 9bits: uuuuutttt : unit | type */
*bits = (*bits & ~VERTICAL_ALIGN_MASK) | ((((uint32_t)type & 0xf) | (
@@ -2357,15 +2205,13 @@ static inline css_error set_vertical_align(css_computed_style *style, uint8_t
#undef VERTICAL_ALIGN_SHIFT
#undef VERTICAL_ALIGN_MASK
-#define VISIBILITY_INDEX 11
+#define VISIBILITY_INDEX 10
#define VISIBILITY_SHIFT 14
#define VISIBILITY_MASK 0xc000
static inline css_error set_visibility(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[VISIBILITY_INDEX];
+ uint32_t *bits = &style->i.bits[VISIBILITY_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~VISIBILITY_MASK) | (((uint32_t)type & 0x3) <<
@@ -2377,15 +2223,13 @@ static inline css_error set_visibility(css_computed_style *style, uint8_t type)
#undef VISIBILITY_SHIFT
#undef VISIBILITY_MASK
-#define WHITE_SPACE_INDEX 10
-#define WHITE_SPACE_SHIFT 20
-#define WHITE_SPACE_MASK 0x700000
+#define WHITE_SPACE_INDEX 8
+#define WHITE_SPACE_SHIFT 0
+#define WHITE_SPACE_MASK 0x7
static inline css_error set_white_space(css_computed_style *style, uint8_t type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[WHITE_SPACE_INDEX];
+ uint32_t *bits = &style->i.bits[WHITE_SPACE_INDEX];
/* 3bits: ttt : type */
*bits = (*bits & ~WHITE_SPACE_MASK) | (((uint32_t)type & 0x7) <<
@@ -2397,16 +2241,14 @@ static inline css_error set_white_space(css_computed_style *style, uint8_t type)
#undef WHITE_SPACE_SHIFT
#undef WHITE_SPACE_MASK
-#define WIDOWS_INDEX 14
-#define WIDOWS_SHIFT 24
-#define WIDOWS_MASK 0x1000000
+#define WIDOWS_INDEX 12
+#define WIDOWS_SHIFT 0
+#define WIDOWS_MASK 0x1
static inline css_error set_widows(css_computed_style *style, uint8_t type,
int32_t integer)
{
- uint32_t *bits;
-
- bits = &style->i.bits[WIDOWS_INDEX];
+ uint32_t *bits = &style->i.bits[WIDOWS_INDEX];
/* 1bit: t : type */
*bits = (*bits & ~WIDOWS_MASK) | (((uint32_t)type & 0x1) <<
@@ -2420,16 +2262,14 @@ static inline css_error set_widows(css_computed_style *style, uint8_t type,
#undef WIDOWS_SHIFT
#undef WIDOWS_MASK
-#define WIDTH_INDEX 5
+#define WIDTH_INDEX 4
#define WIDTH_SHIFT 25
#define WIDTH_MASK 0xfe000000
static inline css_error set_width(css_computed_style *style, uint8_t type,
css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[WIDTH_INDEX];
+ uint32_t *bits = &style->i.bits[WIDTH_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~WIDTH_MASK) | ((((uint32_t)type & 0x3) | (unit << 2))
@@ -2443,16 +2283,14 @@ static inline css_error set_width(css_computed_style *style, uint8_t type,
#undef WIDTH_SHIFT
#undef WIDTH_MASK
-#define WORD_SPACING_INDEX 4
-#define WORD_SPACING_SHIFT 25
-#define WORD_SPACING_MASK 0xfe000000
+#define WORD_SPACING_INDEX 1
+#define WORD_SPACING_SHIFT 0
+#define WORD_SPACING_MASK 0x7f
static inline css_error set_word_spacing(css_computed_style *style, uint8_t
type, css_fixed length, css_unit unit)
{
- uint32_t *bits;
-
- bits = &style->i.bits[WORD_SPACING_INDEX];
+ uint32_t *bits = &style->i.bits[WORD_SPACING_INDEX];
/* 7bits: uuuuutt : unit | type */
*bits = (*bits & ~WORD_SPACING_MASK) | ((((uint32_t)type & 0x3) | (unit
@@ -2466,16 +2304,14 @@ static inline css_error set_word_spacing(css_computed_style *style, uint8_t
#undef WORD_SPACING_SHIFT
#undef WORD_SPACING_MASK
-#define WRITING_MODE_INDEX 11
-#define WRITING_MODE_SHIFT 18
-#define WRITING_MODE_MASK 0xc0000
+#define WRITING_MODE_INDEX 10
+#define WRITING_MODE_SHIFT 16
+#define WRITING_MODE_MASK 0x30000
static inline css_error set_writing_mode(css_computed_style *style, uint8_t
type)
{
- uint32_t *bits;
-
- bits = &style->i.bits[WRITING_MODE_INDEX];
+ uint32_t *bits = &style->i.bits[WRITING_MODE_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~WRITING_MODE_MASK) | (((uint32_t)type & 0x3) <<
@@ -2487,16 +2323,14 @@ static inline css_error set_writing_mode(css_computed_style *style, uint8_t
#undef WRITING_MODE_SHIFT
#undef WRITING_MODE_MASK
-#define Z_INDEX_INDEX 11
-#define Z_INDEX_SHIFT 2
-#define Z_INDEX_MASK 0xc
+#define Z_INDEX_INDEX 10
+#define Z_INDEX_SHIFT 18
+#define Z_INDEX_MASK 0xc0000
static inline css_error set_z_index(css_computed_style *style, uint8_t type,
int32_t integer)
{
- uint32_t *bits;
-
- bits = &style->i.bits[Z_INDEX_INDEX];
+ uint32_t *bits = &style->i.bits[Z_INDEX_INDEX];
/* 2bits: tt : type */
*bits = (*bits & ~Z_INDEX_MASK) | (((uint32_t)type & 0x3) <<
diff --git a/src/select/bloom.h b/src/select/bloom.h
index 11628ab..dda4cca 100644
--- a/src/select/bloom.h
+++ b/src/select/bloom.h
@@ -9,22 +9,30 @@
* Bloom filter for CSS style selection optimisation.
*
* Attempting to match CSS rules by querying the client about DOM nodes via
- * the selection callbacks is slow. To avoid this, clients may pass a node
- * bloom filter to css_get_style. This bloom filter has bits set according
- * to the node's ancestor element names, class names and id names.
+ * the selection callbacks is slow. To avoid the slow matching of CSS rule
+ * selector chains, we build up two bloom filters. One describing the rule
+ * selector chain, and one describing the node we are selecting for in
+ * css_get_style.
+ *
+ * These bloom filters have bits set according to the node's ancestor element
+ * names, class names and id names.
*
* Generate the bloom filter by adding calling css_bloom_add_hash() on each
* ancestor element name, class name and id name for the node.
*
- * Use the insesnsitive hash value:
+ * Use the insensitive hash value:
*
* lwc_err = lwc_string_caseless_hash_value(str, &hash);
+ *
+ * We avoid matching most selector chains by checking whether the rule bloom
+ * is a subset of the node bloom.
*/
#ifndef libcss_bloom_h_
#define libcss_bloom_h_
#include <stdint.h>
+#include <string.h>
/* Size of bloom filter as multiple of 32 bits.
* Has to be 4, 8, or 16.
@@ -88,7 +96,8 @@ static inline bool css_bloom_has_hash(const css_bloom bloom[CSS_BLOOM_SIZE],
* \param b superset bloom
* \return true iff 'a' is subset of 'b'
*/
-static inline bool css_bloom_in_bloom(const css_bloom a[CSS_BLOOM_SIZE],
+static inline bool css_bloom_in_bloom(
+ const css_bloom a[CSS_BLOOM_SIZE],
const css_bloom b[CSS_BLOOM_SIZE])
{
if ((a[0] & b[0]) != a[0])
@@ -132,13 +141,14 @@ static inline bool css_bloom_in_bloom(const css_bloom a[CSS_BLOOM_SIZE],
/**
- * Merge bloom 'a' into bloom 'b'.
+ * Merge bloom \ref a into bloom \ref b.
*
* \param a bloom to insert
* \param b target bloom
*/
-static inline void css_bloom_merge(const css_bloom a[CSS_BLOOM_SIZE],
- css_bloom b[CSS_BLOOM_SIZE])
+static inline void css_bloom_merge(
+ const css_bloom a[restrict CSS_BLOOM_SIZE],
+ css_bloom b[restrict CSS_BLOOM_SIZE])
{
b[0] |= a[0];
b[1] |= a[1];
@@ -170,27 +180,7 @@ static inline void css_bloom_merge(const css_bloom a[CSS_BLOOM_SIZE],
*/
static inline void css_bloom_init(css_bloom bloom[CSS_BLOOM_SIZE])
{
- bloom[0] = 0;
- bloom[1] = 0;
- bloom[2] = 0;
- bloom[3] = 0;
-#if (CSS_BLOOM_SIZE > 4)
- bloom[4] = 0;
- bloom[5] = 0;
- bloom[6] = 0;
- bloom[7] = 0;
-#endif
-#if (CSS_BLOOM_SIZE > 8)
- bloom[8] = 0;
- bloom[9] = 0;
- bloom[10] = 0;
- bloom[11] = 0;
- bloom[12] = 0;
- bloom[13] = 0;
- bloom[14] = 0;
- bloom[15] = 0;
-#endif
+ memset(bloom, 0, sizeof(*bloom) * CSS_BLOOM_SIZE);
}
#endif
-
diff --git a/src/select/computed.c b/src/select/computed.c
index 190ca83..78f3b80 100644
--- a/src/select/computed.c
+++ b/src/select/computed.c
@@ -12,6 +12,7 @@
#include "select/dispatch.h"
#include "select/propget.h"
#include "select/propset.h"
+#include "select/unit.h"
#include "utils/utils.h"
static css_error compute_absolute_color(css_computed_style *style,
@@ -232,6 +233,37 @@ css_error css__computed_style_initialise(css_computed_style *style,
}
/**
+ * Clone a computed style
+ *
+ * \param orig Style to copy
+ * \param clone_out Returns cloned style on success
+ * \return CSS_OK on success.
+ */
+css_error css__computed_style_clone(
+ const css_computed_style *orig,
+ css_computed_style **clone_out)
+{
+ css_error error;
+ css_computed_style *clone;
+
+ error = css__computed_style_create(&clone);
+ if (error != CSS_OK) {
+ return error;
+ }
+
+ for (size_t i = 0; i < CSS_N_PROPERTIES; i++) {
+ error = prop_dispatch[i].copy(orig, clone);
+ if (error != CSS_OK) {
+ css_computed_style_destroy(clone);
+ return error;
+ }
+ }
+
+ *clone_out = clone;
+ return CSS_OK;
+}
+
+/**
* Compose two computed styles
*
* \param parent Parent style
@@ -247,9 +279,7 @@ css_error css__computed_style_initialise(css_computed_style *style,
css_error css_computed_style_compose(
const css_computed_style *restrict parent,
const css_computed_style *restrict child,
- css_error (*compute_font_size)(void *pw,
- const css_hint *parent, css_hint *size),
- void *pw,
+ const css_unit_ctx *unit_ctx,
css_computed_style **restrict result)
{
css_computed_style *composed;
@@ -275,8 +305,7 @@ css_error css_computed_style_compose(
}
/* Finally, compute absolute values for everything */
- error = css__compute_absolute_values(parent, composed,
- compute_font_size, pw);
+ error = css__compute_absolute_values(parent, composed, unit_ctx);
if (error != CSS_OK) {
return error;
}
@@ -781,6 +810,18 @@ uint8_t css_computed_opacity(const css_computed_style *style,
return get_opacity(style, opacity);
}
+uint8_t css_computed_fill_opacity(const css_computed_style *style,
+ css_fixed *fill_opacity)
+{
+ return get_fill_opacity(style, fill_opacity);
+}
+
+uint8_t css_computed_stroke_opacity(const css_computed_style *style,
+ css_fixed *stroke_opacity)
+{
+ return get_stroke_opacity(style, stroke_opacity);
+}
+
uint8_t css_computed_text_transform(const css_computed_style *style)
{
return get_text_transform(style);
@@ -897,6 +938,8 @@ uint8_t css_computed_display(const css_computed_style *style,
return CSS_DISPLAY_TABLE;
} else if (display == CSS_DISPLAY_INLINE_FLEX) {
return CSS_DISPLAY_FLEX;
+ } else if (display == CSS_DISPLAY_INLINE_GRID) {
+ return CSS_DISPLAY_GRID;
} else if (display == CSS_DISPLAY_INLINE ||
display == CSS_DISPLAY_RUN_IN ||
display == CSS_DISPLAY_TABLE_ROW_GROUP ||
@@ -1087,31 +1130,36 @@ uint8_t css_computed_order(const css_computed_style *style,
*
* \param parent Parent style, or NULL for tree root
* \param style Computed style to process
- * \param compute_font_size Callback to calculate an absolute font-size
- * \param pw Private word for callback
+ * \param unit_ctx Client length conversion context.
* \return CSS_OK on success.
*/
css_error css__compute_absolute_values(const css_computed_style *parent,
css_computed_style *style,
- css_error (*compute_font_size)(void *pw,
- const css_hint *parent, css_hint *size),
- void *pw)
+ const css_unit_ctx *unit_ctx)
{
+ css_hint_length *ref_length = NULL;
css_hint psize, size, ex_size;
css_error error;
- /* Ensure font-size is absolute */
+ /* Get reference font-size for relative sizes. */
if (parent != NULL) {
psize.status = get_font_size(parent,
&psize.data.length.value,
&psize.data.length.unit);
+ if (psize.status != CSS_FONT_SIZE_DIMENSION) {
+ return CSS_BADPARM;
+ }
+ ref_length = &psize.data.length;
}
size.status = get_font_size(style,
&size.data.length.value,
&size.data.length.unit);
- error = compute_font_size(pw, parent != NULL ? &psize : NULL, &size);
+ error = css_unit_compute_absolute_font_size(ref_length,
+ unit_ctx->root_style,
+ unit_ctx->font_size_default,
+ &size);
if (error != CSS_OK)
return error;
@@ -1125,7 +1173,12 @@ css_error css__compute_absolute_values(const css_computed_style *parent,
ex_size.status = CSS_FONT_SIZE_DIMENSION;
ex_size.data.length.value = INTTOFIX(1);
ex_size.data.length.unit = CSS_UNIT_EX;
- error = compute_font_size(pw, &size, &ex_size);
+
+ error = css_unit_compute_absolute_font_size(
+ &size.data.length,
+ unit_ctx->root_style,
+ unit_ctx->font_size_default,
+ &ex_size);
if (error != CSS_OK)
return error;
@@ -1460,6 +1513,8 @@ css_error compute_absolute_border_side_width(css_computed_style *style,
unit = ex_size->unit;
}
break;
+ default:
+ return CSS_INVALID;
}
return set(style, CSS_BORDER_WIDTH_WIDTH, length, unit);
@@ -1700,8 +1755,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);
@@ -1741,6 +1796,10 @@ css_error compute_absolute_length_pair(css_computed_style *style,
type = get(style, &length1, &unit1, &length2, &unit2);
+ if (type != CSS_BACKGROUND_POSITION_SET) {
+ return CSS_OK;
+ }
+
if (unit1 == CSS_UNIT_EX) {
length1 = FMUL(length1, ex_size->value);
unit1 = ex_size->unit;
diff --git a/src/select/computed.h b/src/select/computed.h
index c926cec..a1e4eed 100644
--- a/src/select/computed.h
+++ b/src/select/computed.h
@@ -10,6 +10,8 @@
#include <libcss/computed.h>
#include <libcss/hint.h>
+#include <libcss/unit.h>
+
#include "autogenerated_computed.h"
/**
@@ -33,10 +35,12 @@ css_error css__computed_style_create(css_computed_style **result);
css_error css__computed_style_initialise(css_computed_style *style,
struct css_select_handler *handler, void *pw);
+css_error css__computed_style_clone(
+ const css_computed_style *orig,
+ css_computed_style **clone_out);
+
css_error css__compute_absolute_values(const css_computed_style *parent,
css_computed_style *style,
- css_error (*compute_font_size)(void *pw,
- const css_hint *parent, css_hint *size),
- void *pw);
+ const css_unit_ctx *unit_ctx);
#endif
diff --git a/src/select/dispatch.c b/src/select/dispatch.c
index 30bba25..cee9335 100644
--- a/src/select/dispatch.c
+++ b/src/select/dispatch.c
@@ -15,6 +15,7 @@
css__cascade_##pname, \
css__set_##pname##_from_hint, \
css__initial_##pname, \
+ css__copy_##pname, \
css__compose_##pname
struct prop_table prop_dispatch[CSS_N_PROPERTIES] = {
@@ -513,5 +514,13 @@ struct prop_table prop_dispatch[CSS_N_PROPERTIES] = {
{
PROPERTY_FUNCS(order),
0,
+ },
+ {
+ PROPERTY_FUNCS(fill_opacity),
+ 1,
+ },
+ {
+ PROPERTY_FUNCS(stroke_opacity),
+ 1,
}
};
diff --git a/src/select/dispatch.h b/src/select/dispatch.h
index e3f93a3..8ddf4f9 100644
--- a/src/select/dispatch.h
+++ b/src/select/dispatch.h
@@ -23,6 +23,8 @@ extern struct prop_table {
css_error (*set_from_hint)(const css_hint *hint,
css_computed_style *style);
css_error (*initial)(css_select_state *state);
+ css_error (*copy)(const css_computed_style *from,
+ css_computed_style *to);
css_error (*compose)(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result);
diff --git a/src/select/format_list_style.c b/src/select/format_list_style.c
new file mode 100644
index 0000000..0e3a39e
--- /dev/null
+++ b/src/select/format_list_style.c
@@ -0,0 +1,1229 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2021 Vincent Sanders <vince@netsurf-browser.org>
+ */
+
+#include "select/propget.h"
+#include "utils/utils.h"
+
+#define SYMBOL_SIZE 8
+typedef char symbol_t[SYMBOL_SIZE];
+
+/**
+ * numeric representation of the value using a system
+ */
+struct numeric {
+ uint8_t *val; /* buffer containing the numeric values */
+ size_t len; /* length of alen */
+ size_t used; /* number of numeric values used */
+ bool negative; /* if the value is negative */
+};
+
+/**
+ * list counter style
+ */
+struct list_counter_style {
+ /** style name for debug purposes */
+ const char *name;
+ /** function to calculate the system */
+ css_error (*system)(int value, const struct list_counter_style *cstyle, struct numeric *nval);
+ /** fallback style if this system fails */
+ const struct list_counter_style* fallback;
+ /** array of symbols which represent this style */
+ const symbol_t *symbols;
+ /** symbol weights for additive schemes */
+ const int *weights;
+ /** number of items in symbol and weight table */
+ const size_t items;
+ /** range of acceptable values */
+ struct {
+ const int start; /**< first acceptable value for this style */
+ const int end; /**< last acceptable value for this style */
+ } range;
+
+ /** padding formatting */
+ struct {
+ const unsigned int length;
+ const symbol_t value;
+ } pad;
+ /** negative value formating */
+ struct {
+ const char *pre;
+ const char *post;
+ } negative;
+ /** prefix formatting */
+ const char *prefix;
+ /** suffix formatting */
+ const char *suffix;
+};
+
+
+/**
+ * Copy a null-terminated UTF-8 string to buffer at offset, if there is space
+ *
+ * \param[in] buf The output buffer
+ * \param[in] buflen The length of \a buf
+ * \param[in] pos Current position in \a buf
+ * \param[in] str The string to copy into \a buf
+ * \return The number of bytes needed in the output buffer which may be
+ * larger than \a buflen but the buffer will not be overrun
+ */
+static inline size_t
+copy_string(char *buf, const size_t buflen, size_t pos, const char *str)
+{
+ size_t sidx = 0; /* current string index */
+
+ while (str[sidx] != '\0') {
+ if (pos < buflen) {
+ buf[pos] = str[sidx];
+ }
+ pos++;
+ sidx++;
+ }
+
+ return sidx;
+}
+
+/**
+ * Copy a UTF-8 symbol to buffer at offset, if there is space
+ *
+ * \param[in] buf The output buffer
+ * \param[in] buflen The length of \a buf
+ * \param[in] pos Current position in \a buf
+ * \param[in] symbol The symbol to copy into \a buf
+ * \return The number of bytes needed in the output buffer which may be
+ * larger than \a buflen but the buffer will not be overrun
+ */
+static inline size_t
+copy_symbol(char *buf, const size_t buflen, size_t pos, const symbol_t symbol)
+{
+ size_t sidx = 0; /* current symbol index */
+
+ while ((sidx < sizeof(symbol_t)) && (symbol[sidx] != '\0')) {
+ if (pos < buflen) {
+ buf[pos] = symbol[sidx];
+ }
+ pos++;
+ sidx++;
+ }
+
+ return sidx;
+}
+
+/**
+ * maps numeric values to output values with a symbol table
+ *
+ * Takes a list of numeric values and for each one outputs the
+ * compete symbol (in utf8) to an output buffer.
+ *
+ * \param buf The output buffer
+ * \param buflen the length of \a buf
+ * \param aval array of alphabet values
+ * \param alen The number of values in \a alen
+ * \param symtab The symbol table
+ * \param symtablen The number of symbols in \a symtab
+ * \return The number of bytes needed in the output buffer whichmay be
+ * larger than \a buflen but the buffer will not be overrun
+ */
+static size_t
+nval_to_symbols(struct numeric *nval,
+ const struct list_counter_style *cstyle,
+ char *buf, const size_t buflen)
+{
+ size_t oidx = 0;
+ size_t aidx; /* numeral index */
+ const char *suffix = "."; /* default sufffix string */
+ const char *negative_pre = "-"; /* default negative string */
+
+ /* prefix */
+ if (cstyle->prefix != NULL) {
+ oidx += copy_string(buf, buflen, oidx, cstyle->prefix);
+ }
+
+ /* negative pre */
+ if (nval->negative) {
+ if (cstyle->negative.pre != NULL) {
+ negative_pre = cstyle->negative.pre;
+ }
+ oidx += copy_string(buf, buflen, oidx, negative_pre);
+ }
+
+ /* add padding if required */
+ if (nval->used < cstyle->pad.length) {
+ size_t pidx; /* padding index */
+ for (pidx = cstyle->pad.length - nval->used; pidx > 0; pidx--) {
+ oidx += copy_symbol(buf, buflen, oidx,
+ cstyle->pad.value);
+ }
+ }
+
+ /* map symbols */
+ for (aidx = 0; aidx < nval->used; aidx++) {
+ oidx += copy_symbol(buf, buflen, oidx,
+ cstyle->symbols[nval->val[aidx]]);
+ }
+
+ /* negative post */
+ if ((nval->negative) && (cstyle->negative.post != NULL)) {
+ oidx += copy_string(buf, buflen, oidx, cstyle->negative.post);
+ }
+
+ /* suffix */
+ if (cstyle->suffix != NULL) {
+ suffix = cstyle->suffix;
+ }
+ oidx += copy_string(buf, buflen, oidx, suffix);
+
+ return oidx;
+}
+
+
+/**
+ * generate numeric symbol values
+ *
+ * fills array with numeric values that represent the input value
+ *
+ * \param ares Buffer to recive the converted values
+ * \param alen the length of \a ares buffer
+ * \param value The value to convert
+ * \param cstyle The counter style in use
+ * \return The length a complete conversion which may be larger than \a alen
+ */
+static css_error
+calc_numeric_system(int value,
+ const struct list_counter_style *cstyle,
+ struct numeric *nval)
+{
+ size_t idx = 0;
+ uint8_t *first;
+ uint8_t *last;
+
+ if (value == 0) {
+ if (nval->len >= 1) {
+ nval->val[0] = 0;
+ }
+ nval->used = 1;
+ return CSS_OK;
+ }
+
+ if (value < 0) {
+ nval->negative = true;
+ value = abs(value);
+ } else {
+ nval->negative = false;
+ }
+
+ /* generate alphabet values in ascending order */
+ while (value > 0) {
+ if (idx < nval->len) {
+ nval->val[idx] = value % cstyle->items;
+ }
+ idx++;
+ value = value / cstyle->items;
+ }
+
+ /* put the values in decending order */
+ first = nval->val;
+ if (idx < nval->len) {
+ last = first + (idx - 1);
+ } else {
+ last = first + (nval->len - 1);
+ }
+ while (first < last) {
+ *first ^= *last;
+ *last ^= *first;
+ *first ^= *last;
+ first++;
+ last--;
+ }
+
+ nval->used = idx;
+
+ return CSS_OK;
+}
+
+
+/**
+ * generate cyclic symbol values
+ *
+ * fills array with cyclic values that represent the input value
+ *
+ * \param ares Buffer to recive the converted values
+ * \param alen the length of \a ares buffer
+ * \param value The value to convert
+ * \param cstyle The counter style in use
+ * \return The length a complete conversion which may be larger than \a alen
+ */
+static css_error
+calc_cyclic_system(int value,
+ const struct list_counter_style *cstyle,
+ struct numeric *nval)
+{
+ if (nval->len == 0) {
+ return CSS_INVALID;
+ }
+ if (cstyle->items == 1) {
+ /* there is only one symbol so select it */
+ nval->val[0] = 0;
+ } else {
+ nval->val[0] = (value - 1) % cstyle->items;
+ }
+ nval->used = 1;
+ nval->negative = false;
+
+ return CSS_OK;
+}
+
+
+/**
+ * generate addative symbol values
+ *
+ * fills array with numeric values that represent the input value
+ *
+ * \param ares Buffer to recive the converted values
+ * \param alen the length of \a ares buffer
+ * \param value The value to convert
+ * \param wlen The number of weights
+ * \return The length a complete conversion which may be larger than \a alen
+ */
+static css_error
+calc_additive_system(int value,
+ const struct list_counter_style *cstyle,
+ struct numeric *nval)
+{
+ size_t widx; /* weight index */
+ size_t aidx = 0; /* numerals used */
+ size_t idx;
+ size_t times; /* number of times a weight occours */
+
+ /* ensure value is within acceptable range of this system */
+ if ((value < cstyle->range.start) || (value > cstyle->range.end)) {
+ return CSS_INVALID;
+ }
+
+ /* zero needs a specific weight */
+ if (value == 0) {
+ /* search weights for a zero entry */
+ for (widx = 0; widx < cstyle->items; widx++) {
+ if (cstyle->weights[widx] == 0) {
+ if (nval->len > 0) {
+ nval->val[0] = widx;
+ }
+
+ nval->used = 1;
+ nval->negative = false;
+ return CSS_OK;
+ }
+ }
+ return CSS_INVALID;
+ }
+
+ /* negative values */
+ if (value < 0) {
+ nval->negative = true;
+ value = abs(value);
+ } else {
+ nval->negative = false;
+ }
+
+ /* iterate over the available weights */
+ for (widx = 0; widx < cstyle->items; widx++) {
+ if (cstyle->weights[widx] == 0) {
+ break;
+ }
+ times = value / cstyle->weights[widx];
+ if (times > 0) {
+ for (idx = 0;idx < times;idx++) {
+ if (aidx < nval->len) {
+ nval->val[aidx] = widx;
+ }
+ aidx++;
+ }
+
+ value -= times * cstyle->weights[widx];
+ }
+ }
+
+ nval->used = aidx;
+
+ return CSS_OK;
+}
+
+
+/**
+ * generate alphabet symbol values for latin and greek labelling
+ *
+ * fills array with alphabet values suitable for the input value
+ *
+ * \param ares Buffer to recive the converted values
+ * \param alen the length of \a ares buffer
+ * \param value The value to convert
+ * \param slen The number of symbols in the alphabet
+ * \return The length a complete conversion which may be larger than \a alen
+ */
+static css_error
+calc_alphabet_system(int value,
+ const struct list_counter_style *cstyle,
+ struct numeric *nval)
+{
+ size_t idx = 0;
+ uint8_t *first;
+ uint8_t *last;
+
+ if (value < 1) {
+ return CSS_INVALID;
+ }
+
+ /* generate alphabet values in ascending order */
+ while (value > 0) {
+ --value;
+ if (idx < nval->len) {
+ nval->val[idx] = value % cstyle->items;
+ }
+ idx++;
+ value = value / cstyle->items;
+ }
+
+ /* put the values in decending order */
+ first = nval->val;
+ if (idx < nval->len) {
+ last = first + (idx - 1);
+ } else {
+ last = first + (nval->len - 1);
+ }
+ while (first < last) {
+ *first ^= *last;
+ *last ^= *first;
+ *first ^= *last;
+ first++;
+ last--;
+ }
+
+ nval->used = idx;
+ nval->negative = false;
+
+ return CSS_OK;
+}
+
+
+/**
+ * Roman numeral conversion
+ *
+ * \return The number of numerals that are nesesary for full output
+ */
+static css_error
+calc_roman_system(int value,
+ const struct list_counter_style *cstyle,
+ struct numeric *nval)
+{
+ const int S[] = { 0, 2, 4, 2, 4, 2, 4 };
+ size_t k = 0; /* index into output buffer */
+ unsigned int i = 0; /* index into maps */
+ int r;
+ int r2 = 0;
+ size_t L;
+
+ assert(cstyle->items == 7);
+
+ /* ensure value is within acceptable range of this system */
+ if ((value < cstyle->range.start) || (value > cstyle->range.end)) {
+ return CSS_INVALID;
+ }
+
+ L = cstyle->items - 1;
+
+ while (value > 0) {
+ if (cstyle->weights[i] <= value) {
+ r = value / cstyle->weights[i];
+ value = value - (r * cstyle->weights[i]);
+ if (i < L) {
+ /* lookahead */
+ r2 = value / cstyle->weights[i+1];
+ }
+ if (i < L && r2 >= S[i+1]) {
+ /* will violate repeat boundary on next pass */
+ value = value - (r2 * cstyle->weights[i+1]);
+ if (k < nval->len) {
+ nval->val[k++] = i+1;
+ }
+ if (k < nval->len) {
+ nval->val[k++] = i-1;
+ }
+ } else if (S[i] && r >= S[i]) {
+ /* violated repeat boundary on this pass */
+ if (k < nval->len) {
+ nval->val[k++] = i;
+ }
+ if (k < nval->len) {
+ nval->val[k++] = i-1;
+ }
+ } else {
+ while ((r-- > 0) && (k < nval->len)) {
+ nval->val[k++] = i;
+ }
+ }
+ }
+ i++;
+ }
+
+ nval->used = k;
+ nval->negative = false;
+
+ return CSS_OK;
+}
+
+
+/* tables for all the counter styles */
+
+static const symbol_t decimal_symbols[] = {
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
+};
+static const struct list_counter_style lcs_decimal = {
+ .name = "decimal",
+ .system = calc_numeric_system,
+ .symbols = decimal_symbols,
+ .items = (sizeof(decimal_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t georgian_symbols[] = {
+ "ჵ",
+ "ჰ", "ჯ", "ჴ", "ხ", "ჭ", "წ", "ძ", "ც", "ჩ",
+ "შ", "ყ", "ღ", "ქ", "ფ", "ჳ", "ტ", "ს", "რ",
+ "ჟ", "პ", "ო", "ჲ", "ნ", "მ", "ლ", "კ", "ი",
+ "თ", "ჱ", "ზ", "ვ", "ე", "დ", "გ", "ბ", "ა",
+};
+static const int georgian_weights[] = {
+ 10000,
+ 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000,
+ 900, 800, 700, 600, 500, 400, 300, 200, 100,
+ 90, 80, 70, 60, 50, 40, 30, 20, 10,
+ 9, 8, 7, 6, 5, 4, 3, 2, 1
+};
+static const struct list_counter_style lcs_georgian = {
+ .name="georgian",
+ .system = calc_additive_system,
+ .fallback = &lcs_decimal,
+ .symbols = georgian_symbols,
+ .weights = georgian_weights,
+ .items = (sizeof(georgian_symbols) / SYMBOL_SIZE),
+ .range = { .start = 1, .end = 19999 },
+};
+
+
+static const symbol_t upper_armenian_symbols[] = {
+ "Ք", "Փ", "Ւ", "Ց", "Ր", "Տ", "Վ", "Ս", "Ռ",
+ "Ջ", "Պ", "Չ", "Ո", "Շ", "Ն", "Յ", "Մ", "Ճ",
+ "Ղ", "Ձ", "Հ", "Կ", "Ծ", "Խ", "Լ", "Ի", "Ժ",
+ "Թ", "Ը", "Է", "Զ", "Ե", "Դ", "Գ", "Բ", "Ա"
+};
+static const int armenian_weights[] = {
+ 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000,
+ 900, 800, 700, 600, 500, 400, 300, 200, 100,
+ 90, 80, 70, 60, 50, 40, 30, 20, 10,
+ 9, 8, 7, 6, 5, 4, 3, 2, 1
+};
+static const struct list_counter_style lcs_upper_armenian = {
+ .name = "upper-armenian",
+ .system = calc_additive_system,
+ .fallback = &lcs_decimal,
+ .symbols = upper_armenian_symbols,
+ .weights = armenian_weights,
+ .items = (sizeof(upper_armenian_symbols) / SYMBOL_SIZE),
+ .range = { .start = 1, .end = 9999 },
+};
+
+
+static const symbol_t lower_armenian_symbols[] = {
+ "ք", "փ", "ւ", "ց", "ր", "տ", "վ", "ս", "ռ",
+ "ջ", "պ", "չ", "ո", "շ", "ն", "յ", "մ", "ճ",
+ "ղ", "ձ", "հ", "կ", "ծ", "խ", "լ", "ի", "ժ",
+ "թ", "ը", "է", "զ", "ե", "դ", "գ", "բ", "ա"
+};
+static const struct list_counter_style lcs_lower_armenian = {
+ .name = "lower-armenian",
+ .system = calc_additive_system,
+ .fallback = &lcs_decimal,
+ .symbols = lower_armenian_symbols,
+ .weights = armenian_weights,
+ .items = (sizeof(lower_armenian_symbols) / SYMBOL_SIZE),
+ .range = { .start = 1, .end = 9999 },
+};
+
+
+static const struct list_counter_style lcs_decimal_leading_zero = {
+ .name = "decimal-leading-zero",
+ .system = calc_numeric_system,
+ .symbols = decimal_symbols,
+ .items = (sizeof(decimal_symbols) / SYMBOL_SIZE),
+ .pad = { .length = 2, .value = "0" },
+};
+
+
+static const symbol_t lower_greek_symbols[] = {
+ "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ",
+ "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ",
+ "φ", "χ", "ψ", "ω"
+};
+static const struct list_counter_style lcs_lower_greek = {
+ .name = "lower-greek",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = lower_greek_symbols,
+ .items = (sizeof(lower_greek_symbols) / SYMBOL_SIZE),
+};
+
+
+static const symbol_t upper_alpha_symbols[] = {
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+ "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
+ "U", "V", "W", "X", "Y", "Z"
+};
+static const struct list_counter_style lcs_upper_alpha = {
+ .name = "upper-alpha",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = upper_alpha_symbols,
+ .items = (sizeof(upper_alpha_symbols) / SYMBOL_SIZE),
+};
+
+
+static const symbol_t lower_alpha_symbols[] = {
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
+ "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
+ "u", "v", "w", "x", "y", "z"
+};
+static struct list_counter_style lcs_lower_alpha = {
+ .name = "lower-alpha",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = lower_alpha_symbols,
+ .items = (sizeof(lower_alpha_symbols) / SYMBOL_SIZE),
+};
+
+
+static const int roman_weights[] = {
+ 1000, 500, 100, 50, 10, 5, 1
+};
+static const symbol_t upper_roman_symbols[] = {
+ "M", "D", "C", "L", "X", "V", "I"
+};
+static const struct list_counter_style lcs_upper_roman = {
+ .name = "upper-roman",
+ .system = calc_roman_system,
+ .fallback = &lcs_decimal,
+ .symbols = upper_roman_symbols,
+ .weights = roman_weights,
+ .items = (sizeof(upper_roman_symbols) / SYMBOL_SIZE),
+ .range = { .start = 1, .end = 3999 },
+};
+
+
+static const symbol_t lower_roman_symbols[] = {
+ "m", "d", "c", "l", "x", "v", "i"
+};
+static const struct list_counter_style lcs_lower_roman = {
+ .name = "lower-roman",
+ .system = calc_roman_system,
+ .fallback = &lcs_decimal,
+ .symbols = lower_roman_symbols,
+ .weights = roman_weights,
+ .items = (sizeof(lower_roman_symbols) / SYMBOL_SIZE),
+ .range = { .start = 1, .end = 3999 },
+};
+
+static const symbol_t disc_symbols[] = { "\xE2\x80\xA2"}; /* 2022 BULLET */
+static const struct list_counter_style lcs_disc = {
+ .name = "disc",
+ .system = calc_cyclic_system,
+ .symbols = disc_symbols,
+ .items = (sizeof(disc_symbols) / SYMBOL_SIZE),
+ .suffix = " ",
+};
+
+static const symbol_t circle_symbols[] = { "\342\227\213"}; /* 25CB WHITE CIRCLE */
+static const struct list_counter_style lcs_circle = {
+ .name = "circle",
+ .system = calc_cyclic_system,
+ .symbols = circle_symbols,
+ .items = (sizeof(circle_symbols) / SYMBOL_SIZE),
+ .suffix = " ",
+};
+
+static const symbol_t square_symbols[] = { "\342\226\252"}; /* 25AA BLACK SMALL SQUARE */
+static const struct list_counter_style lcs_square = {
+ .name = "square",
+ .system = calc_cyclic_system,
+ .symbols = square_symbols,
+ .items = (sizeof(square_symbols) / SYMBOL_SIZE),
+ .suffix = " ",
+};
+
+static const symbol_t binary_symbols[] = { "0", "1" };
+static const struct list_counter_style lcs_binary = {
+ .name = "binary",
+ .system = calc_numeric_system,
+ .symbols = binary_symbols,
+ .items = (sizeof(binary_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t octal_symbols[] = {
+ "0", "1", "2", "3", "4", "5", "6", "7"
+};
+static const struct list_counter_style lcs_octal = {
+ .name = "octal",
+ .system = calc_numeric_system,
+ .symbols = octal_symbols,
+ .items = (sizeof(octal_symbols) / SYMBOL_SIZE),
+};
+
+
+static const symbol_t lower_hexadecimal_symbols[] = {
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+ "a", "b", "c", "d", "e", "f"
+};
+static const struct list_counter_style lcs_lower_hexadecimal = {
+ .name = "lower-hexadecimal",
+ .system = calc_numeric_system,
+ .symbols = lower_hexadecimal_symbols,
+ .items = (sizeof(lower_hexadecimal_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t upper_hexadecimal_symbols[] = {
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+ "a", "b", "c", "d", "e", "f"
+};
+static const struct list_counter_style lcs_upper_hexadecimal = {
+ .name = "upper-hexadecimal",
+ .system = calc_numeric_system,
+ .symbols = upper_hexadecimal_symbols,
+ .items = (sizeof(upper_hexadecimal_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t arabic_indic_symbols[] = {
+ "\xd9\xa0", "\xd9\xa1", "\xd9\xa2", "\xd9\xa3", "\xd9\xa4", "\xd9\xa5", "\xd9\xa6", "\xd9\xa7", "\xd9\xa8", "\xd9\xa9"
+};
+static const struct list_counter_style lcs_arabic_indic = {
+ .name = "arabic-indic",
+ .system = calc_numeric_system,
+ .symbols = arabic_indic_symbols,
+ .items = (sizeof(arabic_indic_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t bengali_symbols[] = {
+ "০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"
+};
+static const struct list_counter_style lcs_bengali = {
+ .name = "bengali",
+ .system = calc_numeric_system,
+ .symbols = bengali_symbols,
+ .items = (sizeof(bengali_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t cambodian_symbols[] = {
+ "០", "១", "២", "៣", "៤", "៥", "៦", "៧", "៨", "៩"
+};
+static const struct list_counter_style lcs_cambodian = {
+ .name = "cambodian",
+ .system = calc_numeric_system,
+ .symbols = cambodian_symbols,
+ .items = (sizeof(cambodian_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t cjk_decimal_symbols[] = {
+ "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"
+};
+static const struct list_counter_style lcs_cjk_decimal = {
+ .name = "cjk-decimal",
+ .system = calc_numeric_system,
+ .symbols = cjk_decimal_symbols,
+ .suffix = "、",
+ .items = (sizeof(cjk_decimal_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t devanagari_symbols[] = {
+ "०", "१", "२", "३", "४", "५", "६", "७", "८", "९"
+};
+static const struct list_counter_style lcs_devanagari = {
+ .name = "devanagari",
+ .system = calc_numeric_system,
+ .symbols = devanagari_symbols,
+ .items = (sizeof(devanagari_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t gujarati_symbols[] = {
+ "૦", "૧", "૨", "૩", "૪", "૫", "૬", "૭", "૮", "૯"
+};
+static const struct list_counter_style lcs_gujarati = {
+ .name = "gujarati",
+ .system = calc_numeric_system,
+ .symbols = gujarati_symbols,
+ .items = (sizeof(gujarati_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t gurmukhi_symbols[] = {
+ "੦", "੧", "੨", "੩", "੪", "੫", "੬", "੭", "੮", "੯"
+};
+static const struct list_counter_style lcs_gurmukhi = {
+ .name = "gurmukhi",
+ .system = calc_numeric_system,
+ .symbols = gurmukhi_symbols,
+ .items = (sizeof(gurmukhi_symbols) / SYMBOL_SIZE),
+};
+
+static const int hebrew_weights[] = {
+ 10000,
+ 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000,
+ 400, 300, 200, 100,
+ 90, 80, 70, 60, 50, 40, 30, 20, 19, 18, 17, 16, 15, 10,
+ 9, 8, 7, 6, 5, 4, 3, 2, 1
+};
+static const symbol_t hebrew_symbols[] = {
+ "\xD7\x99\xD7\xB3",
+ "\xD7\x98\xD7\xB3", "\xD7\x97\xD7\xB3", "\xD7\x96\xD7\xB3", "\xD7\x95\xD7\xB3", "\xD7\x94\xD7\xB3", "\xD7\x93\xD7\xB3", "\xD7\x92\xD7\xB3", "\xD7\x91\xD7\xB3", "\xD7\x90\xD7\xB3",
+ "\xD7\xAA", "\xD7\xA9", "\xD7\xA8", "\xD7\xA7",
+ "\xD7\xA6", "\xD7\xA4", "\xD7\xA2", "\xD7\xA1", "\xD7\xA0", "\xD7\x9E", "\xD7\x9C", /* 20 */"\xD7\x9B", "\xD7\x99\xD7\x98", "\xD7\x99\xD7\x97", "\xD7\x99\xD7\x96", "\xD7\x98\xD7\x96", "\xD7\x98\xD7\x95", "\xD7\x99",
+ "\xD7\x98", "\xD7\x97", "\xD7\x96", "\xD7\x95", "\xD7\x94", "\xD7\x93", "\xD7\x92", "\xD7\x91", "\xD7\x90"
+};
+static const struct list_counter_style lcs_hebrew = {
+ .name = "hebrew",
+ .system = calc_additive_system,
+ .fallback = &lcs_decimal,
+ .symbols = hebrew_symbols,
+ .weights = hebrew_weights,
+ .items = (sizeof(hebrew_symbols) / SYMBOL_SIZE),
+ .range = { .start = 1, .end = 10999 },
+};
+
+static const symbol_t kannada_symbols[] = {
+ "\xE0\xB3\xA6", "\xE0\xB3\xA7", "\xE0\xB3\xA8", "\xE0\xB3\xA9", "\xE0\xB3\xAA", "\xE0\xB3\xAB", "\xE0\xB3\xAC", "\xE0\xB3\xAD", "\xE0\xB3\xAE", "\xE0\xB3\xAF"
+};
+static const struct list_counter_style lcs_kannada = {
+ .name = "kannada",
+ .system = calc_numeric_system,
+ .symbols = kannada_symbols,
+ .items = (sizeof(kannada_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t lao_symbols[] = {
+ "໐", "໑", "໒", "໓", "໔", "໕", "໖", "໗", "໘", "໙"
+};
+static const struct list_counter_style lcs_lao = {
+ .name = "lao",
+ .system = calc_numeric_system,
+ .symbols = lao_symbols,
+ .items = (sizeof(lao_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t malayalam_symbols[] = {
+ "൦", "൧", "൨", "൩", "൪", "൫", "൬", "൭", "൮", "൯"
+};
+static const struct list_counter_style lcs_malayalam = {
+ .name = "malayalam",
+ .system = calc_numeric_system,
+ .symbols = malayalam_symbols,
+ .items = (sizeof(malayalam_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t mongolian_symbols[] = {
+ "᠐", "᠑", "᠒", "᠓", "᠔", "᠕", "᠖", "᠗", "᠘", "᠙"
+};
+static const struct list_counter_style lcs_mongolian = {
+ .name = "mongolian",
+ .system = calc_numeric_system,
+ .symbols = mongolian_symbols,
+ .items = (sizeof(mongolian_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t myanmar_symbols[] = {
+ "၀", "၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉"
+};
+static const struct list_counter_style lcs_myanmar = {
+ .name = "myanmar",
+ .system = calc_numeric_system,
+ .symbols = myanmar_symbols,
+ .items = (sizeof(myanmar_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t oriya_symbols[] = {
+ "୦", "୧", "୨", "୩", "୪", "୫", "୬", "୭", "୮", "୯"
+};
+static const struct list_counter_style lcs_oriya = {
+ .name = "oriya",
+ .system = calc_numeric_system,
+ .symbols = oriya_symbols,
+ .items = (sizeof(oriya_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t persian_symbols[] = {
+ "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"
+};
+static const struct list_counter_style lcs_persian = {
+ .name = "persian",
+ .system = calc_numeric_system,
+ .symbols = persian_symbols,
+ .items = (sizeof(persian_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t tamil_symbols[] = {
+ "௦", "௧", "௨", "௩", "௪", "௫", "௬", "௭", "௮", "௯"
+};
+static const struct list_counter_style lcs_tamil = {
+ .name = "tamil",
+ .system = calc_numeric_system,
+ .symbols = tamil_symbols,
+ .items = (sizeof(tamil_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t telugu_symbols[] = {
+ "౦", "౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯"
+};
+static const struct list_counter_style lcs_telugu = {
+ .name = "telugu",
+ .system = calc_numeric_system,
+ .symbols = telugu_symbols,
+ .items = (sizeof(telugu_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t thai_symbols[] = {
+ "๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙"
+};
+static const struct list_counter_style lcs_thai = {
+ .name = "thai",
+ .system = calc_numeric_system,
+ .symbols = thai_symbols,
+ .items = (sizeof(thai_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t tibetan_symbols[] = {
+ "༠", "༡", "༢", "༣", "༤", "༥", "༦", "༧", "༨", "༩"
+};
+static const struct list_counter_style lcs_tibetan = {
+ .name = "tibetan",
+ .system = calc_numeric_system,
+ .symbols = tibetan_symbols,
+ .items = (sizeof(tibetan_symbols) / SYMBOL_SIZE),
+};
+
+static const symbol_t cjk_earthly_branch_symbols[] = {
+ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"
+};
+static struct list_counter_style lcs_cjk_earthly_branch = {
+ .name = "cjk-earthly-branch",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = cjk_earthly_branch_symbols,
+ .items = (sizeof(cjk_earthly_branch_symbols) / SYMBOL_SIZE),
+ .suffix = "、",
+};
+
+static const symbol_t cjk_heavenly_stem_symbols[] = {
+ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"
+};
+static struct list_counter_style lcs_cjk_heavenly_stem = {
+ .name = "cjk-heavenly-stem",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = cjk_heavenly_stem_symbols,
+ .items = (sizeof(cjk_heavenly_stem_symbols) / SYMBOL_SIZE),
+ .suffix = "、",
+};
+
+static const symbol_t hiragana_symbols[] = {
+ "あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "や", "ゆ", "よ", "ら", "り", "る", "れ", "ろ", "わ", "ゐ", "ゑ", "を", "ん"
+};
+static struct list_counter_style lcs_hiragana = {
+ .name = "hiragana",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = hiragana_symbols,
+ .items = (sizeof(hiragana_symbols) / SYMBOL_SIZE),
+ .suffix = "、",
+};
+
+static const symbol_t hiragana_iroha_symbols[] = {
+ "い", "ろ", "は", "に", "ほ", "へ", "と", "ち", "り", "ぬ", "る", "を", "わ", "か", "よ", "た", "れ", "そ", "つ", "ね", "な", "ら", "む", "う", "ゐ", "の", "お", "く", "や", "ま", "け", "ふ", "こ", "え", "て", "あ", "さ", "き", "ゆ", "め", "み", "し", "ゑ", "ひ", "も", "せ", "す"
+};
+static struct list_counter_style lcs_hiragana_iroha = {
+ .name = "hiragana-iroha",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = hiragana_iroha_symbols,
+ .items = (sizeof(hiragana_iroha_symbols) / SYMBOL_SIZE),
+ .suffix = "、",
+};
+
+static const symbol_t katakana_symbols[] = {
+ "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ヰ", "ヱ", "ヲ", "ン"
+};
+static struct list_counter_style lcs_katakana = {
+ .name = "katakana",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = katakana_symbols,
+ .items = (sizeof(katakana_symbols) / SYMBOL_SIZE),
+ .suffix = "、",
+};
+
+static const symbol_t katakana_iroha_symbols[] = {
+ "イ", "ロ", "ハ", "ニ", "ホ", "ヘ", "ト", "チ", "リ", "ヌ", "ル", "ヲ", "ワ", "カ", "ヨ", "タ", "レ", "ソ", "ツ", "ネ", "ナ", "ラ", "ム", "ウ", "ヰ", "ノ", "オ", "ク", "ヤ", "マ", "ケ", "フ", "コ", "エ", "テ", "ア", "サ", "キ", "ユ", "メ", "ミ", "シ", "ヱ", "ヒ", "モ", "セ", "ス"
+};
+static struct list_counter_style lcs_katakana_iroha = {
+ .name = "katakana-iroha",
+ .system = calc_alphabet_system,
+ .fallback = &lcs_decimal,
+ .symbols = katakana_iroha_symbols,
+ .items = (sizeof(katakana_iroha_symbols) / SYMBOL_SIZE),
+ .suffix = "、",
+};
+
+/**
+ * weights suitable for the five complex addative styles
+ */
+static const int complex_counter_weights[] = {
+ 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000,
+ 900, 800, 700, 600, 500, 400, 300, 200, 100,
+ 90, 80, 70, 60, 50, 40, 30, 20, 10,
+ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+};
+static const symbol_t japanese_informal_symbols[] = {
+ "九千", "八千", "七千", "六千", "五千", "四千", "三千", "二千", "千",
+ "九百", "八百", "七百", "六百", "五百", "四百", "三百", "二百", "百",
+ "九十", "八十", "七十", "六十", "五十", "四十", "三十", "二十", "十",
+ "九", "八", "七", "六", "五", "四", "三", "二", "一", "〇",
+};
+static const struct list_counter_style lcs_japanese_informal = {
+ .name = "japanese-informal",
+ .system = calc_additive_system,
+ .fallback = &lcs_cjk_decimal,
+ .symbols = japanese_informal_symbols,
+ .weights = complex_counter_weights,
+ .items = (sizeof(japanese_informal_symbols) / SYMBOL_SIZE),
+ .range = { .start = -9999, .end = 9999 },
+ .negative = { .pre = "マイナス" },
+ .suffix = "\xE3\x80\x81",
+};
+
+static const symbol_t japanese_formal_symbols[] = {
+ "九阡", "八阡", "七阡", "六阡", "伍阡", "四阡", "参阡", "弐阡", "壱阡",
+ "九百", "八百", "七百", "六百", "伍百", "四百", "参百", "弐百", "壱百",
+ "九拾", "八拾", "七拾", "六拾", "伍拾", "四拾", "参拾", "弐拾", "壱拾",
+ "九", "八", "七", "六", "伍", "四", "参", "弐", "壱", "零",
+};
+static const struct list_counter_style lcs_japanese_formal = {
+ .name = "japanese-formal",
+ .system = calc_additive_system,
+ .fallback = &lcs_cjk_decimal,
+ .symbols = japanese_formal_symbols,
+ .weights = complex_counter_weights,
+ .items = (sizeof(japanese_formal_symbols) / SYMBOL_SIZE),
+ .range = { .start = -9999, .end = 9999 },
+ .negative = { .pre = "マイナス" },
+ .suffix = "\xE3\x80\x81",
+};
+
+static const symbol_t korean_hangul_formal_symbols[] = {
+ "구천", "팔천", "칠천", "육천", "오천", "사천", "삼천", "이천", "일천",
+ "구백", "팔백", "칠백", "육백", "오백", "사백", "삼백", "이백", "일백",
+ "구십", "팔십", "칠십", "육십", "오십", "사십", "삼십", "이십", "일십",
+ "구", "팔", "칠", "육", "오", "사", "삼", "이", "일", "영"
+};
+static const struct list_counter_style lcs_korean_hangul_formal = {
+ .name = "korean-hangul-formal",
+ .system = calc_additive_system,
+ .fallback = &lcs_cjk_decimal,
+ .symbols = korean_hangul_formal_symbols,
+ .weights = complex_counter_weights,
+ .items = (sizeof(korean_hangul_formal_symbols) / SYMBOL_SIZE),
+ .range = { .start = -9999, .end = 9999 },
+ .negative = { .pre = "\xEB\xA7\x88\xEC\x9D\xB4\xEB\x84\x88\xEC\x8A\xA4 " },
+ .suffix = ", ",
+};
+
+static const symbol_t korean_hanja_informal_symbols[] = {
+ "九千", "八千", "七千", "六千", "五千", "四千", "三千", "二千", "千",
+ "九百", "八百", "七百", "六百", "五百", "四百", "三百", "二百", "百",
+ "九十", "八十", "七十", "六十", "五十", "四十", "三十", "二十", "十",
+ "九", "八", "七", "六", "五", "四", "三", "二", "一", "零"
+};
+static const struct list_counter_style lcs_korean_hanja_informal = {
+ .name = "korean-hanja-informal",
+ .system = calc_additive_system,
+ .fallback = &lcs_cjk_decimal,
+ .symbols = korean_hanja_informal_symbols,
+ .weights = complex_counter_weights,
+ .items = (sizeof(korean_hanja_informal_symbols) / SYMBOL_SIZE),
+ .range = { .start = -9999, .end = 9999 },
+ .negative = { .pre = "\xEB\xA7\x88\xEC\x9D\xB4\xEB\x84\x88\xEC\x8A\xA4 " },
+ .suffix = ", ",
+};
+
+static const symbol_t korean_hanja_formal_symbols[] = {
+ "九仟", "八仟", "七仟", "六仟", "五仟", "四仟", "參仟", "貳仟", "壹仟",
+ "九百", "八百", "七百", "六百", "五百", "四百", "參百", "貳百", "壹百",
+ "九拾", "八拾", "七拾", "六拾", "五拾", "四拾", "參拾", "貳拾", "壹拾",
+ "九", "八", "七", "六", "五", "四", "參", "貳", "壹", "零"
+};
+static const struct list_counter_style lcs_korean_hanja_formal = {
+ .name = "korean-hanja-formal",
+ .system = calc_additive_system,
+ .fallback = &lcs_cjk_decimal,
+ .symbols = korean_hanja_formal_symbols,
+ .weights = complex_counter_weights,
+ .items = (sizeof(korean_hanja_formal_symbols) / SYMBOL_SIZE),
+ .range = { .start = -9999, .end = 9999 },
+ .negative = { .pre = "\xEB\xA7\x88\xEC\x9D\xB4\xEB\x84\x88\xEC\x8A\xA4 " },
+ .suffix = ", ",
+};
+
+
+
+static const struct list_counter_style *
+counter_style_from_computed_style(const css_computed_style *style)
+{
+ switch (get_list_style_type(style)) {
+ case CSS_LIST_STYLE_TYPE_DISC:
+ return &lcs_disc;
+ case CSS_LIST_STYLE_TYPE_CIRCLE:
+ return &lcs_circle;
+ case CSS_LIST_STYLE_TYPE_SQUARE:
+ return &lcs_square;
+ case CSS_LIST_STYLE_TYPE_DECIMAL:
+ return &lcs_decimal;
+ case CSS_LIST_STYLE_TYPE_DECIMAL_LEADING_ZERO:
+ return &lcs_decimal_leading_zero;
+ case CSS_LIST_STYLE_TYPE_LOWER_ROMAN:
+ return &lcs_lower_roman;
+ case CSS_LIST_STYLE_TYPE_UPPER_ROMAN:
+ return &lcs_upper_roman;
+ case CSS_LIST_STYLE_TYPE_LOWER_GREEK:
+ return &lcs_lower_greek;
+ case CSS_LIST_STYLE_TYPE_LOWER_ALPHA:
+ case CSS_LIST_STYLE_TYPE_LOWER_LATIN:
+ return &lcs_lower_alpha;
+ case CSS_LIST_STYLE_TYPE_UPPER_ALPHA:
+ case CSS_LIST_STYLE_TYPE_UPPER_LATIN:
+ return &lcs_upper_alpha;
+ case CSS_LIST_STYLE_TYPE_UPPER_ARMENIAN:
+ case CSS_LIST_STYLE_TYPE_ARMENIAN:
+ return &lcs_upper_armenian;
+ case CSS_LIST_STYLE_TYPE_GEORGIAN:
+ return &lcs_georgian;
+ case CSS_LIST_STYLE_TYPE_NONE:
+ return NULL;
+ case CSS_LIST_STYLE_TYPE_BINARY:
+ return &lcs_binary;
+ case CSS_LIST_STYLE_TYPE_OCTAL:
+ return &lcs_octal;
+ case CSS_LIST_STYLE_TYPE_LOWER_HEXADECIMAL:
+ return &lcs_lower_hexadecimal;
+ case CSS_LIST_STYLE_TYPE_UPPER_HEXADECIMAL:
+ return &lcs_upper_hexadecimal;
+ case CSS_LIST_STYLE_TYPE_ARABIC_INDIC:
+ return &lcs_arabic_indic;
+ case CSS_LIST_STYLE_TYPE_LOWER_ARMENIAN:
+ return &lcs_lower_armenian;
+ case CSS_LIST_STYLE_TYPE_BENGALI:
+ return &lcs_bengali;
+ case CSS_LIST_STYLE_TYPE_CAMBODIAN:
+ case CSS_LIST_STYLE_TYPE_KHMER:
+ return &lcs_cambodian;
+ case CSS_LIST_STYLE_TYPE_CJK_DECIMAL:
+ return &lcs_cjk_decimal;
+ case CSS_LIST_STYLE_TYPE_DEVANAGARI:
+ return &lcs_devanagari;
+ case CSS_LIST_STYLE_TYPE_GUJARATI:
+ return &lcs_gujarati;
+ case CSS_LIST_STYLE_TYPE_GURMUKHI:
+ return &lcs_gurmukhi;
+ case CSS_LIST_STYLE_TYPE_HEBREW:
+ return &lcs_hebrew;
+ case CSS_LIST_STYLE_TYPE_KANNADA:
+ return &lcs_kannada;
+ case CSS_LIST_STYLE_TYPE_LAO:
+ return &lcs_lao;
+ case CSS_LIST_STYLE_TYPE_MALAYALAM:
+ return &lcs_malayalam;
+ case CSS_LIST_STYLE_TYPE_MONGOLIAN:
+ return &lcs_mongolian;
+ case CSS_LIST_STYLE_TYPE_MYANMAR:
+ return &lcs_myanmar;
+ case CSS_LIST_STYLE_TYPE_ORIYA:
+ return &lcs_oriya;
+ case CSS_LIST_STYLE_TYPE_PERSIAN:
+ return &lcs_persian;
+ case CSS_LIST_STYLE_TYPE_TAMIL:
+ return &lcs_tamil;
+ case CSS_LIST_STYLE_TYPE_TELUGU:
+ return &lcs_telugu;
+ case CSS_LIST_STYLE_TYPE_THAI:
+ return &lcs_thai;
+ case CSS_LIST_STYLE_TYPE_TIBETAN:
+ return &lcs_tibetan;
+ case CSS_LIST_STYLE_TYPE_CJK_EARTHLY_BRANCH:
+ return &lcs_cjk_earthly_branch;
+ case CSS_LIST_STYLE_TYPE_CJK_HEAVENLY_STEM:
+ return &lcs_cjk_heavenly_stem;
+ case CSS_LIST_STYLE_TYPE_HIAGANA:
+ return &lcs_hiragana;
+ case CSS_LIST_STYLE_TYPE_HIAGANA_IROHA:
+ return &lcs_hiragana_iroha;
+ case CSS_LIST_STYLE_TYPE_KATAKANA:
+ return &lcs_katakana;
+ case CSS_LIST_STYLE_TYPE_KATAKANA_IROHA:
+ return &lcs_katakana_iroha;
+ case CSS_LIST_STYLE_TYPE_JAPANESE_INFORMAL:
+ return &lcs_japanese_informal;
+ case CSS_LIST_STYLE_TYPE_JAPANESE_FORMAL:
+ return &lcs_japanese_formal;
+ case CSS_LIST_STYLE_TYPE_KOREAN_HANGUL_FORMAL:
+ return &lcs_korean_hangul_formal;
+ case CSS_LIST_STYLE_TYPE_KOREAN_HANJA_INFORMAL:
+ return &lcs_korean_hanja_informal;
+ case CSS_LIST_STYLE_TYPE_KOREAN_HANJA_FORMAL:
+ return &lcs_korean_hanja_formal;
+ }
+ return NULL;
+}
+
+
+/* exported interface defined in select.h */
+css_error css_computed_format_list_style(
+ const css_computed_style *style,
+ int value,
+ char *buffer,
+ size_t buffer_length,
+ size_t *format_length)
+{
+ css_error res = CSS_INVALID;
+ const struct list_counter_style *cstyle;
+ uint8_t aval[20];
+ struct numeric nval = {
+ .val = aval,
+ .len = sizeof(aval),
+ .used = 0,
+ .negative = false
+ };
+
+
+ cstyle = counter_style_from_computed_style(style);
+ while (cstyle != NULL) {
+ res = cstyle->system(value, cstyle, &nval);
+
+ if ((res == CSS_OK) &&
+ (nval.used < nval.len)) {
+ /* system sucessfully generated numeric values */
+ *format_length = nval_to_symbols(&nval,
+ cstyle,
+ buffer,
+ buffer_length);
+ break;
+ }
+
+ res = CSS_INVALID;
+ cstyle = cstyle->fallback;
+ }
+
+ return res;
+}
diff --git a/src/select/hash.c b/src/select/hash.c
index 92457d8..12e82aa 100644
--- a/src/select/hash.c
+++ b/src/select/hash.c
@@ -8,6 +8,8 @@
#include <stdio.h>
#include <string.h>
+#include <libcss/hint.h>
+
#include "stylesheet.h"
#include "select/hash.h"
#include "select/mq.h"
@@ -368,7 +370,8 @@ css_error css__selector_hash_find(css_selector_hash *hash,
head->sel_chain_bloom,
req->node_bloom) &&
mq_rule_good_for_media(head->sel->rule,
- req->media)) {
+ req->unit_ctx, req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -444,10 +447,12 @@ css_error css__selector_hash_find_by_class(css_selector_hash *hash,
_chain_good_for_element_name(
head->sel,
&(req->qname),
- req->uni) &&
+ req->str->universal) &&
mq_rule_good_for_media(
head->sel->rule,
- req->media)) {
+ req->unit_ctx,
+ req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -524,10 +529,12 @@ css_error css__selector_hash_find_by_id(css_selector_hash *hash,
_chain_good_for_element_name(
head->sel,
&req->qname,
- req->uni) &&
+ req->str->universal) &&
mq_rule_good_for_media(
head->sel->rule,
- req->media)) {
+ req->unit_ctx,
+ req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -577,7 +584,8 @@ css_error css__selector_hash_find_universal(css_selector_hash *hash,
head->sel_chain_bloom,
req->node_bloom) &&
mq_rule_good_for_media(head->sel->rule,
- req->media)) {
+ req->unit_ctx, req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -757,7 +765,7 @@ static void print_chain_bloom_details(css_bloom bloom[CSS_BLOOM_SIZE])
{
printf("Chain bloom:\t");
int total = 0, i;
- int set[4];
+ int set[CSS_BLOOM_SIZE];
for (i = 0; i < CSS_BLOOM_SIZE; i++) {
set[i] = bits_set(bloom[i]);
total += set[i];
@@ -815,24 +823,23 @@ css_error _insert_into_chain(css_selector_hash *ctx, hash_entry *head,
search = search->next;
} while (search != NULL);
- entry->sel = selector;
- _chain_bloom_generate(selector, entry->sel_chain_bloom);
-
-#ifdef PRINT_CHAIN_BLOOM_DETAILS
- print_chain_bloom_details(entry->sel_chain_bloom);
-#endif
-
if (prev == NULL) {
- hash_entry temp;
- entry->next = entry;
- temp = *entry;
*entry = *head;
- *head = temp;
+ head->next = entry;
+
+ entry = head;
} else {
entry->next = prev->next;
prev->next = entry;
}
+ entry->sel = selector;
+ _chain_bloom_generate(selector, entry->sel_chain_bloom);
+
+#ifdef PRINT_CHAIN_BLOOM_DETAILS
+ print_chain_bloom_details(entry->sel_chain_bloom);
+#endif
+
ctx->hash_size += sizeof(hash_entry);
}
@@ -921,7 +928,8 @@ css_error _iterate_elements(
head->sel_chain_bloom,
req->node_bloom) &&
mq_rule_good_for_media(head->sel->rule,
- req->media)) {
+ req->unit_ctx, req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -978,10 +986,12 @@ css_error _iterate_classes(
_chain_good_for_element_name(
head->sel,
&(req->qname),
- req->uni) &&
+ req->str->universal) &&
mq_rule_good_for_media(
head->sel->rule,
- req->media)) {
+ req->unit_ctx,
+ req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -1039,10 +1049,12 @@ css_error _iterate_ids(
_chain_good_for_element_name(
head->sel,
&req->qname,
- req->uni) &&
+ req->str->universal) &&
mq_rule_good_for_media(
head->sel->rule,
- req->media)) {
+ req->unit_ctx,
+ req->media,
+ req->str)) {
/* Found a match */
break;
}
@@ -1085,7 +1097,8 @@ css_error _iterate_universal(
head->sel_chain_bloom,
req->node_bloom) &&
mq_rule_good_for_media(head->sel->rule,
- req->media)) {
+ req->unit_ctx, req->media,
+ req->str)) {
/* Found a match */
break;
}
diff --git a/src/select/hash.h b/src/select/hash.h
index aecf15a..5f48a38 100644
--- a/src/select/hash.h
+++ b/src/select/hash.h
@@ -10,10 +10,12 @@
#include <libwapcaplet/libwapcaplet.h>
+#include <libcss/unit.h>
#include <libcss/errors.h>
#include <libcss/functypes.h>
#include "select/bloom.h"
+#include "select/strings.h"
/* Ugh. We need this to avoid circular includes. Happy! */
struct css_selector;
@@ -24,8 +26,9 @@ struct css_hash_selection_requirments {
css_qname qname; /* Element name, or universal "*" */
lwc_string *class; /* Name of class, or NULL */
lwc_string *id; /* Name of id, or NULL */
- lwc_string *uni; /* Universal element string "*" */
+ const css_select_strings *str; /* Selection strings */
const css_media *media; /* Media spec we're selecting for */
+ const css_unit_ctx *unit_ctx; /* Document unit conversion context. */
const css_bloom *node_bloom; /* Node's bloom filter */
};
diff --git a/src/select/helpers.h b/src/select/helpers.h
new file mode 100644
index 0000000..19ff7de
--- /dev/null
+++ b/src/select/helpers.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org>
+ */
+
+#ifndef css_select_helpers_h_
+#define css_select_helpers_h_
+
+/**
+ * Convert unit bytecode to a css_unit.
+ */
+static inline css_unit css__to_css_unit(uint32_t u)
+{
+ switch (u) {
+ case UNIT_PX: return CSS_UNIT_PX;
+ case UNIT_EX: return CSS_UNIT_EX;
+ case UNIT_EM: return CSS_UNIT_EM;
+ case UNIT_IN: return CSS_UNIT_IN;
+ case UNIT_CM: return CSS_UNIT_CM;
+ case UNIT_MM: return CSS_UNIT_MM;
+ case UNIT_PT: return CSS_UNIT_PT;
+ case UNIT_PC: return CSS_UNIT_PC;
+ case UNIT_CH: return CSS_UNIT_CH;
+ case UNIT_REM: return CSS_UNIT_REM;
+ case UNIT_LH: return CSS_UNIT_LH;
+ case UNIT_VH: return CSS_UNIT_VH;
+ case UNIT_VW: return CSS_UNIT_VW;
+ case UNIT_VI: return CSS_UNIT_VI;
+ case UNIT_VB: return CSS_UNIT_VB;
+ case UNIT_VMIN: return CSS_UNIT_VMIN;
+ case UNIT_VMAX: return CSS_UNIT_VMAX;
+ case UNIT_Q: return CSS_UNIT_Q;
+ case UNIT_PCT: return CSS_UNIT_PCT;
+ case UNIT_DEG: return CSS_UNIT_DEG;
+ case UNIT_GRAD: return CSS_UNIT_GRAD;
+ case UNIT_RAD: return CSS_UNIT_RAD;
+ case UNIT_MS: return CSS_UNIT_MS;
+ case UNIT_S: return CSS_UNIT_S;
+ case UNIT_HZ: return CSS_UNIT_HZ;
+ case UNIT_KHZ: return CSS_UNIT_KHZ;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/src/select/mq.h b/src/select/mq.h
index c01144b..89da2c5 100644
--- a/src/select/mq.h
+++ b/src/select/mq.h
@@ -9,112 +9,15 @@
#ifndef css_select_mq_h_
#define css_select_mq_h_
-static inline css_fixed css_len2px(
- css_fixed length,
- css_unit unit,
- const css_media *media)
-{
- css_fixed px_per_unit;
-
- switch (unit) {
- case CSS_UNIT_VI:
- /* TODO: Assumes writing mode. */
- unit = CSS_UNIT_VW;
- break;
- case CSS_UNIT_VB:
- /* TODO: Assumes writing mode. */
- unit = CSS_UNIT_VH;
- break;
- case CSS_UNIT_VMIN:
- unit = (media->height < media->width) ?
- CSS_UNIT_VH : CSS_UNIT_VW;
- break;
- case CSS_UNIT_VMAX:
- unit = (media->width > media->height) ?
- CSS_UNIT_VH : CSS_UNIT_VW;
- break;
- default:
- break;
- }
-
- switch (unit) {
- case CSS_UNIT_EM:
- case CSS_UNIT_EX:
- case CSS_UNIT_CAP:
- case CSS_UNIT_CH:
- case CSS_UNIT_IC:
- {
- px_per_unit = FDIV(FMUL(media->client_font_size, F_96), F_72);
-
- /* TODO: Handling these as fixed ratios of CSS_UNIT_EM. */
- switch (unit) {
- case CSS_UNIT_EX:
- px_per_unit = FMUL(px_per_unit, FLTTOFIX(0.6));
- break;
- case CSS_UNIT_CAP:
- px_per_unit = FMUL(px_per_unit, FLTTOFIX(0.9));
- break;
- case CSS_UNIT_CH:
- px_per_unit = FMUL(px_per_unit, FLTTOFIX(0.4));
- break;
- case CSS_UNIT_IC:
- px_per_unit = FMUL(px_per_unit, FLTTOFIX(1.1));
- break;
- default:
- break;
- }
- }
- break;
- case CSS_UNIT_PX:
- return length;
- case CSS_UNIT_IN:
- px_per_unit = F_96;
- break;
- case CSS_UNIT_CM:
- px_per_unit = FDIV(F_96, FLTTOFIX(2.54));
- break;
- case CSS_UNIT_MM:
- px_per_unit = FDIV(F_96, FLTTOFIX(25.4));
- break;
- case CSS_UNIT_Q:
- px_per_unit = FDIV(F_96, FLTTOFIX(101.6));
- break;
- case CSS_UNIT_PT:
- px_per_unit = FDIV(F_96, F_72);
- break;
- case CSS_UNIT_PC:
- px_per_unit = FDIV(F_96, INTTOFIX(6));
- break;
- case CSS_UNIT_REM:
- px_per_unit = FDIV(FMUL(media->client_font_size, F_96), F_72);
- break;
- case CSS_UNIT_RLH:
- px_per_unit = media->client_line_height;
- break;
- case CSS_UNIT_VH:
- px_per_unit = FDIV(media->height, F_100);
- break;
- case CSS_UNIT_VW:
- px_per_unit = FDIV(media->width, F_100);
- break;
- default:
- px_per_unit = 0;
- break;
- }
-
- /* Ensure we round px_per_unit to the nearest whole number of pixels:
- * the use of FIXTOINT() below will truncate. */
- px_per_unit += F_0_5;
-
- /* Calculate total number of pixels */
- return FMUL(length, TRUNCATEFIX(px_per_unit));
-}
+#include "select/helpers.h"
+#include "select/strings.h"
+#include "select/unit.h"
static inline bool mq_match_feature_range_length_op1(
css_mq_feature_op op,
const css_mq_value *value,
const css_fixed client_len,
- const css_media *media)
+ const css_unit_ctx *unit_ctx)
{
css_fixed v;
@@ -122,9 +25,10 @@ static inline bool mq_match_feature_range_length_op1(
return false;
}
- if (value->data.dim.unit != CSS_UNIT_PX) {
- v = css_len2px(value->data.dim.len,
- value->data.dim.unit, media);
+ if (value->data.dim.unit != UNIT_PX) {
+ v = css_unit_len2px_mq(unit_ctx,
+ value->data.dim.len,
+ css__to_css_unit(value->data.dim.unit));
} else {
v = value->data.dim.len;
}
@@ -145,7 +49,7 @@ static inline bool mq_match_feature_range_length_op2(
css_mq_feature_op op,
const css_mq_value *value,
const css_fixed client_len,
- const css_media *media)
+ const css_unit_ctx *unit_ctx)
{
css_fixed v;
@@ -156,9 +60,10 @@ static inline bool mq_match_feature_range_length_op2(
return false;
}
- if (value->data.dim.unit != CSS_UNIT_PX) {
- v = css_len2px(value->data.dim.len,
- value->data.dim.unit, media);
+ if (value->data.dim.unit != UNIT_PX) {
+ v = css_unit_len2px_mq(unit_ctx,
+ value->data.dim.len,
+ css__to_css_unit(value->data.dim.unit));
} else {
v = value->data.dim.len;
}
@@ -174,34 +79,79 @@ static inline bool mq_match_feature_range_length_op2(
}
}
+static inline bool mq_match_feature_eq_ident_op1(
+ css_mq_feature_op op,
+ const css_mq_value *value,
+ const lwc_string *client_value)
+{
+ bool is_match;
+
+ if (value->type != CSS_MQ_VALUE_TYPE_IDENT) {
+ return false;
+ }
+
+ if (value->data.ident == NULL || client_value == NULL) {
+ return false;
+ }
+
+ switch (op) {
+ case CSS_MQ_FEATURE_OP_EQ:
+ return (lwc_string_isequal(value->data.ident,
+ client_value, &is_match) == lwc_error_ok) &&
+ is_match;
+ default:
+ return false;
+ }
+}
+
/**
* Match media query features.
*
- * \param[in] feat Condition to match.
- * \param[in] media Current media spec, to check against feat.
+ * \param[in] feat Condition to match.
+ * \param[in] unit_ctx Current unit conversion context.
+ * \param[in] media Current media spec, to check against feat.
* \return true if condition matches, otherwise false.
*/
static inline bool mq_match_feature(
const css_mq_feature *feat,
- const css_media *media)
+ const css_unit_ctx *unit_ctx,
+ const css_media *media,
+ const css_select_strings *str)
{
+ bool match;
+
/* TODO: Use interned string for comparison. */
- if (strcmp(lwc_string_data(feat->name), "width") == 0) {
+ if (lwc_string_isequal(feat->name,
+ str->width, &match) == lwc_error_ok &&
+ match == true) {
if (!mq_match_feature_range_length_op1(feat->op, &feat->value,
- media->width, media)) {
+ media->width, unit_ctx)) {
return false;
}
return mq_match_feature_range_length_op2(feat->op2,
- &feat->value2, media->width, media);
+ &feat->value2, media->width, unit_ctx);
- } else if (strcmp(lwc_string_data(feat->name), "height") == 0) {
+ } else if (lwc_string_isequal(feat->name,
+ str->height, &match) == lwc_error_ok &&
+ match == true) {
if (!mq_match_feature_range_length_op1(feat->op, &feat->value,
- media->height, media)) {
+ media->height, unit_ctx)) {
return false;
}
return mq_match_feature_range_length_op2(feat->op2,
- &feat->value2, media->height, media);
+ &feat->value2, media->height, unit_ctx);
+
+ } else if (lwc_string_isequal(feat->name,
+ str->prefers_color_scheme, &match) == lwc_error_ok &&
+ match == true) {
+ if (mq_match_feature_eq_ident_op1(feat->op, &feat->value,
+ media->prefers_color_scheme) ||
+ feat->op == CSS_MQ_FEATURE_OP_BOOL) {
+ return true;
+ }
+
+ return false;
}
/* TODO: Look at other feature names. */
@@ -212,13 +162,16 @@ static inline bool mq_match_feature(
/**
* Match media query conditions.
*
- * \param[in] cond Condition to match.
- * \param[in] media Current media spec, to check against cond.
+ * \param[in] cond Condition to match.
+ * \param[in] unit_ctx Current unit conversion context.
+ * \param[in] media Current media spec, to check against cond.
* \return true if condition matches, otherwise false.
*/
static inline bool mq_match_condition(
const css_mq_cond *cond,
- const css_media *media)
+ const css_unit_ctx *unit_ctx,
+ const css_media *media,
+ const css_select_strings *str)
{
bool matched = !cond->op;
@@ -226,11 +179,13 @@ static inline bool mq_match_condition(
bool part_matched;
if (cond->parts[i]->type == CSS_MQ_FEATURE) {
part_matched = mq_match_feature(
- cond->parts[i]->data.feat, media);
+ cond->parts[i]->data.feat,
+ unit_ctx, media, str);
} else {
assert(cond->parts[i]->type == CSS_MQ_COND);
part_matched = mq_match_condition(
- cond->parts[i]->data.cond, media);
+ cond->parts[i]->data.cond,
+ unit_ctx, media, str);
}
if (cond->op) {
@@ -257,19 +212,23 @@ static inline bool mq_match_condition(
* If anything in the list matches, the list matches. If none match
* it doesn't match.
*
- * \param[in] m Media query list.
- * \param[in] media Current media spec, to check against m.
+ * \param[in] m Media query list.
+ * \param[in] unit_ctx Current unit conversion context.
+ * \param[in] media Current media spec, to check against m.
* \return true if media query list matches media
*/
static inline bool mq__list_match(
const css_mq_query *m,
- const css_media *media)
+ const css_unit_ctx *unit_ctx,
+ const css_media *media,
+ const css_select_strings *str)
{
for (; m != NULL; m = m->next) {
/* Check type */
if (!!(m->type & media->type) != m->negate_type) {
if (m->cond == NULL ||
- mq_match_condition(m->cond, media)) {
+ mq_match_condition(m->cond,
+ unit_ctx, media, str)) {
/* We have a match, no need to look further. */
return true;
}
@@ -282,11 +241,16 @@ static inline bool mq__list_match(
/**
* Test whether the rule applies for current media.
*
- * \param rule Rule to test
- * \param media Current media spec
+ * \param rule Rule to test
+ * \param unit_ctx Current unit conversion context.
+ * \param media Current media spec
* \return true iff chain's rule applies for media
*/
-static inline bool mq_rule_good_for_media(const css_rule *rule, const css_media *media)
+static inline bool mq_rule_good_for_media(
+ const css_rule *rule,
+ const css_unit_ctx *unit_ctx,
+ const css_media *media,
+ const css_select_strings *str)
{
bool applies = true;
const css_rule *ancestor = rule;
@@ -295,7 +259,8 @@ static inline bool mq_rule_good_for_media(const css_rule *rule, const css_media
const css_rule_media *m = (const css_rule_media *) ancestor;
if (ancestor->type == CSS_RULE_MEDIA) {
- applies = mq__list_match(m->media, media);
+ applies = mq__list_match(m->media,
+ unit_ctx, media, str);
if (applies == false) {
break;
}
diff --git a/src/select/overrides.py b/src/select/overrides.py
index b4d349a..869d6ec 100644
--- a/src/select/overrides.py
+++ b/src/select/overrides.py
@@ -183,35 +183,3 @@ static inline css_error set_content(
return CSS_OK;
}'''
-
-get_side = '''\
-static inline uint8_t get_{0}(
- const css_computed_style *style,
- css_fixed *length, css_unit *unit)
-{{
- uint32_t bits = style->i.bits[{1}_INDEX];
- bits &= {1}_MASK;
- bits >>= {1}_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- if ((bits & 0x3) == CSS_{1}_SET) {{
- *length = style->i.{0};
- *unit = bits >> 2;
- }}
-
- return (bits & 0x3);
-}}
-static inline uint8_t get_{0}_bits(
- const css_computed_style *style)
-{{
- uint32_t bits = style->i.bits[{1}_INDEX];
- bits &= {1}_MASK;
- bits >>= {1}_SHIFT;
-
- /* 7bits: uuuuutt : units | type */
- return bits;
-}}'''
-overrides['get']['top'] = get_side.format('top', 'TOP')
-overrides['get']['right'] = get_side.format('right', 'RIGHT')
-overrides['get']['bottom'] = get_side.format('bottom', 'BOTTOM')
-overrides['get']['left'] = get_side.format('left', 'LEFT')
diff --git a/src/select/properties/Makefile b/src/select/properties/Makefile
index 6c6cf84..eee6cc3 100644
--- a/src/select/properties/Makefile
+++ b/src/select/properties/Makefile
@@ -50,6 +50,7 @@ direction.c \
display.c \
elevation.c \
empty_cells.c \
+fill_opacity.c \
flex_basis.c \
flex_direction.c \
flex_grow.c \
@@ -107,6 +108,7 @@ speak_header.c \
speak_numeral.c \
speak_punctuation.c \
stress.c \
+stroke_opacity.c \
table_layout.c \
text_align.c \
text_decoration.c \
diff --git a/src/select/properties/align_content.c b/src/select/properties/align_content.c
index f43cd8e..d432879 100644
--- a/src/select/properties/align_content.c
+++ b/src/select/properties/align_content.c
@@ -21,7 +21,7 @@ css_error css__cascade_align_content(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case ALIGN_CONTENT_STRETCH:
value = CSS_ALIGN_CONTENT_STRETCH;
@@ -48,7 +48,7 @@ css_error css__cascade_align_content(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_align_content(state->computed, value);
}
@@ -66,16 +66,25 @@ css_error css__initial_align_content(css_select_state *state)
return set_align_content(state->computed, CSS_ALIGN_CONTENT_STRETCH);
}
+css_error css__copy_align_content(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_align_content(to, get_align_content(from));
+}
+
css_error css__compose_align_content(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_align_content(child);
- if (type == CSS_ALIGN_CONTENT_INHERIT) {
- type = get_align_content(parent);
- }
-
- return set_align_content(result, type);
+ return css__copy_align_content(
+ type == CSS_ALIGN_CONTENT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/align_items.c b/src/select/properties/align_items.c
index ad69c81..52ca094 100644
--- a/src/select/properties/align_items.c
+++ b/src/select/properties/align_items.c
@@ -21,7 +21,7 @@ css_error css__cascade_align_items(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case ALIGN_ITEMS_STRETCH:
value = CSS_ALIGN_ITEMS_STRETCH;
@@ -42,7 +42,7 @@ css_error css__cascade_align_items(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_align_items(state->computed, value);
}
@@ -60,16 +60,25 @@ css_error css__initial_align_items(css_select_state *state)
return set_align_items(state->computed, CSS_ALIGN_ITEMS_STRETCH);
}
+css_error css__copy_align_items(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_align_items(to, get_align_items(from));
+}
+
css_error css__compose_align_items(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_align_items(child);
- if (type == CSS_ALIGN_ITEMS_INHERIT) {
- type = get_align_items(parent);
- }
-
- return set_align_items(result, type);
+ return css__copy_align_items(
+ type == CSS_ALIGN_ITEMS_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/align_self.c b/src/select/properties/align_self.c
index e8e469e..abdb3fe 100644
--- a/src/select/properties/align_self.c
+++ b/src/select/properties/align_self.c
@@ -21,7 +21,7 @@ css_error css__cascade_align_self(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case ALIGN_SELF_STRETCH:
value = CSS_ALIGN_SELF_STRETCH;
@@ -45,7 +45,7 @@ css_error css__cascade_align_self(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_align_self(state->computed, value);
}
@@ -63,16 +63,25 @@ css_error css__initial_align_self(css_select_state *state)
return set_align_self(state->computed, CSS_ALIGN_SELF_AUTO);
}
+css_error css__copy_align_self(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_align_self(to, get_align_self(from));
+}
+
css_error css__compose_align_self(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_align_self(child);
- if (type == CSS_ALIGN_SELF_INHERIT) {
- type = get_align_self(parent);
- }
-
- return set_align_self(result, type);
+ return css__copy_align_self(
+ type == CSS_ALIGN_SELF_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/azimuth.c b/src/select/properties/azimuth.c
index d52110f..bbbb48d 100644
--- a/src/select/properties/azimuth.c
+++ b/src/select/properties/azimuth.c
@@ -18,7 +18,7 @@ css_error css__cascade_azimuth(uint32_t opv, css_style *style,
css_fixed val = 0;
uint32_t unit = UNIT_DEG;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv) & ~AZIMUTH_BEHIND) {
case AZIMUTH_ANGLE:
val = *((css_fixed *) style->bytecode);
@@ -47,7 +47,7 @@ css_error css__cascade_azimuth(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo set computed azimuth */
}
@@ -70,6 +70,16 @@ css_error css__initial_azimuth(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_azimuth(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_azimuth(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/background_attachment.c b/src/select/properties/background_attachment.c
index 834c830..49194cc 100644
--- a/src/select/properties/background_attachment.c
+++ b/src/select/properties/background_attachment.c
@@ -21,7 +21,7 @@ css_error css__cascade_background_attachment(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BACKGROUND_ATTACHMENT_FIXED:
value = CSS_BACKGROUND_ATTACHMENT_FIXED;
@@ -33,7 +33,7 @@ css_error css__cascade_background_attachment(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_background_attachment(state->computed, value);
}
@@ -52,16 +52,25 @@ css_error css__initial_background_attachment(css_select_state *state)
CSS_BACKGROUND_ATTACHMENT_SCROLL);
}
+css_error css__copy_background_attachment(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_background_attachment(to, get_background_attachment(from));
+}
+
css_error css__compose_background_attachment(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_background_attachment(child);
- if (type == CSS_BACKGROUND_ATTACHMENT_INHERIT) {
- type = get_background_attachment(parent);
- }
-
- return set_background_attachment(result, type);
+ return css__copy_background_attachment(
+ type == CSS_BACKGROUND_ATTACHMENT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/background_color.c b/src/select/properties/background_color.c
index bb90604..1ab61e6 100644
--- a/src/select/properties/background_color.c
+++ b/src/select/properties/background_color.c
@@ -32,6 +32,20 @@ css_error css__initial_background_color(css_select_state *state)
CSS_BACKGROUND_COLOR_COLOR, 0);
}
+css_error css__copy_background_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_background_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_background_color(to, type, color);
+}
+
css_error css__compose_background_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -39,10 +53,8 @@ css_error css__compose_background_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_background_color(child, &color);
- if (type == CSS_BACKGROUND_COLOR_INHERIT) {
- type = get_background_color(parent, &color);
- }
-
- return set_background_color(result, type, color);
+ return css__copy_background_color(
+ type == CSS_BACKGROUND_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/background_image.c b/src/select/properties/background_image.c
index 96f7409..68b1e0f 100644
--- a/src/select/properties/background_image.c
+++ b/src/select/properties/background_image.c
@@ -39,6 +39,20 @@ css_error css__initial_background_image(css_select_state *state)
CSS_BACKGROUND_IMAGE_NONE, NULL);
}
+css_error css__copy_background_image(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ lwc_string *url;
+ uint8_t type = get_background_image(from, &url);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_background_image(to, type, url);
+}
+
css_error css__compose_background_image(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -46,10 +60,8 @@ css_error css__compose_background_image(const css_computed_style *parent,
lwc_string *url;
uint8_t type = get_background_image(child, &url);
- if (type == CSS_BACKGROUND_IMAGE_INHERIT) {
- type = get_background_image(parent, &url);
- }
-
- return set_background_image(result, type, url);
+ return css__copy_background_image(
+ type == CSS_BACKGROUND_IMAGE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/background_position.c b/src/select/properties/background_position.c
index d925b9c..f3fe47c 100644
--- a/src/select/properties/background_position.c
+++ b/src/select/properties/background_position.c
@@ -23,7 +23,7 @@ css_error css__cascade_background_position(uint32_t opv, css_style *style,
uint32_t hunit = UNIT_PX;
uint32_t vunit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = CSS_BACKGROUND_POSITION_SET;
switch (getValue(opv) & 0xf0) {
@@ -73,7 +73,7 @@ css_error css__cascade_background_position(uint32_t opv, css_style *style,
vunit = css__to_css_unit(vunit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_background_position(state->computed, value,
hlength, hunit, vlength, vunit);
}
@@ -96,6 +96,22 @@ css_error css__initial_background_position(css_select_state *state)
0, CSS_UNIT_PCT, 0, CSS_UNIT_PCT);
}
+css_error css__copy_background_position(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed hlength = 0, vlength = 0;
+ css_unit hunit = CSS_UNIT_PX, vunit = CSS_UNIT_PX;
+ uint8_t type = get_background_position(from, &hlength, &hunit,
+ &vlength, &vunit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_background_position(to, type, hlength, hunit, vlength, vunit);
+}
+
css_error css__compose_background_position(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -105,12 +121,8 @@ css_error css__compose_background_position(const css_computed_style *parent,
uint8_t type = get_background_position(child, &hlength, &hunit,
&vlength, &vunit);
- if (type == CSS_BACKGROUND_POSITION_INHERIT) {
- type = get_background_position(parent,
- &hlength, &hunit, &vlength, &vunit);
- }
-
- return set_background_position(result, type, hlength, hunit,
- vlength, vunit);
+ return css__copy_background_position(
+ type == CSS_BACKGROUND_POSITION_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/background_repeat.c b/src/select/properties/background_repeat.c
index 3881573..7104bfb 100644
--- a/src/select/properties/background_repeat.c
+++ b/src/select/properties/background_repeat.c
@@ -21,7 +21,7 @@ css_error css__cascade_background_repeat(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BACKGROUND_REPEAT_NO_REPEAT:
value = CSS_BACKGROUND_REPEAT_NO_REPEAT;
@@ -39,7 +39,7 @@ css_error css__cascade_background_repeat(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_background_repeat(state->computed, value);
}
@@ -58,16 +58,25 @@ css_error css__initial_background_repeat(css_select_state *state)
CSS_BACKGROUND_REPEAT_REPEAT);
}
+css_error css__copy_background_repeat(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_background_repeat(to, get_background_repeat(from));
+}
+
css_error css__compose_background_repeat(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_background_repeat(child);
- if (type == CSS_BACKGROUND_REPEAT_INHERIT) {
- type = get_background_repeat(parent);
- }
-
- return set_background_repeat(result, type);
+ return css__copy_background_repeat(
+ type == CSS_BACKGROUND_REPEAT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_bottom_color.c b/src/select/properties/border_bottom_color.c
index bdbecb7..1996d71 100644
--- a/src/select/properties/border_bottom_color.c
+++ b/src/select/properties/border_bottom_color.c
@@ -33,6 +33,20 @@ css_error css__initial_border_bottom_color(css_select_state *state)
CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
+css_error css__copy_border_bottom_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_border_bottom_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_bottom_color(to, type, color);
+}
+
css_error css__compose_border_bottom_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +54,8 @@ css_error css__compose_border_bottom_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_border_bottom_color(child, &color);
- if (type == CSS_BORDER_COLOR_INHERIT) {
- type = get_border_bottom_color(parent, &color);
- }
-
- return set_border_bottom_color(result, type, color);
+ return css__copy_border_bottom_color(
+ type == CSS_BORDER_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_bottom_style.c b/src/select/properties/border_bottom_style.c
index b5caccb..3451c65 100644
--- a/src/select/properties/border_bottom_style.c
+++ b/src/select/properties/border_bottom_style.c
@@ -31,16 +31,25 @@ css_error css__initial_border_bottom_style(css_select_state *state)
return set_border_bottom_style(state->computed, CSS_BORDER_STYLE_NONE);
}
+css_error css__copy_border_bottom_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_bottom_style(to, get_border_bottom_style(from));
+}
+
css_error css__compose_border_bottom_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_border_bottom_style(child);
- if (type == CSS_BORDER_STYLE_INHERIT) {
- type = get_border_bottom_style(parent);
- }
-
- return set_border_bottom_style(result, type);
+ return css__copy_border_bottom_style(
+ type == CSS_BORDER_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_bottom_width.c b/src/select/properties/border_bottom_width.c
index b071fba..19f4304 100644
--- a/src/select/properties/border_bottom_width.c
+++ b/src/select/properties/border_bottom_width.c
@@ -14,16 +14,16 @@
#include "select/properties/properties.h"
#include "select/properties/helpers.h"
-css_error css__cascade_border_bottom_width(uint32_t opv, css_style *style,
+css_error css__cascade_border_bottom_width(uint32_t opv, css_style *width,
css_select_state *state)
{
- return css__cascade_border_width(opv, style, state, set_border_bottom_width);
+ return css__cascade_border_width(opv, width, state, set_border_bottom_width);
}
css_error css__set_border_bottom_width_from_hint(const css_hint *hint,
- css_computed_style *style)
+ css_computed_style *width)
{
- return set_border_bottom_width(style, hint->status,
+ return set_border_bottom_width(width, hint->status,
hint->data.length.value, hint->data.length.unit);
}
@@ -33,6 +33,21 @@ css_error css__initial_border_bottom_width(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_border_bottom_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_border_bottom_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_bottom_width(to, type, length, unit);
+}
+
css_error css__compose_border_bottom_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_border_bottom_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_border_bottom_width(child, &length, &unit);
- if (type == CSS_BORDER_WIDTH_INHERIT) {
- type = get_border_bottom_width(parent, &length, &unit);
- }
-
- return set_border_bottom_width(result, type, length, unit);
+ return css__copy_border_bottom_width(
+ type == CSS_BORDER_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_collapse.c b/src/select/properties/border_collapse.c
index 1363c7c..8868e6b 100644
--- a/src/select/properties/border_collapse.c
+++ b/src/select/properties/border_collapse.c
@@ -21,7 +21,7 @@ css_error css__cascade_border_collapse(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BORDER_COLLAPSE_SEPARATE:
value = CSS_BORDER_COLLAPSE_SEPARATE;
@@ -33,7 +33,7 @@ css_error css__cascade_border_collapse(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_border_collapse(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_border_collapse(css_select_state *state)
return set_border_collapse(state->computed, CSS_BORDER_COLLAPSE_SEPARATE);
}
+css_error css__copy_border_collapse(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_collapse(to, get_border_collapse(from));
+}
+
css_error css__compose_border_collapse(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_border_collapse(child);
- if (type == CSS_BORDER_COLLAPSE_INHERIT) {
- type = get_border_collapse(parent);
- }
-
- return set_border_collapse(result, type);
+ return css__copy_border_collapse(
+ type == CSS_BORDER_COLLAPSE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_left_color.c b/src/select/properties/border_left_color.c
index 2880751..60b81ae 100644
--- a/src/select/properties/border_left_color.c
+++ b/src/select/properties/border_left_color.c
@@ -33,6 +33,20 @@ css_error css__initial_border_left_color(css_select_state *state)
CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
+css_error css__copy_border_left_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_border_left_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_left_color(to, type, color);
+}
+
css_error css__compose_border_left_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +54,8 @@ css_error css__compose_border_left_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_border_left_color(child, &color);
- if (type == CSS_BORDER_COLOR_INHERIT) {
- type = get_border_left_color(parent, &color);
- }
-
- return set_border_left_color(result, type, color);
+ return css__copy_border_left_color(
+ type == CSS_BORDER_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_left_style.c b/src/select/properties/border_left_style.c
index e6472b3..99b5494 100644
--- a/src/select/properties/border_left_style.c
+++ b/src/select/properties/border_left_style.c
@@ -31,16 +31,25 @@ css_error css__initial_border_left_style(css_select_state *state)
return set_border_left_style(state->computed, CSS_BORDER_STYLE_NONE);
}
+css_error css__copy_border_left_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_left_style(to, get_border_left_style(from));
+}
+
css_error css__compose_border_left_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_border_left_style(child);
- if (type == CSS_BORDER_STYLE_INHERIT) {
- type = get_border_left_style(parent);
- }
-
- return set_border_left_style(result, type);
+ return css__copy_border_left_style(
+ type == CSS_BORDER_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_left_width.c b/src/select/properties/border_left_width.c
index 1278fa9..e1fc822 100644
--- a/src/select/properties/border_left_width.c
+++ b/src/select/properties/border_left_width.c
@@ -33,6 +33,21 @@ css_error css__initial_border_left_width(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_border_left_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_border_left_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_left_width(to, type, length, unit);
+}
+
css_error css__compose_border_left_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_border_left_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_border_left_width(child, &length, &unit);
- if (type == CSS_BORDER_WIDTH_INHERIT) {
- type = get_border_left_width(parent, &length, &unit);
- }
-
- return set_border_left_width(result, type, length, unit);
+ return css__copy_border_left_width(
+ type == CSS_BORDER_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_right_color.c b/src/select/properties/border_right_color.c
index b8563e6..815ca9c 100644
--- a/src/select/properties/border_right_color.c
+++ b/src/select/properties/border_right_color.c
@@ -33,6 +33,20 @@ css_error css__initial_border_right_color(css_select_state *state)
CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
+css_error css__copy_border_right_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_border_right_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_right_color(to, type, color);
+}
+
css_error css__compose_border_right_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +54,8 @@ css_error css__compose_border_right_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_border_right_color(child, &color);
- if (type == CSS_BORDER_COLOR_INHERIT) {
- type = get_border_right_color(parent, &color);
- }
-
- return set_border_right_color(result, type, color);
+ return css__copy_border_right_color(
+ type == CSS_BORDER_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_right_style.c b/src/select/properties/border_right_style.c
index d75a99e..d14fbfb 100644
--- a/src/select/properties/border_right_style.c
+++ b/src/select/properties/border_right_style.c
@@ -31,16 +31,25 @@ css_error css__initial_border_right_style(css_select_state *state)
return set_border_right_style(state->computed, CSS_BORDER_STYLE_NONE);
}
+css_error css__copy_border_right_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_right_style(to, get_border_right_style(from));
+}
+
css_error css__compose_border_right_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_border_right_style(child);
- if (type == CSS_BORDER_STYLE_INHERIT) {
- type = get_border_right_style(parent);
- }
-
- return set_border_right_style(result, type);
+ return css__copy_border_right_style(
+ type == CSS_BORDER_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_right_width.c b/src/select/properties/border_right_width.c
index 18cacd2..93e8f19 100644
--- a/src/select/properties/border_right_width.c
+++ b/src/select/properties/border_right_width.c
@@ -33,6 +33,21 @@ css_error css__initial_border_right_width(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_border_right_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_border_right_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_right_width(to, type, length, unit);
+}
+
css_error css__compose_border_right_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_border_right_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_border_right_width(child, &length, &unit);
- if (type == CSS_BORDER_WIDTH_INHERIT) {
- type = get_border_right_width(parent, &length, &unit);
- }
-
- return set_border_right_width(result, type, length, unit);
+ return css__copy_border_right_width(
+ type == CSS_BORDER_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_spacing.c b/src/select/properties/border_spacing.c
index 0077aac..1f70aff 100644
--- a/src/select/properties/border_spacing.c
+++ b/src/select/properties/border_spacing.c
@@ -23,7 +23,7 @@ css_error css__cascade_border_spacing(uint32_t opv, css_style *style,
uint32_t hunit = UNIT_PX;
uint32_t vunit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = CSS_BORDER_SPACING_SET;
hlength = *((css_fixed *) style->bytecode);
advance_bytecode(style, sizeof(hlength));
@@ -40,7 +40,7 @@ css_error css__cascade_border_spacing(uint32_t opv, css_style *style,
vunit = css__to_css_unit(vunit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_border_spacing(state->computed, value,
hlength, hunit, vlength, vunit);
}
@@ -62,6 +62,22 @@ css_error css__initial_border_spacing(css_select_state *state)
0, CSS_UNIT_PX, 0, CSS_UNIT_PX);
}
+css_error css__copy_border_spacing(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed hlength = 0, vlength = 0;
+ css_unit hunit = CSS_UNIT_PX, vunit = CSS_UNIT_PX;
+ uint8_t type = get_border_spacing(from, &hlength, &hunit,
+ &vlength, &vunit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_spacing(to, type, hlength, hunit, vlength, vunit);
+}
+
css_error css__compose_border_spacing(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -71,10 +87,7 @@ css_error css__compose_border_spacing(const css_computed_style *parent,
uint8_t type = get_border_spacing(child, &hlength, &hunit,
&vlength, &vunit);
- if (type == CSS_BORDER_SPACING_INHERIT) {
- type = get_border_spacing(parent,
- &hlength, &hunit, &vlength, &vunit);
- }
-
- return set_border_spacing(result, type, hlength, hunit, vlength, vunit);
+ return css__copy_border_spacing(
+ type == CSS_BORDER_SPACING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_top_color.c b/src/select/properties/border_top_color.c
index fd2ced4..ee3feb1 100644
--- a/src/select/properties/border_top_color.c
+++ b/src/select/properties/border_top_color.c
@@ -31,6 +31,20 @@ css_error css__initial_border_top_color(css_select_state *state)
return set_border_top_color(state->computed, CSS_BORDER_COLOR_CURRENT_COLOR, 0);
}
+css_error css__copy_border_top_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_border_top_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_top_color(to, type, color);
+}
+
css_error css__compose_border_top_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -38,10 +52,8 @@ css_error css__compose_border_top_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_border_top_color(child, &color);
- if (type == CSS_BORDER_COLOR_INHERIT) {
- type = get_border_top_color(parent, &color);
- }
-
- return set_border_top_color(result, type, color);
+ return css__copy_border_top_color(
+ type == CSS_BORDER_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_top_style.c b/src/select/properties/border_top_style.c
index 48d6b6d..1d2dc91 100644
--- a/src/select/properties/border_top_style.c
+++ b/src/select/properties/border_top_style.c
@@ -31,16 +31,25 @@ css_error css__initial_border_top_style(css_select_state *state)
return set_border_top_style(state->computed, CSS_BORDER_STYLE_NONE);
}
+css_error css__copy_border_top_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_top_style(to, get_border_top_style(from));
+}
+
css_error css__compose_border_top_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_border_top_style(child);
- if (type == CSS_BORDER_STYLE_INHERIT) {
- type = get_border_top_style(parent);
- }
-
- return set_border_top_style(result, type);
+ return css__copy_border_top_style(
+ type == CSS_BORDER_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/border_top_width.c b/src/select/properties/border_top_width.c
index c0fb7da..18e60cb 100644
--- a/src/select/properties/border_top_width.c
+++ b/src/select/properties/border_top_width.c
@@ -33,6 +33,21 @@ css_error css__initial_border_top_width(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_border_top_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_border_top_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_border_top_width(to, type, length, unit);
+}
+
css_error css__compose_border_top_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_border_top_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_border_top_width(child, &length, &unit);
- if (type == CSS_BORDER_WIDTH_INHERIT) {
- type = get_border_top_width(parent, &length, &unit);
- }
-
- return set_border_top_width(result, type, length, unit);
+ return css__copy_border_top_width(
+ type == CSS_BORDER_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/bottom.c b/src/select/properties/bottom.c
index 82754f1..fd65ed3 100644
--- a/src/select/properties/bottom.c
+++ b/src/select/properties/bottom.c
@@ -32,6 +32,21 @@ css_error css__initial_bottom(css_select_state *state)
return set_bottom(state->computed, CSS_BOTTOM_AUTO, 0, CSS_UNIT_PX);
}
+css_error css__copy_bottom(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_bottom(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_bottom(to, type, length, unit);
+}
+
css_error css__compose_bottom(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_bottom(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_bottom(child, &length, &unit);
- if (type == CSS_BOTTOM_INHERIT) {
- type = get_bottom(parent, &length, &unit);
- }
-
- return set_bottom(result, type, length, unit);
+ return css__copy_bottom(
+ type == CSS_BOTTOM_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/box_sizing.c b/src/select/properties/box_sizing.c
index 2d19c95..471f8a7 100644
--- a/src/select/properties/box_sizing.c
+++ b/src/select/properties/box_sizing.c
@@ -21,7 +21,7 @@ css_error css__cascade_box_sizing(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BOX_SIZING_CONTENT_BOX:
value = CSS_BOX_SIZING_CONTENT_BOX;
@@ -33,7 +33,7 @@ css_error css__cascade_box_sizing(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_box_sizing(state->computed, value);
}
@@ -51,17 +51,25 @@ css_error css__initial_box_sizing(css_select_state *state)
return set_box_sizing(state->computed, CSS_BOX_SIZING_CONTENT_BOX);
}
-css_error css__compose_box_sizing(
- const css_computed_style *parent,
+css_error css__copy_box_sizing(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_box_sizing(to, get_box_sizing(from));
+}
+
+css_error css__compose_box_sizing(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_box_sizing(child);
- if (type == CSS_BOX_SIZING_INHERIT) {
- type = get_box_sizing(parent);
- }
-
- return set_box_sizing(result, type);
+ return css__copy_box_sizing(
+ type == CSS_BOX_SIZING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/break_after.c b/src/select/properties/break_after.c
index 1f253aa..cb382e0 100644
--- a/src/select/properties/break_after.c
+++ b/src/select/properties/break_after.c
@@ -32,16 +32,25 @@ css_error css__initial_break_after(css_select_state *state)
return set_break_after(state->computed, CSS_BREAK_AFTER_AUTO);
}
+css_error css__copy_break_after(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_break_after(to, get_break_after(from));
+}
+
css_error css__compose_break_after(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_break_after(child);
- if (type == CSS_BREAK_AFTER_INHERIT) {
- type = get_break_after(parent);
- }
-
- return set_break_after(result, type);
+ return css__copy_break_after(
+ type == CSS_BREAK_AFTER_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/break_before.c b/src/select/properties/break_before.c
index 3dcda76..91b0612 100644
--- a/src/select/properties/break_before.c
+++ b/src/select/properties/break_before.c
@@ -32,16 +32,25 @@ css_error css__initial_break_before(css_select_state *state)
return set_break_before(state->computed, CSS_BREAK_BEFORE_AUTO);
}
+css_error css__copy_break_before(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_break_before(to, get_break_before(from));
+}
+
css_error css__compose_break_before(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_break_before(child);
- if (type == CSS_BREAK_BEFORE_INHERIT) {
- type = get_break_before(parent);
- }
-
- return set_break_before(result, type);
+ return css__copy_break_before(
+ type == CSS_BREAK_BEFORE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/break_inside.c b/src/select/properties/break_inside.c
index fdc44c1..d5b8aef 100644
--- a/src/select/properties/break_inside.c
+++ b/src/select/properties/break_inside.c
@@ -21,7 +21,7 @@ css_error css__cascade_break_inside(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BREAK_INSIDE_AUTO:
value = CSS_BREAK_INSIDE_AUTO;
@@ -39,7 +39,7 @@ css_error css__cascade_break_inside(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_break_inside(state->computed, value);
}
@@ -57,16 +57,25 @@ css_error css__initial_break_inside(css_select_state *state)
return set_break_inside(state->computed, CSS_BREAK_INSIDE_AUTO);
}
+css_error css__copy_break_inside(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_break_inside(to, get_break_inside(from));
+}
+
css_error css__compose_break_inside(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_break_inside(child);
- if (type == CSS_BREAK_INSIDE_INHERIT) {
- type = get_break_inside(parent);
- }
-
- return set_break_inside(result, type);
+ return css__copy_break_inside(
+ type == CSS_BREAK_INSIDE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/caption_side.c b/src/select/properties/caption_side.c
index ecccc1d..f0e7693 100644
--- a/src/select/properties/caption_side.c
+++ b/src/select/properties/caption_side.c
@@ -21,7 +21,7 @@ css_error css__cascade_caption_side(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case CAPTION_SIDE_TOP:
value = CSS_CAPTION_SIDE_TOP;
@@ -33,7 +33,7 @@ css_error css__cascade_caption_side(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_caption_side(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_caption_side(css_select_state *state)
return set_caption_side(state->computed, CSS_CAPTION_SIDE_TOP);
}
+css_error css__copy_caption_side(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_caption_side(to, get_caption_side(from));
+}
+
css_error css__compose_caption_side(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_caption_side(child);
- if (type == CSS_CAPTION_SIDE_INHERIT) {
- type = get_caption_side(parent);
- }
-
- return set_caption_side(result, type);
+ return css__copy_caption_side(
+ type == CSS_CAPTION_SIDE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/clear.c b/src/select/properties/clear.c
index bbb2673..1fbc48e 100644
--- a/src/select/properties/clear.c
+++ b/src/select/properties/clear.c
@@ -21,7 +21,7 @@ css_error css__cascade_clear(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case CLEAR_NONE:
value = CSS_CLEAR_NONE;
@@ -39,7 +39,7 @@ css_error css__cascade_clear(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_clear(state->computed, value);
}
@@ -57,16 +57,25 @@ css_error css__initial_clear(css_select_state *state)
return set_clear(state->computed, CSS_CLEAR_NONE);
}
+css_error css__copy_clear(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_clear(to, get_clear(from));
+}
+
css_error css__compose_clear(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_clear(child);
- if (type == CSS_CLEAR_INHERIT) {
- type = get_clear(parent);
- }
-
- return set_clear(result, type);
+ return css__copy_clear(
+ type == CSS_CLEAR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/clip.c b/src/select/properties/clip.c
index 2785afb..c0b9c2b 100644
--- a/src/select/properties/clip.c
+++ b/src/select/properties/clip.c
@@ -22,7 +22,7 @@ css_error css__cascade_clip(uint32_t opv, css_style *style,
CSS_UNIT_PX, CSS_UNIT_PX, CSS_UNIT_PX, CSS_UNIT_PX,
false, false, false, false };
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv) & CLIP_SHAPE_MASK) {
case CLIP_SHAPE_RECT:
if (getValue(opv) & CLIP_RECT_TOP_AUTO) {
@@ -71,7 +71,7 @@ css_error css__cascade_clip(uint32_t opv, css_style *style,
rect.lunit = css__to_css_unit(rect.lunit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_clip(state->computed, value, &rect);
}
@@ -93,6 +93,22 @@ css_error css__initial_clip(css_select_state *state)
return set_clip(state->computed, CSS_CLIP_AUTO, &rect);
}
+css_error css__copy_clip(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_computed_clip_rect rect = { 0, 0, 0, 0,
+ CSS_UNIT_PX, CSS_UNIT_PX, CSS_UNIT_PX, CSS_UNIT_PX,
+ false, false, false, false };
+ uint8_t type = get_clip(from, &rect);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_clip(to, type, &rect);
+}
+
css_error css__compose_clip(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -102,9 +118,7 @@ css_error css__compose_clip(const css_computed_style *parent,
false, false, false, false };
uint8_t type = get_clip(child, &rect);
- if (type == CSS_CLIP_INHERIT) {
- type = get_clip(parent, &rect);
- }
-
- return set_clip(result, type, &rect);
+ return css__copy_clip(
+ type == CSS_CLIP_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/color.c b/src/select/properties/color.c
index 806f2cc..6424436 100644
--- a/src/select/properties/color.c
+++ b/src/select/properties/color.c
@@ -17,11 +17,11 @@
css_error css__cascade_color(uint32_t opv, css_style *style,
css_select_state *state)
{
- bool inherit = isInherit(opv);
+ enum flag_value flag_value = getFlagValue(opv);
uint16_t value = CSS_COLOR_INHERIT;
css_color color = 0;
- if (inherit == false) {
+ if (flag_value == FLAG_VALUE__NONE) {
switch (getValue(opv)) {
case COLOR_TRANSPARENT:
value = CSS_COLOR_COLOR;
@@ -29,7 +29,7 @@ css_error css__cascade_color(uint32_t opv, css_style *style,
case COLOR_CURRENT_COLOR:
/* color: currentColor always computes to inherit */
value = CSS_COLOR_INHERIT;
- inherit = true;
+ flag_value = FLAG_VALUE_INHERIT;
break;
case COLOR_SET:
value = CSS_COLOR_COLOR;
@@ -40,7 +40,7 @@ css_error css__cascade_color(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- inherit)) {
+ flag_value)) {
return set_color(state->computed, value, color);
}
@@ -66,6 +66,20 @@ css_error css__initial_color(css_select_state *state)
return css__set_color_from_hint(&hint, state->computed);
}
+css_error css__copy_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_color(to, type, color);
+}
+
css_error css__compose_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -73,10 +87,8 @@ css_error css__compose_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_color(child, &color);
- if (type == CSS_COLOR_INHERIT) {
- type = get_color(parent, &color);
- }
-
- return set_color(result, type, color);
+ return css__copy_color(
+ type == CSS_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_count.c b/src/select/properties/column_count.c
index efd1243..4adadd6 100644
--- a/src/select/properties/column_count.c
+++ b/src/select/properties/column_count.c
@@ -20,7 +20,7 @@ css_error css__cascade_column_count(uint32_t opv, css_style *style,
uint16_t value = CSS_COLUMN_COUNT_INHERIT;
css_fixed count = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case COLUMN_COUNT_SET:
value = CSS_COLUMN_COUNT_SET;
@@ -34,7 +34,7 @@ css_error css__cascade_column_count(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_column_count(state->computed, value, count);
}
@@ -52,6 +52,20 @@ css_error css__initial_column_count(css_select_state *state)
return set_column_count(state->computed, CSS_COLUMN_COUNT_AUTO, 0);
}
+css_error css__copy_column_count(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ int32_t count = 0;
+ uint8_t type = get_column_count(from, &count);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_count(to, type, count);
+}
+
css_error css__compose_column_count(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -59,9 +73,7 @@ css_error css__compose_column_count(const css_computed_style *parent,
int32_t count = 0;
uint8_t type = get_column_count(child, &count);
- if (type == CSS_COLUMN_COUNT_INHERIT) {
- type = get_column_count(parent, &count);
- }
-
- return set_column_count(result, type, count);
+ return css__copy_column_count(
+ type == CSS_COLUMN_COUNT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_fill.c b/src/select/properties/column_fill.c
index 31f19f0..f49946c 100644
--- a/src/select/properties/column_fill.c
+++ b/src/select/properties/column_fill.c
@@ -21,7 +21,7 @@ css_error css__cascade_column_fill(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case COLUMN_FILL_BALANCE:
value = CSS_COLUMN_FILL_BALANCE;
@@ -33,7 +33,7 @@ css_error css__cascade_column_fill(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_column_fill(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_column_fill(css_select_state *state)
return set_column_fill(state->computed, CSS_COLUMN_FILL_BALANCE);
}
+css_error css__copy_column_fill(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_fill(to, get_column_fill(from));
+}
+
css_error css__compose_column_fill(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_column_fill(child);
- if (type == CSS_COLUMN_FILL_INHERIT) {
- type = get_column_fill(parent);
- }
-
- return set_column_fill(result, type);
+ return css__copy_column_fill(
+ type == CSS_COLUMN_FILL_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_gap.c b/src/select/properties/column_gap.c
index 087eb0f..5776dc9 100644
--- a/src/select/properties/column_gap.c
+++ b/src/select/properties/column_gap.c
@@ -33,6 +33,21 @@ css_error css__initial_column_gap(css_select_state *state)
INTTOFIX(1), CSS_UNIT_EM);
}
+css_error css__copy_column_gap(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = INTTOFIX(1);
+ css_unit unit = CSS_UNIT_EM;
+ uint8_t type = get_column_gap(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_gap(to, type, length, unit);
+}
+
css_error css__compose_column_gap(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,9 +56,7 @@ css_error css__compose_column_gap(const css_computed_style *parent,
css_unit unit = CSS_UNIT_EM;
uint8_t type = get_column_gap(child, &length, &unit);
- if (type == CSS_COLUMN_GAP_INHERIT) {
- type = get_column_gap(parent, &length, &unit);
- }
-
- return set_column_gap(result, type, length, unit);
+ return css__copy_column_gap(
+ type == CSS_COLUMN_GAP_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_rule_color.c b/src/select/properties/column_rule_color.c
index f54c2ab..0b7ec9d 100644
--- a/src/select/properties/column_rule_color.c
+++ b/src/select/properties/column_rule_color.c
@@ -17,17 +17,18 @@
css_error css__cascade_column_rule_color(uint32_t opv, css_style *style,
css_select_state *state)
{
- bool inherit = isInherit(opv);
+ enum flag_value flag_value = getFlagValue(opv);
uint16_t value = CSS_COLUMN_RULE_COLOR_INHERIT;
css_color color = 0;
- if (isInherit(opv) == false) {
+ if (flag_value == FLAG_VALUE__NONE) {
switch (getValue(opv)) {
case COLUMN_RULE_COLOR_TRANSPARENT:
value = CSS_COLUMN_RULE_COLOR_COLOR;
break;
case COLUMN_RULE_COLOR_CURRENT_COLOR:
value = CSS_COLUMN_RULE_COLOR_CURRENT_COLOR;
+ flag_value = FLAG_VALUE_INHERIT;
break;
case COLUMN_RULE_COLOR_SET:
value = CSS_COLUMN_RULE_COLOR_COLOR;
@@ -38,7 +39,7 @@ css_error css__cascade_column_rule_color(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- inherit)) {
+ flag_value)) {
return set_column_rule_color(state->computed, value, color);
}
@@ -57,6 +58,20 @@ css_error css__initial_column_rule_color(css_select_state *state)
CSS_COLUMN_RULE_COLOR_CURRENT_COLOR, 0);
}
+css_error css__copy_column_rule_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color;
+ uint8_t type = get_column_rule_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_rule_color(to, type, color);
+}
+
css_error css__compose_column_rule_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -64,10 +79,8 @@ css_error css__compose_column_rule_color(const css_computed_style *parent,
css_color color;
uint8_t type = get_column_rule_color(child, &color);
- if (type == CSS_COLUMN_RULE_COLOR_INHERIT) {
- type = get_column_rule_color(parent, &color);
- }
-
- return set_column_rule_color(result, type, color);
+ return css__copy_column_rule_color(
+ type == CSS_COLUMN_RULE_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_rule_style.c b/src/select/properties/column_rule_style.c
index 1d9a41e..be9579c 100644
--- a/src/select/properties/column_rule_style.c
+++ b/src/select/properties/column_rule_style.c
@@ -33,16 +33,25 @@ css_error css__initial_column_rule_style(css_select_state *state)
CSS_COLUMN_RULE_STYLE_NONE);
}
+css_error css__copy_column_rule_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_rule_style(to, get_column_rule_style(from));
+}
+
css_error css__compose_column_rule_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_column_rule_style(child);
- if (type == CSS_COLUMN_RULE_STYLE_INHERIT) {
- type = get_column_rule_style(parent);
- }
-
- return set_column_rule_style(result, type);
+ return css__copy_column_rule_style(
+ type == CSS_COLUMN_RULE_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_rule_width.c b/src/select/properties/column_rule_width.c
index 3ca9367..c18f26c 100644
--- a/src/select/properties/column_rule_width.c
+++ b/src/select/properties/column_rule_width.c
@@ -34,6 +34,21 @@ css_error css__initial_column_rule_width(css_select_state *state)
CSS_COLUMN_RULE_WIDTH_MEDIUM, 0, CSS_UNIT_PX);
}
+css_error css__copy_column_rule_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_column_rule_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_rule_width(to, type, length, unit);
+}
+
css_error css__compose_column_rule_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -42,10 +57,8 @@ css_error css__compose_column_rule_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_column_rule_width(child, &length, &unit);
- if (type == CSS_COLUMN_RULE_WIDTH_INHERIT) {
- type = get_column_rule_width(parent, &length, &unit);
- }
-
- return set_column_rule_width(result, type, length, unit);
+ return css__copy_column_rule_width(
+ type == CSS_COLUMN_RULE_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_span.c b/src/select/properties/column_span.c
index 2c870d3..340150f 100644
--- a/src/select/properties/column_span.c
+++ b/src/select/properties/column_span.c
@@ -21,7 +21,7 @@ css_error css__cascade_column_span(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case COLUMN_SPAN_NONE:
value = CSS_COLUMN_SPAN_NONE;
@@ -33,7 +33,7 @@ css_error css__cascade_column_span(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_column_span(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_column_span(css_select_state *state)
return set_column_span(state->computed, CSS_COLUMN_SPAN_NONE);
}
+css_error css__copy_column_span(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_span(to, get_column_span(from));
+}
+
css_error css__compose_column_span(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_column_span(child);
- if (type == CSS_COLUMN_SPAN_INHERIT) {
- type = get_column_span(parent);
- }
-
- return set_column_span(result, type);
+ return css__copy_column_span(
+ type == CSS_COLUMN_SPAN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/column_width.c b/src/select/properties/column_width.c
index e739ade..d88d022 100644
--- a/src/select/properties/column_width.c
+++ b/src/select/properties/column_width.c
@@ -33,17 +33,30 @@ css_error css__initial_column_width(css_select_state *state)
INTTOFIX(1), CSS_UNIT_EM);
}
+css_error css__copy_column_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_column_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_column_width(to, type, length, unit);
+}
+
css_error css__compose_column_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
- css_fixed length = INTTOFIX(1);
- css_unit unit = CSS_UNIT_EM;
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
uint8_t type = get_column_width(child, &length, &unit);
- if (type == CSS_COLUMN_WIDTH_INHERIT) {
- type = get_column_width(parent, &length, &unit);
- }
-
- return set_column_width(result, type, length, unit);
+ return css__copy_column_width(
+ type == CSS_COLUMN_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/content.c b/src/select/properties/content.c
index f75743d..32af49f 100644
--- a/src/select/properties/content.c
+++ b/src/select/properties/content.c
@@ -21,7 +21,7 @@ css_error css__cascade_content(uint32_t opv, css_style *style,
css_computed_content_item *content = NULL;
uint32_t n_contents = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
uint32_t v = getValue(opv);
if (v == CONTENT_NORMAL) {
@@ -140,7 +140,7 @@ css_error css__cascade_content(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
css_error error;
error = set_content(state->computed, value, content);
@@ -199,39 +199,40 @@ css_error css__initial_content(css_select_state *state)
return set_content(state->computed, CSS_CONTENT_NORMAL, NULL);
}
-css_error css__compose_content(const css_computed_style *parent,
- const css_computed_style *child,
- css_computed_style *result)
+css_error css__copy_content(
+ const css_computed_style *from,
+ css_computed_style *to)
{
css_error error;
css_computed_content_item *copy = NULL;
const css_computed_content_item *items = NULL;
- uint8_t type = get_content(child, &items);
+ uint8_t type = get_content(from, &items);
- if (type == CSS_CONTENT_INHERIT) {
- type = get_content(parent, &items);
+ if (from == to) {
+ return CSS_OK;
}
- if (type == CSS_CONTENT_SET) {
- size_t n_items = 0;
- const css_computed_content_item *i;
-
- for (i = items; i->type != CSS_COMPUTED_CONTENT_NONE;
- i++)
- n_items++;
-
- copy = malloc((n_items + 1) *
- sizeof(css_computed_content_item));
- if (copy == NULL)
- return CSS_NOMEM;
-
- memcpy(copy, items, (n_items + 1) *
- sizeof(css_computed_content_item));
+ error = css__copy_computed_content_item_array(false, items, &copy);
+ if (error != CSS_OK) {
+ return CSS_NOMEM;
}
- error = set_content(result, type, copy);
- if (error != CSS_OK && copy != NULL)
+ error = set_content(to, type, copy);
+ if (error != CSS_OK) {
free(copy);
+ }
return error;
}
+
+css_error css__compose_content(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ const css_computed_content_item *items = NULL;
+ uint8_t type = get_content(child, &items);
+
+ return css__copy_content(
+ type == CSS_CONTENT_INHERIT ? parent : child,
+ result);
+}
diff --git a/src/select/properties/counter_increment.c b/src/select/properties/counter_increment.c
index 1b75c25..2638838 100644
--- a/src/select/properties/counter_increment.c
+++ b/src/select/properties/counter_increment.c
@@ -48,38 +48,40 @@ css_error css__initial_counter_increment(css_select_state *state)
CSS_COUNTER_INCREMENT_NONE, NULL);
}
-css_error css__compose_counter_increment(const css_computed_style *parent,
- const css_computed_style *child,
- css_computed_style *result)
+css_error css__copy_counter_increment(
+ const css_computed_style *from,
+ css_computed_style *to)
{
css_error error;
css_computed_counter *copy = NULL;
- const css_computed_counter *items = NULL;
- uint8_t type = get_counter_increment(child, &items);
+ const css_computed_counter *counter_increment = NULL;
+ uint8_t type = get_counter_increment(from, &counter_increment);
- if (type == CSS_COUNTER_INCREMENT_INHERIT) {
- type = get_counter_increment(parent, &items);
+ if (from == to) {
+ return CSS_OK;
}
- if (type == CSS_COUNTER_INCREMENT_NAMED && items != NULL) {
- size_t n_items = 0;
- const css_computed_counter *i;
-
- for (i = items; i->name != NULL; i++)
- n_items++;
-
- copy = malloc((n_items + 1) *
- sizeof(css_computed_counter));
- if (copy == NULL)
- return CSS_NOMEM;
-
- memcpy(copy, items, (n_items + 1) *
- sizeof(css_computed_counter));
+ error = css__copy_computed_counter_array(false, counter_increment, &copy);
+ if (error != CSS_OK) {
+ return CSS_NOMEM;
}
- error = set_counter_increment(result, type, copy);
- if (error != CSS_OK && copy != NULL)
+ error = set_counter_increment(to, type, copy);
+ if (error != CSS_OK) {
free(copy);
+ }
return error;
}
+
+css_error css__compose_counter_increment(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ const css_computed_counter *counter_increment = NULL;
+ uint8_t type = get_counter_increment(child, &counter_increment);
+
+ return css__copy_counter_increment(
+ type == CSS_COUNTER_INCREMENT_INHERIT ? parent : child,
+ result);
+}
diff --git a/src/select/properties/counter_reset.c b/src/select/properties/counter_reset.c
index e4ec8bf..fcb39a3 100644
--- a/src/select/properties/counter_reset.c
+++ b/src/select/properties/counter_reset.c
@@ -47,38 +47,40 @@ css_error css__initial_counter_reset(css_select_state *state)
return set_counter_reset(state->computed, CSS_COUNTER_RESET_NONE, NULL);
}
-css_error css__compose_counter_reset(const css_computed_style *parent,
- const css_computed_style *child,
- css_computed_style *result)
+css_error css__copy_counter_reset(
+ const css_computed_style *from,
+ css_computed_style *to)
{
css_error error;
css_computed_counter *copy = NULL;
- const css_computed_counter *items = NULL;
- uint8_t type = get_counter_reset(child, &items);
+ const css_computed_counter *counter_reset = NULL;
+ uint8_t type = get_counter_reset(from, &counter_reset);
- if (type == CSS_COUNTER_RESET_INHERIT) {
- type = get_counter_reset(parent, &items);
+ if (from == to) {
+ return CSS_OK;
}
- if (type == CSS_COUNTER_RESET_NAMED && items != NULL) {
- size_t n_items = 0;
- const css_computed_counter *i;
-
- for (i = items; i->name != NULL; i++)
- n_items++;
-
- copy = malloc((n_items + 1) *
- sizeof(css_computed_counter));
- if (copy == NULL)
- return CSS_NOMEM;
-
- memcpy(copy, items, (n_items + 1) *
- sizeof(css_computed_counter));
+ error = css__copy_computed_counter_array(false, counter_reset, &copy);
+ if (error != CSS_OK) {
+ return CSS_NOMEM;
}
- error = set_counter_reset(result, type, copy);
- if (error != CSS_OK && copy != NULL)
+ error = set_counter_reset(to, type, copy);
+ if (error != CSS_OK) {
free(copy);
+ }
return error;
}
+
+css_error css__compose_counter_reset(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ const css_computed_counter *counter_reset = NULL;
+ uint8_t type = get_counter_reset(child, &counter_reset);
+
+ return css__copy_counter_reset(
+ type == CSS_COUNTER_RESET_INHERIT ? parent : child,
+ result);
+}
diff --git a/src/select/properties/cue_after.c b/src/select/properties/cue_after.c
index e1c09e8..67a2c73 100644
--- a/src/select/properties/cue_after.c
+++ b/src/select/properties/cue_after.c
@@ -37,6 +37,16 @@ css_error css__initial_cue_after(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_cue_after(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_cue_after(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/cue_before.c b/src/select/properties/cue_before.c
index d562b3b..7c24822 100644
--- a/src/select/properties/cue_before.c
+++ b/src/select/properties/cue_before.c
@@ -37,6 +37,16 @@ css_error css__initial_cue_before(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_cue_before(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_cue_before(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/cursor.c b/src/select/properties/cursor.c
index c5e50c6..09955c6 100644
--- a/src/select/properties/cursor.c
+++ b/src/select/properties/cursor.c
@@ -21,7 +21,7 @@ css_error css__cascade_cursor(uint32_t opv, css_style *style,
lwc_string **uris = NULL;
uint32_t n_uris = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
uint32_t v = getValue(opv);
while (v == CURSOR_URI) {
@@ -124,7 +124,7 @@ css_error css__cascade_cursor(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
css_error error;
error = set_cursor(state->computed, value, uris);
@@ -164,38 +164,40 @@ css_error css__initial_cursor(css_select_state *state)
return set_cursor(state->computed, CSS_CURSOR_AUTO, NULL);
}
-css_error css__compose_cursor(const css_computed_style *parent,
- const css_computed_style *child,
- css_computed_style *result)
+css_error css__copy_cursor(
+ const css_computed_style *from,
+ css_computed_style *to)
{
css_error error;
lwc_string **copy = NULL;
- lwc_string **urls = NULL;
- uint8_t type = get_cursor(child, &urls);
+ lwc_string **cursor = NULL;
+ uint8_t type = get_cursor(from, &cursor);
- if (type == CSS_CURSOR_INHERIT) {
- type = get_cursor(parent, &urls);
+ if (from == to) {
+ return CSS_OK;
}
- if (urls != NULL) {
- lwc_string **i;
- size_t n_urls = 0;
-
- for (i = urls; (*i) != NULL; i++)
- n_urls++;
-
- copy = malloc((n_urls + 1) *
- sizeof(lwc_string *));
- if (copy == NULL)
- return CSS_NOMEM;
-
- memcpy(copy, urls, (n_urls + 1) *
- sizeof(lwc_string *));
+ error = css__copy_lwc_string_array(false, cursor, &copy);
+ if (error != CSS_OK) {
+ return CSS_NOMEM;
}
- error = set_cursor(result, type, copy);
- if (error != CSS_OK && copy != NULL)
+ error = set_cursor(to, type, copy);
+ if (error != CSS_OK) {
free(copy);
+ }
return error;
}
+
+css_error css__compose_cursor(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ lwc_string **cursor = NULL;
+ uint8_t type = get_cursor(child, &cursor);
+
+ return css__copy_cursor(
+ type == CSS_CURSOR_INHERIT ? parent : child,
+ result);
+}
diff --git a/src/select/properties/direction.c b/src/select/properties/direction.c
index f4a5c46..32bd31e 100644
--- a/src/select/properties/direction.c
+++ b/src/select/properties/direction.c
@@ -21,7 +21,7 @@ css_error css__cascade_direction(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case DIRECTION_LTR:
value = CSS_DIRECTION_LTR;
@@ -33,7 +33,7 @@ css_error css__cascade_direction(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_direction(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_direction(css_select_state *state)
return set_direction(state->computed, CSS_DIRECTION_LTR);
}
+css_error css__copy_direction(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_direction(to, get_direction(from));
+}
+
css_error css__compose_direction(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_direction(child);
- if (type == CSS_DIRECTION_INHERIT) {
- type = get_direction(parent);
- }
-
- return set_direction(result, type);
+ return css__copy_direction(
+ type == CSS_DIRECTION_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/display.c b/src/select/properties/display.c
index 510d24a..5455d20 100644
--- a/src/select/properties/display.c
+++ b/src/select/properties/display.c
@@ -21,7 +21,7 @@ css_error css__cascade_display(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case DISPLAY_INLINE:
value = CSS_DISPLAY_INLINE;
@@ -77,11 +77,17 @@ css_error css__cascade_display(uint32_t opv, css_style *style,
case DISPLAY_INLINE_FLEX:
value = CSS_DISPLAY_INLINE_FLEX;
break;
+ case DISPLAY_GRID:
+ value = CSS_DISPLAY_GRID;
+ break;
+ case DISPLAY_INLINE_GRID:
+ value = CSS_DISPLAY_INLINE_GRID;
+ break;
}
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_display(state->computed, value);
}
@@ -99,16 +105,25 @@ css_error css__initial_display(css_select_state *state)
return set_display(state->computed, CSS_DISPLAY_INLINE);
}
+css_error css__copy_display(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_display(to, get_display(from));
+}
+
css_error css__compose_display(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_display(child);
- if (type == CSS_DISPLAY_INHERIT) {
- type = get_display(parent);
- }
-
- return set_display(result, type);
+ return css__copy_display(
+ type == CSS_DISPLAY_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/elevation.c b/src/select/properties/elevation.c
index ee7d036..1368ef8 100644
--- a/src/select/properties/elevation.c
+++ b/src/select/properties/elevation.c
@@ -20,7 +20,7 @@ css_error css__cascade_elevation(uint32_t opv, css_style *style,
css_fixed val = 0;
uint32_t unit = UNIT_DEG;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case ELEVATION_ANGLE:
val = *((css_fixed *) style->bytecode);
@@ -42,7 +42,7 @@ css_error css__cascade_elevation(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo set computed elevation */
}
@@ -65,6 +65,16 @@ css_error css__initial_elevation(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_elevation(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_elevation(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/empty_cells.c b/src/select/properties/empty_cells.c
index fecdbdc..559fbde 100644
--- a/src/select/properties/empty_cells.c
+++ b/src/select/properties/empty_cells.c
@@ -21,7 +21,7 @@ css_error css__cascade_empty_cells(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case EMPTY_CELLS_SHOW:
value = CSS_EMPTY_CELLS_SHOW;
@@ -33,7 +33,7 @@ css_error css__cascade_empty_cells(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_empty_cells(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_empty_cells(css_select_state *state)
return set_empty_cells(state->computed, CSS_EMPTY_CELLS_SHOW);
}
+css_error css__copy_empty_cells(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_empty_cells(to, get_empty_cells(from));
+}
+
css_error css__compose_empty_cells(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_empty_cells(child);
- if (type == CSS_EMPTY_CELLS_INHERIT) {
- type = get_empty_cells(parent);
- }
-
- return set_empty_cells(result, type);
+ return css__copy_empty_cells(
+ type == CSS_EMPTY_CELLS_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/fill_opacity.c b/src/select/properties/fill_opacity.c
new file mode 100644
index 0000000..af0b52b
--- /dev/null
+++ b/src/select/properties/fill_opacity.c
@@ -0,0 +1,73 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+#include "bytecode/bytecode.h"
+#include "bytecode/opcodes.h"
+#include "select/propset.h"
+#include "select/propget.h"
+#include "utils/utils.h"
+
+#include "select/properties/properties.h"
+#include "select/properties/helpers.h"
+
+css_error css__cascade_fill_opacity(uint32_t opv, css_style *style,
+ css_select_state *state)
+{
+ uint16_t value = CSS_FILL_OPACITY_INHERIT;
+ css_fixed fill_opacity = 0;
+
+ if (hasFlagValue(opv) == false) {
+ value = CSS_FILL_OPACITY_SET;
+
+ fill_opacity = *((css_fixed *) style->bytecode);
+ advance_bytecode(style, sizeof(fill_opacity));
+ }
+
+ if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
+ getFlagValue(opv))) {
+ return set_fill_opacity(state->computed, value, fill_opacity);
+ }
+
+ return CSS_OK;
+}
+
+css_error css__set_fill_opacity_from_hint(const css_hint *hint,
+ css_computed_style *style)
+{
+ return set_fill_opacity(style, hint->status, hint->data.fixed);
+}
+
+css_error css__initial_fill_opacity(css_select_state *state)
+{
+ return set_fill_opacity(state->computed, CSS_FILL_OPACITY_SET, INTTOFIX(1));
+}
+
+css_error css__copy_fill_opacity(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed fill_opacity = 0;
+ uint8_t type = get_fill_opacity(from, &fill_opacity);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_fill_opacity(to, type, fill_opacity);
+}
+
+css_error css__compose_fill_opacity(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ css_fixed fill_opacity = 0;
+ uint8_t type = get_fill_opacity(child, &fill_opacity);
+
+ return css__copy_fill_opacity(
+ type == CSS_FILL_OPACITY_INHERIT ? parent : child,
+ result);
+}
+
diff --git a/src/select/properties/flex_basis.c b/src/select/properties/flex_basis.c
index 1a92a6b..a3141bc 100644
--- a/src/select/properties/flex_basis.c
+++ b/src/select/properties/flex_basis.c
@@ -21,7 +21,7 @@ css_error css__cascade_flex_basis(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FLEX_BASIS_AUTO:
value = CSS_FLEX_BASIS_AUTO;
@@ -42,7 +42,7 @@ css_error css__cascade_flex_basis(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_flex_basis(state->computed, value, length, unit);
}
@@ -62,6 +62,21 @@ css_error css__initial_flex_basis(css_select_state *state)
CSS_UNIT_PX);
}
+css_error css__copy_flex_basis(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_flex_basis(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_flex_basis(to, type, length, unit);
+}
+
css_error css__compose_flex_basis(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -70,10 +85,8 @@ css_error css__compose_flex_basis(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_flex_basis(child, &length, &unit);
- if (type == CSS_FLEX_BASIS_INHERIT) {
- type = get_flex_basis(parent, &length, &unit);
- }
-
- return set_flex_basis(result, type, length, unit);
+ return css__copy_flex_basis(
+ type == CSS_FLEX_BASIS_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/flex_direction.c b/src/select/properties/flex_direction.c
index 79703be..1d979be 100644
--- a/src/select/properties/flex_direction.c
+++ b/src/select/properties/flex_direction.c
@@ -21,7 +21,7 @@ css_error css__cascade_flex_direction(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FLEX_DIRECTION_ROW:
value = CSS_FLEX_DIRECTION_ROW;
@@ -39,7 +39,7 @@ css_error css__cascade_flex_direction(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_flex_direction(state->computed, value);
}
@@ -57,16 +57,25 @@ css_error css__initial_flex_direction(css_select_state *state)
return set_flex_direction(state->computed, CSS_FLEX_DIRECTION_ROW);
}
+css_error css__copy_flex_direction(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_flex_direction(to, get_flex_direction(from));
+}
+
css_error css__compose_flex_direction(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_flex_direction(child);
- if (type == CSS_FLEX_DIRECTION_INHERIT) {
- type = get_flex_direction(parent);
- }
-
- return set_flex_direction(result, type);
+ return css__copy_flex_direction(
+ type == CSS_FLEX_DIRECTION_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/flex_grow.c b/src/select/properties/flex_grow.c
index 7f37cfe..4650cef 100644
--- a/src/select/properties/flex_grow.c
+++ b/src/select/properties/flex_grow.c
@@ -20,7 +20,7 @@ css_error css__cascade_flex_grow(uint32_t opv, css_style *style,
uint16_t value = CSS_FLEX_GROW_INHERIT;
css_fixed flex_grow = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = CSS_FLEX_GROW_SET;
flex_grow = *((css_fixed *) style->bytecode);
@@ -28,7 +28,7 @@ css_error css__cascade_flex_grow(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_flex_grow(state->computed, value, flex_grow);
}
@@ -46,6 +46,20 @@ css_error css__initial_flex_grow(css_select_state *state)
return set_flex_grow(state->computed, CSS_FLEX_GROW_SET, INTTOFIX(0));
}
+css_error css__copy_flex_grow(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed flex_grow = 0;
+ uint8_t type = get_flex_grow(from, &flex_grow);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_flex_grow(to, type, flex_grow);
+}
+
css_error css__compose_flex_grow(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -53,10 +67,8 @@ css_error css__compose_flex_grow(const css_computed_style *parent,
css_fixed flex_grow = 0;
uint8_t type = get_flex_grow(child, &flex_grow);
- if (type == CSS_FLEX_GROW_INHERIT) {
- type = get_flex_grow(parent, &flex_grow);
- }
-
- return set_flex_grow(result, type, flex_grow);
+ return css__copy_flex_grow(
+ type == CSS_FLEX_GROW_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/flex_shrink.c b/src/select/properties/flex_shrink.c
index d1acd2a..9b39ed0 100644
--- a/src/select/properties/flex_shrink.c
+++ b/src/select/properties/flex_shrink.c
@@ -20,7 +20,7 @@ css_error css__cascade_flex_shrink(uint32_t opv, css_style *style,
uint16_t value = CSS_FLEX_SHRINK_INHERIT;
css_fixed flex_shrink = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = CSS_FLEX_SHRINK_SET;
flex_shrink = *((css_fixed *) style->bytecode);
@@ -28,7 +28,7 @@ css_error css__cascade_flex_shrink(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_flex_shrink(state->computed, value, flex_shrink);
}
@@ -46,6 +46,20 @@ css_error css__initial_flex_shrink(css_select_state *state)
return set_flex_shrink(state->computed, CSS_FLEX_SHRINK_SET, INTTOFIX(1));
}
+css_error css__copy_flex_shrink(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed flex_shrink = 0;
+ uint8_t type = get_flex_shrink(from, &flex_shrink);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_flex_shrink(to, type, flex_shrink);
+}
+
css_error css__compose_flex_shrink(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -53,10 +67,8 @@ css_error css__compose_flex_shrink(const css_computed_style *parent,
css_fixed flex_shrink = 0;
uint8_t type = get_flex_shrink(child, &flex_shrink);
- if (type == CSS_FLEX_SHRINK_INHERIT) {
- type = get_flex_shrink(parent, &flex_shrink);
- }
-
- return set_flex_shrink(result, type, flex_shrink);
+ return css__copy_flex_shrink(
+ type == CSS_FLEX_SHRINK_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/flex_wrap.c b/src/select/properties/flex_wrap.c
index 688a9b6..3ca9b74 100644
--- a/src/select/properties/flex_wrap.c
+++ b/src/select/properties/flex_wrap.c
@@ -21,7 +21,7 @@ css_error css__cascade_flex_wrap(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FLEX_WRAP_NOWRAP:
value = CSS_FLEX_WRAP_NOWRAP;
@@ -36,7 +36,7 @@ css_error css__cascade_flex_wrap(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_flex_wrap(state->computed, value);
}
@@ -54,16 +54,27 @@ css_error css__initial_flex_wrap(css_select_state *state)
return set_flex_wrap(state->computed, CSS_FLEX_WRAP_NOWRAP);
}
+css_error css__copy_flex_wrap(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ uint8_t type = get_flex_wrap(from);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_flex_wrap(to, type);
+}
+
css_error css__compose_flex_wrap(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_flex_wrap(child);
- if (type == CSS_FLEX_WRAP_INHERIT) {
- type = get_flex_wrap(parent);
- }
-
- return set_flex_wrap(result, type);
+ return css__copy_flex_wrap(
+ type == CSS_FLEX_WRAP_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/float.c b/src/select/properties/float.c
index c3ba909..6d009bb 100644
--- a/src/select/properties/float.c
+++ b/src/select/properties/float.c
@@ -21,7 +21,7 @@ css_error css__cascade_float(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FLOAT_LEFT:
value = CSS_FLOAT_LEFT;
@@ -36,7 +36,7 @@ css_error css__cascade_float(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_float(state->computed, value);
}
@@ -54,16 +54,25 @@ css_error css__initial_float(css_select_state *state)
return set_float(state->computed, CSS_FLOAT_NONE);
}
+css_error css__copy_float(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_float(to, get_float(from));
+}
+
css_error css__compose_float(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_float(child);
- if (type == CSS_FLOAT_INHERIT) {
- type = get_float(parent);
- }
-
- return set_float(result, type);
+ return css__copy_float(
+ type == CSS_FLOAT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/font_family.c b/src/select/properties/font_family.c
index f853fcc..b0183e2 100644
--- a/src/select/properties/font_family.c
+++ b/src/select/properties/font_family.c
@@ -21,7 +21,7 @@ css_error css__cascade_font_family(uint32_t opv, css_style *style,
lwc_string **fonts = NULL;
uint32_t n_fonts = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
uint32_t v = getValue(opv);
while (v != FONT_FAMILY_END) {
@@ -134,7 +134,7 @@ css_error css__cascade_font_family(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
css_error error;
error = set_font_family(state->computed, value, fonts);
@@ -182,42 +182,41 @@ css_error css__initial_font_family(css_select_state *state)
return css__set_font_family_from_hint(&hint, state->computed);
}
-css_error css__compose_font_family(const css_computed_style *parent,
- const css_computed_style *child,
- css_computed_style *result)
+css_error css__copy_font_family(
+ const css_computed_style *from,
+ css_computed_style *to)
{
css_error error;
- lwc_string **names = NULL;
- uint8_t type = get_font_family(child, &names);
-
- if (type == CSS_FONT_FAMILY_INHERIT || result != child) {
- size_t n_names = 0;
- lwc_string **copy = NULL;
-
- if (type == CSS_FONT_FAMILY_INHERIT)
- type = get_font_family(parent, &names);
+ lwc_string **copy = NULL;
+ lwc_string **font_family = NULL;
+ uint8_t type = get_font_family(from, &font_family);
- if (names != NULL) {
- lwc_string **i;
-
- for (i = names; (*i) != NULL; i++)
- n_names++;
+ if (from == to) {
+ return CSS_OK;
+ }
- copy = malloc((n_names + 1) * sizeof(lwc_string *));
- if (copy == NULL)
- return CSS_NOMEM;
+ error = css__copy_lwc_string_array(false, font_family, &copy);
+ if (error != CSS_OK) {
+ return CSS_NOMEM;
+ }
- memcpy(copy, names, (n_names + 1) *
- sizeof(lwc_string *));
- }
+ error = set_font_family(to, type, copy);
+ if (error != CSS_OK) {
+ free(copy);
+ }
- error = set_font_family(result, type, copy);
- if (error != CSS_OK && copy != NULL)
- free(copy);
+ return error;
+}
- return error;
- }
+css_error css__compose_font_family(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ lwc_string **font_family = NULL;
+ uint8_t type = get_font_family(child, &font_family);
- return CSS_OK;
+ return css__copy_font_family(
+ type == CSS_FONT_FAMILY_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/font_size.c b/src/select/properties/font_size.c
index a0269be..3ee9ce0 100644
--- a/src/select/properties/font_size.c
+++ b/src/select/properties/font_size.c
@@ -21,7 +21,7 @@ css_error css__cascade_font_size(uint32_t opv, css_style *style,
css_fixed size = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FONT_SIZE_DIMENSION:
value = CSS_FONT_SIZE_DIMENSION;
@@ -65,7 +65,7 @@ css_error css__cascade_font_size(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_font_size(state->computed, value, size, unit);
}
@@ -85,6 +85,21 @@ css_error css__initial_font_size(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_font_size(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed size = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_font_size(from, &size, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_font_size(to, type, size, unit);
+}
+
css_error css__compose_font_size(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -93,10 +108,8 @@ css_error css__compose_font_size(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_font_size(child, &size, &unit);
- if (type == CSS_FONT_SIZE_INHERIT) {
- type = get_font_size(parent, &size, &unit);
- }
-
- return set_font_size(result, type, size, unit);
+ return css__copy_font_size(
+ type == CSS_FONT_SIZE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/font_style.c b/src/select/properties/font_style.c
index 0ba1fdd..fe605b8 100644
--- a/src/select/properties/font_style.c
+++ b/src/select/properties/font_style.c
@@ -21,7 +21,7 @@ css_error css__cascade_font_style(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FONT_STYLE_NORMAL:
value = CSS_FONT_STYLE_NORMAL;
@@ -36,7 +36,7 @@ css_error css__cascade_font_style(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_font_style(state->computed, value);
}
@@ -54,16 +54,25 @@ css_error css__initial_font_style(css_select_state *state)
return set_font_style(state->computed, CSS_FONT_STYLE_NORMAL);
}
+css_error css__copy_font_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_font_style(to, get_font_style(from));
+}
+
css_error css__compose_font_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_font_style(child);
- if (type == CSS_FONT_STYLE_INHERIT) {
- type= get_font_style(parent);
- }
-
- return set_font_style(result, type);
+ return css__copy_font_style(
+ type == CSS_FONT_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/font_variant.c b/src/select/properties/font_variant.c
index a9b6e56..9668fc3 100644
--- a/src/select/properties/font_variant.c
+++ b/src/select/properties/font_variant.c
@@ -21,7 +21,7 @@ css_error css__cascade_font_variant(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FONT_VARIANT_NORMAL:
value = CSS_FONT_VARIANT_NORMAL;
@@ -33,7 +33,7 @@ css_error css__cascade_font_variant(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_font_variant(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_font_variant(css_select_state *state)
return set_font_variant(state->computed, CSS_FONT_VARIANT_NORMAL);
}
+css_error css__copy_font_variant(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_font_variant(to, get_font_variant(from));
+}
+
css_error css__compose_font_variant(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_font_variant(child);
- if (type == CSS_FONT_VARIANT_INHERIT) {
- type = get_font_variant(parent);
- }
-
- return set_font_variant(result, type);
+ return css__copy_font_variant(
+ type == CSS_FONT_VARIANT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/font_weight.c b/src/select/properties/font_weight.c
index c0c2f2b..da918a1 100644
--- a/src/select/properties/font_weight.c
+++ b/src/select/properties/font_weight.c
@@ -21,7 +21,7 @@ css_error css__cascade_font_weight(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case FONT_WEIGHT_NORMAL:
value = CSS_FONT_WEIGHT_NORMAL;
@@ -66,7 +66,7 @@ css_error css__cascade_font_weight(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_font_weight(state->computed, value);
}
@@ -84,16 +84,25 @@ css_error css__initial_font_weight(css_select_state *state)
return set_font_weight(state->computed, CSS_FONT_WEIGHT_NORMAL);
}
+css_error css__copy_font_weight(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_font_weight(to, get_font_weight(from));
+}
+
css_error css__compose_font_weight(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_font_weight(child);
- if (type == CSS_FONT_WEIGHT_INHERIT) {
- type = get_font_weight(parent);
- }
-
- return set_font_weight(result, type);
+ return css__copy_font_weight(
+ type == CSS_FONT_WEIGHT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/height.c b/src/select/properties/height.c
index 1d74c4a..d449e72 100644
--- a/src/select/properties/height.c
+++ b/src/select/properties/height.c
@@ -32,6 +32,21 @@ css_error css__initial_height(css_select_state *state)
return set_height(state->computed, CSS_HEIGHT_AUTO, 0, CSS_UNIT_PX);
}
+css_error css__copy_height(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_height(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_height(to, type, length, unit);
+}
+
css_error css__compose_height(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_height(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_height(child, &length, &unit);
- if (type == CSS_HEIGHT_INHERIT) {
- type = get_height(parent, &length, &unit);
- }
-
- return set_height(result, type, length, unit);
+ return css__copy_height(
+ type == CSS_HEIGHT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/helpers.c b/src/select/properties/helpers.c
index 5893919..10ff228 100644
--- a/src/select/properties/helpers.c
+++ b/src/select/properties/helpers.c
@@ -16,45 +16,6 @@
#include "select/properties/helpers.h"
-/* Useful helpers */
-
-css_unit css__to_css_unit(uint32_t u)
-{
- switch (u) {
- case UNIT_PX: return CSS_UNIT_PX;
- case UNIT_EX: return CSS_UNIT_EX;
- case UNIT_EM: return CSS_UNIT_EM;
- case UNIT_IN: return CSS_UNIT_IN;
- case UNIT_CM: return CSS_UNIT_CM;
- case UNIT_MM: return CSS_UNIT_MM;
- case UNIT_PT: return CSS_UNIT_PT;
- case UNIT_PC: return CSS_UNIT_PC;
- case UNIT_CAP: return CSS_UNIT_CAP;
- case UNIT_CH: return CSS_UNIT_CH;
- case UNIT_IC: return CSS_UNIT_IC;
- case UNIT_REM: return CSS_UNIT_REM;
- case UNIT_LH: return CSS_UNIT_LH;
- case UNIT_RLH: return CSS_UNIT_RLH;
- case UNIT_VH: return CSS_UNIT_VH;
- case UNIT_VW: return CSS_UNIT_VW;
- case UNIT_VI: return CSS_UNIT_VI;
- case UNIT_VB: return CSS_UNIT_VB;
- case UNIT_VMIN: return CSS_UNIT_VMIN;
- case UNIT_VMAX: return CSS_UNIT_VMAX;
- case UNIT_Q: return CSS_UNIT_Q;
- case UNIT_PCT: return CSS_UNIT_PCT;
- case UNIT_DEG: return CSS_UNIT_DEG;
- case UNIT_GRAD: return CSS_UNIT_GRAD;
- case UNIT_RAD: return CSS_UNIT_RAD;
- case UNIT_MS: return CSS_UNIT_MS;
- case UNIT_S: return CSS_UNIT_S;
- case UNIT_HZ: return CSS_UNIT_HZ;
- case UNIT_KHZ: return CSS_UNIT_KHZ;
- }
-
- return 0;
-}
-
/******************************************************************************
* Utilities below here *
******************************************************************************/
@@ -72,7 +33,7 @@ css_error css__cascade_bg_border_color(uint32_t opv, css_style *style,
assert(CSS_BACKGROUND_COLOR_CURRENT_COLOR ==
(enum css_background_color_e)CSS_BORDER_COLOR_CURRENT_COLOR);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BACKGROUND_COLOR_TRANSPARENT:
value = CSS_BACKGROUND_COLOR_COLOR;
@@ -89,7 +50,7 @@ css_error css__cascade_bg_border_color(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return fun(state->computed, value, color);
}
@@ -104,7 +65,7 @@ css_error css__cascade_uri_none(uint32_t opv, css_style *style,
uint16_t value = CSS_BACKGROUND_IMAGE_INHERIT;
lwc_string *uri = NULL;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BACKGROUND_IMAGE_NONE:
value = CSS_BACKGROUND_IMAGE_NONE;
@@ -119,7 +80,7 @@ css_error css__cascade_uri_none(uint32_t opv, css_style *style,
/** \todo lose fun != NULL once all properties have set routines */
if (fun != NULL && css__outranks_existing(getOpcode(opv),
- isImportant(opv), state, isInherit(opv))) {
+ isImportant(opv), state, getFlagValue(opv))) {
return fun(state->computed, value, uri);
}
@@ -134,7 +95,7 @@ css_error css__cascade_border_style(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BORDER_STYLE_NONE:
value = CSS_BORDER_STYLE_NONE;
@@ -170,7 +131,7 @@ css_error css__cascade_border_style(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return fun(state->computed, value);
}
@@ -186,7 +147,7 @@ css_error css__cascade_border_width(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BORDER_WIDTH_SET:
value = CSS_BORDER_WIDTH_WIDTH;
@@ -210,7 +171,7 @@ css_error css__cascade_border_width(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return fun(state->computed, value, length, unit);
}
@@ -226,7 +187,7 @@ css_error css__cascade_length_auto(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BOTTOM_SET:
value = CSS_BOTTOM_SET;
@@ -244,7 +205,7 @@ css_error css__cascade_length_auto(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return fun(state->computed, value, length, unit);
}
@@ -260,7 +221,7 @@ css_error css__cascade_length_normal(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case LETTER_SPACING_SET:
value = CSS_LETTER_SPACING_SET;
@@ -278,7 +239,7 @@ css_error css__cascade_length_normal(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return fun(state->computed, value, length, unit);
}
@@ -294,7 +255,7 @@ css_error css__cascade_length_none(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case MAX_HEIGHT_SET:
value = CSS_MAX_HEIGHT_SET;
@@ -312,7 +273,7 @@ css_error css__cascade_length_none(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return fun(state->computed, value, length, unit);
}
@@ -328,7 +289,7 @@ css_error css__cascade_length(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = CSS_MIN_HEIGHT_SET;
length = *((css_fixed *) style->bytecode);
advance_bytecode(style, sizeof(length));
@@ -340,7 +301,7 @@ css_error css__cascade_length(uint32_t opv, css_style *style,
/** \todo lose fun != NULL once all properties have set routines */
if (fun != NULL && css__outranks_existing(getOpcode(opv),
- isImportant(opv), state, isInherit(opv))) {
+ isImportant(opv), state, getFlagValue(opv))) {
return fun(state->computed, value, length, unit);
}
@@ -356,7 +317,7 @@ css_error css__cascade_number(uint32_t opv, css_style *style,
/** \todo values */
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = 0;
length = *((css_fixed *) style->bytecode);
advance_bytecode(style, sizeof(length));
@@ -364,7 +325,7 @@ css_error css__cascade_number(uint32_t opv, css_style *style,
/** \todo lose fun != NULL once all properties have set routines */
if (fun != NULL && css__outranks_existing(getOpcode(opv),
- isImportant(opv), state, isInherit(opv))) {
+ isImportant(opv), state, getFlagValue(opv))) {
return fun(state->computed, value, length);
}
@@ -379,7 +340,7 @@ css_error css__cascade_page_break_after_before_inside(uint32_t opv,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case PAGE_BREAK_AFTER_AUTO:
value = CSS_PAGE_BREAK_AFTER_AUTO;
@@ -401,7 +362,7 @@ css_error css__cascade_page_break_after_before_inside(uint32_t opv,
/** \todo lose fun != NULL */
if (fun != NULL && css__outranks_existing(getOpcode(opv),
- isImportant(opv), state, isInherit(opv))) {
+ isImportant(opv), state, getFlagValue(opv))) {
return fun(state->computed, value);
}
@@ -416,7 +377,7 @@ css_error css__cascade_break_after_before_inside(uint32_t opv,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case BREAK_AFTER_AUTO:
value = CSS_BREAK_AFTER_AUTO;
@@ -450,7 +411,7 @@ css_error css__cascade_break_after_before_inside(uint32_t opv,
/** \todo lose fun != NULL */
if (fun != NULL && css__outranks_existing(getOpcode(opv),
- isImportant(opv), state, isInherit(opv))) {
+ isImportant(opv), state, getFlagValue(opv))) {
return fun(state->computed, value);
}
@@ -466,7 +427,7 @@ css_error css__cascade_counter_increment_reset(uint32_t opv, css_style *style,
css_computed_counter *counters = NULL;
uint32_t n_counters = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case COUNTER_INCREMENT_NAMED:
{
@@ -529,7 +490,7 @@ css_error css__cascade_counter_increment_reset(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
css_error error;
error = fun(state->computed, value, counters);
diff --git a/src/select/properties/helpers.h b/src/select/properties/helpers.h
index 901bcf0..16c5d7a 100644
--- a/src/select/properties/helpers.h
+++ b/src/select/properties/helpers.h
@@ -8,13 +8,13 @@
#ifndef css_select_properties_helpers_h_
#define css_select_properties_helpers_h_
+#include "select/helpers.h"
+
uint32_t generic_destroy_color(void *bytecode);
uint32_t generic_destroy_uri(void *bytecode);
uint32_t generic_destroy_length(void *bytecode);
uint32_t generic_destroy_number(void *bytecode);
-css_unit css__to_css_unit(uint32_t u);
-
css_error css__cascade_bg_border_color(uint32_t opv, css_style *style,
css_select_state *state,
css_error (*fun)(css_computed_style *, uint8_t, css_color));
@@ -59,4 +59,137 @@ css_error css__cascade_counter_increment_reset(uint32_t opv, css_style *style,
css_error (*fun)(css_computed_style *, uint8_t,
css_computed_counter *));
+/** Copy NULL terminated array of lwc_string pointers. */
+static inline css_error css__copy_lwc_string_array(
+ bool ref,
+ lwc_string *const*orig,
+ lwc_string ***copy_out)
+{
+ size_t count = 0;
+ lwc_string **copy = NULL;
+
+ if (orig != NULL) {
+ for (lwc_string *const*i = orig; (*i) != NULL; i++) {
+ count++;
+ }
+
+ copy = malloc((count + 1) * sizeof(*copy));
+ if (copy == NULL) {
+ return CSS_NOMEM;
+ }
+
+ if (ref) {
+ for (size_t i = 0; i < count; i++) {
+ copy[i] = lwc_string_ref(orig[i]);
+ }
+ copy[count] = NULL;
+ } else {
+ memcpy(copy, orig, (count + 1) * sizeof(*copy));
+ }
+ }
+
+ *copy_out = copy;
+ return CSS_OK;
+}
+
+/** Copy NULL-name terminated array of css_computed_counter items. */
+static inline css_error css__copy_computed_counter_array(
+ bool ref,
+ const css_computed_counter *orig,
+ css_computed_counter **copy_out)
+{
+ size_t count = 0;
+ css_computed_counter *copy = NULL;
+
+ if (orig != NULL) {
+ for (const css_computed_counter *i = orig;
+ i->name != NULL; i++) {
+ count++;
+ }
+
+ copy = malloc((count + 1) * sizeof(*copy));
+ if (copy == NULL) {
+ return CSS_NOMEM;
+ }
+
+ if (ref) {
+ for (size_t i = 0; i < count; i++) {
+ copy[i].name = lwc_string_ref(orig[i].name);
+ copy[i].value = orig[i].value;
+ }
+ copy[count].name = NULL;
+ copy[count].value = 0;
+ } else {
+ memcpy(copy, orig, (count + 1) * sizeof(*copy));
+ }
+ }
+
+ *copy_out = copy;
+ return CSS_OK;
+}
+
+/** Copy type:none terminated array of css_computed_content_item items. */
+static inline css_error css__copy_computed_content_item_array(
+ bool ref,
+ const css_computed_content_item *orig,
+ css_computed_content_item **copy_out)
+{
+ size_t count = 0;
+ css_computed_content_item *copy = NULL;
+
+ if (orig != NULL) {
+ for (const css_computed_content_item *i = orig;
+ i->type != CSS_COMPUTED_CONTENT_NONE; i++) {
+ count++;
+ }
+
+ copy = malloc((count + 1) * sizeof(*copy));
+ if (copy == NULL) {
+ return CSS_NOMEM;
+ }
+
+ if (ref) {
+ for (size_t i = 0; i < count; i++) {
+ switch (orig[i].type) {
+ case CSS_COMPUTED_CONTENT_STRING:
+ copy[i].data.string = lwc_string_ref(
+ orig[i].data.string);
+ break;
+ case CSS_COMPUTED_CONTENT_URI:
+ copy[i].data.uri = lwc_string_ref(
+ orig[i].data.uri);
+ break;
+ case CSS_COMPUTED_CONTENT_ATTR:
+ copy[i].data.attr = lwc_string_ref(
+ orig[i].data.attr);
+ break;
+ case CSS_COMPUTED_CONTENT_COUNTER:
+ copy[i].data.counter.name = lwc_string_ref(
+ orig[i].data.counter.name);
+ copy[i].data.counter.style =
+ orig[i].data.counter.style;
+ break;
+ case CSS_COMPUTED_CONTENT_COUNTERS:
+ copy[i].data.counters.name = lwc_string_ref(
+ orig[i].data.counters.name);
+ copy[i].data.counters.sep = lwc_string_ref(
+ orig[i].data.counters.sep);
+ copy[i].data.counters.style =
+ orig[i].data.counters.style;
+ break;
+ default:
+ break;
+ }
+ copy[i].type = orig[i].type;
+ }
+ copy[count].type = CSS_COMPUTED_CONTENT_NONE;
+ } else {
+ memcpy(copy, orig, (count + 1) * sizeof(*copy));
+ }
+ }
+
+ *copy_out = copy;
+ return CSS_OK;
+}
+
#endif
diff --git a/src/select/properties/justify_content.c b/src/select/properties/justify_content.c
index 2e17ca5..385bab7 100644
--- a/src/select/properties/justify_content.c
+++ b/src/select/properties/justify_content.c
@@ -21,7 +21,7 @@ css_error css__cascade_justify_content(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case JUSTIFY_CONTENT_FLEX_START:
value = CSS_JUSTIFY_CONTENT_FLEX_START;
@@ -45,7 +45,7 @@ css_error css__cascade_justify_content(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_justify_content(state->computed, value);
}
@@ -64,16 +64,25 @@ css_error css__initial_justify_content(css_select_state *state)
CSS_JUSTIFY_CONTENT_FLEX_START);
}
+css_error css__copy_justify_content(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_justify_content(to, get_justify_content(from));
+}
+
css_error css__compose_justify_content(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_justify_content(child);
- if (type == CSS_JUSTIFY_CONTENT_INHERIT) {
- type = get_justify_content(parent);
- }
-
- return set_justify_content(result, type);
+ return css__copy_justify_content(
+ type == CSS_JUSTIFY_CONTENT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/left.c b/src/select/properties/left.c
index 4baa324..ca8c844 100644
--- a/src/select/properties/left.c
+++ b/src/select/properties/left.c
@@ -32,6 +32,21 @@ css_error css__initial_left(css_select_state *state)
return set_left(state->computed, CSS_LEFT_AUTO, 0, CSS_UNIT_PX);
}
+css_error css__copy_left(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_left(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_left(to, type, length, unit);
+}
+
css_error css__compose_left(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_left(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_left(child, &length, &unit);
- if (type == CSS_LEFT_INHERIT) {
- type = get_left(parent, &length, &unit);
- }
-
- return set_left(result, type, length, unit);
+ return css__copy_left(
+ type == CSS_LEFT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/letter_spacing.c b/src/select/properties/letter_spacing.c
index 27ea04b..9c8e50c 100644
--- a/src/select/properties/letter_spacing.c
+++ b/src/select/properties/letter_spacing.c
@@ -33,6 +33,21 @@ css_error css__initial_letter_spacing(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_letter_spacing(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_letter_spacing(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_letter_spacing(to, type, length, unit);
+}
+
css_error css__compose_letter_spacing(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,9 +56,7 @@ css_error css__compose_letter_spacing(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_letter_spacing(child, &length, &unit);
- if (type == CSS_LETTER_SPACING_INHERIT) {
- type = get_letter_spacing(parent, &length, &unit);
- }
-
- return set_letter_spacing(result, type, length, unit);
+ return css__copy_letter_spacing(
+ type == CSS_LETTER_SPACING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/line_height.c b/src/select/properties/line_height.c
index 091a575..7300b5d 100644
--- a/src/select/properties/line_height.c
+++ b/src/select/properties/line_height.c
@@ -21,7 +21,7 @@ css_error css__cascade_line_height(uint32_t opv, css_style *style,
css_fixed val = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case LINE_HEIGHT_NUMBER:
value = CSS_LINE_HEIGHT_NUMBER;
@@ -44,7 +44,7 @@ css_error css__cascade_line_height(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_line_height(state->computed, value, val, unit);
}
@@ -64,6 +64,21 @@ css_error css__initial_line_height(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_line_height(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_line_height(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_line_height(to, type, length, unit);
+}
+
css_error css__compose_line_height(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -72,10 +87,8 @@ css_error css__compose_line_height(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_line_height(child, &length, &unit);
- if (type == CSS_LINE_HEIGHT_INHERIT) {
- type = get_line_height(parent, &length, &unit);
- }
-
- return set_line_height(result, type, length, unit);
+ return css__copy_line_height(
+ type == CSS_LINE_HEIGHT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/list_style_image.c b/src/select/properties/list_style_image.c
index cc77eb4..7a41c3a 100644
--- a/src/select/properties/list_style_image.c
+++ b/src/select/properties/list_style_image.c
@@ -39,6 +39,20 @@ css_error css__initial_list_style_image(css_select_state *state)
CSS_LIST_STYLE_IMAGE_NONE, NULL);
}
+css_error css__copy_list_style_image(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ lwc_string *url;
+ uint8_t type = get_list_style_image(from, &url);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_list_style_image(to, type, url);
+}
+
css_error css__compose_list_style_image(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -46,10 +60,8 @@ css_error css__compose_list_style_image(const css_computed_style *parent,
lwc_string *url;
uint8_t type = get_list_style_image(child, &url);
- if (type == CSS_LIST_STYLE_IMAGE_INHERIT) {
- type = get_list_style_image(parent, &url);
- }
-
- return set_list_style_image(result, type, url);
+ return css__copy_list_style_image(
+ type == CSS_LIST_STYLE_IMAGE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/list_style_position.c b/src/select/properties/list_style_position.c
index 02d7651..ca46850 100644
--- a/src/select/properties/list_style_position.c
+++ b/src/select/properties/list_style_position.c
@@ -21,7 +21,7 @@ css_error css__cascade_list_style_position(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case LIST_STYLE_POSITION_INSIDE:
value = CSS_LIST_STYLE_POSITION_INSIDE;
@@ -33,7 +33,7 @@ css_error css__cascade_list_style_position(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_list_style_position(state->computed, value);
}
@@ -52,16 +52,25 @@ css_error css__initial_list_style_position(css_select_state *state)
CSS_LIST_STYLE_POSITION_OUTSIDE);
}
+css_error css__copy_list_style_position(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_list_style_position(to, get_list_style_position(from));
+}
+
css_error css__compose_list_style_position(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_list_style_position(child);
- if (type == CSS_LIST_STYLE_POSITION_INHERIT) {
- type = get_list_style_position(parent);
- }
-
- return set_list_style_position(result, type);
+ return css__copy_list_style_position(
+ type == CSS_LIST_STYLE_POSITION_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/list_style_type.c b/src/select/properties/list_style_type.c
index b1e5db6..9d809e6 100644
--- a/src/select/properties/list_style_type.c
+++ b/src/select/properties/list_style_type.c
@@ -21,7 +21,7 @@ css_error css__cascade_list_style_type(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case LIST_STYLE_TYPE_DISC:
value = CSS_LIST_STYLE_TYPE_DISC;
@@ -68,11 +68,122 @@ css_error css__cascade_list_style_type(uint32_t opv, css_style *style,
case LIST_STYLE_TYPE_NONE:
value = CSS_LIST_STYLE_TYPE_NONE;
break;
+ case LIST_STYLE_TYPE_BINARY:
+ value = CSS_LIST_STYLE_TYPE_BINARY;
+ break;
+ case LIST_STYLE_TYPE_OCTAL:
+ value = CSS_LIST_STYLE_TYPE_OCTAL;
+ break;
+ case LIST_STYLE_TYPE_LOWER_HEXADECIMAL:
+ value = CSS_LIST_STYLE_TYPE_LOWER_HEXADECIMAL;
+ break;
+ case LIST_STYLE_TYPE_UPPER_HEXADECIMAL:
+ value = CSS_LIST_STYLE_TYPE_UPPER_HEXADECIMAL;
+ break;
+ case LIST_STYLE_TYPE_ARABIC_INDIC:
+ value = CSS_LIST_STYLE_TYPE_ARABIC_INDIC;
+ break;
+ case LIST_STYLE_TYPE_LOWER_ARMENIAN:
+ value = CSS_LIST_STYLE_TYPE_LOWER_ARMENIAN;
+ break;
+ case LIST_STYLE_TYPE_UPPER_ARMENIAN:
+ value = CSS_LIST_STYLE_TYPE_UPPER_ARMENIAN;
+ break;
+ case LIST_STYLE_TYPE_BENGALI:
+ value = CSS_LIST_STYLE_TYPE_BENGALI;
+ break;
+ case LIST_STYLE_TYPE_CAMBODIAN:
+ value = CSS_LIST_STYLE_TYPE_CAMBODIAN;
+ break;
+ case LIST_STYLE_TYPE_KHMER:
+ value = CSS_LIST_STYLE_TYPE_KHMER;
+ break;
+ case LIST_STYLE_TYPE_CJK_DECIMAL:
+ value = CSS_LIST_STYLE_TYPE_CJK_DECIMAL;
+ break;
+ case LIST_STYLE_TYPE_DEVANAGARI:
+ value = CSS_LIST_STYLE_TYPE_DEVANAGARI;
+ break;
+ case LIST_STYLE_TYPE_GUJARATI:
+ value = CSS_LIST_STYLE_TYPE_GUJARATI;
+ break;
+ case LIST_STYLE_TYPE_GURMUKHI:
+ value = CSS_LIST_STYLE_TYPE_GURMUKHI;
+ break;
+ case LIST_STYLE_TYPE_HEBREW:
+ value = CSS_LIST_STYLE_TYPE_HEBREW;
+ break;
+ case LIST_STYLE_TYPE_KANNADA:
+ value = CSS_LIST_STYLE_TYPE_KANNADA;
+ break;
+ case LIST_STYLE_TYPE_LAO:
+ value = CSS_LIST_STYLE_TYPE_LAO;
+ break;
+ case LIST_STYLE_TYPE_MALAYALAM:
+ value = CSS_LIST_STYLE_TYPE_MALAYALAM;
+ break;
+ case LIST_STYLE_TYPE_MONGOLIAN:
+ value = CSS_LIST_STYLE_TYPE_MONGOLIAN;
+ break;
+ case LIST_STYLE_TYPE_MYANMAR:
+ value = CSS_LIST_STYLE_TYPE_MYANMAR;
+ break;
+ case LIST_STYLE_TYPE_ORIYA:
+ value = CSS_LIST_STYLE_TYPE_ORIYA;
+ break;
+ case LIST_STYLE_TYPE_PERSIAN:
+ value = CSS_LIST_STYLE_TYPE_PERSIAN;
+ break;
+ case LIST_STYLE_TYPE_TAMIL:
+ value = CSS_LIST_STYLE_TYPE_TAMIL;
+ break;
+ case LIST_STYLE_TYPE_TELUGU:
+ value = CSS_LIST_STYLE_TYPE_TELUGU;
+ break;
+ case LIST_STYLE_TYPE_THAI:
+ value = CSS_LIST_STYLE_TYPE_THAI;
+ break;
+ case LIST_STYLE_TYPE_TIBETAN:
+ value = CSS_LIST_STYLE_TYPE_TIBETAN;
+ break;
+ case LIST_STYLE_TYPE_CJK_EARTHLY_BRANCH:
+ value = CSS_LIST_STYLE_TYPE_CJK_EARTHLY_BRANCH;
+ break;
+ case LIST_STYLE_TYPE_CJK_HEAVENLY_STEM:
+ value = CSS_LIST_STYLE_TYPE_CJK_HEAVENLY_STEM;
+ break;
+ case LIST_STYLE_TYPE_HIAGANA:
+ value = CSS_LIST_STYLE_TYPE_HIAGANA;
+ break;
+ case LIST_STYLE_TYPE_HIAGANA_IROHA:
+ value = CSS_LIST_STYLE_TYPE_HIAGANA_IROHA;
+ break;
+ case LIST_STYLE_TYPE_KATAKANA:
+ value = CSS_LIST_STYLE_TYPE_KATAKANA;
+ break;
+ case LIST_STYLE_TYPE_KATAKANA_IROHA:
+ value = CSS_LIST_STYLE_TYPE_KATAKANA_IROHA;
+ break;
+ case LIST_STYLE_TYPE_JAPANESE_INFORMAL:
+ value = CSS_LIST_STYLE_TYPE_JAPANESE_INFORMAL;
+ break;
+ case LIST_STYLE_TYPE_JAPANESE_FORMAL:
+ value = CSS_LIST_STYLE_TYPE_JAPANESE_FORMAL;
+ break;
+ case LIST_STYLE_TYPE_KOREAN_HANGUL_FORMAL:
+ value = CSS_LIST_STYLE_TYPE_KOREAN_HANGUL_FORMAL;
+ break;
+ case LIST_STYLE_TYPE_KOREAN_HANJA_INFORMAL:
+ value = CSS_LIST_STYLE_TYPE_KOREAN_HANJA_INFORMAL;
+ break;
+ case LIST_STYLE_TYPE_KOREAN_HANJA_FORMAL:
+ value = CSS_LIST_STYLE_TYPE_KOREAN_HANJA_FORMAL;
+ break;
}
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_list_style_type(state->computed, value);
}
@@ -90,16 +201,24 @@ css_error css__initial_list_style_type(css_select_state *state)
return set_list_style_type(state->computed, CSS_LIST_STYLE_TYPE_DISC);
}
+css_error css__copy_list_style_type(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_list_style_type(to, get_list_style_type(from));
+}
+
css_error css__compose_list_style_type(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_list_style_type(child);
- if (type == CSS_LIST_STYLE_TYPE_INHERIT) {
- type = get_list_style_type(parent);
- }
-
- return set_list_style_type(result, type);
+ return css__copy_list_style_type(
+ type == CSS_LIST_STYLE_TYPE_INHERIT ? parent : child,
+ result);
}
-
diff --git a/src/select/properties/margin_bottom.c b/src/select/properties/margin_bottom.c
index 3b1d8a1..a0ffd89 100644
--- a/src/select/properties/margin_bottom.c
+++ b/src/select/properties/margin_bottom.c
@@ -32,6 +32,21 @@ css_error css__initial_margin_bottom(css_select_state *state)
return set_margin_bottom(state->computed, CSS_MARGIN_SET, 0, CSS_UNIT_PX);
}
+css_error css__copy_margin_bottom(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_margin_bottom(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_margin_bottom(to, type, length, unit);
+}
+
css_error css__compose_margin_bottom(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_margin_bottom(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_margin_bottom(child, &length, &unit);
- if (type == CSS_MARGIN_INHERIT) {
- type = get_margin_bottom(parent, &length, &unit);
- }
-
- return set_margin_bottom(result, type, length, unit);
+ return css__copy_margin_bottom(
+ type == CSS_MARGIN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/margin_left.c b/src/select/properties/margin_left.c
index 240285a..b163fba 100644
--- a/src/select/properties/margin_left.c
+++ b/src/select/properties/margin_left.c
@@ -32,6 +32,21 @@ css_error css__initial_margin_left(css_select_state *state)
return set_margin_left(state->computed, CSS_MARGIN_SET, 0, CSS_UNIT_PX);
}
+css_error css__copy_margin_left(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_margin_left(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_margin_left(to, type, length, unit);
+}
+
css_error css__compose_margin_left(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_margin_left(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_margin_left(child, &length, &unit);
- if (type == CSS_MARGIN_INHERIT) {
- type = get_margin_left(parent, &length, &unit);
- }
-
- return set_margin_left(result, type, length, unit);
+ return css__copy_margin_left(
+ type == CSS_MARGIN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/margin_right.c b/src/select/properties/margin_right.c
index 737fbee..2c15b54 100644
--- a/src/select/properties/margin_right.c
+++ b/src/select/properties/margin_right.c
@@ -32,6 +32,21 @@ css_error css__initial_margin_right(css_select_state *state)
return set_margin_right(state->computed, CSS_MARGIN_SET, 0, CSS_UNIT_PX);
}
+css_error css__copy_margin_right(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_margin_right(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_margin_right(to, type, length, unit);
+}
+
css_error css__compose_margin_right(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_margin_right(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_margin_right(child, &length, &unit);
- if (type == CSS_MARGIN_INHERIT) {
- type = get_margin_right(parent, &length, &unit);
- }
-
- return set_margin_right(result, type, length, unit);
+ return css__copy_margin_right(
+ type == CSS_MARGIN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/margin_top.c b/src/select/properties/margin_top.c
index 5563a48..1df811d 100644
--- a/src/select/properties/margin_top.c
+++ b/src/select/properties/margin_top.c
@@ -32,6 +32,21 @@ css_error css__initial_margin_top(css_select_state *state)
return set_margin_top(state->computed, CSS_MARGIN_SET, 0, CSS_UNIT_PX);
}
+css_error css__copy_margin_top(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_margin_top(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_margin_top(to, type, length, unit);
+}
+
css_error css__compose_margin_top(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_margin_top(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_margin_top(child, &length, &unit);
- if (type == CSS_MARGIN_INHERIT) {
- type = get_margin_top(parent, &length, &unit);
- }
-
- return set_margin_top(result, type, length, unit);
+ return css__copy_margin_top(
+ type == CSS_MARGIN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/max_height.c b/src/select/properties/max_height.c
index e03c8da..1dcf09d 100644
--- a/src/select/properties/max_height.c
+++ b/src/select/properties/max_height.c
@@ -33,6 +33,21 @@ css_error css__initial_max_height(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_max_height(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_max_height(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_max_height(to, type, length, unit);
+}
+
css_error css__compose_max_height(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_max_height(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_max_height(child, &length, &unit);
- if (type == CSS_MAX_HEIGHT_INHERIT) {
- type = get_max_height(parent, &length, &unit);
- }
-
- return set_max_height(result, type, length, unit);
+ return css__copy_max_height(
+ type == CSS_MAX_HEIGHT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/max_width.c b/src/select/properties/max_width.c
index ec98712..11d8ade 100644
--- a/src/select/properties/max_width.c
+++ b/src/select/properties/max_width.c
@@ -32,6 +32,21 @@ css_error css__initial_max_width(css_select_state *state)
return set_max_width(state->computed, CSS_MAX_WIDTH_NONE, 0, CSS_UNIT_PX);
}
+css_error css__copy_max_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_max_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_max_width(to, type, length, unit);
+}
+
css_error css__compose_max_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_max_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_max_width(child, &length, &unit);
- if (type == CSS_MAX_WIDTH_INHERIT) {
- type = get_max_width(parent, &length, &unit);
- }
-
- return set_max_width(result, type, length, unit);
+ return css__copy_max_width(
+ type == CSS_MAX_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/min_height.c b/src/select/properties/min_height.c
index a5389ce..d05655c 100644
--- a/src/select/properties/min_height.c
+++ b/src/select/properties/min_height.c
@@ -33,6 +33,21 @@ css_error css__initial_min_height(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_min_height(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_min_height(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_min_height(to, type, length, unit);
+}
+
css_error css__compose_min_height(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_min_height(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_min_height(child, &length, &unit);
- if (type == CSS_MIN_HEIGHT_INHERIT) {
- type = get_min_height(parent, &length, &unit);
- }
-
- return set_min_height(result, type, length, unit);
+ return css__copy_min_height(
+ type == CSS_MIN_HEIGHT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/min_width.c b/src/select/properties/min_width.c
index 8460e01..af709d3 100644
--- a/src/select/properties/min_width.c
+++ b/src/select/properties/min_width.c
@@ -33,6 +33,21 @@ css_error css__initial_min_width(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_min_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_min_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_min_width(to, type, length, unit);
+}
+
css_error css__compose_min_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_min_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_min_width(child, &length, &unit);
- if (type == CSS_MIN_WIDTH_INHERIT) {
- type = get_min_width(parent, &length, &unit);
- }
-
- return set_min_width(result, type, length, unit);
+ return css__copy_min_width(
+ type == CSS_MIN_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/opacity.c b/src/select/properties/opacity.c
index aadab0b..3e875f9 100644
--- a/src/select/properties/opacity.c
+++ b/src/select/properties/opacity.c
@@ -20,15 +20,15 @@ css_error css__cascade_opacity(uint32_t opv, css_style *style,
uint16_t value = CSS_OPACITY_INHERIT;
css_fixed opacity = 0;
- if (isInherit(opv) == false) {
- value = CSS_Z_INDEX_SET;
+ if (hasFlagValue(opv) == false) {
+ value = CSS_OPACITY_SET;
opacity = *((css_fixed *) style->bytecode);
advance_bytecode(style, sizeof(opacity));
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_opacity(state->computed, value, opacity);
}
@@ -46,6 +46,20 @@ css_error css__initial_opacity(css_select_state *state)
return set_opacity(state->computed, CSS_OPACITY_SET, INTTOFIX(1));
}
+css_error css__copy_opacity(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed opacity = 0;
+ uint8_t type = get_opacity(from, &opacity);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_opacity(to, type, opacity);
+}
+
css_error css__compose_opacity(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -53,10 +67,8 @@ css_error css__compose_opacity(const css_computed_style *parent,
css_fixed opacity = 0;
uint8_t type = get_opacity(child, &opacity);
- if (type == CSS_OPACITY_INHERIT) {
- type = get_opacity(parent, &opacity);
- }
-
- return set_opacity(result, type, opacity);
+ return css__copy_opacity(
+ type == CSS_OPACITY_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/order.c b/src/select/properties/order.c
index 0366537..4004c0e 100644
--- a/src/select/properties/order.c
+++ b/src/select/properties/order.c
@@ -20,7 +20,7 @@ css_error css__cascade_order(uint32_t opv, css_style *style,
uint16_t value = CSS_ORDER_INHERIT;
css_fixed order = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
value = CSS_ORDER_SET;
order = FIXTOINT(*((css_fixed *) style->bytecode));
@@ -28,7 +28,7 @@ css_error css__cascade_order(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_order(state->computed, value, order);
}
@@ -46,6 +46,20 @@ css_error css__initial_order(css_select_state *state)
return set_order(state->computed, CSS_ORDER_SET, 0);
}
+css_error css__copy_order(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ int32_t order = 0;
+ uint8_t type = get_order(from, &order);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_order(to, type, order);
+}
+
css_error css__compose_order(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -53,10 +67,8 @@ css_error css__compose_order(const css_computed_style *parent,
int32_t order = 0;
uint8_t type = get_order(child, &order);
- if (type == CSS_ORDER_INHERIT) {
- type = get_order(parent, &order);
- }
-
- return set_order(result, type, order);
+ return css__copy_order(
+ type == CSS_ORDER_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/orphans.c b/src/select/properties/orphans.c
index f169b81..b0fee43 100644
--- a/src/select/properties/orphans.c
+++ b/src/select/properties/orphans.c
@@ -31,6 +31,20 @@ css_error css__initial_orphans(css_select_state *state)
return set_orphans(state->computed, CSS_ORPHANS_SET, 2);
}
+css_error css__copy_orphans(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ int32_t count = 0;
+ uint8_t type = get_orphans(from, &count);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_orphans(to, type, count);
+}
+
css_error css__compose_orphans(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -38,10 +52,8 @@ css_error css__compose_orphans(const css_computed_style *parent,
int32_t count = 0;
uint8_t type = get_orphans(child, &count);
- if (type == CSS_ORPHANS_INHERIT) {
- type = get_orphans(parent, &count);
- }
-
- return set_orphans(result, type, count);
+ return css__copy_orphans(
+ type == CSS_ORPHANS_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/outline_color.c b/src/select/properties/outline_color.c
index 97846ac..359960f 100644
--- a/src/select/properties/outline_color.c
+++ b/src/select/properties/outline_color.c
@@ -20,7 +20,7 @@ css_error css__cascade_outline_color(uint32_t opv, css_style *style,
uint16_t value = CSS_OUTLINE_COLOR_INHERIT;
css_color color = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case OUTLINE_COLOR_TRANSPARENT:
value = CSS_OUTLINE_COLOR_COLOR;
@@ -40,7 +40,7 @@ css_error css__cascade_outline_color(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_outline_color(state->computed, value, color);
}
@@ -58,6 +58,20 @@ css_error css__initial_outline_color(css_select_state *state)
return set_outline_color(state->computed, CSS_OUTLINE_COLOR_INVERT, 0);
}
+css_error css__copy_outline_color(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_color color = 0;
+ uint8_t type = get_outline_color(from, &color);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_outline_color(to, type, color);
+}
+
css_error css__compose_outline_color(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -65,9 +79,7 @@ css_error css__compose_outline_color(const css_computed_style *parent,
css_color color = 0;
uint8_t type = get_outline_color(child, &color);
- if (type == CSS_OUTLINE_COLOR_INHERIT) {
- type = get_outline_color(parent, &color);
- }
-
- return set_outline_color(result, type, color);
+ return css__copy_outline_color(
+ type == CSS_OUTLINE_COLOR_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/outline_style.c b/src/select/properties/outline_style.c
index 5c30735..acdab03 100644
--- a/src/select/properties/outline_style.c
+++ b/src/select/properties/outline_style.c
@@ -31,16 +31,25 @@ css_error css__initial_outline_style(css_select_state *state)
return set_outline_style(state->computed, CSS_OUTLINE_STYLE_NONE);
}
+css_error css__copy_outline_style(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_outline_style(to, get_outline_style(from));
+}
+
css_error css__compose_outline_style(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_outline_style(child);
- if (type == CSS_OUTLINE_STYLE_INHERIT) {
- type = get_outline_style(parent);
- }
-
- return set_outline_style(result, type);
+ return css__copy_outline_style(
+ type == CSS_OUTLINE_STYLE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/outline_width.c b/src/select/properties/outline_width.c
index 0289c57..dbc0298 100644
--- a/src/select/properties/outline_width.c
+++ b/src/select/properties/outline_width.c
@@ -33,6 +33,21 @@ css_error css__initial_outline_width(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_outline_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_outline_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_outline_width(to, type, length, unit);
+}
+
css_error css__compose_outline_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_outline_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_outline_width(child, &length, &unit);
- if (type == CSS_OUTLINE_WIDTH_INHERIT) {
- type = get_outline_width(parent, &length, &unit);
- }
-
- return set_outline_width(result, type, length, unit);
+ return css__copy_outline_width(
+ type == CSS_OUTLINE_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/overflow_x.c b/src/select/properties/overflow_x.c
index 817d1d2..98dfba5 100644
--- a/src/select/properties/overflow_x.c
+++ b/src/select/properties/overflow_x.c
@@ -21,7 +21,7 @@ css_error css__cascade_overflow_x(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case OVERFLOW_VISIBLE:
value = CSS_OVERFLOW_VISIBLE;
@@ -39,7 +39,7 @@ css_error css__cascade_overflow_x(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_overflow_x(state->computed, value);
}
@@ -57,16 +57,25 @@ css_error css__initial_overflow_x(css_select_state *state)
return set_overflow_x(state->computed, CSS_OVERFLOW_VISIBLE);
}
+css_error css__copy_overflow_x(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_overflow_x(to, get_overflow_x(from));
+}
+
css_error css__compose_overflow_x(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_overflow_x(child);
- if (type == CSS_OVERFLOW_INHERIT) {
- type = get_overflow_x(parent);
- }
-
- return set_overflow_x(result, type);
+ return css__copy_overflow_x(
+ type == CSS_OVERFLOW_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/overflow_y.c b/src/select/properties/overflow_y.c
index b54c4c8..d7795a2 100644
--- a/src/select/properties/overflow_y.c
+++ b/src/select/properties/overflow_y.c
@@ -21,7 +21,7 @@ css_error css__cascade_overflow_y(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case OVERFLOW_VISIBLE:
value = CSS_OVERFLOW_VISIBLE;
@@ -39,7 +39,7 @@ css_error css__cascade_overflow_y(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_overflow_y(state->computed, value);
}
@@ -57,16 +57,25 @@ css_error css__initial_overflow_y(css_select_state *state)
return set_overflow_y(state->computed, CSS_OVERFLOW_VISIBLE);
}
+css_error css__copy_overflow_y(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_overflow_y(to, get_overflow_y(from));
+}
+
css_error css__compose_overflow_y(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_overflow_y(child);
- if (type == CSS_OVERFLOW_INHERIT) {
- type = get_overflow_y(parent);
- }
-
- return set_overflow_y(result, type);
+ return css__copy_overflow_y(
+ type == CSS_OVERFLOW_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/padding_bottom.c b/src/select/properties/padding_bottom.c
index e3b36f7..53c749c 100644
--- a/src/select/properties/padding_bottom.c
+++ b/src/select/properties/padding_bottom.c
@@ -33,6 +33,21 @@ css_error css__initial_padding_bottom(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_padding_bottom(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_padding_bottom(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_padding_bottom(to, type, length, unit);
+}
+
css_error css__compose_padding_bottom(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_padding_bottom(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_padding_bottom(child, &length, &unit);
- if (type == CSS_PADDING_INHERIT) {
- type = get_padding_bottom(parent, &length, &unit);
- }
-
- return set_padding_bottom(result, type, length, unit);
+ return css__copy_padding_bottom(
+ type == CSS_PADDING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/padding_left.c b/src/select/properties/padding_left.c
index bdea11e..b61ca83 100644
--- a/src/select/properties/padding_left.c
+++ b/src/select/properties/padding_left.c
@@ -32,6 +32,21 @@ css_error css__initial_padding_left(css_select_state *state)
return set_padding_left(state->computed, CSS_PADDING_SET, 0, CSS_UNIT_PX);
}
+css_error css__copy_padding_left(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_padding_left(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_padding_left(to, type, length, unit);
+}
+
css_error css__compose_padding_left(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_padding_left(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_padding_left(child, &length, &unit);
- if (type == CSS_PADDING_INHERIT) {
- type = get_padding_left(parent, &length, &unit);
- }
-
- return set_padding_left(result, type, length, unit);
+ return css__copy_padding_left(
+ type == CSS_PADDING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/padding_right.c b/src/select/properties/padding_right.c
index 82c1ed3..35417d6 100644
--- a/src/select/properties/padding_right.c
+++ b/src/select/properties/padding_right.c
@@ -33,6 +33,21 @@ css_error css__initial_padding_right(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_padding_right(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_padding_right(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_padding_right(to, type, length, unit);
+}
+
css_error css__compose_padding_right(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_padding_right(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_padding_right(child, &length, &unit);
- if (type == CSS_PADDING_INHERIT) {
- type = get_padding_right(parent, &length, &unit);
- }
-
- return set_padding_right(result, type, length, unit);
+ return css__copy_padding_right(
+ type == CSS_PADDING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/padding_top.c b/src/select/properties/padding_top.c
index f6d8b3e..a2cec95 100644
--- a/src/select/properties/padding_top.c
+++ b/src/select/properties/padding_top.c
@@ -32,6 +32,21 @@ css_error css__initial_padding_top(css_select_state *state)
return set_padding_top(state->computed, CSS_PADDING_SET, 0, CSS_UNIT_PX);
}
+css_error css__copy_padding_top(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_padding_top(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_padding_top(to, type, length, unit);
+}
+
css_error css__compose_padding_top(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_padding_top(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_padding_top(child, &length, &unit);
- if (type == CSS_PADDING_INHERIT) {
- type = get_padding_top(parent, &length, &unit);
- }
-
- return set_padding_top(result, type, length, unit);
+ return css__copy_padding_top(
+ type == CSS_PADDING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/page_break_after.c b/src/select/properties/page_break_after.c
index fdb6774..4065a17 100644
--- a/src/select/properties/page_break_after.c
+++ b/src/select/properties/page_break_after.c
@@ -33,16 +33,25 @@ css_error css__initial_page_break_after(css_select_state *state)
CSS_PAGE_BREAK_AFTER_AUTO);
}
+css_error css__copy_page_break_after(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_page_break_after(to, get_page_break_after(from));
+}
+
css_error css__compose_page_break_after(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_page_break_after(child);
- if (type == CSS_PAGE_BREAK_AFTER_INHERIT) {
- type = get_page_break_after(parent);
- }
-
- return set_page_break_after(result, type);
+ return css__copy_page_break_after(
+ type == CSS_PAGE_BREAK_AFTER_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/page_break_before.c b/src/select/properties/page_break_before.c
index 1491997..d8fdd93 100644
--- a/src/select/properties/page_break_before.c
+++ b/src/select/properties/page_break_before.c
@@ -33,15 +33,24 @@ css_error css__initial_page_break_before(css_select_state *state)
CSS_PAGE_BREAK_BEFORE_AUTO);
}
+css_error css__copy_page_break_before(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_page_break_before(to, get_page_break_before(from));
+}
+
css_error css__compose_page_break_before(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_page_break_before(child);
- if (type == CSS_PAGE_BREAK_BEFORE_INHERIT) {
- type = get_page_break_before(parent);
- }
-
- return set_page_break_before(result, type);
+ return css__copy_page_break_before(
+ type == CSS_PAGE_BREAK_BEFORE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/page_break_inside.c b/src/select/properties/page_break_inside.c
index ddcb19f..8655c40 100644
--- a/src/select/properties/page_break_inside.c
+++ b/src/select/properties/page_break_inside.c
@@ -33,16 +33,25 @@ css_error css__initial_page_break_inside(css_select_state *state)
CSS_PAGE_BREAK_INSIDE_AUTO);
}
+css_error css__copy_page_break_inside(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_page_break_inside(to, get_page_break_inside(from));
+}
+
css_error css__compose_page_break_inside(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_page_break_inside(child);
- if (type == CSS_PAGE_BREAK_INSIDE_INHERIT) {
- type = get_page_break_inside(parent);
- }
-
- return set_page_break_inside(result, type);
+ return css__copy_page_break_inside(
+ type == CSS_PAGE_BREAK_INSIDE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/pause_after.c b/src/select/properties/pause_after.c
index 16bbefe..b8bf968 100644
--- a/src/select/properties/pause_after.c
+++ b/src/select/properties/pause_after.c
@@ -37,6 +37,16 @@ css_error css__initial_pause_after(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_pause_after(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_pause_after(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/pause_before.c b/src/select/properties/pause_before.c
index 7770615..74cb565 100644
--- a/src/select/properties/pause_before.c
+++ b/src/select/properties/pause_before.c
@@ -37,6 +37,16 @@ css_error css__initial_pause_before(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_pause_before(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_pause_before(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/pitch.c b/src/select/properties/pitch.c
index c5484d9..c0c5c88 100644
--- a/src/select/properties/pitch.c
+++ b/src/select/properties/pitch.c
@@ -20,7 +20,7 @@ css_error css__cascade_pitch(uint32_t opv, css_style *style,
css_fixed freq = 0;
uint32_t unit = UNIT_HZ;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case PITCH_FREQUENCY:
freq = *((css_fixed *) style->bytecode);
@@ -41,7 +41,7 @@ css_error css__cascade_pitch(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo pitch */
}
@@ -64,6 +64,16 @@ css_error css__initial_pitch(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_pitch(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_pitch(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/pitch_range.c b/src/select/properties/pitch_range.c
index 52a5751..c8f7526 100644
--- a/src/select/properties/pitch_range.c
+++ b/src/select/properties/pitch_range.c
@@ -37,6 +37,16 @@ css_error css__initial_pitch_range(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_pitch_range(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_pitch_range(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/play_during.c b/src/select/properties/play_during.c
index 413d75a..0f38f74 100644
--- a/src/select/properties/play_during.c
+++ b/src/select/properties/play_during.c
@@ -19,7 +19,7 @@ css_error css__cascade_play_during(uint32_t opv, css_style *style,
{
lwc_string *uri = NULL;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case PLAY_DURING_URI:
css__stylesheet_string_get(style->sheet, *((css_code_t *) style->bytecode), &uri);
@@ -35,7 +35,7 @@ css_error css__cascade_play_during(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo play-during */
}
@@ -58,6 +58,16 @@ css_error css__initial_play_during(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_play_during(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_play_during(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/position.c b/src/select/properties/position.c
index 9f9658f..cc4b3e7 100644
--- a/src/select/properties/position.c
+++ b/src/select/properties/position.c
@@ -21,7 +21,7 @@ css_error css__cascade_position(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case POSITION_STATIC:
value = CSS_POSITION_STATIC;
@@ -35,11 +35,14 @@ css_error css__cascade_position(uint32_t opv, css_style *style,
case POSITION_FIXED:
value = CSS_POSITION_FIXED;
break;
+ case POSITION_STICKY:
+ value = CSS_POSITION_STICKY;
+ break;
}
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_position(state->computed, value);
}
@@ -57,16 +60,25 @@ css_error css__initial_position(css_select_state *state)
return set_position(state->computed, CSS_POSITION_STATIC);
}
+css_error css__copy_position(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_position(to, get_position(from));
+}
+
css_error css__compose_position(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_position(child);
- if (type == CSS_POSITION_INHERIT) {
- type = get_position(parent);
- }
-
- return set_position(result, type);
+ return css__copy_position(
+ type == CSS_POSITION_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/properties.h b/src/select/properties/properties.h
index 6eac397..cb0b213 100644
--- a/src/select/properties/properties.h
+++ b/src/select/properties/properties.h
@@ -18,6 +18,7 @@
css_error css__cascade_##pname (uint32_t opv, css_style *style, css_select_state *state); \
css_error css__set_##pname##_from_hint(const css_hint *hint, css_computed_style *style); \
css_error css__initial_##pname (css_select_state *state); \
+ css_error css__copy_##pname (const css_computed_style *from, css_computed_style *to); \
css_error css__compose_##pname (const css_computed_style *parent, const css_computed_style *child, css_computed_style *result); \
uint32_t destroy_##pname (void *bytecode)
@@ -71,6 +72,7 @@ PROPERTY_FUNCS(direction);
PROPERTY_FUNCS(display);
PROPERTY_FUNCS(elevation);
PROPERTY_FUNCS(empty_cells);
+PROPERTY_FUNCS(fill_opacity);
PROPERTY_FUNCS(flex_basis);
PROPERTY_FUNCS(flex_direction);
PROPERTY_FUNCS(flex_grow);
@@ -128,6 +130,7 @@ PROPERTY_FUNCS(speak_punctuation);
PROPERTY_FUNCS(speak);
PROPERTY_FUNCS(speech_rate);
PROPERTY_FUNCS(stress);
+PROPERTY_FUNCS(stroke_opacity);
PROPERTY_FUNCS(table_layout);
PROPERTY_FUNCS(text_align);
PROPERTY_FUNCS(text_decoration);
diff --git a/src/select/properties/quotes.c b/src/select/properties/quotes.c
index 4144d8e..57fc48c 100644
--- a/src/select/properties/quotes.c
+++ b/src/select/properties/quotes.c
@@ -21,7 +21,7 @@ css_error css__cascade_quotes(uint32_t opv, css_style *style,
lwc_string **quotes = NULL;
uint32_t n_quotes = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
uint32_t v = getValue(opv);
value = CSS_QUOTES_STRING;
@@ -75,7 +75,7 @@ css_error css__cascade_quotes(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
css_error error;
error = set_quotes(state->computed, value, quotes);
@@ -123,43 +123,41 @@ css_error css__initial_quotes(css_select_state *state)
return css__set_quotes_from_hint(&hint, state->computed);
}
-css_error css__compose_quotes(const css_computed_style *parent,
- const css_computed_style *child,
- css_computed_style *result)
+css_error css__copy_quotes(
+ const css_computed_style *from,
+ css_computed_style *to)
{
css_error error;
+ lwc_string **copy = NULL;
lwc_string **quotes = NULL;
- uint8_t type = get_quotes(child, &quotes);
-
- if (type == CSS_QUOTES_INHERIT || result != child) {
- size_t n_quotes = 0;
- lwc_string **copy = NULL;
-
- if (type == CSS_QUOTES_INHERIT) {
- type = get_quotes(parent, &quotes);
- }
-
- if (quotes != NULL) {
- lwc_string **i;
+ uint8_t type = get_quotes(from, &quotes);
- for (i = quotes; (*i) != NULL; i++)
- n_quotes++;
+ if (from == to) {
+ return CSS_OK;
+ }
- copy = malloc((n_quotes + 1) * sizeof(lwc_string *));
- if (copy == NULL)
- return CSS_NOMEM;
+ error = css__copy_lwc_string_array(false, quotes, &copy);
+ if (error != CSS_OK) {
+ return CSS_NOMEM;
+ }
- memcpy(copy, quotes, (n_quotes + 1) *
- sizeof(lwc_string *));
- }
+ error = set_quotes(to, type, copy);
+ if (error != CSS_OK) {
+ free(copy);
+ }
- error = set_quotes(result, type, copy);
- if (error != CSS_OK && copy != NULL)
- free(copy);
+ return error;
+}
- return error;
- }
+css_error css__compose_quotes(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ lwc_string **quotes = NULL;
+ uint8_t type = get_quotes(child, &quotes);
- return CSS_OK;
+ return css__copy_quotes(
+ type == CSS_QUOTES_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/richness.c b/src/select/properties/richness.c
index 9656486..cd62d5c 100644
--- a/src/select/properties/richness.c
+++ b/src/select/properties/richness.c
@@ -37,6 +37,16 @@ css_error css__initial_richness(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_richness(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_richness(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/right.c b/src/select/properties/right.c
index 142e7e8..ee4f4a0 100644
--- a/src/select/properties/right.c
+++ b/src/select/properties/right.c
@@ -32,6 +32,21 @@ css_error css__initial_right(css_select_state *state)
return set_right(state->computed, CSS_RIGHT_AUTO, 0, CSS_UNIT_PX);
}
+css_error css__copy_right(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_right(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_right(to, type, length, unit);
+}
+
css_error css__compose_right(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_right(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_right(child, &length, &unit);
- if (type == CSS_RIGHT_INHERIT) {
- type = get_right(parent, &length, &unit);
- }
-
- return set_right(result, type, length, unit);
+ return css__copy_right(
+ type == CSS_RIGHT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/speak.c b/src/select/properties/speak.c
index eb5528b..7b0d014 100644
--- a/src/select/properties/speak.c
+++ b/src/select/properties/speak.c
@@ -19,7 +19,7 @@ css_error css__cascade_speak(uint32_t opv, css_style *style,
{
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case SPEAK_NORMAL:
case SPEAK_NONE:
@@ -30,7 +30,7 @@ css_error css__cascade_speak(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo speak */
}
@@ -53,6 +53,16 @@ css_error css__initial_speak(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_speak(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_speak(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/speak_header.c b/src/select/properties/speak_header.c
index 0935528..88ad0d7 100644
--- a/src/select/properties/speak_header.c
+++ b/src/select/properties/speak_header.c
@@ -19,7 +19,7 @@ css_error css__cascade_speak_header(uint32_t opv, css_style *style,
{
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case SPEAK_HEADER_ONCE:
case SPEAK_HEADER_ALWAYS:
@@ -29,7 +29,7 @@ css_error css__cascade_speak_header(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo speak-header */
}
@@ -52,6 +52,16 @@ css_error css__initial_speak_header(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_speak_header(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_speak_header(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/speak_numeral.c b/src/select/properties/speak_numeral.c
index fc54caf..1cd6e98 100644
--- a/src/select/properties/speak_numeral.c
+++ b/src/select/properties/speak_numeral.c
@@ -19,7 +19,7 @@ css_error css__cascade_speak_numeral(uint32_t opv, css_style *style,
{
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case SPEAK_NUMERAL_DIGITS:
case SPEAK_NUMERAL_CONTINUOUS:
@@ -29,7 +29,7 @@ css_error css__cascade_speak_numeral(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo speak-numeral */
}
@@ -52,6 +52,16 @@ css_error css__initial_speak_numeral(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_speak_numeral(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_speak_numeral(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/speak_punctuation.c b/src/select/properties/speak_punctuation.c
index 67cbdaf..916d530 100644
--- a/src/select/properties/speak_punctuation.c
+++ b/src/select/properties/speak_punctuation.c
@@ -19,7 +19,7 @@ css_error css__cascade_speak_punctuation(
{
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case SPEAK_PUNCTUATION_CODE:
case SPEAK_PUNCTUATION_NONE:
@@ -29,7 +29,7 @@ css_error css__cascade_speak_punctuation(
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo speak-punctuation */
}
@@ -52,6 +52,16 @@ css_error css__initial_speak_punctuation(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_speak_punctuation(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_speak_punctuation(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/speech_rate.c b/src/select/properties/speech_rate.c
index 5cec19b..296c248 100644
--- a/src/select/properties/speech_rate.c
+++ b/src/select/properties/speech_rate.c
@@ -19,7 +19,7 @@ css_error css__cascade_speech_rate(uint32_t opv, css_style *style,
{
css_fixed rate = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case SPEECH_RATE_SET:
rate = *((css_fixed *) style->bytecode);
@@ -38,7 +38,7 @@ css_error css__cascade_speech_rate(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo speech-rate */
}
@@ -61,6 +61,16 @@ css_error css__initial_speech_rate(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_speech_rate(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_speech_rate(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/stress.c b/src/select/properties/stress.c
index c9d61dd..0320fd0 100644
--- a/src/select/properties/stress.c
+++ b/src/select/properties/stress.c
@@ -37,6 +37,16 @@ css_error css__initial_stress(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_stress(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_stress(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/stroke_opacity.c b/src/select/properties/stroke_opacity.c
new file mode 100644
index 0000000..c27e127
--- /dev/null
+++ b/src/select/properties/stroke_opacity.c
@@ -0,0 +1,73 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+#include "bytecode/bytecode.h"
+#include "bytecode/opcodes.h"
+#include "select/propset.h"
+#include "select/propget.h"
+#include "utils/utils.h"
+
+#include "select/properties/properties.h"
+#include "select/properties/helpers.h"
+
+css_error css__cascade_stroke_opacity(uint32_t opv, css_style *style,
+ css_select_state *state)
+{
+ uint16_t value = CSS_STROKE_OPACITY_INHERIT;
+ css_fixed stroke_opacity = 0;
+
+ if (hasFlagValue(opv) == false) {
+ value = CSS_STROKE_OPACITY_SET;
+
+ stroke_opacity = *((css_fixed *) style->bytecode);
+ advance_bytecode(style, sizeof(stroke_opacity));
+ }
+
+ if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
+ getFlagValue(opv))) {
+ return set_stroke_opacity(state->computed, value, stroke_opacity);
+ }
+
+ return CSS_OK;
+}
+
+css_error css__set_stroke_opacity_from_hint(const css_hint *hint,
+ css_computed_style *style)
+{
+ return set_stroke_opacity(style, hint->status, hint->data.fixed);
+}
+
+css_error css__initial_stroke_opacity(css_select_state *state)
+{
+ return set_stroke_opacity(state->computed, CSS_STROKE_OPACITY_SET, INTTOFIX(1));
+}
+
+css_error css__copy_stroke_opacity(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed stroke_opacity = 0;
+ uint8_t type = get_stroke_opacity(from, &stroke_opacity);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_stroke_opacity(to, type, stroke_opacity);
+}
+
+css_error css__compose_stroke_opacity(const css_computed_style *parent,
+ const css_computed_style *child,
+ css_computed_style *result)
+{
+ css_fixed stroke_opacity = 0;
+ uint8_t type = get_stroke_opacity(child, &stroke_opacity);
+
+ return css__copy_stroke_opacity(
+ type == CSS_STROKE_OPACITY_INHERIT ? parent : child,
+ result);
+}
+
diff --git a/src/select/properties/table_layout.c b/src/select/properties/table_layout.c
index c911e10..255ce37 100644
--- a/src/select/properties/table_layout.c
+++ b/src/select/properties/table_layout.c
@@ -21,7 +21,7 @@ css_error css__cascade_table_layout(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case TABLE_LAYOUT_AUTO:
value = CSS_TABLE_LAYOUT_AUTO;
@@ -33,7 +33,7 @@ css_error css__cascade_table_layout(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_table_layout(state->computed, value);
}
@@ -51,16 +51,25 @@ css_error css__initial_table_layout(css_select_state *state)
return set_table_layout(state->computed, CSS_TABLE_LAYOUT_AUTO);
}
+css_error css__copy_table_layout(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_table_layout(to, get_table_layout(from));
+}
+
css_error css__compose_table_layout(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_table_layout(child);
- if (type == CSS_TABLE_LAYOUT_INHERIT) {
- type = get_table_layout(parent);
- }
-
- return set_table_layout(result, type);
+ return css__copy_table_layout(
+ type == CSS_TABLE_LAYOUT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/text_align.c b/src/select/properties/text_align.c
index 808107f..303f8f5 100644
--- a/src/select/properties/text_align.c
+++ b/src/select/properties/text_align.c
@@ -21,7 +21,7 @@ css_error css__cascade_text_align(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case TEXT_ALIGN_LEFT:
value = CSS_TEXT_ALIGN_LEFT;
@@ -48,7 +48,7 @@ css_error css__cascade_text_align(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_text_align(state->computed, value);
}
@@ -66,15 +66,24 @@ css_error css__initial_text_align(css_select_state *state)
return set_text_align(state->computed, CSS_TEXT_ALIGN_DEFAULT);
}
+css_error css__copy_text_align(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_text_align(to, get_text_align(from));
+}
+
css_error css__compose_text_align(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_text_align(child);
- if (type == CSS_TEXT_ALIGN_INHERIT) {
- type = get_text_align(parent);
- } else if (type == CSS_TEXT_ALIGN_INHERIT_IF_NON_MAGIC) {
+ if (type == CSS_TEXT_ALIGN_INHERIT_IF_NON_MAGIC) {
/* This is purely for the benefit of HTML tables */
type = get_text_align(parent);
@@ -83,10 +92,15 @@ css_error css__compose_text_align(const css_computed_style *parent,
* inherit as normal. */
if (type == CSS_TEXT_ALIGN_LIBCSS_LEFT ||
type == CSS_TEXT_ALIGN_LIBCSS_CENTER ||
- type == CSS_TEXT_ALIGN_LIBCSS_RIGHT)
+ type == CSS_TEXT_ALIGN_LIBCSS_RIGHT) {
type = CSS_TEXT_ALIGN_DEFAULT;
+ }
+
+ return set_text_align(result, type);
}
- return set_text_align(result, type);
+ return css__copy_text_align(
+ type == CSS_TEXT_ALIGN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/text_decoration.c b/src/select/properties/text_decoration.c
index 0e7544d..bfea8a8 100644
--- a/src/select/properties/text_decoration.c
+++ b/src/select/properties/text_decoration.c
@@ -23,7 +23,7 @@ css_error css__cascade_text_decoration(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
if (getValue(opv) == TEXT_DECORATION_NONE) {
value = CSS_TEXT_DECORATION_NONE;
} else {
@@ -41,7 +41,7 @@ css_error css__cascade_text_decoration(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_text_decoration(state->computed, value);
}
@@ -59,16 +59,25 @@ css_error css__initial_text_decoration(css_select_state *state)
return set_text_decoration(state->computed, CSS_TEXT_DECORATION_NONE);
}
+css_error css__copy_text_decoration(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_text_decoration(to, get_text_decoration(from));
+}
+
css_error css__compose_text_decoration(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_text_decoration(child);
- if (type == CSS_TEXT_DECORATION_INHERIT) {
- type = get_text_decoration(parent);
- }
-
- return set_text_decoration(result, type);
+ return css__copy_text_decoration(
+ type == CSS_TEXT_DECORATION_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/text_indent.c b/src/select/properties/text_indent.c
index 787c0be..3708130 100644
--- a/src/select/properties/text_indent.c
+++ b/src/select/properties/text_indent.c
@@ -33,6 +33,21 @@ css_error css__initial_text_indent(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_text_indent(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_text_indent(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_text_indent(to, type, length, unit);
+}
+
css_error css__compose_text_indent(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,10 +56,8 @@ css_error css__compose_text_indent(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_text_indent(child, &length, &unit);
- if (type == CSS_TEXT_INDENT_INHERIT) {
- type = get_text_indent(parent, &length, &unit);
- }
-
- return set_text_indent(result, type, length, unit);
+ return css__copy_text_indent(
+ type == CSS_TEXT_INDENT_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/text_transform.c b/src/select/properties/text_transform.c
index 38cb427..3bc5757 100644
--- a/src/select/properties/text_transform.c
+++ b/src/select/properties/text_transform.c
@@ -21,7 +21,7 @@ css_error css__cascade_text_transform(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case TEXT_TRANSFORM_CAPITALIZE:
value = CSS_TEXT_TRANSFORM_CAPITALIZE;
@@ -39,7 +39,7 @@ css_error css__cascade_text_transform(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_text_transform(state->computed, value);
}
@@ -57,16 +57,25 @@ css_error css__initial_text_transform(css_select_state *state)
return set_text_transform(state->computed, CSS_TEXT_TRANSFORM_NONE);
}
+css_error css__copy_text_transform(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_text_transform(to, get_text_transform(from));
+}
+
css_error css__compose_text_transform(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_text_transform(child);
- if (type == CSS_TEXT_TRANSFORM_INHERIT) {
- type = get_text_transform(parent);
- }
-
- return set_text_transform(result, type);
+ return css__copy_text_transform(
+ type == CSS_TEXT_TRANSFORM_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/top.c b/src/select/properties/top.c
index 72129aa..473a105 100644
--- a/src/select/properties/top.c
+++ b/src/select/properties/top.c
@@ -32,6 +32,21 @@ css_error css__initial_top(css_select_state *state)
return set_top(state->computed, CSS_TOP_AUTO, 0, CSS_UNIT_PX);
}
+css_error css__copy_top(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_top(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_top(to, type, length, unit);
+}
+
css_error css__compose_top(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_top(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_top(child, &length, &unit);
- if (type == CSS_TOP_INHERIT) {
- type = get_top(parent, &length, &unit);
- }
-
- return set_top(result, type, length, unit);
+ return css__copy_top(
+ type == CSS_TOP_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/unicode_bidi.c b/src/select/properties/unicode_bidi.c
index 5b91df1..ae0f4ad 100644
--- a/src/select/properties/unicode_bidi.c
+++ b/src/select/properties/unicode_bidi.c
@@ -21,7 +21,7 @@ css_error css__cascade_unicode_bidi(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case UNICODE_BIDI_NORMAL:
value = CSS_UNICODE_BIDI_NORMAL;
@@ -36,7 +36,7 @@ css_error css__cascade_unicode_bidi(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_unicode_bidi(state->computed, value);
}
@@ -54,16 +54,25 @@ css_error css__initial_unicode_bidi(css_select_state *state)
return set_unicode_bidi(state->computed, CSS_UNICODE_BIDI_NORMAL);
}
+css_error css__copy_unicode_bidi(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_unicode_bidi(to, get_unicode_bidi(from));
+}
+
css_error css__compose_unicode_bidi(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_unicode_bidi(child);
- if (type == CSS_UNICODE_BIDI_INHERIT) {
- type = get_unicode_bidi(parent);
- }
-
- return set_unicode_bidi(result, type);
+ return css__copy_unicode_bidi(
+ type == CSS_UNICODE_BIDI_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/vertical_align.c b/src/select/properties/vertical_align.c
index 9fb7143..9fbffe6 100644
--- a/src/select/properties/vertical_align.c
+++ b/src/select/properties/vertical_align.c
@@ -21,7 +21,7 @@ css_error css__cascade_vertical_align(uint32_t opv, css_style *style,
css_fixed length = 0;
uint32_t unit = UNIT_PX;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case VERTICAL_ALIGN_SET:
value = CSS_VERTICAL_ALIGN_SET;
@@ -61,7 +61,7 @@ css_error css__cascade_vertical_align(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_vertical_align(state->computed, value, length, unit);
}
@@ -81,6 +81,21 @@ css_error css__initial_vertical_align(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_vertical_align(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_vertical_align(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_vertical_align(to, type, length, unit);
+}
+
css_error css__compose_vertical_align(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -89,10 +104,8 @@ css_error css__compose_vertical_align(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_vertical_align(child, &length, &unit);
- if (type == CSS_VERTICAL_ALIGN_INHERIT) {
- type = get_vertical_align(parent, &length, &unit);
- }
-
- return set_vertical_align(result, type, length, unit);
+ return css__copy_vertical_align(
+ type == CSS_VERTICAL_ALIGN_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/visibility.c b/src/select/properties/visibility.c
index ef95252..674e433 100644
--- a/src/select/properties/visibility.c
+++ b/src/select/properties/visibility.c
@@ -21,7 +21,7 @@ css_error css__cascade_visibility(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case VISIBILITY_VISIBLE:
value = CSS_VISIBILITY_VISIBLE;
@@ -36,7 +36,7 @@ css_error css__cascade_visibility(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_visibility(state->computed, value);
}
@@ -54,16 +54,25 @@ css_error css__initial_visibility(css_select_state *state)
return set_visibility(state->computed, CSS_VISIBILITY_VISIBLE);
}
+css_error css__copy_visibility(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_visibility(to, get_visibility(from));
+}
+
css_error css__compose_visibility(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_visibility(child);
- if (type == CSS_VISIBILITY_INHERIT) {
- type = get_visibility(parent);
- }
-
- return set_visibility(result, type);
+ return css__copy_visibility(
+ type == CSS_VISIBILITY_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/voice_family.c b/src/select/properties/voice_family.c
index b370a2b..66e3123 100644
--- a/src/select/properties/voice_family.c
+++ b/src/select/properties/voice_family.c
@@ -21,7 +21,7 @@ css_error css__cascade_voice_family(uint32_t opv, css_style *style,
lwc_string **voices = NULL;
uint32_t n_voices = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
uint32_t v = getValue(opv);
while (v != VOICE_FAMILY_END) {
@@ -92,7 +92,7 @@ css_error css__cascade_voice_family(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo voice-family */
if (n_voices > 0)
free(voices);
@@ -120,6 +120,16 @@ css_error css__initial_voice_family(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_voice_family(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_voice_family(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/volume.c b/src/select/properties/volume.c
index 96787fa..65bdd03 100644
--- a/src/select/properties/volume.c
+++ b/src/select/properties/volume.c
@@ -20,7 +20,7 @@ css_error css__cascade_volume(uint32_t opv, css_style *style,
css_fixed val = 0;
uint32_t unit = UNIT_PCT;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case VOLUME_NUMBER:
val = *((css_fixed *) style->bytecode);
@@ -46,7 +46,7 @@ css_error css__cascade_volume(uint32_t opv, css_style *style,
unit = css__to_css_unit(unit);
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
/** \todo volume */
}
@@ -69,6 +69,16 @@ css_error css__initial_volume(css_select_state *state)
return CSS_OK;
}
+css_error css__copy_volume(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ UNUSED(from);
+ UNUSED(to);
+
+ return CSS_OK;
+}
+
css_error css__compose_volume(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
diff --git a/src/select/properties/white_space.c b/src/select/properties/white_space.c
index b8d2e02..edc35cd 100644
--- a/src/select/properties/white_space.c
+++ b/src/select/properties/white_space.c
@@ -21,7 +21,7 @@ css_error css__cascade_white_space(uint32_t opv, css_style *style,
UNUSED(style);
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case WHITE_SPACE_NORMAL:
value = CSS_WHITE_SPACE_NORMAL;
@@ -42,7 +42,7 @@ css_error css__cascade_white_space(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_white_space(state->computed, value);
}
@@ -60,16 +60,25 @@ css_error css__initial_white_space(css_select_state *state)
return set_white_space(state->computed, CSS_WHITE_SPACE_NORMAL);
}
+css_error css__copy_white_space(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_white_space(to, get_white_space(from));
+}
+
css_error css__compose_white_space(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
uint8_t type = get_white_space(child);
- if (type == CSS_WHITE_SPACE_INHERIT) {
- type = get_white_space(parent);
- }
-
- return set_white_space(result, type);
+ return css__copy_white_space(
+ type == CSS_WHITE_SPACE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/widows.c b/src/select/properties/widows.c
index 61126c2..853c08d 100644
--- a/src/select/properties/widows.c
+++ b/src/select/properties/widows.c
@@ -31,6 +31,20 @@ css_error css__initial_widows(css_select_state *state)
return set_widows(state->computed, CSS_WIDOWS_SET, 2);
}
+css_error css__copy_widows(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ int32_t count = 0;
+ uint8_t type = get_widows(from, &count);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_widows(to, type, count);
+}
+
css_error css__compose_widows(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -38,10 +52,8 @@ css_error css__compose_widows(const css_computed_style *parent,
int32_t count = 0;
uint8_t type = get_widows(child, &count);
- if (type == CSS_WIDOWS_INHERIT) {
- type = get_widows(parent, &count);
- }
-
- return set_widows(result, type, count);
+ return css__copy_widows(
+ type == CSS_WIDOWS_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/width.c b/src/select/properties/width.c
index 829df91..c6d33ff 100644
--- a/src/select/properties/width.c
+++ b/src/select/properties/width.c
@@ -32,6 +32,21 @@ css_error css__initial_width(css_select_state *state)
return set_width(state->computed, CSS_WIDTH_AUTO, 0, CSS_UNIT_PX);
}
+css_error css__copy_width(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_width(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_width(to, type, length, unit);
+}
+
css_error css__compose_width(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -40,10 +55,8 @@ css_error css__compose_width(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_width(child, &length, &unit);
- if (type == CSS_WIDTH_INHERIT) {
- type = get_width(parent, &length, &unit);
- }
-
- return set_width(result, type, length, unit);
+ return css__copy_width(
+ type == CSS_WIDTH_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/word_spacing.c b/src/select/properties/word_spacing.c
index eb39b50..c1c6782 100644
--- a/src/select/properties/word_spacing.c
+++ b/src/select/properties/word_spacing.c
@@ -33,6 +33,21 @@ css_error css__initial_word_spacing(css_select_state *state)
0, CSS_UNIT_PX);
}
+css_error css__copy_word_spacing(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ css_fixed length = 0;
+ css_unit unit = CSS_UNIT_PX;
+ uint8_t type = get_word_spacing(from, &length, &unit);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_word_spacing(to, type, length, unit);
+}
+
css_error css__compose_word_spacing(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -41,9 +56,7 @@ css_error css__compose_word_spacing(const css_computed_style *parent,
css_unit unit = CSS_UNIT_PX;
uint8_t type = get_word_spacing(child, &length, &unit);
- if (type == CSS_WORD_SPACING_INHERIT) {
- type = get_word_spacing(parent, &length, &unit);
- }
-
- return set_word_spacing(result, type, length, unit);
+ return css__copy_word_spacing(
+ type == CSS_WORD_SPACING_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/writing_mode.c b/src/select/properties/writing_mode.c
index bbd3753..05c0b26 100644
--- a/src/select/properties/writing_mode.c
+++ b/src/select/properties/writing_mode.c
@@ -17,11 +17,11 @@
css_error css__cascade_writing_mode(uint32_t opv, css_style *style,
css_select_state *state)
{
- bool inherit = isInherit(opv);
+ enum flag_value flag_value = getFlagValue(opv);
uint16_t writing_mode = CSS_WRITING_MODE_INHERIT;
UNUSED(style);
- if (inherit == false) {
+ if (flag_value == FLAG_VALUE__NONE) {
switch (getValue(opv)) {
case WRITING_MODE_HORIZONTAL_TB:
writing_mode = CSS_WRITING_MODE_HORIZONTAL_TB;
@@ -36,7 +36,7 @@ css_error css__cascade_writing_mode(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- inherit)) {
+ flag_value)) {
return set_writing_mode(state->computed, writing_mode);
}
@@ -55,16 +55,25 @@ css_error css__initial_writing_mode(css_select_state *state)
CSS_WRITING_MODE_HORIZONTAL_TB);
}
+css_error css__copy_writing_mode(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_writing_mode(to, get_writing_mode(from));
+}
+
css_error css__compose_writing_mode(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
{
- uint8_t writing_mode = get_writing_mode(child);
-
- if (writing_mode == CSS_WRITING_MODE_INHERIT) {
- writing_mode = get_writing_mode(parent);
- }
+ uint8_t type = get_writing_mode(child);
- return set_writing_mode(result, writing_mode);
+ return css__copy_writing_mode(
+ type == CSS_WRITING_MODE_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/properties/z_index.c b/src/select/properties/z_index.c
index 59cf242..e5159e5 100644
--- a/src/select/properties/z_index.c
+++ b/src/select/properties/z_index.c
@@ -20,7 +20,7 @@ css_error css__cascade_z_index(uint32_t opv, css_style *style,
uint16_t value = CSS_Z_INDEX_INHERIT;
css_fixed index = 0;
- if (isInherit(opv) == false) {
+ if (hasFlagValue(opv) == false) {
switch (getValue(opv)) {
case Z_INDEX_SET:
value = CSS_Z_INDEX_SET;
@@ -35,7 +35,7 @@ css_error css__cascade_z_index(uint32_t opv, css_style *style,
}
if (css__outranks_existing(getOpcode(opv), isImportant(opv), state,
- isInherit(opv))) {
+ getFlagValue(opv))) {
return set_z_index(state->computed, value, index);
}
@@ -53,6 +53,20 @@ css_error css__initial_z_index(css_select_state *state)
return set_z_index(state->computed, CSS_Z_INDEX_AUTO, 0);
}
+css_error css__copy_z_index(
+ const css_computed_style *from,
+ css_computed_style *to)
+{
+ int32_t index = 0;
+ uint8_t type = get_z_index(from, &index);
+
+ if (from == to) {
+ return CSS_OK;
+ }
+
+ return set_z_index(to, type, index);
+}
+
css_error css__compose_z_index(const css_computed_style *parent,
const css_computed_style *child,
css_computed_style *result)
@@ -60,10 +74,8 @@ css_error css__compose_z_index(const css_computed_style *parent,
int32_t index = 0;
uint8_t type = get_z_index(child, &index);
- if (type == CSS_Z_INDEX_INHERIT) {
- type = get_z_index(parent, &index);
- }
-
- return set_z_index(result, type, index);
+ return css__copy_z_index(
+ type == CSS_Z_INDEX_INHERIT ? parent : child,
+ result);
}
diff --git a/src/select/select.c b/src/select/select.c
index f6efbfe..da0aa61 100644
--- a/src/select/select.c
+++ b/src/select/select.c
@@ -23,6 +23,8 @@
#include "select/propset.h"
#include "select/font_face.h"
#include "select/select.h"
+#include "select/strings.h"
+#include "select/unit.h"
#include "utils/parserutilserror.h"
#include "utils/utils.h"
@@ -51,34 +53,9 @@ struct css_select_ctx {
void *pw; /**< Client's private selection context */
- /* Useful interned strings */
- lwc_string *universal;
- lwc_string *first_child;
- lwc_string *link;
- lwc_string *visited;
- lwc_string *hover;
- lwc_string *active;
- lwc_string *focus;
- lwc_string *nth_child;
- lwc_string *nth_last_child;
- lwc_string *nth_of_type;
- lwc_string *nth_last_of_type;
- lwc_string *last_child;
- lwc_string *first_of_type;
- lwc_string *last_of_type;
- lwc_string *only_child;
- lwc_string *only_of_type;
- lwc_string *root;
- lwc_string *empty;
- lwc_string *target;
- lwc_string *lang;
- lwc_string *enabled;
- lwc_string *disabled;
- lwc_string *checked;
- lwc_string *first_line;
- lwc_string *first_letter;
- lwc_string *before;
- lwc_string *after;
+ bool uses_revert; /**< A sheet used revert property value */
+
+ css_select_strings str;
/* Interned default style */
css_computed_style *default_style;
@@ -98,6 +75,7 @@ typedef struct css_select_font_faces_list {
typedef struct css_select_font_faces_state {
lwc_string *font_family;
const css_media *media;
+ const css_unit_ctx *unit_ctx;
css_select_font_faces_list ua_font_faces;
css_select_font_faces_list user_font_faces;
@@ -123,9 +101,6 @@ static css_error set_initial(css_select_state *state,
uint32_t prop, css_pseudo_element pseudo,
void *parent);
-static css_error intern_strings(css_select_ctx *ctx);
-static void destroy_strings(css_select_ctx *ctx);
-
static css_error select_from_sheet(css_select_ctx *ctx,
const css_stylesheet *sheet, css_origin origin,
css_select_state *state);
@@ -151,7 +126,8 @@ static css_error cascade_style(const css_style *style, css_select_state *state);
static css_error select_font_faces_from_sheet(
const css_stylesheet *sheet,
css_origin origin,
- css_select_font_faces_state *state);
+ css_select_font_faces_state *state,
+ const css_select_strings *str);
#ifdef DEBUG_CHAIN_MATCHING
static void dump_chain(const css_selector *selector);
@@ -262,7 +238,7 @@ css_error css_select_ctx_create(css_select_ctx **result)
if (c == NULL)
return CSS_NOMEM;
- error = intern_strings(c);
+ error = css_select_strings_intern(&c->str);
if (error != CSS_OK) {
free(c);
return error;
@@ -284,7 +260,7 @@ css_error css_select_ctx_destroy(css_select_ctx *ctx)
if (ctx == NULL)
return CSS_BADPARM;
- destroy_strings(ctx);
+ css_select_strings_unref(&ctx->str);
if (ctx->default_style != NULL)
css_computed_style_destroy(ctx->default_style);
@@ -381,6 +357,8 @@ css_error css_select_ctx_insert_sheet(css_select_ctx *ctx,
ctx->sheets[index].origin = origin;
ctx->sheets[index].media = mq;
+ ctx->uses_revert |= sheet->uses_revert;
+
ctx->n_sheets++;
return CSS_OK;
@@ -1045,18 +1023,32 @@ static void css_select__finalise_selection_state(
if (state->element.name != NULL){
lwc_string_unref(state->element.name);
}
+
+ if (state->revert != NULL) {
+ for (size_t i = 0; i < CSS_ORIGIN_AUTHOR; i++) {
+ for (size_t j = 0; j < CSS_PSEUDO_ELEMENT_COUNT; j++) {
+ if (state->revert[i].style[j] == NULL) {
+ continue;
+ }
+ css_computed_style_destroy(
+ state->revert[i].style[j]);
+ }
+ }
+ free(state->revert);
+ }
}
/**
* Initialise a selection state.
*
- * \param[in] state The selection state to initialise
- * \param[in] node The node we are selecting for.
- * \param[in] parent The node's parent node, or NULL.
- * \param[in] media The media specification we're selecting for.
- * \param[in] handler The client selection callback table.
- * \param[in] pw The client private data, passsed out to callbacks.
+ * \param[in] state The selection state to initialise
+ * \param[in] node The node we are selecting for.
+ * \param[in] parent The node's parent node, or NULL.
+ * \param[in] media The media specification we're selecting for.
+ * \param[in] unit_ctx Unit conversion context.
+ * \param[in] handler The client selection callback table.
+ * \param[in] pw The client private data, passsed out to callbacks.
* \return CSS_OK or appropriate error otherwise.
*/
static css_error css_select__initialise_selection_state(
@@ -1064,6 +1056,7 @@ static css_error css_select__initialise_selection_state(
void *node,
void *parent,
const css_media *media,
+ const css_unit_ctx *unit_ctx,
css_select_handler *handler,
void *pw)
{
@@ -1074,6 +1067,7 @@ static css_error css_select__initialise_selection_state(
memset(state, 0, sizeof(*state));
state->node = node;
state->media = media;
+ state->unit_ctx = unit_ctx;
state->handler = handler;
state->pw = pw;
state->next_reject = state->reject_cache +
@@ -1158,12 +1152,79 @@ failed:
return error;
}
+static css_error css__select_revert_property_to_origin(
+ css_select_state *select_state,
+ prop_state *prop_state,
+ css_origin origin,
+ enum css_pseudo_element pseudo,
+ enum css_properties_e property)
+{
+ css_error error;
+
+ if (select_state->results->styles[pseudo] == NULL) {
+ return CSS_OK;
+ }
+
+ if (select_state->revert[origin].style[pseudo] == NULL) {
+ return prop_dispatch[property].initial(select_state);
+ }
+
+ error = prop_dispatch[property].copy(
+ select_state->revert[origin].style[pseudo],
+ select_state->results->styles[pseudo]);
+ if (error != CSS_OK) {
+ return error;
+ }
+
+ *prop_state = select_state->revert[origin].props[property][pseudo];
+ return CSS_OK;
+}
+
+static css_error css__select_revert_property(
+ css_select_state *select_state,
+ prop_state *prop_state,
+ enum css_pseudo_element pseudo,
+ enum css_properties_e property)
+{
+ css_error error;
+
+ switch (prop_state->origin) {
+ case CSS_ORIGIN_AUTHOR:
+ error = css__select_revert_property_to_origin(
+ select_state, prop_state, CSS_ORIGIN_USER,
+ pseudo, property);
+ if (error != CSS_OK) {
+ return error;
+ }
+ if (prop_state->explicit_default != FLAG_VALUE_REVERT) {
+ break;
+ }
+ /* Fall-through */
+ case CSS_ORIGIN_USER:
+ error = css__select_revert_property_to_origin(
+ select_state, prop_state, CSS_ORIGIN_UA,
+ pseudo, property);
+ if (error != CSS_OK) {
+ return error;
+ }
+ if (prop_state->explicit_default != FLAG_VALUE_REVERT) {
+ break;
+ }
+ /* Fall-through */
+ case CSS_ORIGIN_UA:
+ prop_state->explicit_default = FLAG_VALUE_UNSET;
+ break;
+ }
+
+ return CSS_OK;
+}
/**
* Select a style for the given node
*
* \param ctx Selection context to use
* \param node Node to select style for
+ * \param unit_ctx Context for length unit conversions.
* \param media Currently active media specification
* \param inline_style Corresponding inline style for node, or NULL
* \param handler Dispatch table of handler functions
@@ -1181,10 +1242,12 @@ failed:
* update the fully computed style for a node when layout changes.
*/
css_error css_select_style(css_select_ctx *ctx, void *node,
+ const css_unit_ctx *unit_ctx,
const css_media *media, const css_stylesheet *inline_style,
css_select_handler *handler, void *pw,
css_select_results **result)
{
+ css_origin origin = CSS_ORIGIN_UA;
uint32_t i, j, nhints;
css_error error;
css_select_state state;
@@ -1201,7 +1264,7 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
return error;
error = css_select__initialise_selection_state(
- &state, node, parent, media, handler, pw);
+ &state, node, parent, media, unit_ctx, handler, pw);
if (error != CSS_OK)
return error;
@@ -1237,8 +1300,18 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
printf("style:\t%s\tSELECTED\n", lwc_string_data(state.element.name));
#endif
- /* Not sharing; need to select.
- * Base element style is guaranteed to exist
+ /* Not sharing; need to select. */
+ if (ctx->uses_revert ||
+ (inline_style != NULL && inline_style->uses_revert)) {
+ /* Need to track UA and USER origin styles for revert. */
+ state.revert = calloc(CSS_ORIGIN_AUTHOR, sizeof(*state.revert));
+ if (state.revert == NULL) {
+ error = CSS_NOMEM;
+ goto cleanup;
+ }
+ }
+
+ /* Base element style is guaranteed to exist
*/
error = css__computed_style_create(
&state.results->styles[CSS_PSEUDO_ELEMENT_NONE]);
@@ -1263,10 +1336,30 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
/* Iterate through the top-level stylesheets, selecting styles
* from those which apply to our current media requirements and
* are not disabled */
+ if (ctx->n_sheets > 0) {
+ origin = ctx->sheets[0].origin;
+ }
for (i = 0; i < ctx->n_sheets; i++) {
const css_select_sheet s = ctx->sheets[i];
- if (mq__list_match(s.media, media) &&
+ if (state.revert != NULL && s.origin != origin) {
+ for (j = 0; j < CSS_PSEUDO_ELEMENT_COUNT; j++) {
+ if (state.results->styles[j] == NULL) {
+ continue;
+ }
+ error = css__computed_style_clone(
+ state.results->styles[j],
+ &state.revert[origin].style[j]);
+ if (error != CSS_OK) {
+ goto cleanup;
+ }
+ memcpy(state.revert[origin].props,
+ state.props, sizeof(state.props));
+ }
+ origin = s.origin;
+ }
+
+ if (mq__list_match(s.media, unit_ctx, media, &ctx->str) &&
s.sheet->disabled == false) {
error = select_from_sheet(ctx, s.sheet,
s.origin, &state);
@@ -1307,15 +1400,31 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
state.current_pseudo = CSS_PSEUDO_ELEMENT_NONE;
state.computed = state.results->styles[CSS_PSEUDO_ELEMENT_NONE];
for (i = 0; i < CSS_N_PROPERTIES; i++) {
- const prop_state *prop =
- &state.props[i][CSS_PSEUDO_ELEMENT_NONE];
+ prop_state *prop = &state.props[i][CSS_PSEUDO_ELEMENT_NONE];
+
+ if (prop->explicit_default == FLAG_VALUE_REVERT) {
+ error = css__select_revert_property(&state, prop,
+ CSS_PSEUDO_ELEMENT_NONE, i);
+ if (error != CSS_OK) {
+ goto cleanup;
+ }
+ }
+
+ if (prop->explicit_default == FLAG_VALUE_UNSET) {
+ if (prop_dispatch[i].inherited == true) {
+ prop->explicit_default = FLAG_VALUE_INHERIT;
+ } else {
+ prop->explicit_default = FLAG_VALUE_INITIAL;
+ }
+ }
/* If the property is still unset or it's set to inherit
* and we're the root element, then set it to its initial
* value. */
- if (prop->set == false ||
+ if (prop->explicit_default == FLAG_VALUE_INITIAL ||
+ prop->set == false ||
(parent == NULL &&
- prop->inherit == true)) {
+ prop->explicit_default == FLAG_VALUE_INHERIT)) {
error = set_initial(&state, i,
CSS_PSEUDO_ELEMENT_NONE, parent);
if (error != CSS_OK)
@@ -1333,11 +1442,28 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
continue;
for (i = 0; i < CSS_N_PROPERTIES; i++) {
- const prop_state *prop = &state.props[i][j];
+ prop_state *prop = &state.props[i][j];
+
+ if (prop->explicit_default == FLAG_VALUE_REVERT) {
+ error = css__select_revert_property(&state,
+ prop, j, i);
+ if (error != CSS_OK) {
+ goto cleanup;
+ }
+ }
+
+ if (prop->explicit_default == FLAG_VALUE_UNSET) {
+ if (prop_dispatch[i].inherited == true) {
+ prop->explicit_default = FLAG_VALUE_INHERIT;
+ } else {
+ prop->explicit_default = FLAG_VALUE_INITIAL;
+ }
+ }
/* If the property is still unset then set it
* to its initial value. */
- if (prop->set == false) {
+ if (prop->explicit_default == FLAG_VALUE_INITIAL ||
+ prop->set == false) {
error = set_initial(&state, i, j, parent);
if (error != CSS_OK)
goto cleanup;
@@ -1353,7 +1479,7 @@ css_error css_select_style(css_select_ctx *ctx, void *node,
/* Only compute absolute values for the base element */
error = css__compute_absolute_values(NULL,
state.results->styles[CSS_PSEUDO_ELEMENT_NONE],
- handler->compute_font_size, pw);
+ unit_ctx);
if (error != CSS_OK)
goto cleanup;
}
@@ -1417,12 +1543,15 @@ css_error css_select_results_destroy(css_select_results *results)
*
* \param ctx Selection context
* \param media Currently active media spec
+ * \param unit_ctx Current unit conversion context.
* \param font_family Font family to search for
* \param result Pointer to location to receive result
* \return CSS_OK on success, appropriate error otherwise.
*/
css_error css_select_font_faces(css_select_ctx *ctx,
- const css_media *media, lwc_string *font_family,
+ const css_media *media,
+ const css_unit_ctx *unit_ctx,
+ lwc_string *font_family,
css_select_font_faces_results **result)
{
uint32_t i;
@@ -1436,6 +1565,7 @@ css_error css_select_font_faces(css_select_ctx *ctx,
memset(&state, 0, sizeof(css_select_font_faces_state));
state.font_family = font_family;
state.media = media;
+ state.unit_ctx = unit_ctx;
/* Iterate through the top-level stylesheets, selecting font-faces
* from those which apply to our current media requirements and
@@ -1443,10 +1573,10 @@ css_error css_select_font_faces(css_select_ctx *ctx,
for (i = 0; i < ctx->n_sheets; i++) {
const css_select_sheet s = ctx->sheets[i];
- if (mq__list_match(s.media, media) &&
+ if (mq__list_match(s.media, unit_ctx, media, &ctx->str) &&
s.sheet->disabled == false) {
error = select_font_faces_from_sheet(s.sheet,
- s.origin, &state);
+ s.origin, &state, &ctx->str);
if (error != CSS_OK)
goto cleanup;
}
@@ -1548,233 +1678,6 @@ css_error css_select_font_faces_results_destroy(
* Selection engine internals below here *
******************************************************************************/
-css_error intern_strings(css_select_ctx *ctx)
-{
- lwc_error error;
-
- /* Universal selector */
- error = lwc_intern_string("*", SLEN("*"), &ctx->universal);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- /* Pseudo classes */
- error = lwc_intern_string(
- "first-child", SLEN("first-child"),
- &ctx->first_child);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "link", SLEN("link"),
- &ctx->link);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "visited", SLEN("visited"),
- &ctx->visited);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "hover", SLEN("hover"),
- &ctx->hover);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "active", SLEN("active"),
- &ctx->active);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "focus", SLEN("focus"),
- &ctx->focus);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "nth-child", SLEN("nth-child"),
- &ctx->nth_child);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "nth-last-child", SLEN("nth-last-child"),
- &ctx->nth_last_child);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "nth-of-type", SLEN("nth-of-type"),
- &ctx->nth_of_type);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "nth-last-of-type", SLEN("nth-last-of-type"),
- &ctx->nth_last_of_type);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "last-child", SLEN("last-child"),
- &ctx->last_child);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "first-of-type", SLEN("first-of-type"),
- &ctx->first_of_type);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "last-of-type", SLEN("last-of-type"),
- &ctx->last_of_type);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "only-child", SLEN("only-child"),
- &ctx->only_child);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "only-of-type", SLEN("only-of-type"),
- &ctx->only_of_type);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "root", SLEN("root"),
- &ctx->root);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "empty", SLEN("empty"),
- &ctx->empty);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "target", SLEN("target"),
- &ctx->target);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "lang", SLEN("lang"),
- &ctx->lang);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "enabled", SLEN("enabled"),
- &ctx->enabled);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "disabled", SLEN("disabled"),
- &ctx->disabled);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "checked", SLEN("checked"),
- &ctx->checked);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- /* Pseudo elements */
- error = lwc_intern_string(
- "first-line", SLEN("first-line"),
- &ctx->first_line);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "first_letter", SLEN("first-letter"),
- &ctx->first_letter);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "before", SLEN("before"),
- &ctx->before);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- error = lwc_intern_string(
- "after", SLEN("after"),
- &ctx->after);
- if (error != lwc_error_ok)
- return css_error_from_lwc_error(error);
-
- return CSS_OK;
-}
-
-void destroy_strings(css_select_ctx *ctx)
-{
- if (ctx->universal != NULL)
- lwc_string_unref(ctx->universal);
- if (ctx->first_child != NULL)
- lwc_string_unref(ctx->first_child);
- if (ctx->link != NULL)
- lwc_string_unref(ctx->link);
- if (ctx->visited != NULL)
- lwc_string_unref(ctx->visited);
- if (ctx->hover != NULL)
- lwc_string_unref(ctx->hover);
- if (ctx->active != NULL)
- lwc_string_unref(ctx->active);
- if (ctx->focus != NULL)
- lwc_string_unref(ctx->focus);
- if (ctx->nth_child != NULL)
- lwc_string_unref(ctx->nth_child);
- if (ctx->nth_last_child != NULL)
- lwc_string_unref(ctx->nth_last_child);
- if (ctx->nth_of_type != NULL)
- lwc_string_unref(ctx->nth_of_type);
- if (ctx->nth_last_of_type != NULL)
- lwc_string_unref(ctx->nth_last_of_type);
- if (ctx->last_child != NULL)
- lwc_string_unref(ctx->last_child);
- if (ctx->first_of_type != NULL)
- lwc_string_unref(ctx->first_of_type);
- if (ctx->last_of_type != NULL)
- lwc_string_unref(ctx->last_of_type);
- if (ctx->only_child != NULL)
- lwc_string_unref(ctx->only_child);
- if (ctx->only_of_type != NULL)
- lwc_string_unref(ctx->only_of_type);
- if (ctx->root != NULL)
- lwc_string_unref(ctx->root);
- if (ctx->empty != NULL)
- lwc_string_unref(ctx->empty);
- if (ctx->target != NULL)
- lwc_string_unref(ctx->target);
- if (ctx->lang != NULL)
- lwc_string_unref(ctx->lang);
- if (ctx->enabled != NULL)
- lwc_string_unref(ctx->enabled);
- if (ctx->disabled != NULL)
- lwc_string_unref(ctx->disabled);
- if (ctx->checked != NULL)
- lwc_string_unref(ctx->checked);
- if (ctx->first_line != NULL)
- lwc_string_unref(ctx->first_line);
- if (ctx->first_letter != NULL)
- lwc_string_unref(ctx->first_letter);
- if (ctx->before != NULL)
- lwc_string_unref(ctx->before);
- if (ctx->after != NULL)
- lwc_string_unref(ctx->after);
-}
css_error set_hint(css_select_state *state, css_hint *hint)
{
@@ -1792,7 +1695,8 @@ css_error set_hint(css_select_state *state, css_hint *hint)
existing->specificity = 0;
existing->origin = CSS_ORIGIN_AUTHOR;
existing->important = 0;
- existing->inherit = (hint->status == 0);
+ existing->explicit_default = (hint->status == 0) ?
+ FLAG_VALUE_INHERIT : FLAG_VALUE__NONE;
return CSS_OK;
}
@@ -1809,7 +1713,8 @@ css_error set_initial(css_select_state *state,
* If the node is tree root and we're dealing with the base element,
* everything should be defaulted.
*/
- if (prop_dispatch[prop].inherited == false ||
+ if (state->props[prop][pseudo].explicit_default == FLAG_VALUE_INITIAL ||
+ prop_dispatch[prop].inherited == false ||
(pseudo == CSS_PSEUDO_ELEMENT_NONE && parent == NULL)) {
error = prop_dispatch[prop].initial(state);
if (error != CSS_OK)
@@ -1843,7 +1748,9 @@ css_error select_from_sheet(css_select_ctx *ctx, const css_stylesheet *sheet,
if (import->sheet != NULL &&
mq__list_match(import->media,
- state->media)) {
+ state->unit_ctx,
+ state->media,
+ &ctx->str)) {
/* It's applicable, so process it */
if (sp >= IMPORT_STACK_SIZE)
return CSS_NOMEM;
@@ -1884,9 +1791,11 @@ css_error select_from_sheet(css_select_ctx *ctx, const css_stylesheet *sheet,
static css_error _select_font_face_from_rule(
const css_rule_font_face *rule, css_origin origin,
- css_select_font_faces_state *state)
+ css_select_font_faces_state *state,
+ const css_select_strings *str)
{
- if (mq_rule_good_for_media((const css_rule *) rule, state->media)) {
+ if (mq_rule_good_for_media((const css_rule *) rule,
+ state->unit_ctx, state->media, str)) {
bool correct_family = false;
if (lwc_string_isequal(
@@ -1930,7 +1839,8 @@ static css_error _select_font_face_from_rule(
static css_error select_font_faces_from_sheet(
const css_stylesheet *sheet,
css_origin origin,
- css_select_font_faces_state *state)
+ css_select_font_faces_state *state,
+ const css_select_strings *str)
{
const css_stylesheet *s = sheet;
const css_rule *rule = s->rule_list;
@@ -1951,7 +1861,9 @@ static css_error select_font_faces_from_sheet(
if (import->sheet != NULL &&
mq__list_match(import->media,
- state->media)) {
+ state->unit_ctx,
+ state->media,
+ str)) {
/* It's applicable, so process it */
if (sp >= IMPORT_STACK_SIZE)
return CSS_NOMEM;
@@ -1969,8 +1881,7 @@ static css_error select_font_faces_from_sheet(
error = _select_font_face_from_rule(
(const css_rule_font_face *) rule,
- origin,
- state);
+ origin, state, str);
if (error != CSS_OK)
return error;
@@ -2098,8 +2009,9 @@ css_error match_selectors_in_sheet(css_select_ctx *ctx,
/* Set up general selector chain requirments */
req.media = state->media;
+ req.unit_ctx = state->unit_ctx;
req.node_bloom = state->node_data->bloom;
- req.uni = ctx->universal;
+ req.str = &ctx->str;
/* Find hash chain that applies to current node */
req.qname = state->element;
@@ -2264,7 +2176,7 @@ css_error match_selector_chain(css_select_ctx *ctx,
/* Consider any combinator on this selector */
if (s->data.comb != CSS_COMBINATOR_NONE &&
s->combinator->data.qname.name !=
- ctx->universal) {
+ ctx->str.universal) {
/* Named combinator */
may_optimise &=
(s->data.comb == CSS_COMBINATOR_ANCESTOR ||
@@ -2599,7 +2511,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
return error;
if (is_root == false &&
- detail->qname.name == ctx->first_child) {
+ detail->qname.name == ctx->str.first_child) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2607,7 +2519,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_before == 0);
} else if (is_root == false &&
- detail->qname.name == ctx->nth_child) {
+ detail->qname.name == ctx->str.nth_child) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2619,7 +2531,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_before + 1);
}
} else if (is_root == false &&
- detail->qname.name == ctx->nth_last_child) {
+ detail->qname.name == ctx->str.nth_last_child) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2631,7 +2543,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_after + 1);
}
} else if (is_root == false &&
- detail->qname.name == ctx->nth_of_type) {
+ detail->qname.name == ctx->str.nth_of_type) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2643,7 +2555,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_before + 1);
}
} else if (is_root == false &&
- detail->qname.name == ctx->nth_last_of_type) {
+ detail->qname.name == ctx->str.nth_last_of_type) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2655,7 +2567,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = match_nth(a, b, num_after + 1);
}
} else if (is_root == false &&
- detail->qname.name == ctx->last_child) {
+ detail->qname.name == ctx->str.last_child) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2663,7 +2575,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_after == 0);
} else if (is_root == false &&
- detail->qname.name == ctx->first_of_type) {
+ detail->qname.name == ctx->str.first_of_type) {
int32_t num_before = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2671,7 +2583,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_before == 0);
} else if (is_root == false &&
- detail->qname.name == ctx->last_of_type) {
+ detail->qname.name == ctx->str.last_of_type) {
int32_t num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2679,7 +2591,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
if (error == CSS_OK)
*match = (num_after == 0);
} else if (is_root == false &&
- detail->qname.name == ctx->only_child) {
+ detail->qname.name == ctx->str.only_child) {
int32_t num_before = 0, num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2693,7 +2605,7 @@ css_error match_detail(css_select_ctx *ctx, void *node,
(num_after == 0);
}
} else if (is_root == false &&
- detail->qname.name == ctx->only_of_type) {
+ detail->qname.name == ctx->str.only_of_type) {
int32_t num_before = 0, num_after = 0;
error = state->handler->node_count_siblings(state->pw,
@@ -2706,44 +2618,44 @@ css_error match_detail(css_select_ctx *ctx, void *node,
*match = (num_before == 0) &&
(num_after == 0);
}
- } else if (detail->qname.name == ctx->root) {
+ } else if (detail->qname.name == ctx->str.root) {
*match = is_root;
- } else if (detail->qname.name == ctx->empty) {
+ } else if (detail->qname.name == ctx->str.empty) {
error = state->handler->node_is_empty(state->pw,
node, match);
- } else if (detail->qname.name == ctx->link) {
+ } else if (detail->qname.name == ctx->str.link) {
error = state->handler->node_is_link(state->pw,
node, match);
flags = CSS_NODE_FLAGS_NONE;
- } else if (detail->qname.name == ctx->visited) {
+ } else if (detail->qname.name == ctx->str.visited) {
error = state->handler->node_is_visited(state->pw,
node, match);
flags = CSS_NODE_FLAGS_NONE;
- } else if (detail->qname.name == ctx->hover) {
+ } else if (detail->qname.name == ctx->str.hover) {
error = state->handler->node_is_hover(state->pw,
node, match);
flags = CSS_NODE_FLAGS_NONE;
- } else if (detail->qname.name == ctx->active) {
+ } else if (detail->qname.name == ctx->str.active) {
error = state->handler->node_is_active(state->pw,
node, match);
flags = CSS_NODE_FLAGS_NONE;
- } else if (detail->qname.name == ctx->focus) {
+ } else if (detail->qname.name == ctx->str.focus) {
error = state->handler->node_is_focus(state->pw,
node, match);
flags = CSS_NODE_FLAGS_NONE;
- } else if (detail->qname.name == ctx->target) {
+ } else if (detail->qname.name == ctx->str.target) {
error = state->handler->node_is_target(state->pw,
node, match);
- } else if (detail->qname.name == ctx->lang) {
+ } else if (detail->qname.name == ctx->str.lang) {
error = state->handler->node_is_lang(state->pw,
node, detail->value.string, match);
- } else if (detail->qname.name == ctx->enabled) {
+ } else if (detail->qname.name == ctx->str.enabled) {
error = state->handler->node_is_enabled(state->pw,
node, match);
- } else if (detail->qname.name == ctx->disabled) {
+ } else if (detail->qname.name == ctx->str.disabled) {
error = state->handler->node_is_disabled(state->pw,
node, match);
- } else if (detail->qname.name == ctx->checked) {
+ } else if (detail->qname.name == ctx->str.checked) {
error = state->handler->node_is_checked(state->pw,
node, match);
} else {
@@ -2754,13 +2666,13 @@ css_error match_detail(css_select_ctx *ctx, void *node,
case CSS_SELECTOR_PSEUDO_ELEMENT:
*match = true;
- if (detail->qname.name == ctx->first_line) {
+ if (detail->qname.name == ctx->str.first_line) {
*pseudo_element = CSS_PSEUDO_ELEMENT_FIRST_LINE;
- } else if (detail->qname.name == ctx->first_letter) {
+ } else if (detail->qname.name == ctx->str.first_letter) {
*pseudo_element = CSS_PSEUDO_ELEMENT_FIRST_LETTER;
- } else if (detail->qname.name == ctx->before) {
+ } else if (detail->qname.name == ctx->str.before) {
*pseudo_element = CSS_PSEUDO_ELEMENT_BEFORE;
- } else if (detail->qname.name == ctx->after) {
+ } else if (detail->qname.name == ctx->str.after) {
*pseudo_element = CSS_PSEUDO_ELEMENT_AFTER;
} else
*match = false;
@@ -2837,7 +2749,7 @@ css_error cascade_style(const css_style *style, css_select_state *state)
}
bool css__outranks_existing(uint16_t op, bool important, css_select_state *state,
- bool inherit)
+ enum flag_value explicit_default)
{
prop_state *existing = &state->props[op][state->current_pseudo];
bool outranks = false;
@@ -2932,7 +2844,7 @@ bool css__outranks_existing(uint16_t op, bool important, css_select_state *state
existing->specificity = state->current_specificity;
existing->origin = state->current_origin;
existing->important = important;
- existing->inherit = inherit;
+ existing->explicit_default = explicit_default;
}
return outranks;
diff --git a/src/select/select.h b/src/select/select.h
index dc9aa4a..5170e58 100644
--- a/src/select/select.h
+++ b/src/select/select.h
@@ -24,11 +24,11 @@ typedef struct reject_item {
} reject_item;
typedef struct prop_state {
- uint32_t specificity; /* Specificity of property in result */
- unsigned int set : 1, /* Whether property is set in result */
- origin : 2, /* Origin of property in result */
- important : 1, /* Importance of property in result */
- inherit : 1; /* Property is set to inherit */
+ uint32_t specificity; /* Specificity of property in result */
+ unsigned int set : 1, /* Whether property is set in result */
+ origin : 2, /* Origin of property in result */
+ important : 1; /* Importance of property in result */
+ enum flag_value explicit_default : 3; /* Property is set to inherit */
} prop_state;
@@ -58,14 +58,23 @@ struct css_node_data {
css_node_flags flags;
};
+struct revert_data {
+ prop_state props[CSS_N_PROPERTIES][CSS_PSEUDO_ELEMENT_COUNT];
+ css_computed_style *style[CSS_PSEUDO_ELEMENT_COUNT];
+};
+
/**
* Selection state
*/
typedef struct css_select_state {
void *node; /* Node we're selecting for */
const css_media *media; /* Currently active media spec */
+ const css_unit_ctx *unit_ctx; /* Unit conversion context. */
css_select_results *results; /* Result set to populate */
+ /** UA and user styles for handling revert property value. */
+ struct revert_data *revert; /* Length: CSS_ORIGIN_AUTHOR */
+
css_pseudo_element current_pseudo; /* Current pseudo element */
css_computed_style *computed; /* Computed style to populate */
@@ -97,7 +106,7 @@ static inline void advance_bytecode(css_style *style, uint32_t n_bytes)
}
bool css__outranks_existing(uint16_t op, bool important,
- css_select_state *state, bool inherit);
+ css_select_state *state, enum flag_value explicit_default);
#endif
diff --git a/src/select/select_config.py b/src/select/select_config.py
index 8845814..1cfe05c 100644
--- a/src/select/select_config.py
+++ b/src/select/select_config.py
@@ -49,7 +49,7 @@ style = {
('font_weight', 4),
('justify_content', 3),
('list_style_position', 2),
- ('list_style_type', 4),
+ ('list_style_type', 6),
('overflow_x', 3),
('overflow_y', 3),
('outline_style', 4),
@@ -95,6 +95,8 @@ style = {
('min_height', 2, 'length', 'CSS_MIN_HEIGHT_SET'),
('min_width', 2, 'length', 'CSS_MIN_WIDTH_SET'),
('opacity', 1, 'fixed', 'CSS_OPACITY_SET'),
+ ('fill_opacity', 1, 'fixed', 'CSS_FILL_OPACITY_SET'),
+ ('stroke_opacity', 1, 'fixed', 'CSS_STROKE_OPACITY_SET'),
('order', 1, 'integer', 'CSS_ORDER_SET'),
('padding_top', 1, 'length', 'CSS_PADDING_SET'),
('padding_right', 1, 'length', 'CSS_PADDING_SET'),
diff --git a/src/select/select_generator.py b/src/select/select_generator.py
index 2d6afe8..9e92909 100644
--- a/src/select/select_generator.py
+++ b/src/select/select_generator.py
@@ -29,8 +29,8 @@ def shift_star(value_type, prop_name):
`lwc_string **str_array`
"""
star_i = value_type.find('*')
- v_type = value_type if star_i is -1 else value_type[:star_i]
- v_name = prop_name if star_i is -1 else value_type[star_i:] + prop_name
+ v_type = value_type if star_i == -1 else value_type[:star_i]
+ v_name = prop_name if star_i == -1 else value_type[star_i:] + prop_name
return (v_type, v_name)
class Text:
@@ -233,7 +233,7 @@ class CSSProperty:
for x in values:
if x[0] == v[0]:
value = CSSValue(*x)
- if len(v) is 2:
+ if len(v) == 2:
value.defaults = v[1]
if len(vals) > 1:
value.suffix = '_' + string.ascii_lowercase[i]
@@ -322,18 +322,16 @@ class CSSProperty:
"""
vals = []
for v in self.values:
+ star = '*' if pointer else ''
vt, vn = shift_star(v.type, v.name)
- vn += v.suffix
+ vn = star + vn + v.suffix
if pointer:
- vn = '*' + vn
if v.name == 'counter_arr' or v.name == 'content_item':
vt = 'const ' + vt
vals.append((vt, vn))
if v.bits is not None:
- bt, bn = shift_star(v.bits['type'], v.bits['name'])
- bn += v.suffix
- if pointer:
- bn = '*' + bn
+ bt = v.bits['type']
+ bn = star + v.bits['name'] + v.suffix
vals.append((bt, bn))
return vals
@@ -348,7 +346,7 @@ class CSSProperty:
bits_len = sum([ x['size'] for x in bits ])
comment = '/* {}bit{}: {} : {} */'.format(
bits_len,
- ('' if bits_len is 1 else 's'),
+ ('' if bits_len == 1 else 's'),
''.join([ b['letter'] * b['size'] for b in bits ]),
' | '.join([ b['name'] for b in bits ]))
rev_bits = list(reversed(bits))
@@ -406,7 +404,7 @@ class CSSGroup:
bin_size = 32 # We're using uint32_t as concrete bins.
bits_array = []
- props = sorted(self.props, key=(lambda x: x.bits_size), reverse=True)
+ props = sorted(self.props, key=(lambda x: (x.bits_size, x.name)), reverse=True)
for p in props:
for b in bits_array:
@@ -429,21 +427,12 @@ class CSSGroup:
return bits_array
- def get_idot_grp(self):
- """Make parameters for accessing bits and values in this group."""
- i_dot = '' if self.name is 'page' else 'i.'
- grp = '' if self.name is 'style' else '->{}{}'.format(
- '' if self.name is 'page' else i_dot, self.name)
- return (i_dot, grp)
-
def make_computed_h(self):
"""Output this group's text for the computed.h file."""
t = Text()
t.append()
- typedef = 'typedef ' if self.name is 'page' else ''
- t.append('{}struct css_computed_{}{} {{'.format(
- typedef, self.name, '' if self.name is 'page' else '_i'))
+ t.append('struct css_computed_style_i {')
t.comment()
commented = []
@@ -490,103 +479,28 @@ class CSSGroup:
t.append()
t.append(self.make_value_declaration(for_commented=False))
- if self.name is 'style':
- t.append()
- for g in css_groups:
- if g.name is not 'style' and g.name is not 'page':
- t.append('css_computed_{0} *{0};'.format(g.name))
-
t.indent(-1)
- t.append('}}{};'.format(
- ' css_computed_' + self.name if typedef else ''))
+ t.append('};')
- if self.name is not 'page':
- typedef = 'typedef ' if self.name is not 'style' else ''
- t.append()
- t.append('{}struct css_computed_{} {{'.format(
- typedef, self.name))
- t.indent(1)
- t.append('struct css_computed_' + self.name + '_i i;')
- t.append()
- t.append(self.make_value_declaration(for_commented=True))
- t.append()
+ t.append()
+ t.append('struct css_computed_style {')
+ t.indent(1)
+ t.append('struct css_computed_style_i i;')
+ t.append()
+ t.append(self.make_value_declaration(for_commented=True))
+ t.append()
- t.append('struct css_computed_' + self.name + ' *next;')
- t.append('uint32_t count;')
- t.append('uint32_t bin;')
- t.indent(-1)
- t.append('}}{};'.format(
- ' css_computed_' + self.name if typedef else ''))
+ t.append('struct css_computed_style *next;')
+ t.append('uint32_t count;')
+ t.append('uint32_t bin;')
+ t.indent(-1)
+ t.append('};')
return t.to_string()
def make_propset_h(self):
- """Output this group's property functions for the propset.h file.
-
- If group is not `style`, will also output the defaults
- and the ENSURE_{group} texts.
- """
+ """Output this group's property functions for the propset.h file."""
t = Text()
- i_dot, grp = self.get_idot_grp()
-
- if self.name is not 'style':
- t.append('static const css_computed_{0} default_{0} = {{'.format(
- self.name))
- t.indent(1)
-
- if self.name is not 'page':
- t.append('.i = {')
- t.indent(1)
-
- t.append('.bits = {')
- t.indent(1)
-
- bits_ops = []
- for b in self.bits_array:
- or_ops = []
- for p in b.contents:
- or_ops.append('({} << {})'.format(p.defaults, str(p.shift))
- if p.shift else p.defaults)
- bits_ops.append(' | '.join(or_ops))
-
- t.append(',\n'.join(bits_ops).split('\n'))
- t.indent(-1)
- t.append('},')
- t.append(',\n'.join(
- self.make_value_declaration(False, True)).split('\n'))
-
- if self.name is not 'page':
- t.indent(-1)
- t.append('},')
- t.append(',\n'.join(
- self.make_value_declaration(True, True) +
- [ '.next = NULL', '.count = 0', '.bin = UINT32_MAX' ]
- ).split('\n'))
-
- t.indent(-1)
- t.append('};')
-
- t.append()
- t.escape_newline()
- t.append('#define ENSURE_{} do {{'.format(self.name.upper()))
- t.indent(1)
- t.append('if (style->{}{} == NULL) {{'.format(i_dot, self.name))
- t.indent(1)
- t.append('style->{}{n} = malloc(sizeof(css_computed_{n}));'.format(
- i_dot, n=self.name))
- t.append('if (style->{}{} == NULL)'.format(i_dot, self.name))
- t.indent(1)
- t.append('return CSS_NOMEM;')
- t.indent(-1)
- t.append()
- t.append('memcpy(style->{}{n}, &default_{n}, '
- 'sizeof(css_computed_{n}));'.format(i_dot, n=self.name))
- t.indent(-1)
- t.append('}')
- t.indent(-1)
- t.append('} while(0)')
- t.escape_newline()
- t.append()
for p in sorted(self.props, key=(lambda x: x.name)):
defines, undefs = p.def_undefs
@@ -608,15 +522,7 @@ class CSSGroup:
t.append('{')
t.indent(1)
- t.append('uint32_t *bits;')
- t.append()
-
- if self.name is not 'style':
- t.append('ENSURE_{};'.format(self.name.upper()))
- t.append()
-
- t.append('bits = &style{}->{}bits[{}_INDEX];'.format(
- grp, i_dot, p.name.upper()))
+ t.append('uint32_t *bits = &style->i.bits[{}_INDEX];'.format(p.name.upper()))
t.append()
type_mask, shift_list, bits_comment = p.get_bits()
@@ -636,20 +542,18 @@ class CSSGroup:
old_n = 'old_' + v.name + v.suffix
old_t, old_n_shift = shift_star(v.type, old_n)
- if v.name is 'string':
- t.append('{} {} = style{}->{}{};'.format(
- old_t, old_n_shift,
- grp, i_dot, p.name + v.suffix))
+ if v.name == 'string':
+ t.append('{} {} = style->i.{};'.format(
+ old_t, old_n_shift, p.name + v.suffix))
t.append()
t.append('if ({} != NULL) {{'.format(v.name + v.suffix))
t.indent(1)
- t.append('style{}->{}{} = lwc_string_ref({});'.format(
- grp, i_dot, p.name + v.suffix, v.name + v.suffix))
+ t.append('style->i.{} = lwc_string_ref({});'.format(
+ p.name + v.suffix, v.name + v.suffix))
t.indent(-1)
t.append('} else {')
t.indent(1)
- t.append('style{}->{}{} = NULL;'.format(
- grp, i_dot, p.name + v.suffix))
+ t.append('style->i.{} = NULL;'.format(p.name + v.suffix))
t.indent(-1)
t.append('}')
t.append()
@@ -658,12 +562,12 @@ class CSSGroup:
t.append('lwc_string_unref({});'.format(old_n))
t.indent(-1)
- elif v.name is 'string_arr' or v.name is 'counter_arr':
- iter_var = 's' if v.name is 'string_arr' else 'c'
- iter_deref = '*s' if v.name is 'string_arr' else 'c->name'
- t.append('{} {} = style{}->{};'.format(
+ elif v.name == 'string_arr' or v.name == 'counter_arr':
+ iter_var = 's' if v.name == 'string_arr' else 'c'
+ iter_deref = '*s' if v.name == 'string_arr' else 'c->name'
+ t.append('{} {} = style->{};'.format(
old_t, old_n_shift,
- grp, p.name + v.suffix))
+ p.name + v.suffix))
t.append('{} {};'.format(old_t,
shift_star(v.type, iter_var)[1]))
t.append()
@@ -674,8 +578,8 @@ class CSSGroup:
t.append('{0} = lwc_string_ref({0});'.format(iter_deref))
t.indent(-1)
t.append()
- t.append('style{}->{} = {};'.format(
- grp, p.name + v.suffix, v.name + v.suffix))
+ t.append('style->{} = {};'.format(
+ p.name + v.suffix, v.name + v.suffix))
t.append()
t.append('/* Free existing array */')
t.append('if ({} != NULL) {{'.format(old_n))
@@ -693,8 +597,8 @@ class CSSGroup:
t.append('}')
elif not v.is_ptr:
- t.append('style{}->{}{} = {};'.format(
- grp, i_dot, p.name + v.suffix, v.name + v.suffix))
+ t.append('style->i.{} = {};'.format(
+ p.name + v.suffix, v.name + v.suffix))
else:
raise ValueError('Cannot handle value ' + v.name +'!')
@@ -707,54 +611,38 @@ class CSSGroup:
return t.to_string()
- def make_propget_h(self):
- """Output this group's property functions for the propget.h file."""
- t = Text()
- i_dot, grp = self.get_idot_grp()
-
- for p in sorted(self.props, key=(lambda x: x.name)):
- defines, undefs = p.def_undefs
-
- t.append()
- t.append(defines)
-
- if p.name in overrides['get']:
- t.append(overrides['get'][p.name], pre_formatted=True)
- t.append(undefs)
- continue
+ def print_propget(self, t, p, only_bits=False):
+ vals = [] if only_bits else p.get_param_values(pointer=True)
+ params = ', '.join([ 'css_computed_style *style' ]
+ + [ ' '.join(x) for x in vals ])
- vals = p.get_param_values(pointer=True)
- params = ', '.join([ 'css_computed_style *style' ]
- + [ ' '.join(x) for x in vals ])
- t.append('static inline uint8_t get_{}(const {})'.format(
- p.name, params))
- t.append('{')
- t.indent(1)
-
- if self.name is not 'style':
- t.append('if (style{} != NULL) {{'.format(grp))
- t.indent(1)
+ underscore_bits = '_bits' if only_bits else ''
+ t.append('static inline uint8_t get_{}{}(const {})'.format(
+ p.name, underscore_bits, params))
+ t.append('{')
+ t.indent(1)
- t.append('uint32_t bits = style{}->{}bits[{}_INDEX];'.format(
- grp, i_dot, p.name.upper()))
- t.append('bits &= {}_MASK;'.format(p.name.upper()))
- t.append('bits >>= {}_SHIFT;'.format(p.name.upper()))
- t.append()
+ t.append('uint32_t bits = style->i.bits[{}_INDEX];'.format(
+ p.name.upper()))
+ t.append('bits &= {}_MASK;'.format(p.name.upper()))
+ t.append('bits >>= {}_SHIFT;'.format(p.name.upper()))
+ t.append()
- type_mask, shift_list, bits_comment = p.get_bits()
- t.append(bits_comment)
+ type_mask, shift_list, bits_comment = p.get_bits()
+ t.append(bits_comment)
+ if only_bits == False:
if p.condition:
t.append('if ((bits & {}) == {}) {{'.format(
type_mask, p.condition))
t.indent(1)
for v in p.values:
- this_idot = '' if v.is_ptr and v.name != 'string' else i_dot
- t.append('*{} = style{}->{}{};'.format(
- v.name + v.suffix, grp, this_idot, p.name + v.suffix))
+ i_dot = '' if v.is_ptr and v.name != 'string' else 'i.'
+ t.append('*{} = style->{}{};'.format(
+ v.name + v.suffix, i_dot, p.name + v.suffix))
for i, v in enumerate(list(reversed(shift_list))):
- if i is 0:
+ if i == 0:
t.append('*{} = bits >> {};'.format(v[0], v[1]))
else:
t.append('*{} = (bits & 0x{:x}) >> {};'.format(
@@ -763,29 +651,35 @@ class CSSGroup:
if p.condition:
t.indent(-1)
t.append('}')
+ t.append()
+
+ t.append('return (bits & {});'.format(type_mask))
+
+ t.indent(-1)
+ t.append('}')
+
+ def make_propget_h(self):
+ """Output this group's property functions for the propget.h file."""
+ t = Text()
+
+ for p in sorted(self.props, key=(lambda x: x.name)):
+ defines, undefs = p.def_undefs
t.append()
- t.append('return (bits & {});'.format(type_mask))
+ t.append(defines)
- if self.name is not 'style':
- t.indent(-1)
- t.append('}')
- t.append()
- t.append('/* Initial value */')
- for v in p.values:
- t.append('*{} = {};'.format(v.name + v.suffix, v.defaults))
- if v.bits is not None:
- t.append('*{} = {};'.format(
- v.bits['name'] + v.suffix, v.bits['defaults']))
- t.append('return {};'.format(p.defaults))
+ self.print_propget(t, p, True)
+
+ if p.name in overrides['get']:
+ t.append(overrides['get'][p.name], pre_formatted=True)
+ else:
+ self.print_propget(t, p)
- t.indent(-1)
- t.append('}')
t.append(undefs)
return t.to_string()
- def make_value_declaration(self, for_commented, defaults=False):
+ def make_value_declaration(self, for_commented):
"""Output declarations of values for this group's properties.
Args:
@@ -797,12 +691,8 @@ class CSSGroup:
for p in sorted(self.props, key=(lambda x: x.name)):
if bool(p.comments) == for_commented:
for v in p.values:
- if defaults:
- r.append('.{}{} = {}'.format(p.name, v.suffix,
- v.defaults))
- else:
- v_type, v_name = shift_star(v.type, p.name)
- r.append('{} {}{};'.format(v_type, v_name, v.suffix))
+ v_type, v_name = shift_star(v.type, p.name)
+ r.append('{} {}{};'.format(v_type, v_name, v.suffix))
return r
def make_text(self, filename):
diff --git a/src/select/strings.c b/src/select/strings.c
new file mode 100644
index 0000000..6e9137d
--- /dev/null
+++ b/src/select/strings.c
@@ -0,0 +1,264 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org>
+ */
+
+#include <libwapcaplet/libwapcaplet.h>
+
+#include "select/strings.h"
+#include "utils/utils.h"
+
+css_error css_select_strings_intern(css_select_strings *str)
+{
+ lwc_error error;
+
+ /* Universal selector */
+ error = lwc_intern_string("*", SLEN("*"), &str->universal);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ /* Pseudo classes */
+ error = lwc_intern_string(
+ "first-child", SLEN("first-child"),
+ &str->first_child);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "link", SLEN("link"),
+ &str->link);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "visited", SLEN("visited"),
+ &str->visited);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "hover", SLEN("hover"),
+ &str->hover);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "active", SLEN("active"),
+ &str->active);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "focus", SLEN("focus"),
+ &str->focus);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "nth-child", SLEN("nth-child"),
+ &str->nth_child);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "nth-last-child", SLEN("nth-last-child"),
+ &str->nth_last_child);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "nth-of-type", SLEN("nth-of-type"),
+ &str->nth_of_type);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "nth-last-of-type", SLEN("nth-last-of-type"),
+ &str->nth_last_of_type);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "last-child", SLEN("last-child"),
+ &str->last_child);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "first-of-type", SLEN("first-of-type"),
+ &str->first_of_type);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "last-of-type", SLEN("last-of-type"),
+ &str->last_of_type);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "only-child", SLEN("only-child"),
+ &str->only_child);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "only-of-type", SLEN("only-of-type"),
+ &str->only_of_type);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "root", SLEN("root"),
+ &str->root);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "empty", SLEN("empty"),
+ &str->empty);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "target", SLEN("target"),
+ &str->target);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "lang", SLEN("lang"),
+ &str->lang);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "enabled", SLEN("enabled"),
+ &str->enabled);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "disabled", SLEN("disabled"),
+ &str->disabled);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "checked", SLEN("checked"),
+ &str->checked);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ /* Pseudo elements */
+ error = lwc_intern_string(
+ "first-line", SLEN("first-line"),
+ &str->first_line);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "first_letter", SLEN("first-letter"),
+ &str->first_letter);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "before", SLEN("before"),
+ &str->before);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "after", SLEN("after"),
+ &str->after);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "width", SLEN("width"),
+ &str->width);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "height", SLEN("height"),
+ &str->height);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ error = lwc_intern_string(
+ "prefers-color-scheme", SLEN("prefers-color-scheme"),
+ &str->prefers_color_scheme);
+ if (error != lwc_error_ok)
+ return css_error_from_lwc_error(error);
+
+ return CSS_OK;
+}
+
+void css_select_strings_unref(css_select_strings *str)
+{
+ if (str->universal != NULL)
+ lwc_string_unref(str->universal);
+ if (str->first_child != NULL)
+ lwc_string_unref(str->first_child);
+ if (str->link != NULL)
+ lwc_string_unref(str->link);
+ if (str->visited != NULL)
+ lwc_string_unref(str->visited);
+ if (str->hover != NULL)
+ lwc_string_unref(str->hover);
+ if (str->active != NULL)
+ lwc_string_unref(str->active);
+ if (str->focus != NULL)
+ lwc_string_unref(str->focus);
+ if (str->nth_child != NULL)
+ lwc_string_unref(str->nth_child);
+ if (str->nth_last_child != NULL)
+ lwc_string_unref(str->nth_last_child);
+ if (str->nth_of_type != NULL)
+ lwc_string_unref(str->nth_of_type);
+ if (str->nth_last_of_type != NULL)
+ lwc_string_unref(str->nth_last_of_type);
+ if (str->last_child != NULL)
+ lwc_string_unref(str->last_child);
+ if (str->first_of_type != NULL)
+ lwc_string_unref(str->first_of_type);
+ if (str->last_of_type != NULL)
+ lwc_string_unref(str->last_of_type);
+ if (str->only_child != NULL)
+ lwc_string_unref(str->only_child);
+ if (str->only_of_type != NULL)
+ lwc_string_unref(str->only_of_type);
+ if (str->root != NULL)
+ lwc_string_unref(str->root);
+ if (str->empty != NULL)
+ lwc_string_unref(str->empty);
+ if (str->target != NULL)
+ lwc_string_unref(str->target);
+ if (str->lang != NULL)
+ lwc_string_unref(str->lang);
+ if (str->enabled != NULL)
+ lwc_string_unref(str->enabled);
+ if (str->disabled != NULL)
+ lwc_string_unref(str->disabled);
+ if (str->checked != NULL)
+ lwc_string_unref(str->checked);
+ if (str->first_line != NULL)
+ lwc_string_unref(str->first_line);
+ if (str->first_letter != NULL)
+ lwc_string_unref(str->first_letter);
+ if (str->before != NULL)
+ lwc_string_unref(str->before);
+ if (str->after != NULL)
+ lwc_string_unref(str->after);
+
+ if (str->width != NULL)
+ lwc_string_unref(str->width);
+ if (str->height != NULL)
+ lwc_string_unref(str->height);
+ if (str->prefers_color_scheme != NULL)
+ lwc_string_unref(str->prefers_color_scheme);
+}
diff --git a/src/select/strings.h b/src/select/strings.h
new file mode 100644
index 0000000..ff965e5
--- /dev/null
+++ b/src/select/strings.h
@@ -0,0 +1,52 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2009 John-Mark Bell <jmb@netsurf-browser.org>
+ */
+
+#ifndef css_select_strings_h_
+#define css_select_strings_h_
+
+#include <libcss/errors.h>
+
+/** Useful interned strings */
+typedef struct {
+ lwc_string *universal;
+ lwc_string *first_child;
+ lwc_string *link;
+ lwc_string *visited;
+ lwc_string *hover;
+ lwc_string *active;
+ lwc_string *focus;
+ lwc_string *nth_child;
+ lwc_string *nth_last_child;
+ lwc_string *nth_of_type;
+ lwc_string *nth_last_of_type;
+ lwc_string *last_child;
+ lwc_string *first_of_type;
+ lwc_string *last_of_type;
+ lwc_string *only_child;
+ lwc_string *only_of_type;
+ lwc_string *root;
+ lwc_string *empty;
+ lwc_string *target;
+ lwc_string *lang;
+ lwc_string *enabled;
+ lwc_string *disabled;
+ lwc_string *checked;
+ lwc_string *first_line;
+ lwc_string *first_letter;
+ lwc_string *before;
+ lwc_string *after;
+
+ lwc_string *width;
+ lwc_string *height;
+ lwc_string *prefers_color_scheme;
+} css_select_strings;
+
+css_error css_select_strings_intern(css_select_strings *str);
+void css_select_strings_unref(css_select_strings *str);
+
+#endif
+
diff --git a/src/select/unit.c b/src/select/unit.c
new file mode 100644
index 0000000..3294db3
--- /dev/null
+++ b/src/select/unit.c
@@ -0,0 +1,513 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Copyright 2021 Michael Drake <tlsa@netsurf-browser.org>
+ */
+
+#include <libcss/stylesheet.h>
+
+#include "utils/utils.h"
+
+#include "propget.h"
+#include "unit.h"
+
+/**
+ * Map viewport-relative length units to either vh or vw.
+ *
+ * Non-viewport-relative units are unchanged.
+ *
+ * \param[in] style Reference style.
+ * \param[in] viewport_height Viewport height in px.
+ * \param[in] viewport_width Viewport width in px.
+ * \param[in] unit Unit to map.
+ * \return the mapped unit.
+ */
+static inline css_unit css_unit__map_viewport_units(
+ const css_computed_style *style,
+ const css_fixed viewport_height,
+ const css_fixed viewport_width,
+ const css_unit unit)
+{
+ switch (unit) {
+ case CSS_UNIT_VI:
+ return (style != NULL && get_writing_mode(style) !=
+ CSS_WRITING_MODE_HORIZONTAL_TB) ?
+ CSS_UNIT_VH : CSS_UNIT_VW;
+
+ case CSS_UNIT_VB:
+ return (style != NULL && get_writing_mode(style) !=
+ CSS_WRITING_MODE_HORIZONTAL_TB) ?
+ CSS_UNIT_VW : CSS_UNIT_VH;
+
+ case CSS_UNIT_VMIN:
+ return (viewport_height < viewport_width) ?
+ CSS_UNIT_VH : CSS_UNIT_VW;
+
+ case CSS_UNIT_VMAX:
+ return (viewport_height > viewport_width) ?
+ CSS_UNIT_VH : CSS_UNIT_VW;
+
+ default:
+ return unit;
+ }
+}
+
+/**
+ * Convert an absolute length to points (pt).
+ *
+ * \param[in] style Style to get font-size from, or NULL.
+ * \param[in] viewport_height Client viewport height.
+ * \param[in] viewport_width Client viewport width.
+ * \param[in] length Length to convert.
+ * \param[in] unit Current unit of length.
+ * \return length in points (pt).
+ */
+static inline css_fixed css_unit__absolute_len2pt(
+ const css_computed_style *style,
+ const css_fixed viewport_height,
+ const css_fixed viewport_width,
+ const css_fixed length,
+ const css_unit unit)
+{
+ /* Length must not be relative */
+ assert(unit != CSS_UNIT_EM &&
+ unit != CSS_UNIT_EX &&
+ unit != CSS_UNIT_CH &&
+ unit != CSS_UNIT_REM);
+
+ switch (css_unit__map_viewport_units(style,
+ viewport_height,
+ viewport_width,
+ unit)) {
+ case CSS_UNIT_PX:
+ return FDIV(FMUL(length, F_72), F_96);
+
+ case CSS_UNIT_IN:
+ return FMUL(length, F_72);
+
+ case CSS_UNIT_CM:
+ return FMUL(length, FDIV(F_72, FLTTOFIX(2.54)));
+
+ case CSS_UNIT_MM:
+ return FMUL(length, FDIV(F_72, FLTTOFIX(25.4)));
+
+ case CSS_UNIT_Q:
+ return FMUL(length, FDIV(F_72, FLTTOFIX(101.6)));
+
+ case CSS_UNIT_PT:
+ return length;
+
+ case CSS_UNIT_PC:
+ return FMUL(length, INTTOFIX(12));
+
+ case CSS_UNIT_VH:
+ return FDIV(FMUL(FDIV(FMUL(length, viewport_height), F_100),
+ F_72), F_96);
+
+ case CSS_UNIT_VW:
+ return FDIV(FMUL(FDIV(FMUL(length, viewport_width), F_100),
+ F_72), F_96);
+
+ default:
+ return 0;
+ }
+}
+
+/* Exported function, documented in libcss/unit.h. */
+css_fixed css_unit_font_size_len2pt(
+ const css_computed_style *style,
+ const css_unit_ctx *ctx,
+ const css_fixed length,
+ const css_unit unit)
+{
+ return css_unit__absolute_len2pt(
+ style,
+ ctx->viewport_height,
+ ctx->viewport_width,
+ length,
+ unit);
+}
+
+/**
+ * Get font size from a style in CSS pixels.
+ *
+ * The style should have font size in absolute units.
+ *
+ * \param[in] style Style to get font-size from, or NULL.
+ * \param[in] font_size_default Client font size for NULL style.
+ * \param[in] font_size_minimum Client minimum font size clamp.
+ * \param[in] viewport_height Client viewport height.
+ * \param[in] viewport_width Client viewport width.
+ * \return font-size in CSS pixels.
+ */
+static inline css_fixed css_unit__font_size_px(
+ const css_computed_style *style,
+ const css_fixed font_size_default,
+ const css_fixed font_size_minimum,
+ const css_fixed viewport_height,
+ const css_fixed viewport_width)
+{
+ css_fixed font_length = 0;
+ css_unit font_unit = CSS_UNIT_PT;
+
+ if (style == NULL) {
+ return font_size_default;
+ }
+
+ get_font_size(style, &font_length, &font_unit);
+
+ if (font_unit != CSS_UNIT_PX) {
+ font_length = css_unit__absolute_len2pt(style,
+ viewport_height,
+ viewport_width,
+ font_length,
+ font_unit);
+
+ /* Convert from pt to CSS pixels.*/
+ font_length = FDIV(FMUL(font_length, F_96), F_72);
+ }
+
+ /* Clamp to configured minimum */
+ if (font_length < font_size_minimum) {
+ font_length = font_size_minimum;
+ }
+
+ return font_length;
+}
+
+/**
+ * Get the number of CSS pixels for a given unit.
+ *
+ * \param[in] measure Client callback for font measuring.
+ * \param[in] ref_style Reference style. (Element or parent, or NULL).
+ * \param[in] root_style Root element style or NULL.
+ * \param[in] font_size_default Client default font size in CSS pixels.
+ * \param[in] font_size_minimum Client minimum font size in CSS pixels.
+ * \param[in] viewport_height Viewport height in CSS pixels.
+ * \param[in] viewport_width Viewport width in CSS pixels.
+ * \param[in] unit The unit to convert from.
+ * \param[in] pw Client private word for measure callback.
+ * \return Number of CSS pixels equivalent to the given unit.
+ */
+static inline css_fixed css_unit__px_per_unit(
+ const css_unit_len_measure measure,
+ const css_computed_style *ref_style,
+ const css_computed_style *root_style,
+ const css_fixed font_size_default,
+ const css_fixed font_size_minimum,
+ const css_fixed viewport_height,
+ const css_fixed viewport_width,
+ const css_unit unit,
+ void *pw)
+{
+ switch (css_unit__map_viewport_units(
+ ref_style,
+ viewport_height,
+ viewport_width,
+ unit)) {
+ case CSS_UNIT_EM:
+ return css_unit__font_size_px(
+ ref_style,
+ font_size_default,
+ font_size_minimum,
+ viewport_height,
+ viewport_width);
+
+ case CSS_UNIT_EX:
+ if (measure != NULL) {
+ return measure(pw, ref_style, CSS_UNIT_EX);
+ }
+ return FMUL(css_unit__font_size_px(
+ ref_style,
+ font_size_default,
+ font_size_minimum,
+ viewport_height,
+ viewport_width), FLTTOFIX(0.6));
+
+ case CSS_UNIT_CH:
+ if (measure != NULL) {
+ return measure(pw, ref_style, CSS_UNIT_CH);
+ }
+ return FMUL(css_unit__font_size_px(
+ ref_style,
+ font_size_default,
+ font_size_minimum,
+ viewport_height,
+ viewport_width), FLTTOFIX(0.4));
+
+ case CSS_UNIT_PX:
+ return F_1;
+
+ case CSS_UNIT_IN:
+ return F_96;
+
+ case CSS_UNIT_CM:
+ return FDIV(F_96, FLTTOFIX(2.54));
+
+ case CSS_UNIT_MM:
+ return FDIV(F_96, FLTTOFIX(25.4));
+
+ case CSS_UNIT_Q:
+ return FDIV(F_96, FLTTOFIX(101.6));
+
+ case CSS_UNIT_PT:
+ return FDIV(F_96, F_72);
+
+ case CSS_UNIT_PC:
+ return FDIV(F_96, INTTOFIX(6));
+
+ case CSS_UNIT_REM:
+ return css_unit__font_size_px(
+ root_style,
+ font_size_default,
+ font_size_minimum,
+ viewport_height,
+ viewport_width);
+
+ case CSS_UNIT_VH:
+ return FDIV(viewport_width, F_100);
+
+ case CSS_UNIT_VW:
+ return FDIV(viewport_height, F_100);
+
+ default:
+ return 0;
+ }
+}
+
+/* Exported function, documented in unit.h. */
+css_fixed css_unit_len2px_mq(
+ const css_unit_ctx *ctx,
+ const css_fixed length,
+ const css_unit unit)
+{
+ /* In the media query context there is no reference or root element
+ * style, so these are hard-coded to NULL. */
+ css_fixed px_per_unit = css_unit__px_per_unit(
+ ctx->measure,
+ NULL,
+ NULL,
+ ctx->font_size_default,
+ ctx->font_size_minimum,
+ ctx->viewport_height,
+ ctx->viewport_width,
+ unit,
+ ctx->pw);
+
+ /* Ensure we round px_per_unit to the nearest whole number of pixels:
+ * the use of FIXTOINT() below will truncate. */
+ px_per_unit += F_0_5;
+
+ /* Calculate total number of pixels */
+ return FMUL(length, TRUNCATEFIX(px_per_unit));
+}
+
+/* Exported function, documented in libcss/unit.h. */
+css_fixed css_unit_len2css_px(
+ const css_computed_style *style,
+ const css_unit_ctx *ctx,
+ const css_fixed length,
+ const css_unit unit)
+{
+ css_fixed px_per_unit = css_unit__px_per_unit(
+ ctx->measure,
+ style,
+ ctx->root_style,
+ ctx->font_size_default,
+ ctx->font_size_minimum,
+ ctx->viewport_height,
+ ctx->viewport_width,
+ unit,
+ ctx->pw);
+
+ /* Ensure we round px_per_unit to the nearest whole number of pixels:
+ * the use of FIXTOINT() below will truncate. */
+ px_per_unit += F_0_5;
+
+ /* Calculate total number of pixels */
+ return FMUL(length, TRUNCATEFIX(px_per_unit));
+}
+
+/* Exported function, documented in libcss/unit.h. */
+css_fixed css_unit_len2device_px(
+ const css_computed_style *style,
+ const css_unit_ctx *ctx,
+ const css_fixed length,
+ const css_unit unit)
+{
+ css_fixed px_per_unit = css_unit__px_per_unit(
+ ctx->measure,
+ style,
+ ctx->root_style,
+ ctx->font_size_default,
+ ctx->font_size_minimum,
+ ctx->viewport_height,
+ ctx->viewport_width,
+ unit,
+ ctx->pw);
+
+ px_per_unit = css_unit_css2device_px(px_per_unit, ctx->device_dpi);
+
+ /* Ensure we round px_per_unit to the nearest whole number of pixels:
+ * the use of FIXTOINT() below will truncate. */
+ px_per_unit += F_0_5;
+
+ /* Calculate total number of pixels */
+ return FMUL(length, TRUNCATEFIX(px_per_unit));
+}
+
+/**
+ * Get font size from a computed style.
+ *
+ * The computed style will have font-size with an absolute unit.
+ * If no computed style is given, the client default font-size will be returned.
+ *
+ * \param[in] style Reference style. (Element or parent, or NULL).
+ * \param[in] font_size_default Client default font size in CSS pixels.
+ * \return The font size in absolute units.
+ */
+static inline css_hint_length css_unit__get_font_size(
+ const css_computed_style *style,
+ css_fixed font_size_default)
+{
+ css_hint_length size = {
+ .value = font_size_default,
+ .unit = CSS_UNIT_PX,
+ };
+
+ if (style != NULL) {
+ enum css_font_size_e status = get_font_size(style,
+ &size.value,
+ &size.unit);
+
+ UNUSED(status);
+
+ /* The font size must be absolute. */
+ assert(status == CSS_FONT_SIZE_DIMENSION);
+ assert(size.unit != CSS_UNIT_EM);
+ assert(size.unit != CSS_UNIT_EX);
+ assert(size.unit != CSS_UNIT_PCT);
+ }
+
+ return size;
+}
+
+/* Exported function, documented in unit.h. */
+css_error css_unit_compute_absolute_font_size(
+ const css_hint_length *ref_length,
+ const css_computed_style *root_style,
+ css_fixed font_size_default,
+ css_hint *size)
+{
+ css_hint_length ref_len = {
+ .value = font_size_default,
+ .unit = CSS_UNIT_PX,
+ };
+
+ if (ref_length != NULL) {
+ /* Must be absolute. */
+ assert(ref_length->unit != CSS_UNIT_EM);
+ assert(ref_length->unit != CSS_UNIT_EX);
+ assert(ref_length->unit != CSS_UNIT_PCT);
+
+ ref_len = *ref_length;
+ }
+
+ assert(size->status != CSS_FONT_SIZE_INHERIT);
+
+ switch (size->status) {
+ case CSS_FONT_SIZE_XX_SMALL: /* Fall-through. */
+ case CSS_FONT_SIZE_X_SMALL: /* Fall-through. */
+ case CSS_FONT_SIZE_SMALL: /* Fall-through. */
+ case CSS_FONT_SIZE_MEDIUM: /* Fall-through. */
+ case CSS_FONT_SIZE_LARGE: /* Fall-through. */
+ case CSS_FONT_SIZE_X_LARGE: /* Fall-through. */
+ case CSS_FONT_SIZE_XX_LARGE:
+ {
+ static const css_fixed factors[CSS_FONT_SIZE_XX_LARGE] = {
+ [CSS_FONT_SIZE_XX_SMALL - 1] = FLTTOFIX(0.5625),
+ [CSS_FONT_SIZE_X_SMALL - 1] = FLTTOFIX(0.6250),
+ [CSS_FONT_SIZE_SMALL - 1] = FLTTOFIX(0.8125),
+ [CSS_FONT_SIZE_MEDIUM - 1] = FLTTOFIX(1.0000),
+ [CSS_FONT_SIZE_LARGE - 1] = FLTTOFIX(1.1250),
+ [CSS_FONT_SIZE_X_LARGE - 1] = FLTTOFIX(1.5000),
+ [CSS_FONT_SIZE_XX_LARGE - 1] = FLTTOFIX(2.0000),
+ };
+ assert(CSS_FONT_SIZE_INHERIT == 0);
+ assert(CSS_FONT_SIZE_XX_SMALL == 1);
+
+ size->data.length.value = FMUL(factors[size->status - 1],
+ font_size_default);
+ size->data.length.unit = CSS_UNIT_PX;
+ size->status = CSS_FONT_SIZE_DIMENSION;
+ break;
+ }
+ case CSS_FONT_SIZE_LARGER:
+ size->data.length.value = FMUL(ref_len.value, FLTTOFIX(1.2));
+ size->data.length.unit = ref_len.unit;
+ size->status = CSS_FONT_SIZE_DIMENSION;
+ break;
+
+ case CSS_FONT_SIZE_SMALLER:
+ size->data.length.value = FDIV(ref_len.value, FLTTOFIX(1.2));
+ size->data.length.unit = ref_len.unit;
+ size->status = CSS_FONT_SIZE_DIMENSION;
+ break;
+
+ case CSS_FONT_SIZE_DIMENSION:
+ /* Convert any relative units to absolute. */
+ switch (size->data.length.unit) {
+ case CSS_UNIT_PCT:
+ size->data.length.value = FDIV(FMUL(
+ size->data.length.value,
+ ref_len.value), INTTOFIX(100));
+ size->data.length.unit = ref_len.unit;
+ break;
+
+ case CSS_UNIT_EM: /* Fall-through */
+ case CSS_UNIT_EX: /* Fall-through */
+ case CSS_UNIT_CH:
+ /* Parent relative units. */
+ size->data.length.value = FMUL(
+ size->data.length.value, ref_len.value);
+
+ switch (size->data.length.unit) {
+ case CSS_UNIT_EX:
+ size->data.length.value = FMUL(
+ size->data.length.value,
+ FLTTOFIX(0.6));
+ break;
+
+ case CSS_UNIT_CH:
+ size->data.length.value = FMUL(
+ size->data.length.value,
+ FLTTOFIX(0.4));
+ break;
+
+ default:
+ break;
+ }
+ size->data.length.unit = ref_len.unit;
+ break;
+
+ case CSS_UNIT_REM:
+ /* Root element relative units. */
+ ref_len = css_unit__get_font_size(root_style,
+ font_size_default);
+
+ size->data.length.unit = ref_len.unit;
+ size->data.length.value = FMUL(
+ size->data.length.value, ref_len.value);
+ break;
+
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+
+ return CSS_OK;
+}
diff --git a/src/select/unit.h b/src/select/unit.h
new file mode 100644
index 0000000..6a677b6
--- /dev/null
+++ b/src/select/unit.h
@@ -0,0 +1,42 @@
+/*
+ * This file is part of LibCSS
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Copyright 2021 Michael Drake <tlsa@netsurf-browser.org>
+ */
+
+#ifndef css_select_unit_h_
+#define css_select_unit_h_
+
+#include <libcss/unit.h>
+
+/**
+ * Convert a length to CSS pixels for a media query context.
+ *
+ * \param[in] ctx Document unit conversion context.
+ * \param[in] length Length to convert.
+ * \param[in] unit Current unit of length.
+ * \return A length in CSS pixels.
+ */
+css_fixed css_unit_len2px_mq(
+ const css_unit_ctx *ctx,
+ const css_fixed length,
+ const css_unit unit);
+
+/**
+ * Convert relative font size units to absolute units.
+ *
+ * \param[in] ref_length Reference font-size length or NULL.
+ * \param[in] root_style Root element style or NULL.
+ * \param[in] font_size_default Client default font size in CSS pixels.
+ * \param[in,out] size The length to convert.
+ * \return CSS_OK on success, or appropriate error otherwise.
+ */
+css_error css_unit_compute_absolute_font_size(
+ const css_hint_length *ref_length,
+ const css_computed_style *root_style,
+ css_fixed font_size_default,
+ css_hint *size);
+
+#endif
diff --git a/src/stylesheet.h b/src/stylesheet.h
index a71fca6..673bc95 100644
--- a/src/stylesheet.h
+++ b/src/stylesheet.h
@@ -188,6 +188,8 @@ struct css_stylesheet {
bool quirks_allowed; /**< Quirks permitted */
bool quirks_used; /**< Quirks actually used */
+ bool uses_revert; /**< Uses 'revert' property value */
+
bool inline_style; /**< Is an inline style */
size_t size; /**< Size, in bytes */
@@ -226,11 +228,14 @@ css_error css__stylesheet_merge_style(css_style *target, css_style *style);
static inline css_error css__stylesheet_style_appendOPV(css_style *style,
opcode_t opcode, uint8_t flags, uint16_t value)
{
+ if ((flags & (0x7 << 1)) == FLAG_REVERT) {
+ style->sheet->uses_revert = true;
+ }
return css__stylesheet_style_append(style,
buildOPV(opcode, flags, value));
}
-/** Helper function to set inherit flag */
+/** Helper function to set inherit generic value */
static inline css_error css_stylesheet_style_inherit(css_style *style,
opcode_t opcode)
{
@@ -238,6 +243,43 @@ static inline css_error css_stylesheet_style_inherit(css_style *style,
buildOPV(opcode, FLAG_INHERIT, 0));
}
+/** Helper function to set initial generic value */
+static inline css_error css_stylesheet_style_initial(css_style *style,
+ opcode_t opcode)
+{
+ return css__stylesheet_style_append(style,
+ buildOPV(opcode, FLAG_INITIAL, 0));
+}
+
+/** Helper function to set inherit generic value */
+static inline css_error css_stylesheet_style_revert(css_style *style,
+ opcode_t opcode)
+{
+ style->sheet->uses_revert = true;
+ return css__stylesheet_style_append(style,
+ buildOPV(opcode, FLAG_REVERT, 0));
+}
+
+/** Helper function to set initial generic value */
+static inline css_error css_stylesheet_style_unset(css_style *style,
+ opcode_t opcode)
+{
+ return css__stylesheet_style_append(style,
+ buildOPV(opcode, FLAG_UNSET, 0));
+}
+
+/** Helper function to set initial generic value */
+static inline css_error css_stylesheet_style_flag_value(css_style *style,
+ enum flag_value flag_value, opcode_t opcode)
+{
+ enum flag flag = flag_value << 1;
+ if (flag == FLAG_REVERT) {
+ style->sheet->uses_revert = true;
+ }
+ return css__stylesheet_style_append(style,
+ buildOPV(opcode, flag, 0));
+}
+
css_error css__stylesheet_selector_create(css_stylesheet *sheet,
css_qname *qname, css_selector **selector);
css_error css__stylesheet_selector_destroy(css_stylesheet *sheet,