diff options
Diffstat (limited to 'src/select')
148 files changed, 4912 insertions, 2303 deletions
diff --git a/src/select/Makefile b/src/select/Makefile index f5ddb18..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 format_list_style.c unit.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 7765f35..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 @@ -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) * * --- --- --- - * 462 bits 228 + 8sizeof(ptr) bytes + * 464 bits 236 + 8sizeof(ptr) bytes * =================== - * 286 + 8sizeof(ptr) bytes + * 294 + 8sizeof(ptr) bytes * * Bit allocations: * * 0 bbbbbbbboooooooorrrrrrrrdddddddd - * border_left_width; border_top_width; border_bottom_width; border_right_width + * border_top_width; border_right_width; border_left_width; border_bottom_width * - * 1 vvvvvvvvvooooooooccccccccmmmmmmm - * vertical_align; outline_width; column_rule_width; margin_top + * 1 fffffffffooooooooccccccccwwwwwww + * font_size; outline_width; column_rule_width; word_spacing * - * 2 ccccccccccccccccccccccccccpppppp - * clip; padding_left + * 2 cccccccccccccccccccccccccctttttt + * clip; text_indent * - * 3 mmmmmmmrrrrrrrwwwwwwwttttttddddd - * max_height; right; width; text_indent; display + * 3 cccccccooooooobbbbbbbppppppttttt + * column_width; column_gap; bottom; padding_top; text_decoration * - * 4 fffffffmmmmmmmcccccccllllllltttt - * flex_basis; min_height; column_gap; left; text_align + * 4 wwwwwwwtttttttrrrrrrrmmmmmmmeeee + * width; top; right; min_width; text_align * - * 5 cccccccmmmmmmmlllllllwwwwwwwbbbb - * column_width; margin_bottom; line_height; word_spacing; break_inside + * 5 mmmmmmmaaaaaaaxxxxxxxrrrrrrroooo + * min_height; max_width; max_height; margin_top; outline_style * - * 6 hhhhhhhlllllllmmmmmmmaaaaaaabbbb - * height; letter_spacing; min_width; margin_right; border_bottom_style + * 6 mmmmmmmaaaaaaarrrrrrrlllllllffff + * margin_right; margin_left; margin_bottom; line_height; font_weight * - * 7 tttttttmmmmmmmbbbbbbbaaaaaaaoooo - * top; margin_left; bottom; max_width; border_top_style + * 7 llllllleeeeeeehhhhhhhfffffffcccc + * letter_spacing; left; height; flex_basis; column_rule_style * - * 8 llllllppppppaaaaaaddddddtttttggg - * list_style_type; padding_top; padding_right; padding_bottom; - * text_decoration; page_break_after + * 8 ppppppaaaaaaddddddlllllliiiiiwww + * padding_right; padding_left; padding_bottom; list_style_type; display; + * white_space * - * 9 cccccbbbbooooffffrrrruuuullllnnn - * cursor; break_before; border_left_style; font_weight; break_after; - * outline_style; column_rule_style; font_family + * 9 cccccbbbbrrrreeeeooooddddllllttt + * cursor; break_inside; break_before; break_after; border_top_style; + * border_right_style; border_left_style; text_transform * - * 10 aaallliiipppbbccttoouuzzffeerrmm - * align_content; align_items; align_self; position; border_bottom_color; - * column_rule_color; table_layout; box_sizing; column_span; z_index; - * flex_wrap; empty_cells; border_left_color; column_count + * 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 ffoobbppaannccrrddeeuulliittUUvv - * float; font_variant; background_attachment; page_break_inside; - * background_color; font_style; content; border_top_color; border_collapse; - * border_right_color; outline_color; column_fill; list_style_position; - * caption_side; unicode_bidi; visibility + * 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 bbbbbbbbbbbaaaaaaaaaaafffffffffl - * border_spacing; background_position; font_size; flex_grow + * 12 bbbbbbbbbbbaaaaaaaaaaavvvvvvvvvw + * border_spacing; background_position; vertical_align; widows * - * 13 bbbboooaaawwwvvvtttcccpppjjjfffr - * border_right_style; overflow_y; background_repeat; white_space; overflow_x; - * text_transform; clear; page_break_before; justify_content; flex_direction; - * order + * 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 wwddlicobfqupr.................. - * writing_mode; direction; list_style_image; widows; counter_reset; orphans; - * background_image; flex_shrink; quotes; counter_increment; opacity; color + * 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 39ce62a..d1f7ffb 100644 --- a/src/select/autogenerated_propget.h +++ b/src/select/autogenerated_propget.h @@ -7,8 +7,17 @@ #define ALIGN_CONTENT_INDEX 10 -#define ALIGN_CONTENT_SHIFT 29 -#define ALIGN_CONTENT_MASK 0xe0000000 +#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]; @@ -24,8 +33,17 @@ static inline uint8_t get_align_content(const css_computed_style *style) #undef ALIGN_CONTENT_MASK #define ALIGN_ITEMS_INDEX 10 -#define ALIGN_ITEMS_SHIFT 26 -#define ALIGN_ITEMS_MASK 0x1c000000 +#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]; @@ -41,8 +59,17 @@ static inline uint8_t get_align_items(const css_computed_style *style) #undef ALIGN_ITEMS_MASK #define ALIGN_SELF_INDEX 10 -#define ALIGN_SELF_SHIFT 23 -#define ALIGN_SELF_MASK 0x3800000 +#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 11 -#define BACKGROUND_ATTACHMENT_SHIFT 26 -#define BACKGROUND_ATTACHMENT_MASK 0xc000000 +#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 11 -#define BACKGROUND_COLOR_SHIFT 22 -#define BACKGROUND_COLOR_MASK 0xc00000 +#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 23 -#define BACKGROUND_IMAGE_MASK 0x800000 +#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 22 -#define BACKGROUND_REPEAT_MASK 0x1c00000 +#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]; @@ -154,9 +229,19 @@ static inline uint8_t get_background_repeat(const css_computed_style *style) #undef BACKGROUND_REPEAT_SHIFT #undef BACKGROUND_REPEAT_MASK -#define BORDER_BOTTOM_COLOR_INDEX 10 -#define BORDER_BOTTOM_COLOR_SHIFT 18 -#define BORDER_BOTTOM_COLOR_MASK 0xc0000 +#define BORDER_BOTTOM_COLOR_INDEX 11 +#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) { @@ -173,9 +258,19 @@ static inline uint8_t get_border_bottom_color(const css_computed_style *style, #undef BORDER_BOTTOM_COLOR_SHIFT #undef BORDER_BOTTOM_COLOR_MASK -#define BORDER_BOTTOM_STYLE_INDEX 6 -#define BORDER_BOTTOM_STYLE_SHIFT 0 -#define BORDER_BOTTOM_STYLE_MASK 0xf +#define BORDER_BOTTOM_STYLE_INDEX 13 +#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]; @@ -191,8 +286,18 @@ static inline uint8_t get_border_bottom_style(const css_computed_style *style) #undef BORDER_BOTTOM_STYLE_MASK #define BORDER_BOTTOM_WIDTH_INDEX 0 -#define BORDER_BOTTOM_WIDTH_SHIFT 8 -#define BORDER_BOTTOM_WIDTH_MASK 0xff00 +#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 14 -#define BORDER_COLLAPSE_MASK 0xc000 +#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 2 -#define BORDER_LEFT_COLOR_MASK 0xc +#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) { @@ -249,8 +373,18 @@ static inline uint8_t get_border_left_color(const css_computed_style *style, #undef BORDER_LEFT_COLOR_MASK #define BORDER_LEFT_STYLE_INDEX 9 -#define BORDER_LEFT_STYLE_SHIFT 19 -#define BORDER_LEFT_STYLE_MASK 0x780000 +#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]; @@ -266,8 +400,18 @@ static inline uint8_t get_border_left_style(const css_computed_style *style) #undef BORDER_LEFT_STYLE_MASK #define BORDER_LEFT_WIDTH_INDEX 0 -#define BORDER_LEFT_WIDTH_SHIFT 24 -#define BORDER_LEFT_WIDTH_MASK 0xff000000 +#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 12 -#define BORDER_RIGHT_COLOR_MASK 0x3000 +#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 13 -#define BORDER_RIGHT_STYLE_SHIFT 28 -#define BORDER_RIGHT_STYLE_MASK 0xf0000000 +#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]; @@ -324,8 +488,18 @@ static inline uint8_t get_border_right_style(const css_computed_style *style) #undef BORDER_RIGHT_STYLE_MASK #define BORDER_RIGHT_WIDTH_INDEX 0 -#define BORDER_RIGHT_WIDTH_SHIFT 0 -#define BORDER_RIGHT_WIDTH_MASK 0xff +#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 16 -#define BORDER_TOP_COLOR_MASK 0x30000 +#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 7 -#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]; @@ -407,8 +608,17 @@ static inline uint8_t get_border_top_style(const css_computed_style *style) #undef BORDER_TOP_STYLE_MASK #define BORDER_TOP_WIDTH_INDEX 0 -#define BORDER_TOP_WIDTH_SHIFT 16 -#define BORDER_TOP_WIDTH_MASK 0xff0000 +#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_INDEX 3 #define BOTTOM_SHIFT 11 #define BOTTOM_MASK 0x3f800 -static inline uint8_t get_bottom( - const css_computed_style *style, - css_fixed *length, css_unit *unit) +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 12 -#define BOX_SIZING_MASK 0x3000 +#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]; @@ -479,8 +696,17 @@ static inline uint8_t get_box_sizing(const css_computed_style *style) #undef BOX_SIZING_MASK #define BREAK_AFTER_INDEX 9 -#define BREAK_AFTER_SHIFT 11 -#define BREAK_AFTER_MASK 0x7800 +#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]; @@ -496,8 +722,17 @@ static inline uint8_t get_break_after(const css_computed_style *style) #undef BREAK_AFTER_MASK #define BREAK_BEFORE_INDEX 9 -#define BREAK_BEFORE_SHIFT 23 -#define BREAK_BEFORE_MASK 0x7800000 +#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 5 -#define BREAK_INSIDE_SHIFT 0 -#define BREAK_INSIDE_MASK 0xf +#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 4 -#define CAPTION_SIDE_MASK 0x30 +#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]; @@ -547,8 +800,17 @@ static inline uint8_t get_caption_side(const css_computed_style *style) #undef CAPTION_SIDE_MASK #define CLEAR_INDEX 13 -#define CLEAR_SHIFT 10 -#define CLEAR_MASK 0x1c00 +#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) @@ -606,8 +878,17 @@ static inline uint8_t get_clip( #undef CLIP_MASK #define COLOR_INDEX 14 -#define COLOR_SHIFT 18 -#define COLOR_MASK 0x40000 +#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) { @@ -624,9 +905,18 @@ static inline uint8_t get_color(const css_computed_style *style, css_color #undef COLOR_SHIFT #undef COLOR_MASK -#define COLUMN_COUNT_INDEX 10 -#define COLUMN_COUNT_SHIFT 0 -#define COLUMN_COUNT_MASK 0x3 +#define COLUMN_COUNT_INDEX 11 +#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 8 -#define COLUMN_FILL_MASK 0x300 +#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 16 -#define COLUMN_RULE_COLOR_MASK 0x30000 +#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) { @@ -701,9 +1019,19 @@ static inline uint8_t get_column_rule_color(const css_computed_style *style, #undef COLUMN_RULE_COLOR_SHIFT #undef COLUMN_RULE_COLOR_MASK -#define COLUMN_RULE_STYLE_INDEX 9 -#define COLUMN_RULE_STYLE_SHIFT 3 -#define COLUMN_RULE_STYLE_MASK 0x78 +#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]; @@ -721,6 +1049,16 @@ static inline uint8_t get_column_rule_style(const css_computed_style *style) #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 10 -#define COLUMN_SPAN_MASK 0xc00 +#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_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 18 -#define CONTENT_MASK 0xc0000 +#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 20 -#define COUNTER_INCREMENT_MASK 0x100000 +#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 25 -#define COUNTER_RESET_MASK 0x2000000 +#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) { @@ -841,6 +1225,15 @@ static inline uint8_t get_counter_reset(const css_computed_style *style, const #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 14 -#define DIRECTION_SHIFT 28 -#define DIRECTION_MASK 0x30000000 +#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 4 -#define EMPTY_CELLS_MASK 0x30 +#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 25 -#define FLEX_BASIS_MASK 0xfe000000 +#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) { @@ -931,8 +1390,17 @@ static inline uint8_t get_flex_basis(const css_computed_style *style, css_fixed #undef FLEX_BASIS_MASK #define FLEX_DIRECTION_INDEX 13 -#define FLEX_DIRECTION_SHIFT 1 -#define FLEX_DIRECTION_MASK 0xe +#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]; @@ -947,9 +1415,18 @@ static inline uint8_t get_flex_direction(const css_computed_style *style) #undef FLEX_DIRECTION_SHIFT #undef FLEX_DIRECTION_MASK -#define FLEX_GROW_INDEX 12 -#define FLEX_GROW_SHIFT 0 -#define FLEX_GROW_MASK 0x1 +#define FLEX_GROW_INDEX 14 +#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) { @@ -971,6 +1448,15 @@ static inline uint8_t get_flex_grow(const css_computed_style *style, css_fixed #define FLEX_SHRINK_INDEX 14 #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 6 -#define FLEX_WRAP_MASK 0xc0 +#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]; @@ -1009,6 +1504,15 @@ static inline uint8_t get_flex_wrap(const css_computed_style *style) #define FLOAT_INDEX 11 #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 0 -#define FONT_FAMILY_MASK 0x7 +#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 20 -#define FONT_STYLE_MASK 0x300000 +#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 28 -#define FONT_VARIANT_MASK 0x30000000 +#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 9 -#define FONT_WEIGHT_SHIFT 15 -#define FONT_WEIGHT_MASK 0x78000 +#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 6 -#define HEIGHT_SHIFT 25 -#define HEIGHT_MASK 0xfe000000 +#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) { @@ -1138,8 +1696,17 @@ static inline uint8_t get_height(const css_computed_style *style, css_fixed #undef HEIGHT_MASK #define JUSTIFY_CONTENT_INDEX 13 -#define JUSTIFY_CONTENT_SHIFT 4 -#define JUSTIFY_CONTENT_MASK 0x70 +#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 6 -#define LETTER_SPACING_SHIFT 18 -#define LETTER_SPACING_MASK 0x1fc0000 +#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) @@ -1237,8 +1820,17 @@ static inline uint8_t get_line_height( #undef LINE_HEIGHT_MASK #define LIST_STYLE_IMAGE_INDEX 14 -#define LIST_STYLE_IMAGE_SHIFT 27 -#define LIST_STYLE_IMAGE_MASK 0x8000000 +#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 11 -#define LIST_STYLE_POSITION_SHIFT 6 -#define LIST_STYLE_POSITION_MASK 0xc0 +#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]; @@ -1273,8 +1875,17 @@ static inline uint8_t get_list_style_position(const css_computed_style *style) #undef LIST_STYLE_POSITION_MASK #define LIST_STYLE_TYPE_INDEX 8 -#define LIST_STYLE_TYPE_SHIFT 26 -#define LIST_STYLE_TYPE_MASK 0xfc000000 +#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]; @@ -1289,9 +1900,18 @@ static inline uint8_t get_list_style_type(const css_computed_style *style) #undef LIST_STYLE_TYPE_SHIFT #undef LIST_STYLE_TYPE_MASK -#define MARGIN_BOTTOM_INDEX 5 -#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 7 +#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 1 -#define MARGIN_TOP_SHIFT 0 -#define MARGIN_TOP_MASK 0x7f +#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 3 -#define MAX_HEIGHT_SHIFT 25 -#define MAX_HEIGHT_MASK 0xfe000000 +#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 7 -#define MAX_WIDTH_SHIFT 4 -#define MAX_WIDTH_MASK 0x7f0 +#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 4 -#define MIN_HEIGHT_SHIFT 18 -#define MIN_HEIGHT_MASK 0x1fc0000 +#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 19 -#define OPACITY_MASK 0x80000 +#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) { @@ -1486,9 +2178,18 @@ static inline uint8_t get_opacity(const css_computed_style *style, css_fixed #undef OPACITY_SHIFT #undef OPACITY_MASK -#define ORDER_INDEX 13 -#define ORDER_SHIFT 0 -#define ORDER_MASK 0x1 +#define ORDER_INDEX 14 +#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 24 -#define ORPHANS_MASK 0x1000000 +#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 10 -#define OUTLINE_COLOR_MASK 0xc00 +#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) { @@ -1547,9 +2266,18 @@ static inline uint8_t get_outline_color(const css_computed_style *style, #undef OUTLINE_COLOR_SHIFT #undef OUTLINE_COLOR_MASK -#define OUTLINE_STYLE_INDEX 9 -#define OUTLINE_STYLE_SHIFT 7 -#define OUTLINE_STYLE_MASK 0x780 +#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]; @@ -1567,6 +2295,15 @@ static inline uint8_t get_outline_style(const css_computed_style *style) #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) { @@ -1587,8 +2324,17 @@ static inline uint8_t get_outline_width(const css_computed_style *style, #undef OUTLINE_WIDTH_MASK #define OVERFLOW_X_INDEX 13 -#define OVERFLOW_X_SHIFT 16 -#define OVERFLOW_X_MASK 0x70000 +#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]; @@ -1604,8 +2350,17 @@ static inline uint8_t get_overflow_x(const css_computed_style *style) #undef OVERFLOW_X_MASK #define OVERFLOW_Y_INDEX 13 -#define OVERFLOW_Y_SHIFT 25 -#define OVERFLOW_Y_MASK 0xe000000 +#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]; @@ -1621,8 +2376,17 @@ static inline uint8_t get_overflow_y(const css_computed_style *style) #undef OVERFLOW_Y_MASK #define PADDING_BOTTOM_INDEX 8 -#define PADDING_BOTTOM_SHIFT 8 -#define PADDING_BOTTOM_MASK 0x3f00 +#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) { @@ -1642,9 +2406,18 @@ static inline uint8_t get_padding_bottom(const css_computed_style *style, #undef PADDING_BOTTOM_SHIFT #undef PADDING_BOTTOM_MASK -#define PADDING_LEFT_INDEX 2 -#define PADDING_LEFT_SHIFT 0 -#define PADDING_LEFT_MASK 0x3f +#define PADDING_LEFT_INDEX 8 +#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 14 -#define PADDING_RIGHT_MASK 0xfc000 +#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 8 -#define PADDING_TOP_SHIFT 20 -#define PADDING_TOP_MASK 0x3f00000 +#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 8 -#define PAGE_BREAK_AFTER_SHIFT 0 -#define PAGE_BREAK_AFTER_MASK 0x7 +#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]; @@ -1726,8 +2526,18 @@ static inline uint8_t get_page_break_after(const css_computed_style *style) #undef PAGE_BREAK_AFTER_MASK #define PAGE_BREAK_BEFORE_INDEX 13 -#define PAGE_BREAK_BEFORE_SHIFT 7 -#define PAGE_BREAK_BEFORE_MASK 0x380 +#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]; @@ -1742,9 +2552,19 @@ static inline uint8_t get_page_break_before(const css_computed_style *style) #undef PAGE_BREAK_BEFORE_SHIFT #undef PAGE_BREAK_BEFORE_MASK -#define PAGE_BREAK_INSIDE_INDEX 11 -#define PAGE_BREAK_INSIDE_SHIFT 24 -#define PAGE_BREAK_INSIDE_MASK 0x3000000 +#define PAGE_BREAK_INSIDE_INDEX 10 +#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 20 -#define POSITION_MASK 0x700000 +#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]; @@ -1777,8 +2606,17 @@ static inline uint8_t get_position(const css_computed_style *style) #undef POSITION_MASK #define QUOTES_INDEX 14 -#define QUOTES_SHIFT 21 -#define QUOTES_MASK 0x200000 +#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 3 -#define RIGHT_SHIFT 18 -#define RIGHT_MASK 0x1fc0000 -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 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 14 -#define TABLE_LAYOUT_MASK 0xc000 +#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]; @@ -1848,6 +2723,15 @@ static inline uint8_t get_table_layout(const css_computed_style *style) #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 3 -#define TEXT_DECORATION_MASK 0xf8 +#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) { @@ -1901,9 +2803,18 @@ static inline uint8_t get_text_indent(const css_computed_style *style, #undef TEXT_INDENT_SHIFT #undef TEXT_INDENT_MASK -#define TEXT_TRANSFORM_INDEX 13 -#define TEXT_TRANSFORM_SHIFT 13 -#define TEXT_TRANSFORM_MASK 0xe000 +#define TEXT_TRANSFORM_INDEX 9 +#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 7 -#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 11 -#define UNICODE_BIDI_SHIFT 2 -#define UNICODE_BIDI_MASK 0xc +#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_SHIFT 0 -#define VISIBILITY_MASK 0x3 +#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 13 -#define WHITE_SPACE_SHIFT 19 -#define WHITE_SPACE_MASK 0x380000 +#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 26 -#define WIDOWS_MASK 0x4000000 +#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 3 -#define WIDTH_SHIFT 11 -#define WIDTH_MASK 0x3f800 +#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 5 -#define WORD_SPACING_SHIFT 4 -#define WORD_SPACING_MASK 0x7f0 +#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 14 -#define WRITING_MODE_SHIFT 30 -#define WRITING_MODE_MASK 0xc0000000 +#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]; @@ -2105,8 +3086,17 @@ static inline uint8_t get_writing_mode(const css_computed_style *style) #undef WRITING_MODE_MASK #define Z_INDEX_INDEX 10 -#define Z_INDEX_SHIFT 8 -#define Z_INDEX_MASK 0x300 +#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 56ff7c6..198bc1e 100644 --- a/src/select/autogenerated_propset.h +++ b/src/select/autogenerated_propset.h @@ -9,15 +9,13 @@ * in which case it is 'inherit'. */ #define ALIGN_CONTENT_INDEX 10 -#define ALIGN_CONTENT_SHIFT 29 -#define ALIGN_CONTENT_MASK 0xe0000000 +#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) << @@ -30,14 +28,12 @@ static inline css_error set_align_content(css_computed_style *style, uint8_t #undef ALIGN_CONTENT_MASK #define ALIGN_ITEMS_INDEX 10 -#define ALIGN_ITEMS_SHIFT 26 -#define ALIGN_ITEMS_MASK 0x1c000000 +#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) << @@ -50,14 +46,12 @@ static inline css_error set_align_items(css_computed_style *style, uint8_t type) #undef ALIGN_ITEMS_MASK #define ALIGN_SELF_INDEX 10 -#define ALIGN_SELF_SHIFT 23 -#define ALIGN_SELF_MASK 0x3800000 +#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 11 -#define BACKGROUND_ATTACHMENT_SHIFT 26 -#define BACKGROUND_ATTACHMENT_MASK 0xc000000 +#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 11 -#define BACKGROUND_COLOR_SHIFT 22 -#define BACKGROUND_COLOR_MASK 0xc00000 +#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 23 -#define BACKGROUND_IMAGE_MASK 0x800000 +#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 22 -#define BACKGROUND_REPEAT_MASK 0x1c00000 +#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) << @@ -193,16 +177,14 @@ static inline css_error set_background_repeat(css_computed_style *style, #undef BACKGROUND_REPEAT_SHIFT #undef BACKGROUND_REPEAT_MASK -#define BORDER_BOTTOM_COLOR_INDEX 10 -#define BORDER_BOTTOM_COLOR_SHIFT 18 -#define BORDER_BOTTOM_COLOR_MASK 0xc0000 +#define BORDER_BOTTOM_COLOR_INDEX 11 +#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) @@ -216,16 +198,14 @@ static inline css_error set_border_bottom_color(css_computed_style *style, #undef BORDER_BOTTOM_COLOR_SHIFT #undef BORDER_BOTTOM_COLOR_MASK -#define BORDER_BOTTOM_STYLE_INDEX 6 -#define BORDER_BOTTOM_STYLE_SHIFT 0 -#define BORDER_BOTTOM_STYLE_MASK 0xf +#define BORDER_BOTTOM_STYLE_INDEX 13 +#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) @@ -238,15 +218,13 @@ static inline css_error set_border_bottom_style(css_computed_style *style, #undef BORDER_BOTTOM_STYLE_MASK #define BORDER_BOTTOM_WIDTH_INDEX 0 -#define BORDER_BOTTOM_WIDTH_SHIFT 8 -#define BORDER_BOTTOM_WIDTH_MASK 0xff00 +#define BORDER_BOTTOM_WIDTH_SHIFT 0 +#define BORDER_BOTTOM_WIDTH_MASK 0xff 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 14 -#define BORDER_COLLAPSE_MASK 0xc000 +#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 2 -#define BORDER_LEFT_COLOR_MASK 0xc +#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) << @@ -305,15 +279,13 @@ static inline css_error set_border_left_color(css_computed_style *style, #undef BORDER_LEFT_COLOR_MASK #define BORDER_LEFT_STYLE_INDEX 9 -#define BORDER_LEFT_STYLE_SHIFT 19 -#define BORDER_LEFT_STYLE_MASK 0x780000 +#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) << @@ -326,15 +298,13 @@ static inline css_error set_border_left_style(css_computed_style *style, #undef BORDER_LEFT_STYLE_MASK #define BORDER_LEFT_WIDTH_INDEX 0 -#define BORDER_LEFT_WIDTH_SHIFT 24 -#define BORDER_LEFT_WIDTH_MASK 0xff000000 +#define BORDER_LEFT_WIDTH_SHIFT 8 +#define BORDER_LEFT_WIDTH_MASK 0xff00 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 12 -#define BORDER_RIGHT_COLOR_MASK 0x3000 +#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 13 -#define BORDER_RIGHT_STYLE_SHIFT 28 -#define BORDER_RIGHT_STYLE_MASK 0xf0000000 +#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) << @@ -393,15 +359,13 @@ static inline css_error set_border_right_style(css_computed_style *style, #undef BORDER_RIGHT_STYLE_MASK #define BORDER_RIGHT_WIDTH_INDEX 0 -#define BORDER_RIGHT_WIDTH_SHIFT 0 -#define BORDER_RIGHT_WIDTH_MASK 0xff +#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 16 -#define BORDER_TOP_COLOR_MASK 0x30000 +#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 7 -#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) << @@ -486,15 +444,13 @@ static inline css_error set_border_top_style(css_computed_style *style, uint8_t #undef BORDER_TOP_STYLE_MASK #define BORDER_TOP_WIDTH_INDEX 0 -#define BORDER_TOP_WIDTH_SHIFT 16 -#define BORDER_TOP_WIDTH_MASK 0xff0000 +#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_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 12 -#define BOX_SIZING_MASK 0x3000 +#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) << @@ -552,14 +504,12 @@ static inline css_error set_box_sizing(css_computed_style *style, uint8_t type) #undef BOX_SIZING_MASK #define BREAK_AFTER_INDEX 9 -#define BREAK_AFTER_SHIFT 11 -#define BREAK_AFTER_MASK 0x7800 +#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) << @@ -572,15 +522,13 @@ static inline css_error set_break_after(css_computed_style *style, uint8_t type) #undef BREAK_AFTER_MASK #define BREAK_BEFORE_INDEX 9 -#define BREAK_BEFORE_SHIFT 23 -#define BREAK_BEFORE_MASK 0x7800000 +#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 5 -#define BREAK_INSIDE_SHIFT 0 -#define BREAK_INSIDE_MASK 0xf +#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 4 -#define CAPTION_SIDE_MASK 0x30 +#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) << @@ -635,14 +579,12 @@ static inline css_error set_caption_side(css_computed_style *style, uint8_t #undef CAPTION_SIDE_MASK #define CLEAR_INDEX 13 -#define CLEAR_SHIFT 10 -#define CLEAR_MASK 0x1c00 +#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); @@ -697,15 +639,13 @@ static inline css_error set_clip( #undef CLIP_MASK #define COLOR_INDEX 14 -#define COLOR_SHIFT 18 -#define COLOR_MASK 0x40000 +#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); @@ -718,16 +658,14 @@ static inline css_error set_color(css_computed_style *style, uint8_t type, #undef COLOR_SHIFT #undef COLOR_MASK -#define COLUMN_COUNT_INDEX 10 -#define COLUMN_COUNT_SHIFT 0 -#define COLUMN_COUNT_MASK 0x3 +#define COLUMN_COUNT_INDEX 11 +#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 8 -#define COLUMN_FILL_MASK 0x300 +#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 16 -#define COLUMN_RULE_COLOR_MASK 0x30000 +#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) << @@ -807,16 +739,14 @@ static inline css_error set_column_rule_color(css_computed_style *style, #undef COLUMN_RULE_COLOR_SHIFT #undef COLUMN_RULE_COLOR_MASK -#define COLUMN_RULE_STYLE_INDEX 9 -#define COLUMN_RULE_STYLE_SHIFT 3 -#define COLUMN_RULE_STYLE_MASK 0x78 +#define COLUMN_RULE_STYLE_INDEX 7 +#define COLUMN_RULE_STYLE_SHIFT 0 +#define COLUMN_RULE_STYLE_MASK 0xf 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) << @@ -835,9 +765,7 @@ static inline css_error set_column_rule_style(css_computed_style *style, 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 10 -#define COLUMN_SPAN_MASK 0xc00 +#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_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 18 -#define CONTENT_MASK 0xc0000 +#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 20 -#define COUNTER_INCREMENT_MASK 0x100000 +#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 25 -#define COUNTER_RESET_MASK 0x2000000 +#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) << @@ -1060,9 +980,7 @@ static inline css_error set_counter_reset(css_computed_style *style, uint8_t 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 14 -#define DIRECTION_SHIFT 28 -#define DIRECTION_MASK 0x30000000 +#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 4 -#define EMPTY_CELLS_MASK 0x30 +#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 25 -#define FLEX_BASIS_MASK 0xfe000000 +#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 @@ -1175,15 +1106,13 @@ static inline css_error set_flex_basis(css_computed_style *style, uint8_t type, #undef FLEX_BASIS_MASK #define FLEX_DIRECTION_INDEX 13 -#define FLEX_DIRECTION_SHIFT 1 -#define FLEX_DIRECTION_MASK 0xe +#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) << @@ -1195,16 +1124,14 @@ static inline css_error set_flex_direction(css_computed_style *style, uint8_t #undef FLEX_DIRECTION_SHIFT #undef FLEX_DIRECTION_MASK -#define FLEX_GROW_INDEX 12 -#define FLEX_GROW_SHIFT 0 -#define FLEX_GROW_MASK 0x1 +#define FLEX_GROW_INDEX 14 +#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) << @@ -1225,9 +1152,7 @@ static inline css_error set_flex_grow(css_computed_style *style, uint8_t type, 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 6 -#define FLEX_WRAP_MASK 0xc0 +#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) << @@ -1267,9 +1190,7 @@ static inline css_error set_flex_wrap(css_computed_style *style, uint8_t type) 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 0 -#define FONT_FAMILY_MASK 0x7 +#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 20 -#define FONT_STYLE_MASK 0x300000 +#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 28 -#define FONT_VARIANT_MASK 0x30000000 +#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 9 -#define FONT_WEIGHT_SHIFT 15 -#define FONT_WEIGHT_MASK 0x78000 +#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 6 -#define HEIGHT_SHIFT 25 -#define HEIGHT_MASK 0xfe000000 +#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 << @@ -1426,15 +1335,13 @@ static inline css_error set_height(css_computed_style *style, uint8_t type, #undef HEIGHT_MASK #define JUSTIFY_CONTENT_INDEX 13 -#define JUSTIFY_CONTENT_SHIFT 4 -#define JUSTIFY_CONTENT_MASK 0x70 +#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 6 -#define LETTER_SPACING_SHIFT 18 -#define LETTER_SPACING_MASK 0x1fc0000 +#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 @@ -1516,15 +1417,13 @@ static inline css_error set_line_height(css_computed_style *style, uint8_t #undef LINE_HEIGHT_MASK #define LIST_STYLE_IMAGE_INDEX 14 -#define LIST_STYLE_IMAGE_SHIFT 27 -#define LIST_STYLE_IMAGE_MASK 0x8000000 +#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 11 -#define LIST_STYLE_POSITION_SHIFT 6 -#define LIST_STYLE_POSITION_MASK 0xc0 +#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) @@ -1569,15 +1466,13 @@ static inline css_error set_list_style_position(css_computed_style *style, #undef LIST_STYLE_POSITION_MASK #define LIST_STYLE_TYPE_INDEX 8 -#define LIST_STYLE_TYPE_SHIFT 26 -#define LIST_STYLE_TYPE_MASK 0xfc000000 +#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]; /* 6bits: tttttt : type */ *bits = (*bits & ~LIST_STYLE_TYPE_MASK) | (((uint32_t)type & 0x3f) << @@ -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 5 -#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 7 +#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 1 -#define MARGIN_TOP_SHIFT 0 -#define MARGIN_TOP_MASK 0x7f +#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 3 -#define MAX_HEIGHT_SHIFT 25 -#define MAX_HEIGHT_MASK 0xfe000000 +#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 7 -#define MAX_WIDTH_SHIFT 4 -#define MAX_WIDTH_MASK 0x7f0 +#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 4 -#define MIN_HEIGHT_SHIFT 18 -#define MIN_HEIGHT_MASK 0x1fc0000 +#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 19 -#define OPACITY_MASK 0x80000 +#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) << @@ -1796,16 +1673,14 @@ static inline css_error set_opacity(css_computed_style *style, uint8_t type, #undef OPACITY_SHIFT #undef OPACITY_MASK -#define ORDER_INDEX 13 -#define ORDER_SHIFT 0 -#define ORDER_MASK 0x1 +#define ORDER_INDEX 14 +#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 24 -#define ORPHANS_MASK 0x1000000 +#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 10 -#define OUTLINE_COLOR_MASK 0xc00 +#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) << @@ -1864,16 +1735,14 @@ static inline css_error set_outline_color(css_computed_style *style, uint8_t #undef OUTLINE_COLOR_SHIFT #undef OUTLINE_COLOR_MASK -#define OUTLINE_STYLE_INDEX 9 -#define OUTLINE_STYLE_SHIFT 7 -#define OUTLINE_STYLE_MASK 0x780 +#define OUTLINE_STYLE_INDEX 5 +#define OUTLINE_STYLE_SHIFT 0 +#define OUTLINE_STYLE_MASK 0xf 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) << @@ -1892,9 +1761,7 @@ static inline css_error set_outline_style(css_computed_style *style, uint8_t 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) | ( @@ -1909,14 +1776,12 @@ static inline css_error set_outline_width(css_computed_style *style, uint8_t #undef OUTLINE_WIDTH_MASK #define OVERFLOW_X_INDEX 13 -#define OVERFLOW_X_SHIFT 16 -#define OVERFLOW_X_MASK 0x70000 +#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) << @@ -1929,14 +1794,12 @@ static inline css_error set_overflow_x(css_computed_style *style, uint8_t type) #undef OVERFLOW_X_MASK #define OVERFLOW_Y_INDEX 13 -#define OVERFLOW_Y_SHIFT 25 -#define OVERFLOW_Y_MASK 0xe000000 +#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) << @@ -1949,15 +1812,13 @@ static inline css_error set_overflow_y(css_computed_style *style, uint8_t type) #undef OVERFLOW_Y_MASK #define PADDING_BOTTOM_INDEX 8 -#define PADDING_BOTTOM_SHIFT 8 -#define PADDING_BOTTOM_MASK 0x3f00 +#define PADDING_BOTTOM_SHIFT 14 +#define PADDING_BOTTOM_MASK 0xfc000 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) | ( @@ -1971,16 +1832,14 @@ static inline css_error set_padding_bottom(css_computed_style *style, uint8_t #undef PADDING_BOTTOM_SHIFT #undef PADDING_BOTTOM_MASK -#define PADDING_LEFT_INDEX 2 -#define PADDING_LEFT_SHIFT 0 -#define PADDING_LEFT_MASK 0x3f +#define PADDING_LEFT_INDEX 8 +#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 14 -#define PADDING_RIGHT_MASK 0xfc000 +#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 8 -#define PADDING_TOP_SHIFT 20 -#define PADDING_TOP_MASK 0x3f00000 +#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 8 -#define PAGE_BREAK_AFTER_SHIFT 0 -#define PAGE_BREAK_AFTER_MASK 0x7 +#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) << @@ -2062,15 +1915,13 @@ static inline css_error set_page_break_after(css_computed_style *style, uint8_t #undef PAGE_BREAK_AFTER_MASK #define PAGE_BREAK_BEFORE_INDEX 13 -#define PAGE_BREAK_BEFORE_SHIFT 7 -#define PAGE_BREAK_BEFORE_MASK 0x380 +#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) << @@ -2082,16 +1933,14 @@ static inline css_error set_page_break_before(css_computed_style *style, #undef PAGE_BREAK_BEFORE_SHIFT #undef PAGE_BREAK_BEFORE_MASK -#define PAGE_BREAK_INSIDE_INDEX 11 -#define PAGE_BREAK_INSIDE_SHIFT 24 -#define PAGE_BREAK_INSIDE_MASK 0x3000000 +#define PAGE_BREAK_INSIDE_INDEX 10 +#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 20 -#define POSITION_MASK 0x700000 +#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) << @@ -2124,15 +1971,13 @@ static inline css_error set_position(css_computed_style *style, uint8_t type) #undef POSITION_MASK #define QUOTES_INDEX 14 -#define QUOTES_SHIFT 21 -#define QUOTES_MASK 0x200000 +#define QUOTES_SHIFT 27 +#define QUOTES_MASK 0x8000000 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 3 -#define RIGHT_SHIFT 18 -#define RIGHT_MASK 0x1fc0000 +#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 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 14 -#define TABLE_LAYOUT_MASK 0xc000 +#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) << @@ -2211,9 +2073,7 @@ static inline css_error set_table_layout(css_computed_style *style, uint8_t 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 3 -#define TEXT_DECORATION_MASK 0xf8 +#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 @@ -2269,16 +2125,14 @@ static inline css_error set_text_indent(css_computed_style *style, uint8_t #undef TEXT_INDENT_SHIFT #undef TEXT_INDENT_MASK -#define TEXT_TRANSFORM_INDEX 13 -#define TEXT_TRANSFORM_SHIFT 13 -#define TEXT_TRANSFORM_MASK 0xe000 +#define TEXT_TRANSFORM_INDEX 9 +#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 7 -#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 11 -#define UNICODE_BIDI_SHIFT 2 -#define UNICODE_BIDI_MASK 0xc +#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_SHIFT 0 -#define VISIBILITY_MASK 0x3 +#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 13 -#define WHITE_SPACE_SHIFT 19 -#define WHITE_SPACE_MASK 0x380000 +#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 26 -#define WIDOWS_MASK 0x4000000 +#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 3 -#define WIDTH_SHIFT 11 -#define WIDTH_MASK 0x3f800 +#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 5 -#define WORD_SPACING_SHIFT 4 -#define WORD_SPACING_MASK 0x7f0 +#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 14 -#define WRITING_MODE_SHIFT 30 -#define WRITING_MODE_MASK 0xc0000000 +#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) << @@ -2488,15 +2324,13 @@ static inline css_error set_writing_mode(css_computed_style *style, uint8_t #undef WRITING_MODE_MASK #define Z_INDEX_INDEX 10 -#define Z_INDEX_SHIFT 8 -#define Z_INDEX_MASK 0x300 +#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/computed.c b/src/select/computed.c index c019590..78f3b80 100644 --- a/src/select/computed.c +++ b/src/select/computed.c @@ -233,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 @@ -779,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); @@ -895,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 || diff --git a/src/select/computed.h b/src/select/computed.h index a4bd23d..a1e4eed 100644 --- a/src/select/computed.h +++ b/src/select/computed.h @@ -35,6 +35,10 @@ 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, const css_unit_ctx *unit_ctx); 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/hash.c b/src/select/hash.c index 16aebf7..12e82aa 100644 --- a/src/select/hash.c +++ b/src/select/hash.c @@ -370,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->unit_ctx, req->media)) { + req->unit_ctx, req->media, + req->str)) { /* Found a match */ break; } @@ -446,11 +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->unit_ctx, - req->media)) { + req->media, + req->str)) { /* Found a match */ break; } @@ -527,11 +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->unit_ctx, - req->media)) { + req->media, + req->str)) { /* Found a match */ break; } @@ -581,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->unit_ctx, req->media)) { + req->unit_ctx, req->media, + req->str)) { /* Found a match */ break; } @@ -761,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]; @@ -924,7 +928,8 @@ css_error _iterate_elements( head->sel_chain_bloom, req->node_bloom) && mq_rule_good_for_media(head->sel->rule, - req->unit_ctx, req->media)) { + req->unit_ctx, req->media, + req->str)) { /* Found a match */ break; } @@ -981,11 +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->unit_ctx, - req->media)) { + req->media, + req->str)) { /* Found a match */ break; } @@ -1043,11 +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->unit_ctx, - req->media)) { + req->media, + req->str)) { /* Found a match */ break; } @@ -1090,7 +1097,8 @@ css_error _iterate_universal( head->sel_chain_bloom, req->node_bloom) && mq_rule_good_for_media(head->sel->rule, - req->unit_ctx, 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 df4102f..5f48a38 100644 --- a/src/select/hash.h +++ b/src/select/hash.h @@ -15,6 +15,7 @@ #include <libcss/functypes.h> #include "select/bloom.h" +#include "select/strings.h" /* Ugh. We need this to avoid circular includes. Happy! */ struct css_selector; @@ -25,7 +26,7 @@ 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/mq.h b/src/select/mq.h index a012a7b..89da2c5 100644 --- a/src/select/mq.h +++ b/src/select/mq.h @@ -10,6 +10,7 @@ #define css_select_mq_h_ #include "select/helpers.h" +#include "select/strings.h" #include "select/unit.h" static inline bool mq_match_feature_range_length_op1( @@ -78,6 +79,31 @@ 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. * @@ -89,10 +115,15 @@ static inline bool mq_match_feature_range_length_op2( static inline bool mq_match_feature( const css_mq_feature *feat, const css_unit_ctx *unit_ctx, - const css_media *media) + 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, unit_ctx)) { return false; @@ -100,7 +131,9 @@ static inline bool mq_match_feature( return mq_match_feature_range_length_op2(feat->op2, &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, unit_ctx)) { return false; @@ -108,6 +141,17 @@ static inline bool mq_match_feature( return mq_match_feature_range_length_op2(feat->op2, &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. */ @@ -126,7 +170,8 @@ static inline bool mq_match_feature( static inline bool mq_match_condition( const css_mq_cond *cond, const css_unit_ctx *unit_ctx, - const css_media *media) + const css_media *media, + const css_select_strings *str) { bool matched = !cond->op; @@ -135,12 +180,12 @@ static inline bool mq_match_condition( if (cond->parts[i]->type == CSS_MQ_FEATURE) { part_matched = mq_match_feature( cond->parts[i]->data.feat, - unit_ctx, media); + unit_ctx, media, str); } else { assert(cond->parts[i]->type == CSS_MQ_COND); part_matched = mq_match_condition( cond->parts[i]->data.cond, - unit_ctx, media); + unit_ctx, media, str); } if (cond->op) { @@ -175,14 +220,15 @@ static inline bool mq_match_condition( static inline bool mq__list_match( const css_mq_query *m, const css_unit_ctx *unit_ctx, - const css_media *media) + 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, - unit_ctx, media)) { + unit_ctx, media, str)) { /* We have a match, no need to look further. */ return true; } @@ -203,7 +249,8 @@ static inline bool mq__list_match( static inline bool mq_rule_good_for_media( const css_rule *rule, const css_unit_ctx *unit_ctx, - const css_media *media) + const css_media *media, + const css_select_strings *str) { bool applies = true; const css_rule *ancestor = rule; @@ -212,7 +259,8 @@ static inline bool mq_rule_good_for_media( const css_rule_media *m = (const css_rule_media *) ancestor; if (ancestor->type == CSS_RULE_MEDIA) { - applies = mq__list_match(m->media, unit_ctx, 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, ©); + 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, ©); + 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, ©); + 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, ©); + 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, ©); + 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 40936dd..10ff228 100644 --- a/src/select/properties/helpers.c +++ b/src/select/properties/helpers.c @@ -33,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; @@ -50,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); } @@ -65,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; @@ -80,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); } @@ -95,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; @@ -131,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); } @@ -147,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; @@ -171,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); } @@ -187,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; @@ -205,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); } @@ -221,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; @@ -239,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); } @@ -255,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; @@ -273,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); } @@ -289,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)); @@ -301,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); } @@ -317,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)); @@ -325,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); } @@ -340,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; @@ -362,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); } @@ -377,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; @@ -411,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); } @@ -427,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: { @@ -490,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 60e5b4c..16c5d7a 100644 --- a/src/select/properties/helpers.h +++ b/src/select/properties/helpers.h @@ -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 e32d1b1..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; @@ -183,7 +183,7 @@ css_error css__cascade_list_style_type(uint32_t opv, css_style *style, } if (css__outranks_existing(getOpcode(opv), isImportant(opv), state, - isInherit(opv))) { + getFlagValue(opv))) { return set_list_style_type(state->computed, value); } @@ -201,15 +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, "es); - - 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, "es); - } - - if (quotes != NULL) { - lwc_string **i; + uint8_t type = get_quotes(from, "es); - 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, ©); + 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, "es); - 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 b050c0c..da0aa61 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -23,6 +23,7 @@ #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" @@ -52,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; @@ -125,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); @@ -153,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); @@ -264,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; @@ -286,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); @@ -383,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; @@ -1047,6 +1023,19 @@ 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); + } } @@ -1163,6 +1152,72 @@ 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 @@ -1192,6 +1247,7 @@ css_error css_select_style(css_select_ctx *ctx, void *node, 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; @@ -1244,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]); @@ -1270,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, unit_ctx, 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); @@ -1314,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) @@ -1340,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; @@ -1454,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, unit_ctx, 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; } @@ -1559,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) { @@ -1803,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; } @@ -1820,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) @@ -1855,7 +1749,8 @@ css_error select_from_sheet(css_select_ctx *ctx, const css_stylesheet *sheet, if (import->sheet != NULL && mq__list_match(import->media, state->unit_ctx, - state->media)) { + state->media, + &ctx->str)) { /* It's applicable, so process it */ if (sp >= IMPORT_STACK_SIZE) return CSS_NOMEM; @@ -1896,10 +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->unit_ctx, state->media)) { + state->unit_ctx, state->media, str)) { bool correct_family = false; if (lwc_string_isequal( @@ -1943,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; @@ -1965,7 +1862,8 @@ static css_error select_font_faces_from_sheet( if (import->sheet != NULL && mq__list_match(import->media, state->unit_ctx, - state->media)) { + state->media, + str)) { /* It's applicable, so process it */ if (sp >= IMPORT_STACK_SIZE) return CSS_NOMEM; @@ -1983,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; @@ -2114,7 +2011,7 @@ css_error match_selectors_in_sheet(css_select_ctx *ctx, 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; @@ -2279,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 || @@ -2614,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, @@ -2622,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, @@ -2634,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, @@ -2646,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, @@ -2658,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, @@ -2670,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, @@ -2678,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, @@ -2686,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, @@ -2694,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, @@ -2708,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, @@ -2721,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 { @@ -2769,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; @@ -2852,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; @@ -2947,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 0a16b12..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,6 +58,11 @@ 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 */ @@ -67,6 +72,9 @@ typedef struct css_select_state { 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 */ @@ -98,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 fd9e765..1cfe05c 100644 --- a/src/select/select_config.py +++ b/src/select/select_config.py @@ -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 + |