From 45fb75ae50ab66ba4098beec956ee0695916589c Mon Sep 17 00:00:00 2001 From: Lucas Neves Date: Mon, 13 Nov 2017 21:13:06 +0000 Subject: Select: autogenerator for computed.h, propset.h and propget.h. --- README | 1 + src/select/.gitignore | 5 + src/select/Makefile | 4 + src/select/assets.py | 30 ++ src/select/overrides.py | 226 +++++++++++ src/select/select_config.py | 176 +++++++++ src/select/select_generator.py | 832 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1274 insertions(+) create mode 100644 src/select/.gitignore create mode 100644 src/select/assets.py create mode 100644 src/select/overrides.py create mode 100644 src/select/select_config.py create mode 100644 src/select/select_generator.py diff --git a/README b/README index ea20b12..b70bc6a 100644 --- a/README +++ b/README @@ -16,6 +16,7 @@ Requirements + GNU make or compatible + Pkg-config + Perl (for the testcases) + + Python3 (minimum 3.6) LibCSS also requires the following libraries to be installed: diff --git a/src/select/.gitignore b/src/select/.gitignore new file mode 100644 index 0000000..a8bedc3 --- /dev/null +++ b/src/select/.gitignore @@ -0,0 +1,5 @@ +autogenerated_*.c +autogenerated_*.h +__pycache__ +*.pyc + diff --git a/src/select/Makefile b/src/select/Makefile index e937191..13c3eec 100644 --- a/src/select/Makefile +++ b/src/select/Makefile @@ -1,4 +1,8 @@ # Sources +select_generator: + python3 src/select/select_generator.py + DIR_SOURCES := arena.c computed.c dispatch.c hash.c select.c font_face.c +PRE_TARGETS := select_generator include $(NSBUILD)/Makefile.subdir diff --git a/src/select/assets.py b/src/select/assets.py new file mode 100644 index 0000000..67c6b6b --- /dev/null +++ b/src/select/assets.py @@ -0,0 +1,30 @@ +# This file is part of LibCSS. +# Licensed under the MIT License, +# http://www.opensource.org/licenses/mit-license.php +# Copyright 2017 Lucas Neves + +copyright = '''\ +/* + * This file is part of LibCSS + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2017 The NetSurf Project + */ +''' + +assets = {} + +assets['computed.h'] = {} +assets['computed.h']['header'] = copyright +assets['computed.h']['footer'] = '' + +assets['propset.h'] = {} +assets['propset.h']['header'] = copyright + ''' +/** Default values are 'initial value', unless the property is inherited, + * in which case it is 'inherit'. */''' +assets['propset.h']['footer'] = '' + +assets['propget.h'] = {} +assets['propget.h']['header'] = copyright +assets['propget.h']['footer'] = '' + diff --git a/src/select/overrides.py b/src/select/overrides.py new file mode 100644 index 0000000..fc2117b --- /dev/null +++ b/src/select/overrides.py @@ -0,0 +1,226 @@ +# This file is part of LibCSS. +# Licensed under the MIT License, +# http://www.opensource.org/licenses/mit-license.php +# Copyright 2017 Lucas Neves + +overrides = { + 'get': {}, + 'set': {}, + 'properties': {} +} + +overrides['get']['clip'] = '''\ +static inline uint8_t get_clip( + const css_computed_style *style, + css_computed_clip_rect *rect) +{ + if (style->i.uncommon != NULL) { + uint32_t bits = style->i.uncommon->i.bits[CLIP_INDEX]; + bits &= CLIP_MASK; + bits >>= CLIP_SHIFT; + + /* + 26bits: tt tttr rrrr bbbb blll llTR BLyy: + units: top | right | bottom | left + opcodes: top | right | bottom | left | type + */ + + if ((bits & 0x3) == CSS_CLIP_RECT) { + rect->left_auto = (bits & 0x4); + rect->bottom_auto = (bits & 0x8); + rect->right_auto = (bits & 0x10); + rect->top_auto = (bits & 0x20); + + rect->top = style->i.uncommon->i.clip_a; + rect->tunit = bits & 0x3e00000; + + rect->right = style->i.uncommon->i.clip_b; + rect->runit = bits & 0x1f0000; + + rect->bottom = style->i.uncommon->i.clip_c; + rect->bunit = bits & 0xf800; + + rect->left = style->i.uncommon->i.clip_d; + rect->lunit = bits & 0x7c0; + } + + return (bits & 0x3); + } + + /* Initial value */ + return CSS_CLIP_AUTO; +}''' + +overrides['set']['clip'] = '''\ +static inline css_error set_clip( + css_computed_style *style, uint8_t type, + css_computed_clip_rect *rect) +{ + uint32_t *bits; + + ENSURE_UNCOMMON; + + bits = &style->i.uncommon->i.bits[CLIP_INDEX]; + + /* + 26bits: tt tttr rrrr bbbb blll llTR BLyy: + units: top | right | bottom | left + opcodes: top | right | bottom | left | type + */ + *bits = (*bits & ~CLIP_MASK) | + ((type & 0x3) << CLIP_SHIFT); + + if (type == CSS_CLIP_RECT) { + *bits |= (((rect->top_auto ? 0x20 : 0) | + (rect->right_auto ? 0x10 : 0) | + (rect->bottom_auto ? 0x8 : 0) | + (rect->left_auto ? 0x4 : 0)) << CLIP_SHIFT); + + *bits |= (((rect->tunit << 5) | rect->runit) + << (CLIP_SHIFT + 16)); + + *bits |= (((rect->bunit << 5) | rect->lunit) + << (CLIP_SHIFT + 6)); + + style->i.uncommon->i.clip_a = rect->top; + style->i.uncommon->i.clip_b = rect->right; + style->i.uncommon->i.clip_c = rect->bottom; + style->i.uncommon->i.clip_d = rect->left; + } + + return CSS_OK; +}''' + +overrides['get']['line_height'] = '''\ +static inline uint8_t get_line_height( + const css_computed_style *style, + css_fixed *length, css_unit *unit) +{ + uint32_t bits = style->i.bits[LINE_HEIGHT_INDEX]; + bits &= LINE_HEIGHT_MASK; + bits >>= LINE_HEIGHT_SHIFT; + + /* 7bits: uuuuutt : units | type */ + if ((bits & 0x3) == CSS_LINE_HEIGHT_NUMBER || + (bits & 0x3) == CSS_LINE_HEIGHT_DIMENSION) { + *length = style->i.line_height; + } + + if ((bits & 0x3) == CSS_LINE_HEIGHT_DIMENSION) { + *unit = bits >> 2; + } + + return (bits & 0x3); +}''' + +overrides['set']['content'] = '''\ +static inline css_error set_content( + css_computed_style *style, uint8_t type, + css_computed_content_item *content) +{ + uint32_t *bits; + css_computed_content_item *oldcontent; + css_computed_content_item *c; + + ENSURE_UNCOMMON; + + /* 2bits: type */ + bits = &style->i.uncommon->i.bits[CONTENT_INDEX]; + oldcontent = style->i.uncommon->content; + + *bits = (*bits & ~CONTENT_MASK) | + ((type & 0x3) << CONTENT_SHIFT); + + for (c = content; c != NULL && + c->type != CSS_COMPUTED_CONTENT_NONE; c++) { + switch (c->type) { + case CSS_COMPUTED_CONTENT_STRING: + c->data.string = lwc_string_ref(c->data.string); + break; + case CSS_COMPUTED_CONTENT_URI: + c->data.uri = lwc_string_ref(c->data.uri); + break; + case CSS_COMPUTED_CONTENT_ATTR: + c->data.attr = lwc_string_ref(c->data.attr); + break; + case CSS_COMPUTED_CONTENT_COUNTER: + c->data.counter.name = + lwc_string_ref(c->data.counter.name); + break; + case CSS_COMPUTED_CONTENT_COUNTERS: + c->data.counters.name = + lwc_string_ref(c->data.counters.name); + c->data.counters.sep = + lwc_string_ref(c->data.counters.sep); + break; + default: + break; + } + } + + style->i.uncommon->content = content; + + /* Free existing array */ + if (oldcontent != NULL) { + for (c = oldcontent; + c->type != CSS_COMPUTED_CONTENT_NONE; c++) { + switch (c->type) { + case CSS_COMPUTED_CONTENT_STRING: + lwc_string_unref(c->data.string); + break; + case CSS_COMPUTED_CONTENT_URI: + lwc_string_unref(c->data.uri); + break; + case CSS_COMPUTED_CONTENT_ATTR: + lwc_string_unref(c->data.attr); + break; + case CSS_COMPUTED_CONTENT_COUNTER: + lwc_string_unref(c->data.counter.name); + break; + case CSS_COMPUTED_CONTENT_COUNTERS: + lwc_string_unref(c->data.counters.name); + lwc_string_unref(c->data.counters.sep); + break; + default: + break; + } + } + + if (oldcontent != content) + free(oldcontent); + } + + 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 & 0x7); +}} +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/select_config.py b/src/select/select_config.py new file mode 100644 index 0000000..468e8dc --- /dev/null +++ b/src/select/select_config.py @@ -0,0 +1,176 @@ +# This file is part of LibCSS. +# Licensed under the MIT License, +# http://www.opensource.org/licenses/mit-license.php +# Copyright 2017 Lucas Neves + +# Configuration of CSS values. +# The tuples in this set will be unpacked as arguments to the CSSValue +# class. +# Args: see docstring for class CSSValue in select_generator.py. +values = { + ('length', 'css_fixed', 4, '0', + 'unit', 'css_unit', 5, 'CSS_UNIT_PX'), + ('integer', 'int32_t', 4, '0'), + ('fixed', 'css_fixed', 4, '0'), + ('color', 'css_color', 4, '0'), + ('string', 'lwc_string*'), + ('string_arr', 'lwc_string**'), + ('counter_arr', 'css_computed_counter*'), + ('content_item', 'css_computed_content_item*') +} + +# Configuration of property groups. +# The tuples in these sets will be unpacked as arguments to the +# CSSproperty class. +# Args: see docstring for class CSSProperty in select_generator.py. +style = { + # Style group, only opcode + ('align_content', 3), + ('align_items', 3), + ('align_self', 3), + ('background_attachment', 2), + ('background_repeat', 3), + ('border_collapse', 2), + ('border_top_style', 4), + ('border_right_style', 4), + ('border_bottom_style', 4), + ('border_left_style', 4), + ('box_sizing', 2), + ('caption_side', 2), + ('clear', 3), + ('direction', 2), + ('display', 5), + ('empty_cells', 2), + ('flex_direction', 3), + ('flex_wrap', 2), + ('float', 2), + ('font_style', 2), + ('font_variant', 2), + ('font_weight', 4), + ('justify_content', 3), + ('list_style_position', 2), + ('list_style_type', 4), + ('overflow_x', 3), + ('overflow_y', 3), + ('outline_style', 4), + ('position', 3), + ('table_layout', 2), + ('text_align', 4), + ('text_decoration', 5), + ('text_transform', 3), + ('unicode_bidi', 2), + ('visibility', 2), + ('white_space', 3), + # Style group, with additional value + ('background_color', 2, 'color'), + ('background_image', 1, 'string'), + ('background_position', 1, (('length',), ('length',)), + 'CSS_BACKGROUND_POSITION_SET'), + ('border_top_color', 2, 'color'), + ('border_right_color', 2, 'color'), + ('border_bottom_color', 2, 'color'), + ('border_left_color', 2, 'color'), + ('border_top_width', 3, 'length', 'CSS_BORDER_WIDTH_WIDTH'), + ('border_right_width', 3, 'length', 'CSS_BORDER_WIDTH_WIDTH'), + ('border_bottom_width', 3, 'length', 'CSS_BORDER_WIDTH_WIDTH'), + ('border_left_width', 3, 'length', 'CSS_BORDER_WIDTH_WIDTH'), + ('top', 2, 'length', 'CSS_TOP_SET', None, None, 'get'), + ('right', 2, 'length', 'CSS_RIGHT_SET', None, None, 'get'), + ('bottom', 2, 'length', 'CSS_BOTTOM_SET', None, None, 'get'), + ('left', 2, 'length', 'CSS_LEFT_SET', None, None, 'get'), + ('color', 1, 'color'), + ('flex_basis', 2, 'length', 'CSS_FLEX_BASIS_SET'), + ('flex_grow', 1, 'fixed', 'CSS_FLEX_GROW_SET'), + ('flex_shrink', 1, 'fixed', 'CSS_FLEX_SHRINK_SET'), + ('font_size', 4, 'length', 'CSS_FONT_SIZE_DIMENSION'), + ('height', 2, 'length', 'CSS_HEIGHT_SET'), + ('line_height', 2, 'length', None, None, None, 'get'), + ('list_style_image', 1, 'string'), + ('margin_top', 2, 'length', 'CSS_MARGIN_SET'), + ('margin_right', 2, 'length', 'CSS_MARGIN_SET'), + ('margin_bottom', 2, 'length', 'CSS_MARGIN_SET'), + ('margin_left', 2, 'length', 'CSS_MARGIN_SET'), + ('max_height', 2, 'length', 'CSS_MAX_HEIGHT_SET'), + ('max_width', 2, 'length', 'CSS_MAX_WIDTH_SET'), + ('min_height', 2, 'length', 'CSS_MIN_HEIGHT_SET'), + ('min_width', 2, 'length', 'CSS_MIN_WIDTH_SET'), + ('opacity', 1, 'fixed', 'CSS_OPACITY_SET'), + ('order', 1, 'integer', 'CSS_ORDER_SET'), + ('padding_top', 1, 'length', 'CSS_PADDING_SET'), + ('padding_right', 1, 'length', 'CSS_PADDING_SET'), + ('padding_left', 1, 'length', 'CSS_PADDING_SET'), + ('padding_bottom', 1, 'length', 'CSS_PADDING_SET'), + ('text_indent', 1, 'length', 'CSS_TEXT_INDENT_SET'), + ('vertical_align', 4, 'length', 'CSS_VERTICAL_ALIGN_SET'), + ('width', 2, 'length', 'CSS_WIDTH_SET'), + ('z_index', 2, 'integer'), + # Style group, arrays + ('font_family', 3, 'string_arr', None, None, + 'Encode font family as an array of string objects, terminated with a ' + 'blank entry.'), + ('quotes', 1, 'string_arr', None, None, + 'Encode quotes as an array of string objects, terminated with a ' + 'blank entry.') +} + +page = { + # Page group + ('page_break_after', 3, None, None, 'CSS_PAGE_BREAK_AFTER_AUTO'), + ('page_break_before', 3, None, None, 'CSS_PAGE_BREAK_BEFORE_AUTO'), + ('page_break_inside', 2, None, None, 'CSS_PAGE_BREAK_INSIDE_AUTO'), + ('widows', 1, (('integer', '2'),), None, + 'CSS_WIDOWS_SET'), + ('orphans', 1, (('integer', '2'),), None, + 'CSS_ORPHANS_SET') +} + +uncommon = { + # Uncommon group + ('border_spacing', 1, (('length',), ('length',)), 'CSS_BORDER_SPACING_SET', + 'CSS_BORDER_SPACING_SET'), + ('break_after', 4, None, None, 'CSS_BREAK_AFTER_AUTO'), + ('break_before', 4, None, None, 'CSS_BREAK_BEFORE_AUTO'), + ('break_inside', 4, None, None, 'CSS_BREAK_INSIDE_AUTO'), + ('clip', 6, (('length',), ('length',), ('length',), ('length',)), + 'CSS_CLIP_RECT', 'CSS_CLIP_AUTO', None, ('get', 'set')), + ('column_count', 2, 'integer', None, 'CSS_COLUMN_COUNT_AUTO'), + ('column_fill', 2, None, None, 'CSS_COLUMN_FILL_BALANCE'), + ('column_gap', 2, 'length', + 'CSS_COLUMN_GAP_SET', 'CSS_COLUMN_GAP_NORMAL'), + ('column_rule_color', 2, 'color', None, + 'CSS_COLUMN_RULE_COLOR_CURRENT_COLOR'), + ('column_rule_style', 4, None, None, 'CSS_COLUMN_RULE_STYLE_NONE'), + ('column_rule_width', 3, 'length', + 'CSS_COLUMN_RULE_WIDTH_WIDTH', 'CSS_COLUMN_RULE_WIDTH_MEDIUM'), + ('column_span', 2, None, None, 'CSS_COLUMN_SPAN_NONE'), + ('column_width', 2, 'length', + 'CSS_COLUMN_WIDTH_SET', 'CSS_COLUMN_WIDTH_AUTO'), + ('letter_spacing', 2, 'length', + 'CSS_LETTER_SPACING_SET', 'CSS_LETTER_SPACING_NORMAL'), + ('outline_color', 2, 'color', + 'CSS_OUTLINE_COLOR_COLOR', 'CSS_OUTLINE_COLOR_INVERT'), + ('outline_width', 3, 'length', + 'CSS_OUTLINE_WIDTH_WIDTH', 'CSS_OUTLINE_WIDTH_MEDIUM'), + ('word_spacing', 2, 'length', + 'CSS_WORD_SPACING_SET', 'CSS_WORD_SPACING_NORMAL'), + ('writing_mode', 2, None, None, 'CSS_WRITING_MODE_HORIZONTAL_TB'), + # Uncommon group, arrays + ('counter_increment', 1, 'counter_arr', None, 'CSS_COUNTER_INCREMENT_NONE', + 'Encode counter_increment as an array of name, value pairs, ' + 'terminated with a blank entry.'), + ('counter_reset', 1, 'counter_arr', None, 'CSS_COUNTER_RESET_NONE', + 'Encode counter_reset as an array of name, value pairs, ' + 'terminated with a blank entry.'), + ('cursor', 5, 'string_arr', None, 'CSS_CURSOR_AUTO', + 'Encode cursor uri(s) as an array of string objects, terminated ' + 'with a blank entry'), + ('content', 2, 'content_item', 'CSS_CONTENT_NORMAL', 'CSS_CONTENT_NORMAL', + 'Encode content as an array of content items, terminated with ' + 'a blank entry.', 'set') +} + +groups = [ + { 'name': 'uncommon', 'props': uncommon }, + { 'name': 'page', 'props': page }, + { 'name': 'style', 'props': style } +] diff --git a/src/select/select_generator.py b/src/select/select_generator.py new file mode 100644 index 0000000..d215f2b --- /dev/null +++ b/src/select/select_generator.py @@ -0,0 +1,832 @@ +# This file is part of LibCSS. +# Licensed under the MIT License, +# http://www.opensource.org/licenses/mit-license.php +# Copyright 2017 Lucas Neves + +import math +import string +import os +from select_config import values, groups +from assets import assets +from overrides import overrides + +def get_tuple(from_var): + """Convert tuples, strings and None into tuple.""" + if type(from_var) is tuple: + return from_var + elif type(from_var) is str: + return (from_var,) + elif from_var is None: + return () + else: + raise TypeError('Value should be either tuple, string or None, ' + + 'received: ' + type(from_var).__name__) + +def shift_star(value_type, prop_name): + """Shift the asterisks from a pointer type to its name. + + Example: `lwc_string** str_array` would become + `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 + return (v_type, v_name) + +class Text: + """Class for building strings for output files.""" + def __init__(self): + self._lines = [] + self._comment = False + self._esc_nl = False + self._indent = 0 + + name_width = 31 + bits_width = 16 + + def indent(self, value): + """Increase or decrease indent by . + + Args: + value : positive or negative value to be added to + indentation. + """ + self._indent += value + + def comment(self): + """Toggle C-style comment in the output text.""" + comm = self._comment + self._comment = False + self.append(' */' if comm else '/*') + self._comment = not comm + + def escape_newline(self): + """Toggle escape of newline character.""" + self._esc_nl = not self._esc_nl + + def append(self, text=None, pre_formatted=False): + """Append text to file builder. + + Args: + text: + add contents, breaking lines and adding comment + markers or newline escapes as needed. + recursively call this method for list items. + add a new line. + pre_formatted: just add text without preprocessing. + """ + if not text: + self._lines.append('{}{}{}'.format( + '\t' * self._indent, + ' * ' if self._comment else '', + '\t' * (9 - self._indent) + '\\' if self._esc_nl else '')) + return + + if isinstance(text, list): + for t in text: + self.append(t, pre_formatted) + return + + if pre_formatted: + self._lines.append(text) + return + + line_break_before = [ c for c in ' +/' ] + line_break_after = [ c for c in '({[' ] + column_max = 72 if self._esc_nl else 80 + multiline = False + + while text: + line = '\t' * self._indent + if self._comment: + line += ' * ' + prefix_size = (3 if self._comment else 0) + 8 * self._indent + if prefix_size + len(text) <= column_max: + line += text + text = '' + else: + break_index = 0 + for c in (line_break_before + line_break_after): + after = 1 if c in line_break_after else 0 + break_index = max(break_index, + text[:column_max - prefix_size].rfind(c) + after) + break_index = break_index or len(text) + line += text[:break_index].rstrip() + text = text[break_index:].lstrip() + if self._esc_nl: + n_tabs = 9 - self._indent - math.floor(len(line.lstrip()) / 8) + line += '\t' * n_tabs + '\\' + self._lines.append(line) + if text and not self._comment and not multiline: + self.indent(2) + multiline = True + + if multiline: + self.indent(-2) + + def table_line(self): + """Add a sum line for the tables in computed.h""" + self.append('{0:{n}}{0:{b}}{0}'.format( + '---', n=self.name_width, b=self.bits_width)) + + def table_header(self): + """Add a header line for the tables in computed.h""" + self.append('{:{n}}{:{b}}{}'.format( + 'Property', 'Size (bits)', 'Size (bytes)', + n=self.name_width, b=self.bits_width)) + self.table_line() + + def result_line(self): + """Add a result line for the tables in computed.h""" + self.append(' ' * self.name_width + '=' * (self.bits_width + 3)) + + def to_string(self): + """Output contents of file builder as a string.""" + return '\n'.join(self._lines) + +class CSSValue: + """Values to be associated with properties. + + Args: + name : value name (required). + css_type : C type of value (required). + size : value size, in bytes (default: None, for pointers). + defaults : default value (default: 'NULL', for pointers). + The fields below are only needed if the value stores data in the + array of bits (currently only css_unit uses it). + bits_name : name of bits value (default: None). + bits_type : C type of bits value (default: None). + bits_size : value size, in bits (default: None). + bits_defaults : default value (default: '0'). + """ + def __init__(self, name, css_type, size=None, defaults='NULL', + bits_name=None, bits_type=None, + bits_size=None, bits_defaults='0'): + self.name = name + self.type = css_type + self.size = size # `None` means sizeof(ptr) + self.defaults = defaults + self.suffix = '' + self.bits = None if bits_size is None else { + 'name': bits_name, + 'type': bits_type, + 'size': bits_size, + 'defaults': bits_defaults + } + + @property + def is_ptr(self): + """Return True if value is a pointer; False otherwise.""" + return ((self.type, self.name) != shift_star(self.type, self.name)) + +class CSSProperty: + """Class for CSS properties. + + Args: + name : property name (required). + type_size : opcode size, in bits (required). + values : property values (default: None). + To set one value, using the value's defaults: + 'value_name' + To set multiple values, using the values' defaults: + (('value_name',), ('value_name',)) + To override the default of one or multiple values: + (('value_name', 'default'),) + (('value_name', 'default'), ('value_name', 'default')) + condition : condition (opcode value) to get property + values in propget.h (default: None). + defaults : default opcode (default: None) + comments : comments for properties that are stored in + "struct css_computed_{group}", instead of + "struct css_computed_{group}_i (default: None) + NOTE: passing this argument will result in the property being + stored in "struct css_computed_{group}"! + overrides : files for which this property shouldn't + autogenerate content; instead, read entry from from overrides.py + Possible values: + 'get': overrides output to autogenerated_propget.h + 'set': overrides output to autogenerated_propset.h + ('get', 'set'): overrides output to both files. + """ + def __init__(self, name, type_size, values=None, condition=None, + defaults=None, comments=None, override=None): + self.name = name + self.type_size = type_size + self.values = self.make_values(values) + self.defaults = defaults + self.condition = condition + self.override = get_tuple(override) + self.comments = comments + self.__mask = None + + def make_values(self, vals): + """Make list of values for this property.""" + if vals is None: + return [] + elif type(vals) is str: + return self.make_values(((vals,),)) + elif type(vals) is tuple: + val_list = [] + for i, v in enumerate(vals): + for x in values: + if x[0] == v[0]: + value = CSSValue(*x) + if len(v) is 2: + value.defaults = v[1] + if len(vals) > 1: + value.suffix = '_' + string.ascii_lowercase[i] + val_list.append(value) + break + else: + raise ValueError('Value ' + v[0] + ' not found!') + return val_list + else: + raise TypeError('Expected None, str or tuple, got ' + + type(vals).__name__) + + @property + def bits_size(self): + """Size of this property in the bits array.""" + return self.type_size + sum([ v.bits['size'] for v in self.values + if v.bits is not None ]) + + @property + def bytes_size(self): + """Size of this property's values, in bytes (excluding pointers).""" + return sum([ v.size for v in self.values if v.size is not None ]) + + @property + def ptr_size(self): + """Number of values of this property that are pointers.""" + return sum([ 1 for v in self.values if v.size is None ]) + + @property + def size_line(self): + """String for computed.h with the sizes of this property.""" + name = '{:{width}}'.format(self.name, width=Text.name_width) + type_size = '{:>3}'.format(str(self.type_size)) + extra_size = sum([ v.bits['size'] for v in self.values + if v.bits is not None ]) + bits_size = '{:{width}}'.format(type_size + + (' + ' + str(extra_size) if extra_size else ''), + width=Text.bits_width) + vars_size = '{:>3}'.format( + str(self.bytes_size)) if self.bytes_size else '' + ptr = '' + for v in self.values: + if v.size is None: + ptr = 'sizeof(ptr)' + break + + return (name + bits_size + vars_size + + (' + ' if vars_size and ptr else '') + ptr) + + @property + def mask(self): + """Getter for the bitwise mask of this property in the bits array.""" + if self.__mask is None: + raise NameError('Attribute `mask` not set yet!') + return '0x{:x}'.format(self.__mask).lower() + + @mask.setter + def mask(self, val): + """Setter for the bitwise mask of this property in the bits array.""" + if type(val) is not int: + raise TypeError('Value of `mask` must be an integer!') + if val < 0: + raise ValueError('Value of `mask` must be zero or positive!') + self.__mask = val + + @property + def def_undefs(self): + """Return defines and undefs for propget.h and propset.h.""" + defines = [ + '#define {}_INDEX {}'.format(self.name.upper(), self.index), + '#define {}_SHIFT {}'.format(self.name.upper(), self.shift), + '#define {}_MASK {}'.format(self.name.upper(), self.mask) + ] + undefs = [ + '#undef {}_INDEX'.format(self.name.upper()), + '#undef {}_SHIFT'.format(self.name.upper()), + '#undef {}_MASK'.format(self.name.upper()) + ] + return (defines, undefs) + + def get_param_values(self, pointer=False): + """Make parameters for functions in propget.h and propset.h. + + Args: + pointer : add a star before value name. + """ + vals = [] + for v in self.values: + vt, vn = shift_star(v.type, v.name) + 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 + vals.append((bt, bn)) + return vals + + def get_bits(self): + """Make vars for the bitwise operations in propget.h and propset.h.""" + bits = [ + { 'letter': v.suffix[1] if v.suffix else v.bits['name'][0], + 'name': v.bits['name'] + v.suffix, + 'size': v.bits['size'] } + for v in self.values if v.bits is not None ] + bits.append({ 'letter': 't', 'size': self.type_size, 'name': 'type' }) + bits_len = sum([ x['size'] for x in bits ]) + comment = '/* {}bit{}: {} : {} */'.format( + bits_len, + ('' if bits_len is 1 else 's'), + ''.join([ b['letter'] * b['size'] for b in bits ]), + ' | '.join([ b['name'] for b in bits ])) + rev_bits = list(reversed(bits)) + type_mask = '0x{:x}'.format( + sum([ 2 ** x for x in range(rev_bits[0]['size']) ])).lower() + shift_list = [ (x['name'], + sum([ b['size'] for b in rev_bits[:(i + 1)] ]), + sum([ 2 ** x for x in range(x['size']) ]) * 2 ** + sum([ b['size'] for b in rev_bits[:(i + 1)] ])) + for i, x in enumerate(rev_bits[1:]) ] + return (type_mask, shift_list, comment) + +class Bin: + """The storage unit for the bits array of properties.""" + def __init__(self, first_object): + self.contents = [ first_object ] + + @property + def size(self): + return sum([ x.bits_size for x in self.contents ]) + + def push(self, obj): + self.contents.append(obj) + +class CSSGroup: + """Group of CSS properties (i.e. style, page, uncommon). + + Args: + config : imported from select_config.py. + """ + def __init__(self, config): + self.name = config['name'] + self.props = [ CSSProperty(*x) for x in config['props'] ] + self.__bits_array = None + + @property + def bits_size(self): + """Sum of all property bits in the bits array.""" + return sum([ p.bits_size for p in self.props ]) + + @property + def bytes_size(self): + """Sum of all property value bytes (excluded pointers).""" + return sum([ p.bytes_size for p in self.props ]) + + @property + def ptr_size(self): + """Sum of all property pointers.""" + return sum([ p.ptr_size for p in self.props ]) + + @property + def bits_array(self): + """Implement a `best fit first` heuristics for the bin packing + of property bits in the bits array.""" + + if self.__bits_array is not None: + return self.__bits_array + + bin_size = 32 # We're using uint32_t as concrete bins. + self.__bits_array = [] + props = sorted(self.props, key=(lambda x: x.bits_size), reverse=True) + + for p in props: + for b in self.__bits_array: + if b.size + p.bits_size <= bin_size: + b.push(p) + p.shift = (bin_size - + sum([ x.bits_size for x in b.contents ])) + break + else: + p.shift = bin_size - p.bits_size + self.__bits_array.append(Bin(p)) + + p.mask = (sum([ 2 ** x for x in range(p.bits_size) ]) * + 2 ** p.shift) + self.__bits_array.sort(key=(lambda x: x.size), reverse=True) + + for i, b in enumerate(self.__bits_array): + for p in b.contents: + p.index = i + + return self.__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.comment() + commented = [] + t.table_header() + + for prop in sorted(self.props, key=(lambda x: x.name)): + if prop.comments is None: + t.append(prop.size_line) + else: + commented.extend(( '', prop.comments, '', prop.size_line )) + + t.append(commented) + t.append() + t.table_line() + t.append('{:{len_1}}{:>3}{:{len_2}}{:>3}{}{}'.format('', + str(self.bits_size), ' bits', str(self.bytes_size), + ' + ' + str(self.ptr_size) + 'sizeof(ptr)' + if self.ptr_size else '', + ' bytes', + len_1=Text.name_width, len_2=(Text.bits_width - 3))) + t.result_line() + t.append('{:{len_1}}{:>3}{}{}'.format('', + math.ceil(self.bits_size / 8) + self.bytes_size, + ' + ' + str(self.ptr_size) + 'sizeof(ptr)' + if self.ptr_size else '', + ' bytes', len_1=Text.name_width)) + t.append() + + t.append('Bit allocations:') + for i, b in enumerate(self.bits_array): + bits = [] + for prop in b.contents: + for char in prop.name + prop.name.upper(): + if char not in bits and char in string.ascii_letters: + bits.extend(char * prop.bits_size) + break + t.append() + t.append('{:<2} {:.<32}'.format(str(i), ''.join(bits))) + t.append('; '.join([ p.name for p in b.contents ])) + t.comment() + + t.indent(1) + t.append('uint32_t bits[' + str(len(self.bits_array)) + '];') + 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.append('void *aural;') + + t.indent(-1) + t.append('}}{};'.format( + ' css_computed_' + self.name if typedef else '')) + + 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() + + if self.name is 'style': + t.append('css_computed_page *page;') + + 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 '')) + + 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. + """ + 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 + + t.append() + t.append(defines) + + if p.name in overrides['set']: + t.append(overrides['set'][p.name], pre_formatted=True) + t.append(undefs) + continue + + vals = p.get_param_values() + params = ', '.join([ 'css_computed_style *style', 'uint8_t type' ] + + [ ' '.join(x) for x in vals ]) + t.append() + t.append('static inline css_error set_{}({})'.format( + p.name, params)) + 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() + + type_mask, shift_list, bits_comment = p.get_bits() + t.append(bits_comment) + type_mask = '(type & {})'.format(type_mask) + val_list = [ '({} << {})'.format(x[0], x[1]) for x in shift_list ] + ops_str = ' | '.join([ type_mask ] + val_list) + t.append('*bits = (*bits & ~{0}_MASK) | ' + '({1}{2}{3} << {0}_SHIFT);'.format( + p.name.upper(), + '(' if val_list else '', + ops_str, + ')' if val_list else '')) + + t.append() + for v in p.values: + 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, v.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.indent(-1) + t.append('} else {') + t.indent(1) + t.append('style{}->{}{} = NULL;'.format( + grp, i_dot, p.name + v.suffix)) + t.indent(-1) + t.append('}') + t.append() + t.append('if ({} != NULL)'.format(old_n)) + t.indent(1) + 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( + old_t, old_n_shift, + grp, p.name + v.suffix)) + t.append('{} {};'.format(old_t, + shift_star(v.type, iter_var)[1])) + t.append() + t.append('for ({0} = {2}; {0} != NULL && ' + '{1} != NULL; {0}++)'.format(iter_var, iter_deref, + v.name + v.suffix)) + t.indent(1) + 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() + t.append('/* Free existing array */') + t.append('if ({} != NULL) {{'.format(old_n)) + t.indent(1) + t.append('for ({0} = {2}; {1} != NULL; {0}++)'.format( + iter_var, iter_deref, old_n)) + t.indent(1) + t.append('lwc_string_unref({});'.format(iter_deref)) + t.indent(-1) + t.append() + t.append('if ({} != {})'.format(old_n, v.name + v.suffix)) + t.indent(1) + t.append('free({});'.format(old_n)) + t.indent(-2) + t.append('}') + + elif not v.is_ptr: + t.append('style{}->{}{} = {};'.format( + grp, i_dot, p.name + v.suffix, v.name + v.suffix)) + + else: + raise ValueError('Cannot handle value ' + v.name +'!') + + t.append() + t.append('return CSS_OK;') + t.indent(-1) + t.append('}') + t.append(undefs) + + 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 + + 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) + + 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() + + type_mask, shift_list, bits_comment = p.get_bits() + t.append(bits_comment) + + 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)) + for i, v in enumerate(list(reversed(shift_list))): + if i is 0: + t.append('*{} = bits >> {};'.format(v[0], v[1])) + else: + t.append('*{} = (bits & 0x{:x}) >> {};'.format( + v[0], v[2], v[1]).lower()) + + if p.condition: + t.indent(-1) + t.append('}') + + t.append() + t.append('return (bits & {});'.format(type_mask)) + + 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)) + + t.indent(-1) + t.append('}') + t.append(undefs) + + return t.to_string() + + def make_value_declaration(self, for_commented, defaults=False): + """Output declarations of values for this group's properties. + + Args: + for_commented: only parse values that have a `comment` field + defaults: outputs default value assignments. + """ + + r = [] + 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)) + return r + + def make_text(self, filename): + """Return this group's text for the given file.""" + if filename == 'computed.h': + return self.make_computed_h() + elif filename == 'propset.h': + return self.make_propset_h() + elif filename == 'propget.h': + return self.make_propget_h() + else: + raise ValueError() + +css_groups = [ CSSGroup(g) for g in groups ] +dir_path = os.path.dirname(os.path.realpath(__file__)) + +for k, v in assets.items(): + # Key is filename string (e.g. "computed.h") without autogenerated_ prefix + body = '\n'.join([ g.make_text(k) for g in css_groups ]) + text = '\n'.join([ v['header'], body, v['footer'] ]) + with open(os.path.join(dir_path, 'autogenerated_') + k, 'w') as file_k: + file_k.write(text) -- cgit v1.2.3 From 3f00f3b7c6f2492600feb7bce70e1ae6ca8f4475 Mon Sep 17 00:00:00 2001 From: Lucas Neves Date: Mon, 13 Nov 2017 21:15:18 +0000 Subject: Select: include autogenerated content in header files. --- src/select/computed.h | 338 +------ src/select/propget.h | 2395 +--------------------------------------------- src/select/propset.h | 2531 +------------------------------------------------ 3 files changed, 3 insertions(+), 5261 deletions(-) diff --git a/src/select/computed.h b/src/select/computed.h index a8934b1..d59fbe3 100644 --- a/src/select/computed.h +++ b/src/select/computed.h @@ -10,343 +10,7 @@ #include #include - - - -struct css_computed_uncommon_i { -/* - * border_spacing 1 + 2(4) 2(4) - * break_before 4 0 - * break_after 4 0 - * break_inside 4 0 - * clip 2 + 4(4) + 4 4(4) - * column_count 2 4 - * column_fill 2 0 - * column_gap 2 + 4 4 - * column_rule_color 2 4 - * column_rule_style 4 0 - * column_rule_width 3 + 4 4 - * column_span 2 0 - * column_width 2 + 4 4 - * letter_spacing 2 + 4 4 - * outline_color 2 4 - * outline_width 3 + 4 4 - * word_spacing 2 + 4 4 - * --- --- - * 95 bits 60 bytes - * - * Encode counter_increment and _reset as an array of name, value pairs, - * terminated with a blank entry. - * - * counter_increment 1 sizeof(ptr) - * counter_reset 1 sizeof(ptr) - * --- --- - * 2 bits 2sizeof(ptr) bytes - * - * Encode cursor uri(s) as an array of string objects, terminated with a - * blank entry. - * - * cursor 5 sizeof(ptr) - * --- --- - * 5 bits sizeof(ptr) bytes - * - * Encode content as an array of content items, terminated with a blank entry. - * - * content 2 sizeof(ptr) - * --- --- - * 2 bits sizeof(ptr) - * - * ___ ___ - * 108 bits 62 + 4sizeof(ptr) bytes - * - * 14 bytes 62 + 4sizeof(ptr) bytes - * =================== - * 74 + 4sizeof(ptr) bytes - * - * Bit allocations: - * - * 76543210 - * 1 llllllcc letter-spacing | outline-color - * 2 ooooooob outline-width | border-spacing - * 3 bbbbbbbb border-spacing - * 4 wwwwwwir word-spacing | counter-increment | counter-reset - * 5 uuuuumm. cursor | writing-mode | - * 6 cccccccc clip - * 7 cccccccc clip - * 8 ccccccoo clip | content - * 9 ccffssss column_count | column-fill | column-rule-style - * 10 ggggggcc column-gap | column-rule-color - * 11 wwwwwww. column-rule-width | - * 12 sswwwwww column-span | column_width - * 13 bbbbaaaa break-before | break-after - * 14 iiii.... break-inside | - */ - uint8_t bits[14]; - - css_fixed border_spacing[2]; - - css_fixed clip[4]; - - css_fixed letter_spacing; - - css_color outline_color; - css_fixed outline_width; - - css_fixed word_spacing; - - int32_t column_count; - css_fixed column_gap; - css_color column_rule_color; - css_fixed column_rule_width; - css_fixed column_width; -}; - -typedef struct css_computed_uncommon { - struct css_computed_uncommon_i i; - - css_computed_counter *counter_increment; - css_computed_counter *counter_reset; - - css_computed_content_item *content; - - lwc_string **cursor; - struct css_computed_uncommon *next; - uint32_t count; - uint32_t bin; -} css_computed_uncommon; - -typedef struct css_computed_page { -/* - * Bit allocations: - * - * 76543210 - * 1 aaabbbii page_break_after | page_break_before | page_break_inside - * 2 ......wo widows | orphans - */ - uint8_t bits[2]; - - int32_t widows; - int32_t orphans; -} css_computed_page; - -struct css_computed_style_i { -/* - * background_attachment 2 - * background_repeat 3 - * border_collapse 2 - * border_top_style 4 - * border_right_style 4 - * border_bottom_style 4 - * border_left_style 4 - * caption_side 2 - * clear 3 - * direction 2 - * display 5 - * empty_cells 2 - * float 2 - * font_style 2 - * font_variant 2 - * font_weight 4 - * list_style_position 2 - * list_style_type 4 - * overflow 3 - * outline_style 4 - * position 3 - * table_layout 2 - * text_align 4 - * text_decoration 5 - * text_transform 3 - * unicode_bidi 2 - * visibility 2 - * white_space 3 - * box_sizing 2 - * align_content 3 - * align_items 3 - * align_self 3 - * flex_direction 3 - * flex_wrap 2 - * justify_content 3 - * --- - * 103 bits - * - * Colours are 32bits of AARRGGBB - * Dimensions are encoded as a fixed point value + 4 bits of unit data - * - * background_color 2 4 - * background_image 1 sizeof(ptr) - * background_position 1 + 2(4) 2(4) - * border_top_color 2 4 - * border_right_color 2 4 - * border_bottom_color 2 4 - * border_left_color 2 4 - * border_top_width 3 + 4 4 - * border_right_width 3 + 4 4 - * border_bottom_width 3 + 4 4 - * border_left_width 3 + 4 4 - * top 2 + 4 4 - * right 2 + 4 4 - * bottom 2 + 4 4 - * left 2 + 4 4 - * color 1 4 - * font_size 4 + 4 4 - * height 2 + 4 4 - * line_height 2 + 4 4 - * list_style_image 1 sizeof(ptr) - * margin_top 2 + 4 4 - * margin_right 2 + 4 4 - * margin_bottom 2 + 4 4 - * margin_left 2 + 4 4 - * max_height 2 + 4 4 - * max_width 2 + 4 4 - * min_height 2 + 4 4 - * min_width 2 + 4 4 - * padding_top 1 + 4 4 - * padding_right 1 + 4 4 - * padding_bottom 1 + 4 4 - * padding_left 1 + 4 4 - * text_indent 1 + 4 4 - * vertical_align 4 + 4 4 - * width 2 + 4 4 - * z_index 2 4 - * flex_basis 2 + 4 4 - * flex_grow 1 4 - * flex_shrink 1 4 - * order 1 4 - * --- --- - * 196 bits 156 + 2sizeof(ptr) bytes - * - * Encode font family as an array of string objects, terminated with a - * blank entry. - * - * font_family 3 sizeof(ptr) - * --- --- - * 3 bits sizeof(ptr) - * - * Encode quotes as an array of string objects, terminated with a blank entry. - * - * quotes 1 sizeof(ptr) - * --- --- - * 1 bit sizeof(ptr) bytes - * - * ___ ___ - * 303 bits 156 + 4sizeof(ptr) bytes - * - * 38 bytes 156 + 4sizeof(ptr) bytes - * =================== - * 194 + 4sizeof(ptr) bytes - * - * Bit allocations: - * - * 76543210 - * 1 vvvvvvvv vertical-align - * 2 ffffffff font-size - * 3 ttttttti border-top-width | background-image - * 4 rrrrrrrc border-right-width | color - * 5 bbbbbbbl border-bottom-width | list-style-image - * 6 lllllllq border-left-width | quotes - * 7 ttttttcc top | border-top-color - * 8 rrrrrrcc right | border-right-color - * 9 bbbbbbcc bottom | border-bottom-color - * 10 llllllcc left | border-left-color - * 11 hhhhhhbb height | background-color - * 12 llllllzz line-height | z-index - * 13 ttttttbb margin-top | background-attachment - * 14 rrrrrrbb margin-right | border-collapse - * 15 bbbbbbcc margin-bottom | caption-side - * 16 lllllldd margin-left | direction - * 17 mmmmmmee max-height | empty-cells - * 18 mmmmmmff max-width | float - * 19 wwwwwwff width | font-style - * 20 mmmmmmff min-height | flex-wrap - * 21 mmmmmmsg min-width | flex-shrink | flex_grow - * 22 tttttxxx padding-top | overflow-x - * 23 rrrrrppp padding-right | position - * 24 bbbbboss padding-bottom | opacity | box-sizing - * 25 lllllttt padding-left | text-transform - * 26 tttttwww text-indent | white-space - * 27 bbbbbbbb background-position - * 28 bdddddff background-position | display | font-variant - * 29 tttttfff text-decoration | font-family - * 30 ttttrrrr border-top-style | border-right-style - * 31 bbbbllll border-bottom-style | border-left-style - * 32 ffffllll font-weight | list-style-type - * 33 oooottuu outline-style | table-layout | unicode-bidi - * 34 vvlltttt visibility | list-style-position | text-align - * 35 yyybbbaa overflow-y | background-repeat | align-content1 - * 36 bbbbbbaj flex-basis | align-content2 | justify_content1 - * 37 fffcccjj flex-direction | clear | justify_content2 - * 38 iiissso. align-items | align-self | order - */ - uint8_t bits[38]; - - uint8_t unused[1]; - - css_color background_color; - lwc_string *background_image; - css_fixed background_position[2]; - - css_color border_color[4]; - css_fixed border_width[4]; - - css_fixed top; - css_fixed right; - css_fixed bottom; - css_fixed left; - - css_color color; - - css_fixed font_size; - - css_fixed height; - - css_fixed line_height; - - lwc_string *list_style_image; - - css_fixed margin[4]; - - css_fixed max_height; - css_fixed max_width; - - css_fixed min_height; - css_fixed min_width; - - css_fixed opacity; - - css_fixed padding[4]; - - css_fixed text_indent; - - css_fixed vertical_align; - - css_fixed width; - - int32_t z_index; - - css_fixed flex_basis; - - css_fixed flex_grow; - - css_fixed flex_shrink; - - int32_t order; - - css_computed_uncommon *uncommon;/**< Uncommon properties */ - void *aural; /**< Aural properties */ -}; - -struct css_computed_style { - struct css_computed_style_i i; - - lwc_string **font_family; - - lwc_string **quotes; - css_computed_page *page; /**< Page properties */ - struct css_computed_style *next; - uint32_t count; - uint32_t bin; -}; - +#include "autogenerated_computed.h" /** * Take a new reference to a computed style diff --git a/src/select/propget.h b/src/select/propget.h index 737dcd4..41298f1 100644 --- a/src/select/propget.h +++ b/src/select/propget.h @@ -10,2399 +10,6 @@ #include #include "computed.h" - -/* Important: keep this file in sync with computed.h */ -/** \todo Is there a better way to ensure this happens? */ - -#define LETTER_SPACING_INDEX 0 -#define LETTER_SPACING_SHIFT 2 -#define LETTER_SPACING_MASK 0xfc -static inline uint8_t get_letter_spacing( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[LETTER_SPACING_INDEX]; - bits &= LETTER_SPACING_MASK; - bits >>= LETTER_SPACING_SHIFT; - - /* 6bits: uuuutt : unit | type */ - - if ((bits & 3) == CSS_LETTER_SPACING_SET) { - *length = style->i.uncommon->i.letter_spacing; - *unit = bits >> 2; - } - - return (bits & 3); - } - - /* Initial value */ - return CSS_LETTER_SPACING_NORMAL; -} -#undef LETTER_SPACING_MASK -#undef LETTER_SPACING_SHIFT -#undef LETTER_SPACING_INDEX - -#define OUTLINE_COLOR_INDEX 0 -#define OUTLINE_COLOR_SHIFT 0 -#define OUTLINE_COLOR_MASK 0x3 -static inline uint8_t get_outline_color( - const css_computed_style *style, css_color *color) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[OUTLINE_COLOR_INDEX]; - bits &= OUTLINE_COLOR_MASK; - bits >>= OUTLINE_COLOR_SHIFT; - - /* 2bits: tt : type */ - - if ((bits & 3) == CSS_OUTLINE_COLOR_COLOR) { - *color = style->i.uncommon->i.outline_color; - } - - return (bits & 3); - } - - /* Initial value */ - return CSS_OUTLINE_COLOR_INVERT; -} -#undef OUTLINE_COLOR_MASK -#undef OUTLINE_COLOR_SHIFT -#undef OUTLINE_COLOR_INDEX - -#define OUTLINE_WIDTH_INDEX 1 -#define OUTLINE_WIDTH_SHIFT 1 -#define OUTLINE_WIDTH_MASK 0xfe -static inline uint8_t get_outline_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[OUTLINE_WIDTH_INDEX]; - bits &= OUTLINE_WIDTH_MASK; - bits >>= OUTLINE_WIDTH_SHIFT; - - /* 7bits: uuuuttt : unit | type */ - - if ((bits & 7) == CSS_OUTLINE_WIDTH_WIDTH) { - *length = style->i.uncommon->i.outline_width; - *unit = bits >> 3; - } - - return (bits & 7); - } - - /* Initial value */ - return CSS_OUTLINE_WIDTH_MEDIUM; -} -#undef OUTLINE_WIDTH_MASK -#undef OUTLINE_WIDTH_SHIFT -#undef OUTLINE_WIDTH_INDEX - -#define BORDER_SPACING_INDEX 1 -#define BORDER_SPACING_SHIFT 0 -#define BORDER_SPACING_MASK 0x1 -#define BORDER_SPACING_INDEX1 2 -#define BORDER_SPACING_SHIFT1 0 -#define BORDER_SPACING_MASK1 0xff -static inline uint8_t get_border_spacing( - const css_computed_style *style, - css_fixed *hlength, css_unit *hunit, - css_fixed *vlength, css_unit *vunit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[BORDER_SPACING_INDEX]; - bits &= BORDER_SPACING_MASK; - bits >>= BORDER_SPACING_SHIFT; - - /* 1 bit: type */ - if (bits == CSS_BORDER_SPACING_SET) { - uint8_t bits1 = - style->i.uncommon->i.bits[BORDER_SPACING_INDEX1]; - bits1 &= BORDER_SPACING_MASK1; - bits1 >>= BORDER_SPACING_SHIFT1; - - /* 8bits: hhhhvvvv : hunit | vunit */ - - *hlength = style->i.uncommon->i.border_spacing[0]; - *hunit = bits1 >> 4; - - *vlength = style->i.uncommon->i.border_spacing[1]; - *vunit = bits1 & 0xf; - } - - return bits; - } - - /* Initial value */ - *hlength = *vlength = 0; - *hunit = *vunit = CSS_UNIT_PX; - return CSS_BORDER_SPACING_SET; -} -#undef BORDER_SPACING_MASK1 -#undef BORDER_SPACING_SHIFT1 -#undef BORDER_SPACING_INDEX1 -#undef BORDER_SPACING_MASK -#undef BORDER_SPACING_SHIFT -#undef BORDER_SPACING_INDEX - -#define BREAK_AFTER_INDEX 12 -#define BREAK_AFTER_SHIFT 0 -#define BREAK_AFTER_MASK 0xf -static inline uint8_t get_break_after( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[BREAK_AFTER_INDEX]; - bits &= BREAK_AFTER_MASK; - bits >>= BREAK_AFTER_SHIFT; - - /* 4bits: type */ - return bits; - } - - /* Initial value */ - return CSS_BREAK_AFTER_AUTO; -} -#undef BREAK_AFTER_MASK -#undef BREAK_AFTER_SHIFT -#undef BREAK_AFTER_INDEX - -#define BREAK_BEFORE_INDEX 12 -#define BREAK_BEFORE_SHIFT 4 -#define BREAK_BEFORE_MASK (0xf << 4) -static inline uint8_t get_break_before( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[BREAK_BEFORE_INDEX]; - bits &= BREAK_BEFORE_MASK; - bits >>= BREAK_BEFORE_SHIFT; - - /* 4bits: type */ - return bits; - } - - /* Initial value */ - return CSS_BREAK_BEFORE_AUTO; -} -#undef BREAK_BEFORE_MASK -#undef BREAK_BEFORE_SHIFT -#undef BREAK_BEFORE_INDEX - -#define BREAK_INSIDE_INDEX 13 -#define BREAK_INSIDE_SHIFT 4 -#define BREAK_INSIDE_MASK (0xf << 4) -static inline uint8_t get_break_inside( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[BREAK_INSIDE_INDEX]; - bits &= BREAK_INSIDE_MASK; - bits >>= BREAK_INSIDE_SHIFT; - - /* 4bits: type */ - return bits; - } - - /* Initial value */ - return CSS_BREAK_INSIDE_AUTO; -} -#undef BREAK_INSIDE_MASK -#undef BREAK_INSIDE_SHIFT -#undef BREAK_INSIDE_INDEX - -#define WORD_SPACING_INDEX 3 -#define WORD_SPACING_SHIFT 2 -#define WORD_SPACING_MASK 0xfc -static inline uint8_t get_word_spacing( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[WORD_SPACING_INDEX]; - bits &= WORD_SPACING_MASK; - bits >>= WORD_SPACING_SHIFT; - - /* 6bits: uuuutt : unit | type */ - - if ((bits & 3) == CSS_WORD_SPACING_SET) { - *length = style->i.uncommon->i.word_spacing; - *unit = bits >> 2; - } - - return (bits & 3); - } - - /* Initial value */ - return CSS_WORD_SPACING_NORMAL; -} -#undef WORD_SPACING_MASK -#undef WORD_SPACING_SHIFT -#undef WORD_SPACING_INDEX - -#define WRITING_MODE_INDEX 4 -#define WRITING_MODE_MASK 0x6 -#define WRITING_MODE_SHIFT 1 -static inline uint8_t get_writing_mode( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[WRITING_MODE_INDEX]; - bits &= WRITING_MODE_MASK; - bits >>= WRITING_MODE_SHIFT; - - /* 2bits: type */ - return bits; - } - - /* Initial value */ - return CSS_WRITING_MODE_HORIZONTAL_TB; -} -#undef WRITING_MODE_INDEX -#undef WRITING_MODE_MASK -#undef WRITING_MODE_SHIFT - -#define COUNTER_INCREMENT_INDEX 3 -#define COUNTER_INCREMENT_SHIFT 1 -#define COUNTER_INCREMENT_MASK 0x2 -static inline uint8_t get_counter_increment( - const css_computed_style *style, - const css_computed_counter **counters) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COUNTER_INCREMENT_INDEX]; - bits &= COUNTER_INCREMENT_MASK; - bits >>= COUNTER_INCREMENT_SHIFT; - - /* 1bit: type */ - *counters = style->i.uncommon->counter_increment; - - return bits; - } - - /* Initial value */ - return CSS_COUNTER_INCREMENT_NONE; -} -#undef COUNTER_INCREMENT_MASK -#undef COUNTER_INCREMENT_SHIFT -#undef COUNTER_INCREMENT_INDEX - -#define COUNTER_RESET_INDEX 3 -#define COUNTER_RESET_SHIFT 0 -#define COUNTER_RESET_MASK 0x1 -static inline uint8_t get_counter_reset( - const css_computed_style *style, - const css_computed_counter **counters) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COUNTER_RESET_INDEX]; - bits &= COUNTER_RESET_MASK; - bits >>= COUNTER_RESET_SHIFT; - - /* 1bit: type */ - *counters = style->i.uncommon->counter_reset; - - return bits; - } - - /* Initial value */ - return CSS_COUNTER_RESET_NONE; -} -#undef COUNTER_RESET_MASK -#undef COUNTER_RESET_SHIFT -#undef COUNTER_RESET_INDEX - -#define CURSOR_INDEX 4 -#define CURSOR_SHIFT 3 -#define CURSOR_MASK 0xf8 -static inline uint8_t get_cursor( - const css_computed_style *style, - lwc_string ***urls) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[CURSOR_INDEX]; - bits &= CURSOR_MASK; - bits >>= CURSOR_SHIFT; - - /* 5bits: type */ - *urls = style->i.uncommon->cursor; - - return bits; - } - - /* Initial value */ - return CSS_CURSOR_AUTO; -} -#undef CURSOR_MASK -#undef CURSOR_SHIFT -#undef CURSOR_INDEX - -#define CLIP_INDEX 7 -#define CLIP_SHIFT 2 -#define CLIP_MASK 0xfc -#define CLIP_INDEX1 5 -#define CLIP_SHIFT1 0 -#define CLIP_MASK1 0xff -#define CLIP_INDEX2 6 -#define CLIP_SHIFT2 0 -#define CLIP_MASK2 0xff -static inline uint8_t get_clip( - const css_computed_style *style, - css_computed_clip_rect *rect) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[CLIP_INDEX]; - bits &= CLIP_MASK; - bits >>= CLIP_SHIFT; - - /* 6bits: trblyy : top | right | bottom | left | type */ - if ((bits & 0x3) == CSS_CLIP_RECT) { - uint8_t bits1; - - rect->left_auto = (bits & 0x4); - rect->bottom_auto = (bits & 0x8); - rect->right_auto = (bits & 0x10); - rect->top_auto = (bits & 0x20); - - if (rect->top_auto == false || - rect->right_auto == false) { - /* 8bits: ttttrrrr : top | right */ - bits1 = style->i.uncommon->i.bits[CLIP_INDEX1]; - bits1 &= CLIP_MASK1; - bits1 >>= CLIP_SHIFT1; - } else { - bits1 = 0; - } - - rect->top = style->i.uncommon->i.clip[0]; - rect->tunit = bits1 >> 4; - - rect->right = style->i.uncommon->i.clip[1]; - rect->runit = bits1 & 0xf; - - if (rect->bottom_auto == false || - rect->left_auto == false) { - /* 8bits: bbbbllll : bottom | left */ - bits1 = style->i.uncommon->i.bits[CLIP_INDEX2]; - bits1 &= CLIP_MASK2; - bits1 >>= CLIP_SHIFT2; - } else { - bits1 = 0; - } - - rect->bottom = style->i.uncommon->i.clip[2]; - rect->bunit = bits1 >> 4; - - rect->left = style->i.uncommon->i.clip[3]; - rect->lunit = bits1 & 0xf; - } - - return (bits & 0x3); - } - - /* Initial value */ - return CSS_CLIP_AUTO; -} -#undef CLIP_MASK2 -#undef CLIP_SHIFT2 -#undef CLIP_INDEX2 -#undef CLIP_MASK1 -#undef CLIP_SHIFT1 -#undef CLIP_INDEX1 -#undef CLIP_MASK -#undef CLIP_SHIFT -#undef CLIP_INDEX - -#define COLUMN_COUNT_INDEX 8 -#define COLUMN_COUNT_SHIFT 6 -#define COLUMN_COUNT_MASK 0xc0 -static inline uint8_t get_column_count( - const css_computed_style *style, int32_t *count) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_COUNT_INDEX]; - bits &= COLUMN_COUNT_MASK; - bits >>= COLUMN_COUNT_SHIFT; - - /* 2bits: tt : type */ - *count = style->i.uncommon->i.column_count; - - return bits; - } - - /* Initial value */ - return CSS_COLUMN_COUNT_AUTO; -} -#undef COLUMN_COUNT_MASK -#undef COLUMN_COUNT_SHIFT -#undef COLUMN_COUNT_INDEX - -#define COLUMN_FILL_INDEX 8 -#define COLUMN_FILL_SHIFT 4 -#define COLUMN_FILL_MASK 0x30 -static inline uint8_t get_column_fill( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_FILL_INDEX]; - bits &= COLUMN_FILL_MASK; - bits >>= COLUMN_FILL_SHIFT; - - /* 2bits: type */ - return bits; - } - - /* Initial value */ - return CSS_COLUMN_FILL_BALANCE; -} -#undef COLUMN_FILL_MASK -#undef COLUMN_FILL_SHIFT -#undef COLUMN_FILL_INDEX - -#define COLUMN_GAP_INDEX 9 -#define COLUMN_GAP_SHIFT 2 -#define COLUMN_GAP_MASK 0xfc -static inline uint8_t get_column_gap( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_GAP_INDEX]; - bits &= COLUMN_GAP_MASK; - bits >>= COLUMN_GAP_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_COLUMN_GAP_SET) { - *length = style->i.uncommon->i.column_gap; - *unit = bits >> 2; - } - - return (bits & 0x3); - } - - /* Initial value */ - return CSS_COLUMN_GAP_NORMAL; -} -#undef COLUMN_GAP_MASK -#undef COLUMN_GAP_SHIFT -#undef COLUMN_GAP_INDEX - -#define COLUMN_RULE_COLOR_INDEX 9 -#define COLUMN_RULE_COLOR_SHIFT 0 -#define COLUMN_RULE_COLOR_MASK 0x3 -static inline uint8_t get_column_rule_color( - const css_computed_style *style, - css_color *color) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_RULE_COLOR_INDEX]; - bits &= COLUMN_RULE_COLOR_MASK; - bits >>= COLUMN_RULE_COLOR_SHIFT; - - /* 2bits: type */ - *color = style->i.uncommon->i.column_rule_color; - - return bits; - } - - /* Initial value */ - *color = 0; - return CSS_COLUMN_RULE_COLOR_CURRENT_COLOR; -} -#undef COLUMN_RULE_COLOR_MASK -#undef COLUMN_RULE_COLOR_SHIFT -#undef COLUMN_RULE_COLOR_INDEX - -#define COLUMN_RULE_STYLE_INDEX 8 -#define COLUMN_RULE_STYLE_SHIFT 0 -#define COLUMN_RULE_STYLE_MASK 0xf -static inline uint8_t get_column_rule_style( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_RULE_STYLE_INDEX]; - bits &= COLUMN_RULE_STYLE_MASK; - bits >>= COLUMN_RULE_STYLE_SHIFT; - - /* 4bits: type */ - return bits; - } - - /* Initial value */ - return CSS_COLUMN_RULE_STYLE_NONE; -} -#undef COLUMN_RULE_STYLE_MASK -#undef COLUMN_RULE_STYLE_SHIFT -#undef COLUMN_RULE_STYLE_INDEX - -#define COLUMN_RULE_WIDTH_INDEX 10 -#define COLUMN_RULE_WIDTH_SHIFT 1 -#define COLUMN_RULE_WIDTH_MASK 0xfe -static inline uint8_t get_column_rule_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_RULE_WIDTH_INDEX]; - bits &= COLUMN_RULE_WIDTH_MASK; - bits >>= COLUMN_RULE_WIDTH_SHIFT; - - /* 7bits: uuuuttt : units | type */ - if ((bits & 0x7) == CSS_COLUMN_RULE_WIDTH_WIDTH) { - *length = style->i.uncommon->i.column_rule_width; - *unit = bits >> 3; - } - - return (bits & 0x7); - } - - /* Initial value */ - return CSS_COLUMN_RULE_WIDTH_MEDIUM; -} -#undef COLUMN_RULE_WIDTH_MASK -#undef COLUMN_RULE_WIDTH_SHIFT -#undef COLUMN_RULE_WIDTH_INDEX - -#define COLUMN_SPAN_INDEX 11 -#define COLUMN_SPAN_SHIFT 6 -#define COLUMN_SPAN_MASK 0xc0 -static inline uint8_t get_column_span( - const css_computed_style *style) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_SPAN_INDEX]; - bits &= COLUMN_SPAN_MASK; - bits >>= COLUMN_SPAN_SHIFT; - - /* 2bits: type */ - return bits; - } - - /* Initial value */ - return CSS_COLUMN_SPAN_NONE; -} -#undef COLUMN_SPAN_MASK -#undef COLUMN_SPAN_SHIFT -#undef COLUMN_SPAN_INDEX - -#define COLUMN_WIDTH_INDEX 11 -#define COLUMN_WIDTH_SHIFT 0 -#define COLUMN_WIDTH_MASK 0x3f -static inline uint8_t get_column_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[COLUMN_WIDTH_INDEX]; - bits &= COLUMN_WIDTH_MASK; - bits >>= COLUMN_WIDTH_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_COLUMN_WIDTH_SET) { - *length = style->i.uncommon->i.column_width; - *unit = bits >> 2; - } - - return (bits & 0x3); - } - - /* Initial value */ - return CSS_COLUMN_WIDTH_AUTO; -} -#undef COLUMN_WIDTH_MASK -#undef COLUMN_WIDTH_SHIFT -#undef COLUMN_WIDTH_INDEX - -#define CONTENT_INDEX 7 -#define CONTENT_SHIFT 0 -#define CONTENT_MASK 0x3 -static inline uint8_t get_content( - const css_computed_style *style, - const css_computed_content_item **content) -{ - if (style->i.uncommon != NULL) { - uint8_t bits = style->i.uncommon->i.bits[CONTENT_INDEX]; - bits &= CONTENT_MASK; - bits >>= CONTENT_SHIFT; - - /* 2bits: type */ - *content = style->i.uncommon->content; - - return bits; - } - - /* Initial value */ - return CSS_CONTENT_NORMAL; -} -#undef CONTENT_MASK -#undef CONTENT_SHIFT -#undef CONTENT_INDEX - -#define VERTICAL_ALIGN_INDEX 0 -#define VERTICAL_ALIGN_SHIFT 0 -#define VERTICAL_ALIGN_MASK 0xff -static inline uint8_t get_vertical_align( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[VERTICAL_ALIGN_INDEX]; - bits &= VERTICAL_ALIGN_MASK; - bits >>= VERTICAL_ALIGN_SHIFT; - - /* 8bits: uuuutttt : units | type */ - if ((bits & 0xf) == CSS_VERTICAL_ALIGN_SET) { - *length = style->i.vertical_align; - *unit = bits >> 4; - } - - return (bits & 0xf); -} -#undef VERTICAL_ALIGN_MASK -#undef VERTICAL_ALIGN_SHIFT -#undef VERTICAL_ALIGN_INDEX - -#define FONT_SIZE_INDEX 1 -#define FONT_SIZE_SHIFT 0 -#define FONT_SIZE_MASK 0xff -static inline uint8_t get_font_size( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[FONT_SIZE_INDEX]; - bits &= FONT_SIZE_MASK; - bits >>= FONT_SIZE_SHIFT; - - /* 8bits: uuuutttt : units | type */ - if ((bits & 0xf) == CSS_FONT_SIZE_DIMENSION) { - *length = style->i.font_size; - *unit = bits >> 4; - } - - return (bits & 0xf); -} -#undef FONT_SIZE_MASK -#undef FONT_SIZE_SHIFT -#undef FONT_SIZE_INDEX - -#define BORDER_TOP_WIDTH_INDEX 2 -#define BORDER_TOP_WIDTH_SHIFT 1 -#define BORDER_TOP_WIDTH_MASK 0xfe -static inline uint8_t get_border_top_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[BORDER_TOP_WIDTH_INDEX]; - bits &= BORDER_TOP_WIDTH_MASK; - bits >>= BORDER_TOP_WIDTH_SHIFT; - - /* 7bits: uuuuttt : units | type */ - if ((bits & 0x7) == CSS_BORDER_WIDTH_WIDTH) { - *length = style->i.border_width[0]; - *unit = bits >> 3; - } - - return (bits & 0x7); -} -#undef BORDER_TOP_WIDTH_MASK -#undef BORDER_TOP_WIDTH_SHIFT -#undef BORDER_TOP_WIDTH_INDEX - -#define BORDER_RIGHT_WIDTH_INDEX 3 -#define BORDER_RIGHT_WIDTH_SHIFT 1 -#define BORDER_RIGHT_WIDTH_MASK 0xfe -static inline uint8_t get_border_right_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[BORDER_RIGHT_WIDTH_INDEX]; - bits &= BORDER_RIGHT_WIDTH_MASK; - bits >>= BORDER_RIGHT_WIDTH_SHIFT; - - /* 7bits: uuuuttt : units | type */ - if ((bits & 0x7) == CSS_BORDER_WIDTH_WIDTH) { - *length = style->i.border_width[1]; - *unit = bits >> 3; - } - - return (bits & 0x7); -} -#undef BORDER_RIGHT_WIDTH_MASK -#undef BORDER_RIGHT_WIDTH_SHIFT -#undef BORDER_RIGHT_WIDTH_INDEX - -#define BORDER_BOTTOM_WIDTH_INDEX 4 -#define BORDER_BOTTOM_WIDTH_SHIFT 1 -#define BORDER_BOTTOM_WIDTH_MASK 0xfe -static inline uint8_t get_border_bottom_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[BORDER_BOTTOM_WIDTH_INDEX]; - bits &= BORDER_BOTTOM_WIDTH_MASK; - bits >>= BORDER_BOTTOM_WIDTH_SHIFT; - - /* 7bits: uuuuttt : units | type */ - if ((bits & 0x7) == CSS_BORDER_WIDTH_WIDTH) { - *length = style->i.border_width[2]; - *unit = bits >> 3; - } - - return (bits & 0x7); -} -#undef BORDER_BOTTOM_WIDTH_MASK -#undef BORDER_BOTTOM_WIDTH_SHIFT -#undef BORDER_BOTTOM_WIDTH_INDEX - -#define BORDER_LEFT_WIDTH_INDEX 5 -#define BORDER_LEFT_WIDTH_SHIFT 1 -#define BORDER_LEFT_WIDTH_MASK 0xfe -static inline uint8_t get_border_left_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[BORDER_LEFT_WIDTH_INDEX]; - bits &= BORDER_LEFT_WIDTH_MASK; - bits >>= BORDER_LEFT_WIDTH_SHIFT; - - /* 7bits: uuuuttt : units | type */ - if ((bits & 0x7) == CSS_BORDER_WIDTH_WIDTH) { - *length = style->i.border_width[3]; - *unit = bits >> 3; - } - - return (bits & 0x7); -} -#undef BORDER_LEFT_WIDTH_MASK -#undef BORDER_LEFT_WIDTH_SHIFT -#undef BORDER_LEFT_WIDTH_INDEX - -#define BACKGROUND_IMAGE_INDEX 2 -#define BACKGROUND_IMAGE_SHIFT 0 -#define BACKGROUND_IMAGE_MASK 0x1 -static inline uint8_t get_background_image( - const css_computed_style *style, - lwc_string **url) -{ - uint8_t bits = style->i.bits[BACKGROUND_IMAGE_INDEX]; - bits &= BACKGROUND_IMAGE_MASK; - bits >>= BACKGROUND_IMAGE_SHIFT; - - /* 1bit: type */ - *url = style->i.background_image; - - return bits; -} -#undef BACKGROUND_IMAGE_MASK -#undef BACKGROUND_IMAGE_SHIFT -#undef BACKGROUND_IMAGE_INDEX - -#define COLOR_INDEX 3 -#define COLOR_SHIFT 0 -#define COLOR_MASK 0x1 -static inline uint8_t get_color( - const css_computed_style *style, - css_color *color) -{ - uint8_t bits = style->i.bits[COLOR_INDEX]; - bits &= COLOR_MASK; - bits >>= COLOR_SHIFT; - - /* 1bit: type */ - *color = style->i.color; - - return bits; -} -#undef COLOR_MASK -#undef COLOR_SHIFT -#undef COLOR_INDEX - -#define LIST_STYLE_IMAGE_INDEX 4 -#define LIST_STYLE_IMAGE_SHIFT 0 -#define LIST_STYLE_IMAGE_MASK 0x1 -static inline uint8_t get_list_style_image( - const css_computed_style *style, - lwc_string **url) -{ - uint8_t bits = style->i.bits[LIST_STYLE_IMAGE_INDEX]; - bits &= LIST_STYLE_IMAGE_MASK; - bits >>= LIST_STYLE_IMAGE_SHIFT; - - /* 1bit: type */ - *url = style->i.list_style_image; - - return bits; -} -#undef LIST_STYLE_IMAGE_MASK -#undef LIST_STYLE_IMAGE_SHIFT -#undef LIST_STYLE_IMAGE_INDEX - -#define QUOTES_INDEX 5 -#define QUOTES_SHIFT 0 -#define QUOTES_MASK 0x1 -static inline uint8_t get_quotes( - const css_computed_style *style, - lwc_string ***quotes) -{ - uint8_t bits = style->i.bits[QUOTES_INDEX]; - bits &= QUOTES_MASK; - bits >>= QUOTES_SHIFT; - - /* 1bit: type */ - *quotes = style->quotes; - - return bits; -} -#undef QUOTES_MASK -#undef QUOTES_SHIFT -#undef QUOTES_INDEX - -#define TOP_INDEX 6 -#define TOP_SHIFT 2 -#define TOP_MASK 0xfc -static inline uint8_t get_top( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[TOP_INDEX]; - bits &= TOP_MASK; - bits >>= TOP_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_TOP_SET) { - *length = style->i.top; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -static inline uint8_t get_top_bits( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[TOP_INDEX]; - bits &= TOP_MASK; - bits >>= TOP_SHIFT; - - /* 6bits: uuuutt : units | type */ - return bits; -} -#undef TOP_MASK -#undef TOP_SHIFT -#undef TOP_INDEX - -#define RIGHT_INDEX 7 -#define RIGHT_SHIFT 2 -#define RIGHT_MASK 0xfc -static inline uint8_t get_right( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[RIGHT_INDEX]; - bits &= RIGHT_MASK; - bits >>= RIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_RIGHT_SET) { - *length = style->i.right; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -static inline uint8_t get_right_bits( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[RIGHT_INDEX]; - bits &= RIGHT_MASK; - bits >>= RIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - return bits; -} -#undef RIGHT_MASK -#undef RIGHT_SHIFT -#undef RIGHT_INDEX - -#define BOTTOM_INDEX 8 -#define BOTTOM_SHIFT 2 -#define BOTTOM_MASK 0xfc -static inline uint8_t get_bottom( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[BOTTOM_INDEX]; - bits &= BOTTOM_MASK; - bits >>= BOTTOM_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_BOTTOM_SET) { - *length = style->i.bottom; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -static inline uint8_t get_bottom_bits( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BOTTOM_INDEX]; - bits &= BOTTOM_MASK; - bits >>= BOTTOM_SHIFT; - - /* 6bits: uuuutt : units | type */ - return bits; -} -#undef BOTTOM_MASK -#undef BOTTOM_SHIFT -#undef BOTTOM_INDEX - -#define LEFT_INDEX 9 -#define LEFT_SHIFT 2 -#define LEFT_MASK 0xfc -static inline uint8_t get_left( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[LEFT_INDEX]; - bits &= LEFT_MASK; - bits >>= LEFT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_LEFT_SET) { - *length = style->i.left; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -static inline uint8_t get_left_bits( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[LEFT_INDEX]; - bits &= LEFT_MASK; - bits >>= LEFT_SHIFT; - - /* 6bits: uuuutt : units | type */ - return bits; -} -#undef LEFT_MASK -#undef LEFT_SHIFT -#undef LEFT_INDEX - -#define BORDER_TOP_COLOR_INDEX 6 -#define BORDER_TOP_COLOR_SHIFT 0 -#define BORDER_TOP_COLOR_MASK 0x3 -static inline uint8_t get_border_top_color( - const css_computed_style *style, - css_color *color) -{ - uint8_t bits = style->i.bits[BORDER_TOP_COLOR_INDEX]; - bits &= BORDER_TOP_COLOR_MASK; - bits >>= BORDER_TOP_COLOR_SHIFT; - - /* 2bits: type */ - *color = style->i.border_color[0]; - - return bits; -} -#undef BORDER_TOP_COLOR_MASK -#undef BORDER_TOP_COLOR_SHIFT -#undef BORDER_TOP_COLOR_INDEX - -#define BORDER_RIGHT_COLOR_INDEX 7 -#define BORDER_RIGHT_COLOR_SHIFT 0 -#define BORDER_RIGHT_COLOR_MASK 0x3 -static inline uint8_t get_border_right_color( - const css_computed_style *style, - css_color *color) -{ - uint8_t bits = style->i.bits[BORDER_RIGHT_COLOR_INDEX]; - bits &= BORDER_RIGHT_COLOR_MASK; - bits >>= BORDER_RIGHT_COLOR_SHIFT; - - /* 2bits: type */ - *color = style->i.border_color[1]; - - return bits; -} -#undef BORDER_RIGHT_COLOR_MASK -#undef BORDER_RIGHT_COLOR_SHIFT -#undef BORDER_RIGHT_COLOR_INDEX - -#define BORDER_BOTTOM_COLOR_INDEX 8 -#define BORDER_BOTTOM_COLOR_SHIFT 0 -#define BORDER_BOTTOM_COLOR_MASK 0x3 -static inline uint8_t get_border_bottom_color( - const css_computed_style *style, - css_color *color) -{ - uint8_t bits = style->i.bits[BORDER_BOTTOM_COLOR_INDEX]; - bits &= BORDER_BOTTOM_COLOR_MASK; - bits >>= BORDER_BOTTOM_COLOR_SHIFT; - - /* 2bits: type */ - *color = style->i.border_color[2]; - - return bits; -} -#undef BORDER_BOTTOM_COLOR_MASK -#undef BORDER_BOTTOM_COLOR_SHIFT -#undef BORDER_BOTTOM_COLOR_INDEX - -#define BORDER_LEFT_COLOR_INDEX 9 -#define BORDER_LEFT_COLOR_SHIFT 0 -#define BORDER_LEFT_COLOR_MASK 0x3 -static inline uint8_t get_border_left_color( - const css_computed_style *style, - css_color *color) -{ - uint8_t bits = style->i.bits[BORDER_LEFT_COLOR_INDEX]; - bits &= BORDER_LEFT_COLOR_MASK; - bits >>= BORDER_LEFT_COLOR_SHIFT; - - /* 2bits: type */ - *color = style->i.border_color[3]; - - return bits; -} -#undef BORDER_LEFT_COLOR_MASK -#undef BORDER_LEFT_COLOR_SHIFT -#undef BORDER_LEFT_COLOR_INDEX - -#define HEIGHT_INDEX 10 -#define HEIGHT_SHIFT 2 -#define HEIGHT_MASK 0xfc -static inline uint8_t get_height( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[HEIGHT_INDEX]; - bits &= HEIGHT_MASK; - bits >>= HEIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_HEIGHT_SET) { - *length = style->i.height; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef HEIGHT_MASK -#undef HEIGHT_SHIFT -#undef HEIGHT_INDEX - -#define LINE_HEIGHT_INDEX 11 -#define LINE_HEIGHT_SHIFT 2 -#define LINE_HEIGHT_MASK 0xfc -static inline uint8_t get_line_height( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[LINE_HEIGHT_INDEX]; - bits &= LINE_HEIGHT_MASK; - bits >>= LINE_HEIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_LINE_HEIGHT_NUMBER || - (bits & 0x3) == CSS_LINE_HEIGHT_DIMENSION) { - *length = style->i.line_height; - } - - if ((bits & 0x3) == CSS_LINE_HEIGHT_DIMENSION) { - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef LINE_HEIGHT_MASK -#undef LINE_HEIGHT_SHIFT -#undef LINE_HEIGHT_INDEX - -#define BACKGROUND_COLOR_INDEX 10 -#define BACKGROUND_COLOR_SHIFT 0 -#define BACKGROUND_COLOR_MASK 0x3 -static inline uint8_t get_background_color( - const css_computed_style *style, - css_color *color) -{ - uint8_t bits = style->i.bits[BACKGROUND_COLOR_INDEX]; - bits &= BACKGROUND_COLOR_MASK; - bits >>= BACKGROUND_COLOR_SHIFT; - - /* 2bits: type */ - *color = style->i.background_color; - - return bits; -} -#undef BACKGROUND_COLOR_MASK -#undef BACKGROUND_COLOR_SHIFT -#undef BACKGROUND_COLOR_INDEX - -#define Z_INDEX_INDEX 11 -#define Z_INDEX_SHIFT 0 -#define Z_INDEX_MASK 0x3 -static inline uint8_t get_z_index( - const css_computed_style *style, - int32_t *z_index) -{ - uint8_t bits = style->i.bits[Z_INDEX_INDEX]; - bits &= Z_INDEX_MASK; - bits >>= Z_INDEX_SHIFT; - - /* 2bits: type */ - *z_index = style->i.z_index; - - return bits; -} -#undef Z_INDEX_MASK -#undef Z_INDEX_SHIFT -#undef Z_INDEX_INDEX - -#define MARGIN_TOP_INDEX 12 -#define MARGIN_TOP_SHIFT 2 -#define MARGIN_TOP_MASK 0xfc -static inline uint8_t get_margin_top( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MARGIN_TOP_INDEX]; - bits &= MARGIN_TOP_MASK; - bits >>= MARGIN_TOP_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MARGIN_SET) { - *length = style->i.margin[0]; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MARGIN_TOP_MASK -#undef MARGIN_TOP_SHIFT -#undef MARGIN_TOP_INDEX - -#define MARGIN_RIGHT_INDEX 13 -#define MARGIN_RIGHT_SHIFT 2 -#define MARGIN_RIGHT_MASK 0xfc -static inline uint8_t get_margin_right( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MARGIN_RIGHT_INDEX]; - bits &= MARGIN_RIGHT_MASK; - bits >>= MARGIN_RIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MARGIN_SET) { - *length = style->i.margin[1]; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MARGIN_RIGHT_MASK -#undef MARGIN_RIGHT_SHIFT -#undef MARGIN_RIGHT_INDEX - -#define MARGIN_BOTTOM_INDEX 14 -#define MARGIN_BOTTOM_SHIFT 2 -#define MARGIN_BOTTOM_MASK 0xfc -static inline uint8_t get_margin_bottom( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MARGIN_BOTTOM_INDEX]; - bits &= MARGIN_BOTTOM_MASK; - bits >>= MARGIN_BOTTOM_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MARGIN_SET) { - *length = style->i.margin[2]; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MARGIN_BOTTOM_MASK -#undef MARGIN_BOTTOM_SHIFT -#undef MARGIN_BOTTOM_INDEX - -#define MARGIN_LEFT_INDEX 15 -#define MARGIN_LEFT_SHIFT 2 -#define MARGIN_LEFT_MASK 0xfc -static inline uint8_t get_margin_left( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MARGIN_LEFT_INDEX]; - bits &= MARGIN_LEFT_MASK; - bits >>= MARGIN_LEFT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MARGIN_SET) { - *length = style->i.margin[3]; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MARGIN_LEFT_MASK -#undef MARGIN_LEFT_SHIFT -#undef MARGIN_LEFT_INDEX - -#define BACKGROUND_ATTACHMENT_INDEX 12 -#define BACKGROUND_ATTACHMENT_SHIFT 0 -#define BACKGROUND_ATTACHMENT_MASK 0x3 -static inline uint8_t get_background_attachment( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BACKGROUND_ATTACHMENT_INDEX]; - bits &= BACKGROUND_ATTACHMENT_MASK; - bits >>= BACKGROUND_ATTACHMENT_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef BACKGROUND_ATTACHMENT_MASK -#undef BACKGROUND_ATTACHMENT_SHIFT -#undef BACKGROUND_ATTACHMENT_INDEX - -#define BOX_SIZING_INDEX 23 -#define BOX_SIZING_SHIFT 0 -#define BOX_SIZING_MASK 0x3 -static inline uint8_t get_box_sizing( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BOX_SIZING_INDEX]; - bits &= BOX_SIZING_MASK; - bits >>= BOX_SIZING_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef BOX_SIZING_MASK -#undef BOX_SIZING_SHIFT -#undef BOX_SIZING_INDEX - -#define BORDER_COLLAPSE_INDEX 13 -#define BORDER_COLLAPSE_SHIFT 0 -#define BORDER_COLLAPSE_MASK 0x3 -static inline uint8_t get_border_collapse( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BORDER_COLLAPSE_INDEX]; - bits &= BORDER_COLLAPSE_MASK; - bits >>= BORDER_COLLAPSE_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef BORDER_COLLAPSE_MASK -#undef BORDER_COLLAPSE_SHIFT -#undef BORDER_COLLAPSE_INDEX - -#define CAPTION_SIDE_INDEX 14 -#define CAPTION_SIDE_SHIFT 0 -#define CAPTION_SIDE_MASK 0x3 -static inline uint8_t get_caption_side( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[CAPTION_SIDE_INDEX]; - bits &= CAPTION_SIDE_MASK; - bits >>= CAPTION_SIDE_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef CAPTION_SIDE_MASK -#undef CAPTION_SIDE_SHIFT -#undef CAPTION_SIDE_INDEX - -#define DIRECTION_INDEX 15 -#define DIRECTION_SHIFT 0 -#define DIRECTION_MASK 0x3 -static inline uint8_t get_direction( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[DIRECTION_INDEX]; - bits &= DIRECTION_MASK; - bits >>= DIRECTION_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef DIRECTION_MASK -#undef DIRECTION_SHIFT -#undef DIRECTION_INDEX - -#define MAX_HEIGHT_INDEX 16 -#define MAX_HEIGHT_SHIFT 2 -#define MAX_HEIGHT_MASK 0xfc -static inline uint8_t get_max_height( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MAX_HEIGHT_INDEX]; - bits &= MAX_HEIGHT_MASK; - bits >>= MAX_HEIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MAX_HEIGHT_SET) { - *length = style->i.max_height; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MAX_HEIGHT_MASK -#undef MAX_HEIGHT_SHIFT -#undef MAX_HEIGHT_INDEX - -#define MAX_WIDTH_INDEX 17 -#define MAX_WIDTH_SHIFT 2 -#define MAX_WIDTH_MASK 0xfc -static inline uint8_t get_max_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MAX_WIDTH_INDEX]; - bits &= MAX_WIDTH_MASK; - bits >>= MAX_WIDTH_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MAX_WIDTH_SET) { - *length = style->i.max_width; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MAX_WIDTH_MASK -#undef MAX_WIDTH_SHIFT -#undef MAX_WIDTH_INDEX - -#define WIDTH_INDEX 18 -#define WIDTH_SHIFT 2 -#define WIDTH_MASK 0xfc -static inline uint8_t get_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[WIDTH_INDEX]; - bits &= WIDTH_MASK; - bits >>= WIDTH_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_WIDTH_SET) { - *length = style->i.width; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef WIDTH_MASK -#undef WIDTH_SHIFT -#undef WIDTH_INDEX - -#define EMPTY_CELLS_INDEX 16 -#define EMPTY_CELLS_SHIFT 0 -#define EMPTY_CELLS_MASK 0x3 -static inline uint8_t get_empty_cells( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[EMPTY_CELLS_INDEX]; - bits &= EMPTY_CELLS_MASK; - bits >>= EMPTY_CELLS_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef EMPTY_CELLS_MASK -#undef EMPTY_CELLS_SHIFT -#undef EMPTY_CELLS_INDEX - -#define FLOAT_INDEX 17 -#define FLOAT_SHIFT 0 -#define FLOAT_MASK 0x3 -static inline uint8_t get_float( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[FLOAT_INDEX]; - bits &= FLOAT_MASK; - bits >>= FLOAT_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef FLOAT_MASK -#undef FLOAT_SHIFT -#undef FLOAT_INDEX - -#define FONT_STYLE_INDEX 18 -#define FONT_STYLE_SHIFT 0 -#define FONT_STYLE_MASK 0x3 -static inline uint8_t get_font_style( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[FONT_STYLE_INDEX]; - bits &= FONT_STYLE_MASK; - bits >>= FONT_STYLE_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef FONT_STYLE_MASK -#undef FONT_STYLE_SHIFT -#undef FONT_STYLE_INDEX - -#define MIN_HEIGHT_INDEX 19 -#define MIN_HEIGHT_SHIFT 2 -#define MIN_HEIGHT_MASK 0xfc -static inline uint8_t get_min_height( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MIN_HEIGHT_INDEX]; - bits &= MIN_HEIGHT_MASK; - bits >>= MIN_HEIGHT_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MIN_HEIGHT_SET) { - *length = style->i.min_height; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MIN_HEIGHT_MASK -#undef MIN_HEIGHT_SHIFT -#undef MIN_HEIGHT_INDEX - -#define MIN_WIDTH_INDEX 20 -#define MIN_WIDTH_SHIFT 2 -#define MIN_WIDTH_MASK 0xfc -static inline uint8_t get_min_width( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[MIN_WIDTH_INDEX]; - bits &= MIN_WIDTH_MASK; - bits >>= MIN_WIDTH_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_MIN_WIDTH_SET) { - *length = style->i.min_width; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef MIN_WIDTH_MASK -#undef MIN_WIDTH_SHIFT -#undef MIN_WIDTH_INDEX - -#define BACKGROUND_REPEAT_INDEX 34 -#define BACKGROUND_REPEAT_SHIFT 2 -#define BACKGROUND_REPEAT_MASK 0x1c -static inline uint8_t get_background_repeat( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BACKGROUND_REPEAT_INDEX]; - bits &= BACKGROUND_REPEAT_MASK; - bits >>= BACKGROUND_REPEAT_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef BACKGROUND_REPEAT_MASK -#undef BACKGROUND_REPEAT_SHIFT -#undef BACKGROUND_REPEAT_INDEX - -#define CLEAR_INDEX 36 -#define CLEAR_SHIFT 2 -#define CLEAR_MASK 0x1c -static inline uint8_t get_clear( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[CLEAR_INDEX]; - bits &= CLEAR_MASK; - bits >>= CLEAR_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef CLEAR_MASK -#undef CLEAR_SHIFT -#undef CLEAR_INDEX - -#define PADDING_TOP_INDEX 21 -#define PADDING_TOP_SHIFT 3 -#define PADDING_TOP_MASK 0xf8 -static inline uint8_t get_padding_top( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[PADDING_TOP_INDEX]; - bits &= PADDING_TOP_MASK; - bits >>= PADDING_TOP_SHIFT; - - /* 5bits: uuuut : units | type */ - if ((bits & 0x1) == CSS_PADDING_SET) { - *length = style->i.padding[0]; - *unit = bits >> 1; - } - - return (bits & 0x1); -} -#undef PADDING_TOP_MASK -#undef PADDING_TOP_SHIFT -#undef PADDING_TOP_INDEX - -#define PADDING_RIGHT_INDEX 22 -#define PADDING_RIGHT_SHIFT 3 -#define PADDING_RIGHT_MASK 0xf8 -static inline uint8_t get_padding_right( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[PADDING_RIGHT_INDEX]; - bits &= PADDING_RIGHT_MASK; - bits >>= PADDING_RIGHT_SHIFT; - - /* 5bits: uuuut : units | type */ - if ((bits & 0x1) == CSS_PADDING_SET) { - *length = style->i.padding[1]; - *unit = bits >> 1; - } - - return (bits & 0x1); -} -#undef PADDING_RIGHT_MASK -#undef PADDING_RIGHT_SHIFT -#undef PADDING_RIGHT_INDEX - -#define PADDING_BOTTOM_INDEX 23 -#define PADDING_BOTTOM_SHIFT 3 -#define PADDING_BOTTOM_MASK 0xf8 -static inline uint8_t get_padding_bottom( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[PADDING_BOTTOM_INDEX]; - bits &= PADDING_BOTTOM_MASK; - bits >>= PADDING_BOTTOM_SHIFT; - - /* 5bits: uuuut : units | type */ - if ((bits & 0x1) == CSS_PADDING_SET) { - *length = style->i.padding[2]; - *unit = bits >> 1; - } - - return (bits & 0x1); -} -#undef PADDING_BOTTOM_MASK -#undef PADDING_BOTTOM_SHIFT -#undef PADDING_BOTTOM_INDEX - -#define PADDING_LEFT_INDEX 24 -#define PADDING_LEFT_SHIFT 3 -#define PADDING_LEFT_MASK 0xf8 -static inline uint8_t get_padding_left( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[PADDING_LEFT_INDEX]; - bits &= PADDING_LEFT_MASK; - bits >>= PADDING_LEFT_SHIFT; - - /* 5bits: uuuut : units | type */ - if ((bits & 0x1) == CSS_PADDING_SET) { - *length = style->i.padding[3]; - *unit = bits >> 1; - } - - return (bits & 0x1); -} -#undef PADDING_LEFT_MASK -#undef PADDING_LEFT_SHIFT -#undef PADDING_LEFT_INDEX - -#define OVERFLOW_X_INDEX 21 -#define OVERFLOW_X_SHIFT 0 -#define OVERFLOW_X_MASK 0x7 -static inline uint8_t get_overflow_x( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[OVERFLOW_X_INDEX]; - bits &= OVERFLOW_X_MASK; - bits >>= OVERFLOW_X_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef OVERFLOW_X_MASK -#undef OVERFLOW_X_SHIFT -#undef OVERFLOW_X_INDEX - -#define OVERFLOW_Y_INDEX 34 -#define OVERFLOW_Y_SHIFT 5 -#define OVERFLOW_Y_MASK 0xe0 -static inline uint8_t get_overflow_y( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[OVERFLOW_Y_INDEX]; - bits &= OVERFLOW_Y_MASK; - bits >>= OVERFLOW_Y_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef OVERFLOW_Y_MASK -#undef OVERFLOW_Y_SHIFT -#undef OVERFLOW_Y_INDEX - -#define POSITION_INDEX 22 -#define POSITION_SHIFT 0 -#define POSITION_MASK 0x7 -static inline uint8_t get_position( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[POSITION_INDEX]; - bits &= POSITION_MASK; - bits >>= POSITION_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef POSITION_MASK -#undef POSITION_SHIFT -#undef POSITION_INDEX - -#define OPACITY_INDEX 23 -#define OPACITY_SHIFT 2 -#define OPACITY_MASK 0x04 -static inline uint8_t get_opacity( - const css_computed_style *style, - css_fixed *opacity) -{ - uint8_t bits = style->i.bits[OPACITY_INDEX]; - bits &= OPACITY_MASK; - bits >>= OPACITY_SHIFT; - - /* 1bit: t : type */ - if ((bits & 0x1) == CSS_OPACITY_SET) { - *opacity = style->i.opacity; - } - - return (bits & 0x1); -} -#undef OPACITY_MASK -#undef OPACITY_SHIFT -#undef OPACITY_INDEX - -#define TEXT_TRANSFORM_INDEX 24 -#define TEXT_TRANSFORM_SHIFT 0 -#define TEXT_TRANSFORM_MASK 0x7 -static inline uint8_t get_text_transform( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[TEXT_TRANSFORM_INDEX]; - bits &= TEXT_TRANSFORM_MASK; - bits >>= TEXT_TRANSFORM_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef TEXT_TRANSFORM_MASK -#undef TEXT_TRANSFORM_SHIFT -#undef TEXT_TRANSFORM_INDEX - -#define TEXT_INDENT_INDEX 25 -#define TEXT_INDENT_SHIFT 3 -#define TEXT_INDENT_MASK 0xf8 -static inline uint8_t get_text_indent( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[TEXT_INDENT_INDEX]; - bits &= TEXT_INDENT_MASK; - bits >>= TEXT_INDENT_SHIFT; - - /* 5bits: uuuut : units | type */ - if ((bits & 0x1) == CSS_TEXT_INDENT_SET) { - *length = style->i.text_indent; - *unit = bits >> 1; - } - - return (bits & 0x1); -} -#undef TEXT_INDENT_MASK -#undef TEXT_INDENT_SHIFT -#undef TEXT_INDENT_INDEX - -#define WHITE_SPACE_INDEX 25 -#define WHITE_SPACE_SHIFT 0 -#define WHITE_SPACE_MASK 0x7 -static inline uint8_t get_white_space( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[WHITE_SPACE_INDEX]; - bits &= WHITE_SPACE_MASK; - bits >>= WHITE_SPACE_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef WHITE_SPACE_MASK -#undef WHITE_SPACE_SHIFT -#undef WHITE_SPACE_INDEX - -#define BACKGROUND_POSITION_INDEX 27 -#define BACKGROUND_POSITION_SHIFT 7 -#define BACKGROUND_POSITION_MASK 0x80 -#define BACKGROUND_POSITION_INDEX1 26 -#define BACKGROUND_POSITION_SHIFT1 0 -#define BACKGROUND_POSITION_MASK1 0xff -static inline uint8_t get_background_position( - const css_computed_style *style, - css_fixed *hlength, css_unit *hunit, - css_fixed *vlength, css_unit *vunit) -{ - uint8_t bits = style->i.bits[BACKGROUND_POSITION_INDEX]; - bits &= BACKGROUND_POSITION_MASK; - bits >>= BACKGROUND_POSITION_SHIFT; - - /* 1bit: type */ - if (bits == CSS_BACKGROUND_POSITION_SET) { - uint8_t bits1 = style->i.bits[BACKGROUND_POSITION_INDEX1]; - bits1 &= BACKGROUND_POSITION_MASK1; - bits1 >>= BACKGROUND_POSITION_SHIFT1; - - /* 8bits: hhhhvvvv : hunit | vunit */ - *hlength = style->i.background_position[0]; - *hunit = bits1 >> 4; - - *vlength = style->i.background_position[1]; - *vunit = bits1 & 0xf; - } - - return bits; -} -#undef BACKGROUND_POSITION_MASK1 -#undef BACKGROUND_POSITION_SHIFT1 -#undef BACKGROUND_POSITION_INDEX1 -#undef BACKGROUND_POSITION_MASK -#undef BACKGROUND_POSITION_SHIFT -#undef BACKGROUND_POSITION_INDEX - -#define DISPLAY_INDEX 27 -#define DISPLAY_SHIFT 2 -#define DISPLAY_MASK 0x7c -static inline uint8_t get_display( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[DISPLAY_INDEX]; - bits &= DISPLAY_MASK; - bits >>= DISPLAY_SHIFT; - - /* 5bits: type */ - return bits; -} -#undef DISPLAY_MASK -#undef DISPLAY_SHIFT -#undef DISPLAY_INDEX - -#define FONT_VARIANT_INDEX 27 -#define FONT_VARIANT_SHIFT 0 -#define FONT_VARIANT_MASK 0x3 -static inline uint8_t get_font_variant( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[FONT_VARIANT_INDEX]; - bits &= FONT_VARIANT_MASK; - bits >>= FONT_VARIANT_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef FONT_VARIANT_MASK -#undef FONT_VARIANT_SHIFT -#undef FONT_VARIANT_INDEX - -#define TEXT_DECORATION_INDEX 28 -#define TEXT_DECORATION_SHIFT 3 -#define TEXT_DECORATION_MASK 0xf8 -static inline uint8_t get_text_decoration( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[TEXT_DECORATION_INDEX]; - bits &= TEXT_DECORATION_MASK; - bits >>= TEXT_DECORATION_SHIFT; - - /* 5bits: type */ - return bits; -} -#undef TEXT_DECORATION_MASK -#undef TEXT_DECORATION_SHIFT -#undef TEXT_DECORATION_INDEX - -#define FONT_FAMILY_INDEX 28 -#define FONT_FAMILY_SHIFT 0 -#define FONT_FAMILY_MASK 0x7 -static inline uint8_t get_font_family( - const css_computed_style *style, - lwc_string ***names) -{ - uint8_t bits = style->i.bits[FONT_FAMILY_INDEX]; - bits &= FONT_FAMILY_MASK; - bits >>= FONT_FAMILY_SHIFT; - - /* 3bits: type */ - *names = style->font_family; - - return bits; -} -#undef FONT_FAMILY_MASK -#undef FONT_FAMILY_SHIFT -#undef FONT_FAMILY_INDEX - -#define BORDER_TOP_STYLE_INDEX 29 -#define BORDER_TOP_STYLE_SHIFT 4 -#define BORDER_TOP_STYLE_MASK 0xf0 -static inline uint8_t get_border_top_style( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BORDER_TOP_STYLE_INDEX]; - bits &= BORDER_TOP_STYLE_MASK; - bits >>= BORDER_TOP_STYLE_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef BORDER_TOP_STYLE_MASK -#undef BORDER_TOP_STYLE_SHIFT -#undef BORDER_TOP_STYLE_INDEX - -#define BORDER_RIGHT_STYLE_INDEX 29 -#define BORDER_RIGHT_STYLE_SHIFT 0 -#define BORDER_RIGHT_STYLE_MASK 0xf -static inline uint8_t get_border_right_style( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BORDER_RIGHT_STYLE_INDEX]; - bits &= BORDER_RIGHT_STYLE_MASK; - bits >>= BORDER_RIGHT_STYLE_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef BORDER_RIGHT_STYLE_MASK -#undef BORDER_RIGHT_STYLE_SHIFT -#undef BORDER_RIGHT_STYLE_INDEX - -#define BORDER_BOTTOM_STYLE_INDEX 30 -#define BORDER_BOTTOM_STYLE_SHIFT 4 -#define BORDER_BOTTOM_STYLE_MASK 0xf0 -static inline uint8_t get_border_bottom_style( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BORDER_BOTTOM_STYLE_INDEX]; - bits &= BORDER_BOTTOM_STYLE_MASK; - bits >>= BORDER_BOTTOM_STYLE_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef BORDER_BOTTOM_STYLE_MASK -#undef BORDER_BOTTOM_STYLE_SHIFT -#undef BORDER_BOTTOM_STYLE_INDEX - -#define BORDER_LEFT_STYLE_INDEX 30 -#define BORDER_LEFT_STYLE_SHIFT 0 -#define BORDER_LEFT_STYLE_MASK 0xf -static inline uint8_t get_border_left_style( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[BORDER_LEFT_STYLE_INDEX]; - bits &= BORDER_LEFT_STYLE_MASK; - bits >>= BORDER_LEFT_STYLE_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef BORDER_LEFT_STYLE_MASK -#undef BORDER_LEFT_STYLE_SHIFT -#undef BORDER_LEFT_STYLE_INDEX - -#define FONT_WEIGHT_INDEX 31 -#define FONT_WEIGHT_SHIFT 4 -#define FONT_WEIGHT_MASK 0xf0 -static inline uint8_t get_font_weight( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[FONT_WEIGHT_INDEX]; - bits &= FONT_WEIGHT_MASK; - bits >>= FONT_WEIGHT_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef FONT_WEIGHT_MASK -#undef FONT_WEIGHT_SHIFT -#undef FONT_WEIGHT_INDEX - -#define LIST_STYLE_TYPE_INDEX 31 -#define LIST_STYLE_TYPE_SHIFT 0 -#define LIST_STYLE_TYPE_MASK 0xf -static inline uint8_t get_list_style_type( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[LIST_STYLE_TYPE_INDEX]; - bits &= LIST_STYLE_TYPE_MASK; - bits >>= LIST_STYLE_TYPE_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef LIST_STYLE_TYPE_MASK -#undef LIST_STYLE_TYPE_SHIFT -#undef LIST_STYLE_TYPE_INDEX - -#define OUTLINE_STYLE_INDEX 32 -#define OUTLINE_STYLE_SHIFT 4 -#define OUTLINE_STYLE_MASK 0xf0 -static inline uint8_t get_outline_style( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[OUTLINE_STYLE_INDEX]; - bits &= OUTLINE_STYLE_MASK; - bits >>= OUTLINE_STYLE_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef OUTLINE_STYLE_MASK -#undef OUTLINE_STYLE_SHIFT -#undef OUTLINE_STYLE_INDEX - -#define TABLE_LAYOUT_INDEX 32 -#define TABLE_LAYOUT_SHIFT 2 -#define TABLE_LAYOUT_MASK 0xc -static inline uint8_t get_table_layout( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[TABLE_LAYOUT_INDEX]; - bits &= TABLE_LAYOUT_MASK; - bits >>= TABLE_LAYOUT_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef TABLE_LAYOUT_MASK -#undef TABLE_LAYOUT_SHIFT -#undef TABLE_LAYOUT_INDEX - -#define UNICODE_BIDI_INDEX 32 -#define UNICODE_BIDI_SHIFT 0 -#define UNICODE_BIDI_MASK 0x3 -static inline uint8_t get_unicode_bidi( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[UNICODE_BIDI_INDEX]; - bits &= UNICODE_BIDI_MASK; - bits >>= UNICODE_BIDI_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef UNICODE_BIDI_MASK -#undef UNICODE_BIDI_SHIFT -#undef UNICODE_BIDI_INDEX - -#define VISIBILITY_INDEX 33 -#define VISIBILITY_SHIFT 6 -#define VISIBILITY_MASK 0xc0 -static inline uint8_t get_visibility( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[VISIBILITY_INDEX]; - bits &= VISIBILITY_MASK; - bits >>= VISIBILITY_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef VISIBILITY_MASK -#undef VISIBILITY_SHIFT -#undef VISIBILITY_INDEX - -#define LIST_STYLE_POSITION_INDEX 33 -#define LIST_STYLE_POSITION_SHIFT 4 -#define LIST_STYLE_POSITION_MASK 0x30 -static inline uint8_t get_list_style_position( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[LIST_STYLE_POSITION_INDEX]; - bits &= LIST_STYLE_POSITION_MASK; - bits >>= LIST_STYLE_POSITION_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef LIST_STYLE_POSITION_MASK -#undef LIST_STYLE_POSITION_SHIFT -#undef LIST_STYLE_POSITION_INDEX - -#define TEXT_ALIGN_INDEX 33 -#define TEXT_ALIGN_SHIFT 0 -#define TEXT_ALIGN_MASK 0xf -static inline uint8_t get_text_align( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[TEXT_ALIGN_INDEX]; - bits &= TEXT_ALIGN_MASK; - bits >>= TEXT_ALIGN_SHIFT; - - /* 4bits: type */ - return bits; -} -#undef TEXT_ALIGN_MASK -#undef TEXT_ALIGN_SHIFT -#undef TEXT_ALIGN_INDEX - -#define PAGE_BREAK_AFTER_INDEX 0 -#define PAGE_BREAK_AFTER_SHIFT 0 -#define PAGE_BREAK_AFTER_MASK 0x7 -static inline uint8_t get_page_break_after( - const css_computed_style *style) -{ - if (style->page != NULL) { - uint8_t bits = style->page->bits[PAGE_BREAK_AFTER_INDEX]; - bits &= PAGE_BREAK_AFTER_MASK; - bits >>= PAGE_BREAK_AFTER_SHIFT; - - /* 3bits: type */ - return bits; - } - - /* Initial value */ - return CSS_PAGE_BREAK_AFTER_AUTO; -} -#undef PAGE_BREAK_AFTER_MASK -#undef PAGE_BREAK_AFTER_SHIFT -#undef PAGE_BREAK_AFTER_INDEX - -#define PAGE_BREAK_BEFORE_INDEX 0 -#define PAGE_BREAK_BEFORE_SHIFT 3 -#define PAGE_BREAK_BEFORE_MASK 0x38 -static inline uint8_t get_page_break_before( - const css_computed_style *style) -{ - if (style->page != NULL) { - uint8_t bits = style->page->bits[PAGE_BREAK_BEFORE_INDEX]; - bits &= PAGE_BREAK_BEFORE_MASK; - bits >>= PAGE_BREAK_BEFORE_SHIFT; - - /* 3bits: type */ - return bits; - } - - /* Initial value */ - return CSS_PAGE_BREAK_BEFORE_AUTO; -} -#undef PAGE_BREAK_BEFORE_MASK -#undef PAGE_BREAK_BEFORE_SHIFT -#undef PAGE_BREAK_BEFORE_INDEX - -#define PAGE_BREAK_INSIDE_INDEX 0 -#define PAGE_BREAK_INSIDE_SHIFT 6 -#define PAGE_BREAK_INSIDE_MASK 0xc0 -static inline uint8_t get_page_break_inside( - const css_computed_style *style) -{ - if (style->page != NULL) { - uint8_t bits = style->page->bits[PAGE_BREAK_INSIDE_INDEX]; - bits &= PAGE_BREAK_INSIDE_MASK; - bits >>= PAGE_BREAK_INSIDE_SHIFT; - - /* 2bits: type */ - return bits; - } - - /* Initial value */ - return CSS_PAGE_BREAK_INSIDE_AUTO; -} -#undef PAGE_BREAK_INSIDE_MASK -#undef PAGE_BREAK_INSIDE_SHIFT -#undef PAGE_BREAK_INSIDE_INDEX - -#define ORPHANS_INDEX 1 -#define ORPHANS_SHIFT 0 -#define ORPHANS_MASK 0x1 -static inline uint8_t get_orphans( - const css_computed_style *style, - int32_t *orphans) -{ - if (style->page != NULL) { - uint8_t bits = style->page->bits[ORPHANS_INDEX]; - bits &= ORPHANS_MASK; - bits >>= ORPHANS_SHIFT; - - *orphans = style->page->orphans; - - /* 1bit: type */ - return bits; - } - - /* Initial value */ - *orphans = 2; - return CSS_ORPHANS_SET; -} -#undef ORPHANS_MASK -#undef ORPHANS_SHIFT -#undef ORPHANS_INDEX - -#define WIDOWS_INDEX 1 -#define WIDOWS_SHIFT 1 -#define WIDOWS_MASK 0x2 -static inline uint8_t get_widows( - const css_computed_style *style, - int32_t *widows) -{ - if (style->page != NULL) { - uint8_t bits = style->page->bits[WIDOWS_INDEX]; - bits &= WIDOWS_MASK; - bits >>= WIDOWS_SHIFT; - - *widows = style->page->widows; - - /* 1bit: type */ - return bits; - } - - /* Initial value */ - *widows = 2; - return CSS_WIDOWS_SET; -} -#undef WIDOWS_MASK -#undef WIDOWS_SHIFT -#undef WIDOWS_INDEX - -#define ALIGN_CONTENT_INDEX_A 34 -#define ALIGN_CONTENT_SHIFT_A 0 -#define ALIGN_CONTENT_MASK_A 0x3 -#define ALIGN_CONTENT_INDEX_B 35 -#define ALIGN_CONTENT_SHIFT_B 1 -#define ALIGN_CONTENT_MASK_B 0x2 -static inline uint8_t get_align_content( - const css_computed_style *style) -{ - uint8_t bits_a = style->i.bits[ALIGN_CONTENT_INDEX_A]; - bits_a &= ALIGN_CONTENT_MASK_A; - bits_a >>= ALIGN_CONTENT_SHIFT_A; - - uint8_t bits_b = style->i.bits[ALIGN_CONTENT_INDEX_B]; - bits_b &= ALIGN_CONTENT_MASK_B; - bits_b >>= ALIGN_CONTENT_SHIFT_B; - /* Most significant bit out of three */ - bits_b <<= 2; - - uint8_t bits = bits_a | bits_b; - - /* 3bits: type */ - return bits; -} -#undef ALIGN_CONTENT_MASK_A -#undef ALIGN_CONTENT_SHIFT_A -#undef ALIGN_CONTENT_INDEX_A -#undef ALIGN_CONTENT_MASK_B -#undef ALIGN_CONTENT_SHIFT_B -#undef ALIGN_CONTENT_INDEX_B - -#define FLEX_WRAP_INDEX 19 -#define FLEX_WRAP_SHIFT 0 -#define FLEX_WRAP_MASK 0x3 -static inline uint8_t get_flex_wrap( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[FLEX_WRAP_INDEX]; - bits &= FLEX_WRAP_MASK; - bits >>= FLEX_WRAP_SHIFT; - - /* 2bits: type */ - return bits; -} -#undef FLEX_WRAP_MASK -#undef FLEX_WRAP_SHIFT -#undef FLEX_WRAP_INDEX - -#define FLEX_BASIS_INDEX 35 -#define FLEX_BASIS_SHIFT 2 -#define FLEX_BASIS_MASK 0xfc -static inline uint8_t get_flex_basis( - const css_computed_style *style, - css_fixed *length, css_unit *unit) -{ - uint8_t bits = style->i.bits[FLEX_BASIS_INDEX]; - bits &= FLEX_BASIS_MASK; - bits >>= FLEX_BASIS_SHIFT; - - /* 6bits: uuuutt : units | type */ - if ((bits & 0x3) == CSS_FLEX_BASIS_SET) { - *length = style->i.flex_basis; - *unit = bits >> 2; - } - - return (bits & 0x3); -} -#undef FLEX_BASIS_MASK -#undef FLEX_BASIS_SHIFT -#undef FLEX_BASIS_INDEX - -#define FLEX_SHRINK_INDEX 20 -#define FLEX_SHRINK_SHIFT 1 -#define FLEX_SHRINK_MASK 0x2 -static inline uint8_t get_flex_shrink( - const css_computed_style *style, css_fixed *number) -{ - uint8_t bits = style->i.bits[FLEX_SHRINK_INDEX]; - bits &= FLEX_SHRINK_MASK; - bits >>= FLEX_SHRINK_SHIFT; - - /* 1bit: type */ - if ((bits & 0x1) == CSS_FLEX_SHRINK_SET) { - *number = style->i.flex_shrink; - } - - return (bits & 0x1); -} -#undef FLEX_SHRINK_MASK -#undef FLEX_SHRINK_SHIFT -#undef FLEX_SHRINK_INDEX - -#define FLEX_GROW_INDEX 20 -#define FLEX_GROW_SHIFT 0 -#define FLEX_GROW_MASK 0x1 -static inline uint8_t get_flex_grow( - const css_computed_style *style, css_fixed *number) -{ - uint8_t bits = style->i.bits[FLEX_GROW_INDEX]; - bits &= FLEX_GROW_MASK; - bits >>= FLEX_GROW_SHIFT; - - /* 1bit: type */ - if ((bits & 0x1) == CSS_FLEX_GROW_SET) { - *number = style->i.flex_grow; - } - - return (bits & 0x1); -} -#undef FLEX_GROW_MASK -#undef FLEX_GROW_SHIFT -#undef FLEX_GROW_INDEX - -#define FLEX_DIRECTION_INDEX 36 -#define FLEX_DIRECTION_SHIFT 5 -#define FLEX_DIRECTION_MASK 0xe0 -static inline uint8_t get_flex_direction( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[FLEX_DIRECTION_INDEX]; - bits &= FLEX_DIRECTION_MASK; - bits >>= FLEX_DIRECTION_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef FLEX_DIRECTION_MASK -#undef FLEX_DIRECTION_SHIFT -#undef FLEX_DIRECTION_INDEX - -#define JUSTIFY_CONTENT_INDEX_A 35 -#define JUSTIFY_CONTENT_SHIFT_A 0 -#define JUSTIFY_CONTENT_MASK_A 0x1 -#define JUSTIFY_CONTENT_INDEX_B 36 -#define JUSTIFY_CONTENT_SHIFT_B 0 -#define JUSTIFY_CONTENT_MASK_B 0x3 -static inline uint8_t get_justify_content( - const css_computed_style *style) -{ - uint8_t bits_a = style->i.bits[JUSTIFY_CONTENT_INDEX_A]; - bits_a &= JUSTIFY_CONTENT_MASK_A; - bits_a >>= JUSTIFY_CONTENT_SHIFT_A; - - uint8_t bits_b = style->i.bits[JUSTIFY_CONTENT_INDEX_B]; - bits_b &= JUSTIFY_CONTENT_MASK_B; - bits_b >>= JUSTIFY_CONTENT_SHIFT_B; - /* Most significant two bits out of three */ - bits_b <<= 1; - - uint8_t bits = bits_a | bits_b; - - /* 3bits: type */ - return bits; -} -#undef JUSTIFY_CONTENT_MASK_A -#undef JUSTIFY_CONTENT_SHIFT_A -#undef JUSTIFY_CONTENT_INDEX_A -#undef JUSTIFY_CONTENT_MASK_B -#undef JUSTIFY_CONTENT_SHIFT_B -#undef JUSTIFY_CONTENT_INDEX_B - -#define ORDER_INDEX 37 -#define ORDER_SHIFT 1 -#define ORDER_MASK 0x2 -static inline uint8_t get_order( - const css_computed_style *style, int32_t *number) -{ - uint8_t bits = style->i.bits[ORDER_INDEX]; - bits &= ORDER_MASK; - bits >>= ORDER_SHIFT; - - /* 1bit: type */ - if ((bits & 0x1) == CSS_ORDER_SET) { - *number = style->i.order; - } - - return (bits & 0x1); -} -#undef ORDER_MASK -#undef ORDER_SHIFT -#undef ORDER_INDEX - -#define ALIGN_ITEMS_INDEX 37 -#define ALIGN_ITEMS_SHIFT 5 -#define ALIGN_ITEMS_MASK 0xe0 -static inline uint8_t get_align_items( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[ALIGN_ITEMS_INDEX]; - bits &= ALIGN_ITEMS_MASK; - bits >>= ALIGN_ITEMS_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef ALIGN_ITEMS_MASK -#undef ALIGN_ITEMS_SHIFT -#undef ALIGN_ITEMS_INDEX - -#define ALIGN_SELF_INDEX 37 -#define ALIGN_SELF_SHIFT 2 -#define ALIGN_SELF_MASK 0x1c -static inline uint8_t get_align_self( - const css_computed_style *style) -{ - uint8_t bits = style->i.bits[ALIGN_SELF_INDEX]; - bits &= ALIGN_SELF_MASK; - bits >>= ALIGN_SELF_SHIFT; - - /* 3bits: type */ - return bits; -} -#undef ALIGN_SELF_MASK -#undef ALIGN_SELF_SHIFT -#undef ALIGN_SELF_INDEX +#include "autogenerated_propget.h" #endif diff --git a/src/select/propset.h b/src/select/propset.h index ea7ca48..0306946 100644 --- a/src/select/propset.h +++ b/src/select/propset.h @@ -12,2535 +12,6 @@ #include #include "computed.h" - -/* Important: keep this file in sync with computed.h */ -/** \todo Is there a better way to ensure this happens? */ - -/** Default values are 'initial value', unless the property is inherited, - * in which case it is 'inherit'. */ -static const css_computed_uncommon default_uncommon = { - .i = { - .bits = { - (CSS_LETTER_SPACING_INHERIT << 2) | - CSS_OUTLINE_COLOR_INVERT, - (CSS_OUTLINE_WIDTH_MEDIUM << 1) | - CSS_BORDER_SPACING_INHERIT, - 0, - (CSS_WORD_SPACING_INHERIT << 2) | - (CSS_COUNTER_INCREMENT_NONE << 1) | - CSS_COUNTER_RESET_NONE, - (CSS_CURSOR_INHERIT << 3) | - (CSS_WRITING_MODE_INHERIT << 1), - 0, - 0, - (CSS_CLIP_AUTO << 2) | CSS_CONTENT_NORMAL, - (CSS_COLUMN_COUNT_AUTO << 6) | - (CSS_COLUMN_FILL_BALANCE << 4) | - (CSS_COLUMN_RULE_STYLE_NONE << 0), - (CSS_COLUMN_GAP_NORMAL << 2) | - (CSS_COLUMN_RULE_COLOR_CURRENT_COLOR), - (CSS_COLUMN_RULE_WIDTH_MEDIUM << 1), - (CSS_COLUMN_SPAN_NONE << 6) | CSS_COLUMN_WIDTH_AUTO, - (CSS_BREAK_BEFORE_AUTO << 4) | CSS_BREAK_AFTER_AUTO, - (CSS_BREAK_INSIDE_AUTO) - }, - .border_spacing = { 0, 0 }, - .clip = { 0, 0, 0, 0 }, - .letter_spacing = 0, - .outline_color = 0x0, - .outline_width = 0, - .word_spacing = 0, - .column_count = 0, - .column_gap = 0, - .column_rule_color = 0, - .column_rule_width = 0, - .column_width = 0 - }, - .counter_increment = NULL, - .counter_reset = NULL, - .content = NULL, - .cursor = NULL, - .next = NULL, - .count = 0, - .bin = UINT32_MAX -}; - -#define ENSURE_UNCOMMON do { \ - if (style->i.uncommon == NULL) { \ - style->i.uncommon = malloc( \ - sizeof(css_computed_uncommon)); \ - if (style->i.uncommon == NULL) \ - return CSS_NOMEM; \ - \ - memcpy(style->i.uncommon, &default_uncommon, \ - sizeof(css_computed_uncommon)); \ - } \ -} while(0) - -static const css_computed_page default_page = { - { - (CSS_PAGE_BREAK_INSIDE_AUTO << 6) | - (CSS_PAGE_BREAK_BEFORE_AUTO << 3) | - CSS_PAGE_BREAK_AFTER_AUTO, - (CSS_WIDOWS_SET << 1) | - CSS_ORPHANS_SET - }, - 2 << CSS_RADIX_POINT, - 2 << CSS_RADIX_POINT -}; - -#define ENSURE_PAGE do { \ - if (style->page == NULL) { \ - style->page = malloc(sizeof(css_computed_page)); \ - if (style->page == NULL) \ - return CSS_NOMEM; \ - \ - memcpy(style->page, &default_page, \ - sizeof(css_computed_page)); \ - } \ -} while(0) - -#define LETTER_SPACING_INDEX 0 -#define LETTER_SPACING_SHIFT 2 -#define LETTER_SPACING_MASK 0xfc -static inline css_error set_letter_spacing( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[LETTER_SPACING_INDEX]; - - /* 6bits: uuuutt : unit | type */ - *bits = (*bits & ~LETTER_SPACING_MASK) | - (((type & 0x3) | unit << 2) << LETTER_SPACING_SHIFT); - - style->i.uncommon->i.letter_spacing = length; - - return CSS_OK; -} -#undef LETTER_SPACING_MASK -#undef LETTER_SPACING_SHIFT -#undef LETTER_SPACING_INDEX - -#define OUTLINE_COLOR_INDEX 0 -#define OUTLINE_COLOR_SHIFT 0 -#define OUTLINE_COLOR_MASK 0x3 -static inline css_error set_outline_color( - css_computed_style *style, uint8_t type, css_color color) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[OUTLINE_COLOR_INDEX]; - - /* 2bits: tt : type */ - *bits = (*bits & ~OUTLINE_COLOR_MASK) | - ((type & 0x3) << OUTLINE_COLOR_SHIFT); - - style->i.uncommon->i.outline_color = color; - - return CSS_OK; -} -#undef OUTLINE_COLOR_MASK -#undef OUTLINE_COLOR_SHIFT -#undef OUTLINE_COLOR_INDEX - -#define OUTLINE_WIDTH_INDEX 1 -#define OUTLINE_WIDTH_SHIFT 1 -#define OUTLINE_WIDTH_MASK 0xfe -static inline css_error set_outline_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[OUTLINE_WIDTH_INDEX]; - - /* 7bits: uuuuttt : unit | type */ - *bits = (*bits & ~OUTLINE_WIDTH_MASK) | - (((type & 0x7) | (unit << 3)) << OUTLINE_WIDTH_SHIFT); - - style->i.uncommon->i.outline_width = length; - - return CSS_OK; -} -#undef OUTLINE_WIDTH_MASK -#undef OUTLINE_WIDTH_SHIFT -#undef OUTLINE_WIDTH_INDEX - -#define BORDER_SPACING_INDEX 1 -#define BORDER_SPACING_SHIFT 0 -#define BORDER_SPACING_MASK 0x1 -#define BORDER_SPACING_INDEX1 2 -#define BORDER_SPACING_SHIFT1 0 -static inline css_error set_border_spacing( - css_computed_style *style, uint8_t type, - css_fixed hlength, css_unit hunit, - css_fixed vlength, css_unit vunit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[BORDER_SPACING_INDEX]; - - /* 1 bit: type */ - *bits = (*bits & ~BORDER_SPACING_MASK) | - ((type & 0x1) << BORDER_SPACING_SHIFT); - - bits = &style->i.uncommon->i.bits[BORDER_SPACING_INDEX1]; - - /* 8bits: hhhhvvvv : hunit | vunit */ - *bits = (((hunit << 4) | vunit) << BORDER_SPACING_SHIFT1); - - - style->i.uncommon->i.border_spacing[0] = hlength; - style->i.uncommon->i.border_spacing[1] = vlength; - - return CSS_OK; -} -#undef BORDER_SPACING_SHIFT1 -#undef BORDER_SPACING_INDEX1 -#undef BORDER_SPACING_MASK -#undef BORDER_SPACING_SHIFT -#undef BORDER_SPACING_INDEX - -#define BREAK_AFTER_INDEX 12 -#define BREAK_AFTER_SHIFT 0 -#define BREAK_AFTER_MASK 0xf -static inline css_error set_break_after( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[BREAK_AFTER_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BREAK_AFTER_MASK) | - ((type & 0xf) << BREAK_AFTER_SHIFT); - - return CSS_OK; -} -#undef BREAK_AFTER_MASK -#undef BREAK_AFTER_SHIFT -#undef BREAK_AFTER_INDEX - -#define BREAK_BEFORE_INDEX 12 -#define BREAK_BEFORE_SHIFT 4 -#define BREAK_BEFORE_MASK (0xf << 4) -static inline css_error set_break_before( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[BREAK_BEFORE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BREAK_BEFORE_MASK) | - ((type & 0xf) << BREAK_BEFORE_SHIFT); - - return CSS_OK; -} -#undef BREAK_BEFORE_MASK -#undef BREAK_BEFORE_SHIFT -#undef BREAK_BEFORE_INDEX - -#define BREAK_INSIDE_INDEX 13 -#define BREAK_INSIDE_SHIFT 4 -#define BREAK_INSIDE_MASK (0xf << 4) -static inline css_error set_break_inside( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[BREAK_INSIDE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BREAK_INSIDE_MASK) | - ((type & 0xf) << BREAK_INSIDE_SHIFT); - - return CSS_OK; -} -#undef BREAK_INSIDE_MASK -#undef BREAK_INSIDE_SHIFT -#undef BREAK_INSIDE_INDEX - -#define WORD_SPACING_INDEX 3 -#define WORD_SPACING_SHIFT 2 -#define WORD_SPACING_MASK 0xfc -static inline css_error set_word_spacing( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[WORD_SPACING_INDEX]; - - /* 6bits: uuuutt : unit | type */ - *bits = (*bits & ~WORD_SPACING_MASK) | - (((type & 0x3) | (unit << 2)) << WORD_SPACING_SHIFT); - - style->i.uncommon->i.word_spacing = length; - - return CSS_OK; -} -#undef WORD_SPACING_MASK -#undef WORD_SPACING_SHIFT -#undef WORD_SPACING_INDEX - -#define WRITING_MODE_INDEX 4 -#define WRITING_MODE_SHIFT 1 -#define WRITING_MODE_MASK 0x6 -static inline css_error set_writing_mode( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[WRITING_MODE_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~WRITING_MODE_MASK) | - ((type & 0x3) << WRITING_MODE_SHIFT); - - return CSS_OK; -} -#undef WRITING_MODE_MASK -#undef WRITING_MODE_SHIFT -#undef WRITING_MODE_INDEX - -#define COUNTER_INCREMENT_INDEX 3 -#define COUNTER_INCREMENT_SHIFT 1 -#define COUNTER_INCREMENT_MASK 0x2 -static inline css_error set_counter_increment( - css_computed_style *style, uint8_t type, - css_computed_counter *counters) -{ - uint8_t *bits; - css_computed_counter *oldcounters; - css_computed_counter *c; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COUNTER_INCREMENT_INDEX]; - oldcounters = style->i.uncommon->counter_increment; - - /* 1bit: type */ - *bits = (*bits & ~COUNTER_INCREMENT_MASK) | - ((type & 0x1) << COUNTER_INCREMENT_SHIFT); - - for (c = counters; c != NULL && c->name != NULL; c++) - c->name = lwc_string_ref(c->name); - - style->i.uncommon->counter_increment = counters; - - /* Free existing array */ - if (oldcounters != NULL) { - for (c = oldcounters; c->name != NULL; c++) - lwc_string_unref(c->name); - - if (oldcounters != counters) - free(oldcounters); - } - - return CSS_OK; -} -#undef COUNTER_INCREMENT_MASK -#undef COUNTER_INCREMENT_SHIFT -#undef COUNTER_INCREMENT_INDEX - -#define COUNTER_RESET_INDEX 3 -#define COUNTER_RESET_SHIFT 0 -#define COUNTER_RESET_MASK 0x1 -static inline css_error set_counter_reset( - css_computed_style *style, uint8_t type, - css_computed_counter *counters) -{ - uint8_t *bits; - css_computed_counter *oldcounters; - css_computed_counter *c; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COUNTER_RESET_INDEX]; - oldcounters = style->i.uncommon->counter_reset; - - /* 1bit: type */ - *bits = (*bits & ~COUNTER_RESET_MASK) | - ((type & 0x1) << COUNTER_RESET_SHIFT); - - for (c = counters; c != NULL && c->name != NULL; c++) - c->name = lwc_string_ref(c->name); - - style->i.uncommon->counter_reset = counters; - - /* Free existing array */ - if (oldcounters != NULL) { - for (c = oldcounters; c->name != NULL; c++) - lwc_string_unref(c->name); - - if (oldcounters != counters) - free(oldcounters); - } - - return CSS_OK; -} -#undef COUNTER_RESET_MASK -#undef COUNTER_RESET_SHIFT -#undef COUNTER_RESET_INDEX - -#define CURSOR_INDEX 4 -#define CURSOR_SHIFT 3 -#define CURSOR_MASK 0xf8 -static inline css_error set_cursor( - css_computed_style *style, uint8_t type, - lwc_string **urls) -{ - uint8_t *bits; - lwc_string **oldurls; - lwc_string **s; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[CURSOR_INDEX]; - oldurls = style->i.uncommon->cursor; - - /* 5bits: type */ - *bits = (*bits & ~CURSOR_MASK) | - ((type & 0x1f) << CURSOR_SHIFT); - - for (s = urls; s != NULL && *s != NULL; s++) - *s = lwc_string_ref(*s); - - style->i.uncommon->cursor = urls; - - /* Free existing array */ - if (oldurls != NULL) { - for (s = oldurls; *s != NULL; s++) - lwc_string_unref(*s); - - if (oldurls != urls) - free(oldurls); - } - - return CSS_OK; -} -#undef CURSOR_MASK -#undef CURSOR_SHIFT -#undef CURSOR_INDEX - -#define CLIP_INDEX 7 -#define CLIP_SHIFT 2 -#define CLIP_MASK 0xfc -#define CLIP_INDEX1 5 -#define CLIP_SHIFT1 0 -#define CLIP_INDEX2 6 -#define CLIP_SHIFT2 0 -static inline css_error set_clip( - css_computed_style *style, uint8_t type, - css_computed_clip_rect *rect) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[CLIP_INDEX]; - - /* 6bits: trblyy : top | right | bottom | left | type */ - *bits = (*bits & ~CLIP_MASK) | - ((type & 0x3) << CLIP_SHIFT); - - if (type == CSS_CLIP_RECT) { - *bits |= (((rect->top_auto ? 0x20 : 0) | - (rect->right_auto ? 0x10 : 0) | - (rect->bottom_auto ? 0x8 : 0) | - (rect->left_auto ? 0x4 : 0)) << CLIP_SHIFT); - - bits = &style->i.uncommon->i.bits[CLIP_INDEX1]; - - /* 8bits: ttttrrrr : top | right */ - *bits = (((rect->tunit << 4) | rect->runit) << CLIP_SHIFT1); - - bits = &style->i.uncommon->i.bits[CLIP_INDEX2]; - - /* 8bits: bbbbllll : bottom | left */ - *bits = (((rect->bunit << 4) | rect->lunit) << CLIP_SHIFT2); - - style->i.uncommon->i.clip[0] = rect->top; - style->i.uncommon->i.clip[1] = rect->right; - style->i.uncommon->i.clip[2] = rect->bottom; - style->i.uncommon->i.clip[3] = rect->left; - } - - return CSS_OK; -} -#undef CLIP_SHIFT2 -#undef CLIP_INDEX2 -#undef CLIP_SHIFT1 -#undef CLIP_INDEX1 -#undef CLIP_MASK -#undef CLIP_SHIFT -#undef CLIP_INDEX - -#define COLUMN_COUNT_INDEX 8 -#define COLUMN_COUNT_SHIFT 6 -#define COLUMN_COUNT_MASK 0xc0 -static inline css_error set_column_count( - css_computed_style *style, uint8_t type, int32_t count) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_COUNT_INDEX]; - - /* 2bits: tt : type */ - *bits = (*bits & ~COLUMN_COUNT_MASK) | - ((type & 0x3) << COLUMN_COUNT_SHIFT); - - style->i.uncommon->i.column_count = count; - - return CSS_OK; -} -#undef COLUMN_COUNT_MASK -#undef COLUMN_COUNT_SHIFT -#undef COLUMN_COUNT_INDEX - -#define COLUMN_FILL_INDEX 8 -#define COLUMN_FILL_SHIFT 4 -#define COLUMN_FILL_MASK 0x30 -static inline css_error set_column_fill( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_FILL_INDEX]; - - /* 2bits: tt : type */ - *bits = (*bits & ~COLUMN_FILL_MASK) | - ((type & 0x3) << COLUMN_FILL_SHIFT); - - return CSS_OK; -} -#undef COLUMN_FILL_MASK -#undef COLUMN_FILL_SHIFT -#undef COLUMN_FILL_INDEX - -#define COLUMN_GAP_INDEX 9 -#define COLUMN_GAP_SHIFT 2 -#define COLUMN_GAP_MASK 0xfc -static inline css_error set_column_gap( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_GAP_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~COLUMN_GAP_MASK) | - (((type & 0x3) | (unit << 2)) << COLUMN_GAP_SHIFT); - - style->i.uncommon->i.column_gap = length; - - return CSS_OK; -} -#undef COLUMN_GAP_MASK -#undef COLUMN_GAP_SHIFT -#undef COLUMN_GAP_INDEX - -#define COLUMN_RULE_COLOR_INDEX 9 -#define COLUMN_RULE_COLOR_SHIFT 0 -#define COLUMN_RULE_COLOR_MASK 0x3 -static inline css_error set_column_rule_color( - css_computed_style *style, uint8_t type, - css_color color) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_RULE_COLOR_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~COLUMN_RULE_COLOR_MASK) | - ((type & 0x3) << COLUMN_RULE_COLOR_SHIFT); - - style->i.uncommon->i.column_rule_color = color; - - return CSS_OK; -} -#undef COLUMN_RULE_COLOR_MASK -#undef COLUMN_RULE_COLOR_SHIFT -#undef COLUMN_RULE_COLOR_INDEX - -#define COLUMN_RULE_STYLE_INDEX 8 -#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) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_RULE_STYLE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~COLUMN_RULE_STYLE_MASK) | - ((type & 0xf) << COLUMN_RULE_STYLE_SHIFT); - - return CSS_OK; -} -#undef COLUMN_RULE_STYLE_MASK -#undef COLUMN_RULE_STYLE_SHIFT -#undef COLUMN_RULE_STYLE_INDEX - -#define COLUMN_RULE_WIDTH_INDEX 10 -#define COLUMN_RULE_WIDTH_SHIFT 1 -#define COLUMN_RULE_WIDTH_MASK 0xfe -static inline css_error set_column_rule_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_RULE_WIDTH_INDEX]; - - /* 7bits: uuuuttt : units | type */ - *bits = (*bits & ~COLUMN_RULE_WIDTH_MASK) | - (((type & 0x7) | (unit << 3)) << COLUMN_RULE_WIDTH_SHIFT); - - style->i.uncommon->i.column_rule_width = length; - - return CSS_OK; -} -#undef COLUMN_RULE_WIDTH_MASK -#undef COLUMN_RULE_WIDTH_SHIFT -#undef COLUMN_RULE_WIDTH_INDEX - -#define COLUMN_SPAN_INDEX 11 -#define COLUMN_SPAN_SHIFT 6 -#define COLUMN_SPAN_MASK 0xc0 -static inline css_error set_column_span( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_SPAN_INDEX]; - - /* 2bits: tt : type */ - *bits = (*bits & ~COLUMN_SPAN_MASK) | - ((type & 0x3) << COLUMN_SPAN_SHIFT); - - return CSS_OK; -} -#undef COLUMN_SPAN_MASK -#undef COLUMN_SPAN_SHIFT -#undef COLUMN_SPAN_INDEX - -#define COLUMN_WIDTH_INDEX 11 -#define COLUMN_WIDTH_SHIFT 0 -#define COLUMN_WIDTH_MASK 0x3f -static inline css_error set_column_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits; - - ENSURE_UNCOMMON; - - bits = &style->i.uncommon->i.bits[COLUMN_WIDTH_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~COLUMN_WIDTH_MASK) | - (((type & 0x3) | (unit << 2)) << COLUMN_WIDTH_SHIFT); - - style->i.uncommon->i.column_width = length; - - return CSS_OK; -} -#undef COLUMN_WIDTH_MASK -#undef COLUMN_WIDTH_SHIFT -#undef COLUMN_WIDTH_INDEX - -#define CONTENT_INDEX 7 -#define CONTENT_SHIFT 0 -#define CONTENT_MASK 0x3 -static inline css_error set_content( - css_computed_style *style, uint8_t type, - css_computed_content_item *content) -{ - uint8_t *bits; - css_computed_content_item *oldcontent; - css_computed_content_item *c; - - ENSURE_UNCOMMON; - - /* 2bits: type */ - bits = &style->i.uncommon->i.bits[CONTENT_INDEX]; - oldcontent = style->i.uncommon->content; - - *bits = (*bits & ~CONTENT_MASK) | - ((type & 0x3) << CONTENT_SHIFT); - - for (c = content; c != NULL && - c->type != CSS_COMPUTED_CONTENT_NONE; c++) { - switch (c->type) { - case CSS_COMPUTED_CONTENT_STRING: - c->data.string = lwc_string_ref(c->data.string); - break; - case CSS_COMPUTED_CONTENT_URI: - c->data.uri = lwc_string_ref(c->data.uri); - break; - case CSS_COMPUTED_CONTENT_ATTR: - c->data.attr = lwc_string_ref(c->data.attr); - break; - case CSS_COMPUTED_CONTENT_COUNTER: - c->data.counter.name = - lwc_string_ref(c->data.counter.name); - break; - case CSS_COMPUTED_CONTENT_COUNTERS: - c->data.counters.name = - lwc_string_ref(c->data.counters.name); - c->data.counters.sep = - lwc_string_ref(c->data.counters.sep); - break; - default: - break; - } - } - - style->i.uncommon->content = content; - - /* Free existing array */ - if (oldcontent != NULL) { - for (c = oldcontent; - c->type != CSS_COMPUTED_CONTENT_NONE; c++) { - switch (c->type) { - case CSS_COMPUTED_CONTENT_STRING: - lwc_string_unref(c->data.string); - break; - case CSS_COMPUTED_CONTENT_URI: - lwc_string_unref(c->data.uri); - break; - case CSS_COMPUTED_CONTENT_ATTR: - lwc_string_unref(c->data.attr); - break; - case CSS_COMPUTED_CONTENT_COUNTER: - lwc_string_unref(c->data.counter.name); - break; - case CSS_COMPUTED_CONTENT_COUNTERS: - lwc_string_unref(c->data.counters.name); - lwc_string_unref(c->data.counters.sep); - break; - default: - break; - } - } - - if (oldcontent != content) - free(oldcontent); - } - - return CSS_OK; -} -#undef CONTENT_MASK -#undef CONTENT_SHIFT -#undef CONTENT_INDEX - - -#define VERTICAL_ALIGN_INDEX 0 -#define VERTICAL_ALIGN_SHIFT 0 -static inline css_error set_vertical_align( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[VERTICAL_ALIGN_INDEX]; - - /* 8bits: uuuutttt : units | type */ - *bits = (((type & 0xf) | (unit << 4)) << VERTICAL_ALIGN_SHIFT); - - style->i.vertical_align = length; - - return CSS_OK; -} -#undef VERTICAL_ALIGN_SHIFT -#undef VERTICAL_ALIGN_INDEX - -#define FONT_SIZE_INDEX 1 -#define FONT_SIZE_SHIFT 0 -static inline css_error set_font_size( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[FONT_SIZE_INDEX]; - - /* 8bits: uuuutttt : units | type */ - *bits = (((type & 0xf) | (unit << 4)) << FONT_SIZE_SHIFT); - - style->i.font_size = length; - - return CSS_OK; -} -#undef FONT_SIZE_SHIFT -#undef FONT_SIZE_INDEX - -#define BORDER_TOP_WIDTH_INDEX 2 -#define BORDER_TOP_WIDTH_SHIFT 1 -#define BORDER_TOP_WIDTH_MASK 0xfe -static inline css_error set_border_top_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[BORDER_TOP_WIDTH_INDEX]; - - /* 7bits: uuuuttt : units | type */ - *bits = (*bits & ~BORDER_TOP_WIDTH_MASK) | - (((type & 0x7) | (unit << 3)) << BORDER_TOP_WIDTH_SHIFT); - - style->i.border_width[0] = length; - - return CSS_OK; -} -#undef BORDER_TOP_WIDTH_MASK -#undef BORDER_TOP_WIDTH_SHIFT -#undef BORDER_TOP_WIDTH_INDEX - -#define BORDER_RIGHT_WIDTH_INDEX 3 -#define BORDER_RIGHT_WIDTH_SHIFT 1 -#define BORDER_RIGHT_WIDTH_MASK 0xfe -static inline css_error set_border_right_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[BORDER_RIGHT_WIDTH_INDEX]; - - /* 7bits: uuuuttt : units | type */ - *bits = (*bits & ~BORDER_RIGHT_WIDTH_MASK) | - (((type & 0x7) | (unit << 3)) << BORDER_RIGHT_WIDTH_SHIFT); - - style->i.border_width[1] = length; - - return CSS_OK; -} -#undef BORDER_RIGHT_WIDTH_MASK -#undef BORDER_RIGHT_WIDTH_SHIFT -#undef BORDER_RIGHT_WIDTH_INDEX - -#define BORDER_BOTTOM_WIDTH_INDEX 4 -#define BORDER_BOTTOM_WIDTH_SHIFT 1 -#define BORDER_BOTTOM_WIDTH_MASK 0xfe -static inline css_error set_border_bottom_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[BORDER_BOTTOM_WIDTH_INDEX]; - - /* 7bits: uuuuttt : units | type */ - *bits = (*bits & ~BORDER_BOTTOM_WIDTH_MASK) | - (((type & 0x7) | (unit << 3)) << BORDER_BOTTOM_WIDTH_SHIFT); - - style->i.border_width[2] = length; - - return CSS_OK; -} -#undef BORDER_BOTTOM_WIDTH_MASK -#undef BORDER_BOTTOM_WIDTH_SHIFT -#undef BORDER_BOTTOM_WIDTH_INDEX - -#define BORDER_LEFT_WIDTH_INDEX 5 -#define BORDER_LEFT_WIDTH_SHIFT 1 -#define BORDER_LEFT_WIDTH_MASK 0xfe -static inline css_error set_border_left_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[BORDER_LEFT_WIDTH_INDEX]; - - /* 7bits: uuuuttt : units | type */ - *bits = (*bits & ~BORDER_LEFT_WIDTH_MASK) | - (((type & 0x7) | (unit << 3)) << BORDER_LEFT_WIDTH_SHIFT); - - style->i.border_width[3] = length; - - return CSS_OK; -} -#undef BORDER_LEFT_WIDTH_MASK -#undef BORDER_LEFT_WIDTH_SHIFT -#undef BORDER_LEFT_WIDTH_INDEX - -#define BACKGROUND_IMAGE_INDEX 2 -#define BACKGROUND_IMAGE_SHIFT 0 -#define BACKGROUND_IMAGE_MASK 0x1 -static inline css_error set_background_image( - css_computed_style *style, uint8_t type, - lwc_string *url) -{ - uint8_t *bits = &style->i.bits[BACKGROUND_IMAGE_INDEX]; - lwc_string *oldurl = style->i.background_image; - - /* 1bit: type */ - *bits = (*bits & ~BACKGROUND_IMAGE_MASK) | - ((type & 0x1) << BACKGROUND_IMAGE_SHIFT); - - if (url != NULL) { - style->i.background_image = lwc_string_ref(url); - } else { - style->i.background_image = NULL; - } - - if (oldurl != NULL) - lwc_string_unref(oldurl); - - return CSS_OK; -} -#undef BACKGROUND_IMAGE_MASK -#undef BACKGROUND_IMAGE_SHIFT -#undef BACKGROUND_IMAGE_INDEX - -#define COLOR_INDEX 3 -#define COLOR_SHIFT 0 -#define COLOR_MASK 0x1 -static inline css_error set_color( - css_computed_style *style, uint8_t type, - css_color color) -{ - uint8_t *bits = &style->i.bits[COLOR_INDEX]; - - /* 1bit: type */ - *bits = (*bits & ~COLOR_MASK) | - ((type & 0x1) << COLOR_SHIFT); - - style->i.color = color; - - return CSS_OK; -} -#undef COLOR_MASK -#undef COLOR_SHIFT -#undef COLOR_INDEX - -#define LIST_STYLE_IMAGE_INDEX 4 -#define LIST_STYLE_IMAGE_SHIFT 0 -#define LIST_STYLE_IMAGE_MASK 0x1 -static inline css_error set_list_style_image( - css_computed_style *style, uint8_t type, - lwc_string *url) -{ - uint8_t *bits = &style->i.bits[LIST_STYLE_IMAGE_INDEX]; - lwc_string *oldurl = style->i.list_style_image; - - /* 1bit: type */ - *bits = (*bits & ~LIST_STYLE_IMAGE_MASK) | - ((type & 0x1) << LIST_STYLE_IMAGE_SHIFT); - - if (url != NULL) { - style->i.list_style_image = lwc_string_ref(url); - } else { - style->i.list_style_image = NULL; - } - - if (oldurl != NULL) - lwc_string_unref(oldurl); - - return CSS_OK; -} -#undef LIST_STYLE_IMAGE_MASK -#undef LIST_STYLE_IMAGE_SHIFT -#undef LIST_STYLE_IMAGE_INDEX - -#define QUOTES_INDEX 5 -#define QUOTES_SHIFT 0 -#define QUOTES_MASK 0x1 -static inline css_error set_quotes( - css_computed_style *style, uint8_t type, - lwc_string **quotes) -{ - uint8_t *bits = &style->i.bits[QUOTES_INDEX]; - lwc_string **oldquotes = style->quotes; - lwc_string **s; - - /* 1bit: type */ - *bits = (*bits & ~QUOTES_MASK) | - ((type & 0x1) << QUOTES_SHIFT); - - for (s = quotes; s != NULL && *s != NULL; s++) - *s = lwc_string_ref(*s); - - style->quotes = quotes; - - /* Free current quotes */ - if (oldquotes != NULL) { - for (s = oldquotes; *s != NULL; s++) - lwc_string_unref(*s); - - if (oldquotes != quotes) - free(oldquotes); - } - - return CSS_OK; -} -#undef QUOTES_MASK -#undef QUOTES_SHIFT -#undef QUOTES_INDEX - -#define TOP_INDEX 6 -#define TOP_SHIFT 2 -#define TOP_MASK 0xfc -static inline css_error set_top( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[TOP_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~TOP_MASK) | - (((type & 0x3) | (unit << 2)) << TOP_SHIFT); - - style->i.top = length; - - return CSS_OK; -} -#undef TOP_MASK -#undef TOP_SHIFT -#undef TOP_INDEX - -#define RIGHT_INDEX 7 -#define RIGHT_SHIFT 2 -#define RIGHT_MASK 0xfc -static inline css_error set_right( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[RIGHT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~RIGHT_MASK) | - (((type & 0x3) | (unit << 2)) << RIGHT_SHIFT); - - style->i.right = length; - - return CSS_OK; -} -#undef RIGHT_MASK -#undef RIGHT_SHIFT -#undef RIGHT_INDEX - -#define BOTTOM_INDEX 8 -#define BOTTOM_SHIFT 2 -#define BOTTOM_MASK 0xfc -static inline css_error set_bottom( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[BOTTOM_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~BOTTOM_MASK) | - (((type & 0x3) | (unit << 2)) << BOTTOM_SHIFT); - - style->i.bottom = length; - - return CSS_OK; -} -#undef BOTTOM_MASK -#undef BOTTOM_SHIFT -#undef BOTTOM_INDEX - -#define LEFT_INDEX 9 -#define LEFT_SHIFT 2 -#define LEFT_MASK 0xfc -static inline css_error set_left( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[LEFT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~LEFT_MASK) | - (((type & 0x3) | (unit << 2)) << LEFT_SHIFT); - - style->i.left = length; - - return CSS_OK; -} -#undef LEFT_MASK -#undef LEFT_SHIFT -#undef LEFT_INDEX - -#define BORDER_TOP_COLOR_INDEX 6 -#define BORDER_TOP_COLOR_SHIFT 0 -#define BORDER_TOP_COLOR_MASK 0x3 -static inline css_error set_border_top_color( - css_computed_style *style, uint8_t type, - css_color color) -{ - uint8_t *bits = &style->i.bits[BORDER_TOP_COLOR_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BORDER_TOP_COLOR_MASK) | - ((type & 0x3) << BORDER_TOP_COLOR_SHIFT); - - style->i.border_color[0] = color; - - return CSS_OK; -} -#undef BORDER_TOP_COLOR_MASK -#undef BORDER_TOP_COLOR_SHIFT -#undef BORDER_TOP_COLOR_INDEX - -#define BORDER_RIGHT_COLOR_INDEX 7 -#define BORDER_RIGHT_COLOR_SHIFT 0 -#define BORDER_RIGHT_COLOR_MASK 0x3 -static inline css_error set_border_right_color( - css_computed_style *style, uint8_t type, - css_color color) -{ - uint8_t *bits = &style->i.bits[BORDER_RIGHT_COLOR_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BORDER_RIGHT_COLOR_MASK) | - ((type & 0x3) << BORDER_RIGHT_COLOR_SHIFT); - - style->i.border_color[1] = color; - - return CSS_OK; -} -#undef BORDER_RIGHT_COLOR_MASK -#undef BORDER_RIGHT_COLOR_SHIFT -#undef BORDER_RIGHT_COLOR_INDEX - -#define BORDER_BOTTOM_COLOR_INDEX 8 -#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) -{ - uint8_t *bits = &style->i.bits[BORDER_BOTTOM_COLOR_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BORDER_BOTTOM_COLOR_MASK) | - ((type & 0x3) << BORDER_BOTTOM_COLOR_SHIFT); - - style->i.border_color[2] = color; - - return CSS_OK; -} -#undef BORDER_BOTTOM_COLOR_MASK -#undef BORDER_BOTTOM_COLOR_SHIFT -#undef BORDER_BOTTOM_COLOR_INDEX - -#define BORDER_LEFT_COLOR_INDEX 9 -#define BORDER_LEFT_COLOR_SHIFT 0 -#define BORDER_LEFT_COLOR_MASK 0x3 -static inline css_error set_border_left_color( - css_computed_style *style, uint8_t type, - css_color color) -{ - uint8_t *bits = &style->i.bits[BORDER_LEFT_COLOR_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BORDER_LEFT_COLOR_MASK) | - ((type & 0x3) << BORDER_LEFT_COLOR_SHIFT); - - style->i.border_color[3] = color; - - return CSS_OK; -} -#undef BORDER_LEFT_COLOR_MASK -#undef BORDER_LEFT_COLOR_SHIFT -#undef BORDER_LEFT_COLOR_INDEX - -#define HEIGHT_INDEX 10 -#define HEIGHT_SHIFT 2 -#define HEIGHT_MASK 0xfc -static inline css_error set_height( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[HEIGHT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~HEIGHT_MASK) | - (((type & 0x3) | (unit << 2)) << HEIGHT_SHIFT); - - style->i.height = length; - - return CSS_OK; -} -#undef HEIGHT_MASK -#undef HEIGHT_SHIFT -#undef HEIGHT_INDEX - -#define LINE_HEIGHT_INDEX 11 -#define LINE_HEIGHT_SHIFT 2 -#define LINE_HEIGHT_MASK 0xfc -static inline css_error set_line_height( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[LINE_HEIGHT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~LINE_HEIGHT_MASK) | - (((type & 0x3) | (unit << 2)) << LINE_HEIGHT_SHIFT); - - style->i.line_height = length; - - return CSS_OK; -} -#undef LINE_HEIGHT_MASK -#undef LINE_HEIGHT_SHIFT -#undef LINE_HEIGHT_INDEX - -#define BACKGROUND_COLOR_INDEX 10 -#define BACKGROUND_COLOR_SHIFT 0 -#define BACKGROUND_COLOR_MASK 0x3 -static inline css_error set_background_color( - css_computed_style *style, uint8_t type, - css_color color) -{ - uint8_t *bits = &style->i.bits[BACKGROUND_COLOR_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BACKGROUND_COLOR_MASK) | - ((type & 0x3) << BACKGROUND_COLOR_SHIFT); - - style->i.background_color = color; - - return CSS_OK; -} -#undef BACKGROUND_COLOR_MASK -#undef BACKGROUND_COLOR_SHIFT -#undef BACKGROUND_COLOR_INDEX - -#define Z_INDEX_INDEX 11 -#define Z_INDEX_SHIFT 0 -#define Z_INDEX_MASK 0x3 -static inline css_error set_z_index( - css_computed_style *style, uint8_t type, - int32_t z_index) -{ - uint8_t *bits = &style->i.bits[Z_INDEX_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~Z_INDEX_MASK) | - ((type & 0x3) << Z_INDEX_SHIFT); - - style->i.z_index = z_index; - - return CSS_OK; -} -#undef Z_INDEX_MASK -#undef Z_INDEX_SHIFT -#undef Z_INDEX_INDEX - -#define MARGIN_TOP_INDEX 12 -#define MARGIN_TOP_SHIFT 2 -#define MARGIN_TOP_MASK 0xfc -static inline css_error set_margin_top( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MARGIN_TOP_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MARGIN_TOP_MASK) | - (((type & 0x3) | (unit << 2)) << MARGIN_TOP_SHIFT); - - style->i.margin[0] = length; - - return CSS_OK; -} -#undef MARGIN_TOP_MASK -#undef MARGIN_TOP_SHIFT -#undef MARGIN_TOP_INDEX - -#define MARGIN_RIGHT_INDEX 13 -#define MARGIN_RIGHT_SHIFT 2 -#define MARGIN_RIGHT_MASK 0xfc -static inline css_error set_margin_right( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MARGIN_RIGHT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MARGIN_RIGHT_MASK) | - (((type & 0x3) | (unit << 2)) << MARGIN_RIGHT_SHIFT); - - style->i.margin[1] = length; - - return CSS_OK; -} -#undef MARGIN_RIGHT_MASK -#undef MARGIN_RIGHT_SHIFT -#undef MARGIN_RIGHT_INDEX - -#define MARGIN_BOTTOM_INDEX 14 -#define MARGIN_BOTTOM_SHIFT 2 -#define MARGIN_BOTTOM_MASK 0xfc -static inline css_error set_margin_bottom( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MARGIN_BOTTOM_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MARGIN_BOTTOM_MASK) | - (((type & 0x3) | (unit << 2)) << MARGIN_BOTTOM_SHIFT); - - style->i.margin[2] = length; - - return CSS_OK; -} -#undef MARGIN_BOTTOM_MASK -#undef MARGIN_BOTTOM_SHIFT -#undef MARGIN_BOTTOM_INDEX - -#define MARGIN_LEFT_INDEX 15 -#define MARGIN_LEFT_SHIFT 2 -#define MARGIN_LEFT_MASK 0xfc -static inline css_error set_margin_left( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MARGIN_LEFT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MARGIN_LEFT_MASK) | - (((type & 0x3) | (unit << 2)) << MARGIN_LEFT_SHIFT); - - style->i.margin[3] = length; - - return CSS_OK; -} -#undef MARGIN_LEFT_MASK -#undef MARGIN_LEFT_SHIFT -#undef MARGIN_LEFT_INDEX - -#define BACKGROUND_ATTACHMENT_INDEX 12 -#define BACKGROUND_ATTACHMENT_SHIFT 0 -#define BACKGROUND_ATTACHMENT_MASK 0x3 -static inline css_error set_background_attachment( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BACKGROUND_ATTACHMENT_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BACKGROUND_ATTACHMENT_MASK) | - ((type & 0x3) << BACKGROUND_ATTACHMENT_SHIFT); - - return CSS_OK; -} -#undef BACKGROUND_ATTACHMENT_MASK -#undef BACKGROUND_ATTACHMENT_SHIFT -#undef BACKGROUND_ATTACHMENT_INDEX - -#define BOX_SIZING_INDEX 23 -#define BOX_SIZING_SHIFT 0 -#define BOX_SIZING_MASK 0x3 -static inline css_error set_box_sizing( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BOX_SIZING_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BOX_SIZING_MASK) | - ((type & 0x3) << BOX_SIZING_SHIFT); - - return CSS_OK; -} -#undef BOX_SIZING_MASK -#undef BOX_SIZING_SHIFT -#undef BOX_SIZING_INDEX - -#define BORDER_COLLAPSE_INDEX 13 -#define BORDER_COLLAPSE_SHIFT 0 -#define BORDER_COLLAPSE_MASK 0x3 -static inline css_error set_border_collapse( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BORDER_COLLAPSE_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~BORDER_COLLAPSE_MASK) | - ((type & 0x3) << BORDER_COLLAPSE_SHIFT); - - return CSS_OK; -} -#undef BORDER_COLLAPSE_MASK -#undef BORDER_COLLAPSE_SHIFT -#undef BORDER_COLLAPSE_INDEX - -#define CAPTION_SIDE_INDEX 14 -#define CAPTION_SIDE_SHIFT 0 -#define CAPTION_SIDE_MASK 0x3 -static inline css_error set_caption_side( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[CAPTION_SIDE_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~CAPTION_SIDE_MASK) | - ((type & 0x3) << CAPTION_SIDE_SHIFT); - - return CSS_OK; -} -#undef CAPTION_SIDE_MASK -#undef CAPTION_SIDE_SHIFT -#undef CAPTION_SIDE_INDEX - -#define DIRECTION_INDEX 15 -#define DIRECTION_SHIFT 0 -#define DIRECTION_MASK 0x3 -static inline css_error set_direction( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[DIRECTION_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~DIRECTION_MASK) | - ((type & 0x3) << DIRECTION_SHIFT); - - return CSS_OK; -} -#undef DIRECTION_MASK -#undef DIRECTION_SHIFT -#undef DIRECTION_INDEX - -#define MAX_HEIGHT_INDEX 16 -#define MAX_HEIGHT_SHIFT 2 -#define MAX_HEIGHT_MASK 0xfc -static inline css_error set_max_height( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MAX_HEIGHT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MAX_HEIGHT_MASK) | - (((type & 0x3) | (unit << 2)) << MAX_HEIGHT_SHIFT); - - style->i.max_height = length; - - return CSS_OK; -} -#undef MAX_HEIGHT_MASK -#undef MAX_HEIGHT_SHIFT -#undef MAX_HEIGHT_INDEX - -#define MAX_WIDTH_INDEX 17 -#define MAX_WIDTH_SHIFT 2 -#define MAX_WIDTH_MASK 0xfc -static inline css_error set_max_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MAX_WIDTH_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MAX_WIDTH_MASK) | - (((type & 0x3) | (unit << 2)) << MAX_WIDTH_SHIFT); - - style->i.max_width = length; - - return CSS_OK; -} -#undef MAX_WIDTH_MASK -#undef MAX_WIDTH_SHIFT -#undef MAX_WIDTH_INDEX - -#define WIDTH_INDEX 18 -#define WIDTH_SHIFT 2 -#define WIDTH_MASK 0xfc -static inline css_error set_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[WIDTH_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~WIDTH_MASK) | - (((type & 0x3) | (unit << 2)) << WIDTH_SHIFT); - - style->i.width = length; - - return CSS_OK; -} -#undef WIDTH_MASK -#undef WIDTH_SHIFT -#undef WIDTH_INDEX - -#define EMPTY_CELLS_INDEX 16 -#define EMPTY_CELLS_SHIFT 0 -#define EMPTY_CELLS_MASK 0x3 -static inline css_error set_empty_cells( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[EMPTY_CELLS_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~EMPTY_CELLS_MASK) | - ((type & 0x3) << EMPTY_CELLS_SHIFT); - - return CSS_OK; -} -#undef EMPTY_CELLS_MASK -#undef EMPTY_CELLS_SHIFT -#undef EMPTY_CELLS_INDEX - -#define FLOAT_INDEX 17 -#define FLOAT_SHIFT 0 -#define FLOAT_MASK 0x3 -static inline css_error set_float( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[FLOAT_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~FLOAT_MASK) | - ((type & 0x3) << FLOAT_SHIFT); - - return CSS_OK; -} -#undef FLOAT_MASK -#undef FLOAT_SHIFT -#undef FLOAT_INDEX - -#define FONT_STYLE_INDEX 18 -#define FONT_STYLE_SHIFT 0 -#define FONT_STYLE_MASK 0x3 -static inline css_error set_font_style( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[FONT_STYLE_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~FONT_STYLE_MASK) | - ((type & 0x3) << FONT_STYLE_SHIFT); - - return CSS_OK; -} -#undef FONT_STYLE_MASK -#undef FONT_STYLE_SHIFT -#undef FONT_STYLE_INDEX - -#define MIN_HEIGHT_INDEX 19 -#define MIN_HEIGHT_SHIFT 2 -#define MIN_HEIGHT_MASK 0xfc -static inline css_error set_min_height( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MIN_HEIGHT_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MIN_HEIGHT_MASK) | - (((type & 0x3) | (unit << 2)) << MIN_HEIGHT_SHIFT); - - style->i.min_height = length; - - return CSS_OK; -} -#undef MIN_HEIGHT_MASK -#undef MIN_HEIGHT_SHIFT -#undef MIN_HEIGHT_INDEX - -#define MIN_WIDTH_INDEX 20 -#define MIN_WIDTH_SHIFT 2 -#define MIN_WIDTH_MASK 0xfc -static inline css_error set_min_width( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[MIN_WIDTH_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~MIN_WIDTH_MASK) | - (((type & 0x3) | (unit << 2)) << MIN_WIDTH_SHIFT); - - style->i.min_width = length; - - return CSS_OK; -} -#undef MIN_WIDTH_MASK -#undef MIN_WIDTH_SHIFT -#undef MIN_WIDTH_INDEX - -#define BACKGROUND_REPEAT_INDEX 34 -#define BACKGROUND_REPEAT_SHIFT 2 -#define BACKGROUND_REPEAT_MASK 0x1c -static inline css_error set_background_repeat( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BACKGROUND_REPEAT_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~BACKGROUND_REPEAT_MASK) | - ((type & 0x7) << BACKGROUND_REPEAT_SHIFT); - - return CSS_OK; -} -#undef BACKGROUND_REPEAT_MASK -#undef BACKGROUND_REPEAT_SHIFT -#undef BACKGROUND_REPEAT_INDEX - -#define CLEAR_INDEX 36 -#define CLEAR_SHIFT 2 -#define CLEAR_MASK 0x1c -static inline css_error set_clear( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[CLEAR_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~CLEAR_MASK) | - ((type & 0x7) << CLEAR_SHIFT); - - return CSS_OK; -} -#undef CLEAR_MASK -#undef CLEAR_SHIFT -#undef CLEAR_INDEX - -#define PADDING_TOP_INDEX 21 -#define PADDING_TOP_SHIFT 3 -#define PADDING_TOP_MASK 0xf8 -static inline css_error set_padding_top( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[PADDING_TOP_INDEX]; - - /* 5bits: uuuut : units | type */ - *bits = (*bits & ~PADDING_TOP_MASK) | - (((type & 0x1) | (unit << 1)) << PADDING_TOP_SHIFT); - - style->i.padding[0] = length; - - return CSS_OK; -} -#undef PADDING_TOP_MASK -#undef PADDING_TOP_SHIFT -#undef PADDING_TOP_INDEX - -#define PADDING_RIGHT_INDEX 22 -#define PADDING_RIGHT_SHIFT 3 -#define PADDING_RIGHT_MASK 0xf8 -static inline css_error set_padding_right( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[PADDING_RIGHT_INDEX]; - - /* 5bits: uuuut : units | type */ - *bits = (*bits & ~PADDING_RIGHT_MASK) | - (((type & 0x1) | (unit << 1)) << PADDING_RIGHT_SHIFT); - - style->i.padding[1] = length; - - return CSS_OK; -} -#undef PADDING_RIGHT_MASK -#undef PADDING_RIGHT_SHIFT -#undef PADDING_RIGHT_INDEX - -#define PADDING_BOTTOM_INDEX 23 -#define PADDING_BOTTOM_SHIFT 3 -#define PADDING_BOTTOM_MASK 0xf8 -static inline css_error set_padding_bottom( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[PADDING_BOTTOM_INDEX]; - - /* 5bits: uuuut : units | type */ - *bits = (*bits & ~PADDING_BOTTOM_MASK) | - (((type & 0x1) | (unit << 1)) << PADDING_BOTTOM_SHIFT); - - style->i.padding[2] = length; - - return CSS_OK; -} -#undef PADDING_BOTTOM_MASK -#undef PADDING_BOTTOM_SHIFT -#undef PADDING_BOTTOM_INDEX - -#define PADDING_LEFT_INDEX 24 -#define PADDING_LEFT_SHIFT 3 -#define PADDING_LEFT_MASK 0xf8 -static inline css_error set_padding_left( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[PADDING_LEFT_INDEX]; - - /* 5bits: uuuut : units | type */ - *bits = (*bits & ~PADDING_LEFT_MASK) | - (((type & 0x1) | (unit << 1)) << PADDING_LEFT_SHIFT); - - style->i.padding[3] = length; - - return CSS_OK; -} -#undef PADDING_LEFT_MASK -#undef PADDING_LEFT_SHIFT -#undef PADDING_LEFT_INDEX - -#define OVERFLOW_X_INDEX 21 -#define OVERFLOW_X_SHIFT 0 -#define OVERFLOW_X_MASK 0x7 -static inline css_error set_overflow_x( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[OVERFLOW_X_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~OVERFLOW_X_MASK) | - ((type & 0x7) << OVERFLOW_X_SHIFT); - - return CSS_OK; -} -#undef OVERFLOW_X_MASK -#undef OVERFLOW_X_SHIFT -#undef OVERFLOW_X_INDEX - -#define OVERFLOW_Y_INDEX 34 -#define OVERFLOW_Y_SHIFT 5 -#define OVERFLOW_Y_MASK 0xe0 -static inline css_error set_overflow_y( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[OVERFLOW_Y_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~OVERFLOW_Y_MASK) | - ((type & 0x7) << OVERFLOW_Y_SHIFT); - - return CSS_OK; -} -#undef OVERFLOW_Y_MASK -#undef OVERFLOW_Y_SHIFT -#undef OVERFLOW_Y_INDEX - -#define POSITION_INDEX 22 -#define POSITION_SHIFT 0 -#define POSITION_MASK 0x7 -static inline css_error set_position( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[POSITION_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~POSITION_MASK) | - ((type & 0x7) << POSITION_SHIFT); - - return CSS_OK; -} -#undef POSITION_MASK -#undef POSITION_SHIFT -#undef POSITION_INDEX - -#define OPACITY_INDEX 23 -#define OPACITY_SHIFT 2 -#define OPACITY_MASK 0x04 -static inline css_error set_opacity( - css_computed_style *style, - uint8_t type, css_fixed opacity) -{ - uint8_t *bits = &style->i.bits[OPACITY_INDEX]; - - /* 1bit: t : type */ - *bits = (*bits & ~OPACITY_MASK) | - ((type & 0x1) << OPACITY_SHIFT); - - style->i.opacity = opacity; - - return CSS_OK; -} -#undef OPACITY_MASK -#undef OPACITY_SHIFT -#undef OPACITY_INDEX - -#define TEXT_TRANSFORM_INDEX 24 -#define TEXT_TRANSFORM_SHIFT 0 -#define TEXT_TRANSFORM_MASK 0x7 -static inline css_error set_text_transform( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[TEXT_TRANSFORM_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~TEXT_TRANSFORM_MASK) | - ((type & 0x7) << TEXT_TRANSFORM_SHIFT); - - return CSS_OK; -} -#undef TEXT_TRANSFORM_MASK -#undef TEXT_TRANSFORM_SHIFT -#undef TEXT_TRANSFORM_INDEX - -#define TEXT_INDENT_INDEX 25 -#define TEXT_INDENT_SHIFT 3 -#define TEXT_INDENT_MASK 0xf8 -static inline css_error set_text_indent( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[TEXT_INDENT_INDEX]; - - /* 5bits: uuuut : units | type */ - *bits = (*bits & ~TEXT_INDENT_MASK) | - (((type & 0x1) | (unit << 1)) << TEXT_INDENT_SHIFT); - - style->i.text_indent = length; - - return CSS_OK; -} -#undef TEXT_INDENT_MASK -#undef TEXT_INDENT_SHIFT -#undef TEXT_INDENT_INDEX - -#define WHITE_SPACE_INDEX 25 -#define WHITE_SPACE_SHIFT 0 -#define WHITE_SPACE_MASK 0x7 -static inline css_error set_white_space( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[WHITE_SPACE_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~WHITE_SPACE_MASK) | - ((type & 0x7) << WHITE_SPACE_SHIFT); - - return CSS_OK; -} -#undef WHITE_SPACE_MASK -#undef WHITE_SPACE_SHIFT -#undef WHITE_SPACE_INDEX - -#define BACKGROUND_POSITION_INDEX 27 -#define BACKGROUND_POSITION_SHIFT 7 -#define BACKGROUND_POSITION_MASK 0x80 -#define BACKGROUND_POSITION_INDEX1 26 -#define BACKGROUND_POSITION_SHIFT1 0 -static inline css_error set_background_position( - css_computed_style *style, uint8_t type, - css_fixed hlength, css_unit hunit, - css_fixed vlength, css_unit vunit) -{ - uint8_t *bits; - - bits = &style->i.bits[BACKGROUND_POSITION_INDEX]; - - /* 1 bit: type */ - *bits = (*bits & ~BACKGROUND_POSITION_MASK) | - ((type & 0x1) << BACKGROUND_POSITION_SHIFT); - - bits = &style->i.bits[BACKGROUND_POSITION_INDEX1]; - - /* 8bits: hhhhvvvv : hunit | vunit */ - *bits = (((hunit << 4) | vunit) << BACKGROUND_POSITION_SHIFT1); - - style->i.background_position[0] = hlength; - style->i.background_position[1] = vlength; - - return CSS_OK; -} -#undef BACKGROUND_POSITION_SHIFT1 -#undef BACKGROUND_POSITION_INDEX1 -#undef BACKGROUND_POSITION_MASK -#undef BACKGROUND_POSITION_SHIFT -#undef BACKGROUND_POSITION_INDEX - -#define DISPLAY_INDEX 27 -#define DISPLAY_SHIFT 2 -#define DISPLAY_MASK 0x7c -static inline css_error set_display( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[DISPLAY_INDEX]; - - /* 5bits: type */ - *bits = (*bits & ~DISPLAY_MASK) | - ((type & 0x1f) << DISPLAY_SHIFT); - - return CSS_OK; -} -#undef DISPLAY_MASK -#undef DISPLAY_SHIFT -#undef DISPLAY_INDEX - -#define FONT_VARIANT_INDEX 27 -#define FONT_VARIANT_SHIFT 0 -#define FONT_VARIANT_MASK 0x3 -static inline css_error set_font_variant( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[FONT_VARIANT_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~FONT_VARIANT_MASK) | - ((type & 0x3) << FONT_VARIANT_SHIFT); - - return CSS_OK; -} -#undef FONT_VARIANT_MASK -#undef FONT_VARIANT_SHIFT -#undef FONT_VARIANT_INDEX - -#define TEXT_DECORATION_INDEX 28 -#define TEXT_DECORATION_SHIFT 3 -#define TEXT_DECORATION_MASK 0xf8 -static inline css_error set_text_decoration( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[TEXT_DECORATION_INDEX]; - - /* 5bits: type */ - *bits = (*bits & ~TEXT_DECORATION_MASK) | - ((type & 0x1f) << TEXT_DECORATION_SHIFT); - - return CSS_OK; -} -#undef TEXT_DECORATION_MASK -#undef TEXT_DECORATION_SHIFT -#undef TEXT_DECORATION_INDEX - -#define FONT_FAMILY_INDEX 28 -#define FONT_FAMILY_SHIFT 0 -#define FONT_FAMILY_MASK 0x7 -static inline css_error set_font_family( - css_computed_style *style, uint8_t type, - lwc_string **names) -{ - uint8_t *bits = &style->i.bits[FONT_FAMILY_INDEX]; - lwc_string **oldnames = style->font_family; - lwc_string **s; - - /* 3bits: type */ - *bits = (*bits & ~FONT_FAMILY_MASK) | - ((type & 0x7) << FONT_FAMILY_SHIFT); - - for (s = names; s != NULL && *s != NULL; s++) - *s = lwc_string_ref(*s); - - style->font_family = names; - - /* Free existing families */ - if (oldnames != NULL) { - for (s = oldnames; *s != NULL; s++) - lwc_string_unref(*s); - - if (oldnames != names) - free(oldnames); - } - - return CSS_OK; -} -#undef FONT_FAMILY_MASK -#undef FONT_FAMILY_SHIFT -#undef FONT_FAMILY_INDEX - -#define BORDER_TOP_STYLE_INDEX 29 -#define BORDER_TOP_STYLE_SHIFT 4 -#define BORDER_TOP_STYLE_MASK 0xf0 -static inline css_error set_border_top_style( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BORDER_TOP_STYLE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BORDER_TOP_STYLE_MASK) | - ((type & 0xf) << BORDER_TOP_STYLE_SHIFT); - - return CSS_OK; -} -#undef BORDER_TOP_STYLE_MASK -#undef BORDER_TOP_STYLE_SHIFT -#undef BORDER_TOP_STYLE_INDEX - -#define BORDER_RIGHT_STYLE_INDEX 29 -#define BORDER_RIGHT_STYLE_SHIFT 0 -#define BORDER_RIGHT_STYLE_MASK 0xf -static inline css_error set_border_right_style( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BORDER_RIGHT_STYLE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BORDER_RIGHT_STYLE_MASK) | - ((type & 0xf) << BORDER_RIGHT_STYLE_SHIFT); - - return CSS_OK; -} -#undef BORDER_RIGHT_STYLE_MASK -#undef BORDER_RIGHT_STYLE_SHIFT -#undef BORDER_RIGHT_STYLE_INDEX - -#define BORDER_BOTTOM_STYLE_INDEX 30 -#define BORDER_BOTTOM_STYLE_SHIFT 4 -#define BORDER_BOTTOM_STYLE_MASK 0xf0 -static inline css_error set_border_bottom_style( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BORDER_BOTTOM_STYLE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BORDER_BOTTOM_STYLE_MASK) | - ((type & 0xf) << BORDER_BOTTOM_STYLE_SHIFT); - - return CSS_OK; -} -#undef BORDER_BOTTOM_STYLE_MASK -#undef BORDER_BOTTOM_STYLE_SHIFT -#undef BORDER_BOTTOM_STYLE_INDEX - -#define BORDER_LEFT_STYLE_INDEX 30 -#define BORDER_LEFT_STYLE_SHIFT 0 -#define BORDER_LEFT_STYLE_MASK 0xf -static inline css_error set_border_left_style( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[BORDER_LEFT_STYLE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~BORDER_LEFT_STYLE_MASK) | - ((type & 0xf) << BORDER_LEFT_STYLE_SHIFT); - - return CSS_OK; -} -#undef BORDER_LEFT_STYLE_MASK -#undef BORDER_LEFT_STYLE_SHIFT -#undef BORDER_LEFT_STYLE_INDEX - -#define FONT_WEIGHT_INDEX 31 -#define FONT_WEIGHT_SHIFT 4 -#define FONT_WEIGHT_MASK 0xf0 -static inline css_error set_font_weight( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[FONT_WEIGHT_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~FONT_WEIGHT_MASK) | - ((type & 0xf) << FONT_WEIGHT_SHIFT); - - return CSS_OK; -} -#undef FONT_WEIGHT_MASK -#undef FONT_WEIGHT_SHIFT -#undef FONT_WEIGHT_INDEX - -#define LIST_STYLE_TYPE_INDEX 31 -#define LIST_STYLE_TYPE_SHIFT 0 -#define LIST_STYLE_TYPE_MASK 0xf -static inline css_error set_list_style_type( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[LIST_STYLE_TYPE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~LIST_STYLE_TYPE_MASK) | - ((type & 0xf) << LIST_STYLE_TYPE_SHIFT); - - return CSS_OK; -} -#undef LIST_STYLE_TYPE_MASK -#undef LIST_STYLE_TYPE_SHIFT -#undef LIST_STYLE_TYPE_INDEX - -#define OUTLINE_STYLE_INDEX 32 -#define OUTLINE_STYLE_SHIFT 4 -#define OUTLINE_STYLE_MASK 0xf0 -static inline css_error set_outline_style( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[OUTLINE_STYLE_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~OUTLINE_STYLE_MASK) | - ((type & 0xf) << OUTLINE_STYLE_SHIFT); - - return CSS_OK; -} -#undef OUTLINE_STYLE_MASK -#undef OUTLINE_STYLE_SHIFT -#undef OUTLINE_STYLE_INDEX - -#define TABLE_LAYOUT_INDEX 32 -#define TABLE_LAYOUT_SHIFT 2 -#define TABLE_LAYOUT_MASK 0xc -static inline css_error set_table_layout( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[TABLE_LAYOUT_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~TABLE_LAYOUT_MASK) | - ((type & 0x3) << TABLE_LAYOUT_SHIFT); - - return CSS_OK; -} -#undef TABLE_LAYOUT_MASK -#undef TABLE_LAYOUT_SHIFT -#undef TABLE_LAYOUT_INDEX - -#define UNICODE_BIDI_INDEX 32 -#define UNICODE_BIDI_SHIFT 0 -#define UNICODE_BIDI_MASK 0x3 -static inline css_error set_unicode_bidi( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[UNICODE_BIDI_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~UNICODE_BIDI_MASK) | - ((type & 0x3) << UNICODE_BIDI_SHIFT); - - return CSS_OK; -} -#undef UNICODE_BIDI_MASK -#undef UNICODE_BIDI_SHIFT -#undef UNICODE_BIDI_INDEX - -#define VISIBILITY_INDEX 33 -#define VISIBILITY_SHIFT 6 -#define VISIBILITY_MASK 0xc0 -static inline css_error set_visibility( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[VISIBILITY_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~VISIBILITY_MASK) | - ((type & 0x3) << VISIBILITY_SHIFT); - - return CSS_OK; -} -#undef VISIBILITY_MASK -#undef VISIBILITY_SHIFT -#undef VISIBILITY_INDEX - -#define LIST_STYLE_POSITION_INDEX 33 -#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) -{ - uint8_t *bits = &style->i.bits[LIST_STYLE_POSITION_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~LIST_STYLE_POSITION_MASK) | - ((type & 0x3) << LIST_STYLE_POSITION_SHIFT); - - return CSS_OK; -} -#undef LIST_STYLE_POSITION_MASK -#undef LIST_STYLE_POSITION_SHIFT -#undef LIST_STYLE_POSITION_INDEX - -#define TEXT_ALIGN_INDEX 33 -#define TEXT_ALIGN_SHIFT 0 -#define TEXT_ALIGN_MASK 0xf -static inline uint8_t set_text_align( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[TEXT_ALIGN_INDEX]; - - /* 4bits: type */ - *bits = (*bits & ~TEXT_ALIGN_MASK) | - ((type & 0xf) << TEXT_ALIGN_SHIFT); - - return CSS_OK; -} -#undef TEXT_ALIGN_MASK -#undef TEXT_ALIGN_SHIFT -#undef TEXT_ALIGN_INDEX - -#define PAGE_BREAK_AFTER_INDEX 0 -#define PAGE_BREAK_AFTER_SHIFT 0 -#define PAGE_BREAK_AFTER_MASK 0x7 -static inline css_error set_page_break_after( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - if (style->page == NULL) { - if (type == CSS_PAGE_BREAK_AFTER_AUTO) { - return CSS_OK; - } - } - - ENSURE_PAGE; - - bits = &style->page->bits[PAGE_BREAK_AFTER_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~PAGE_BREAK_AFTER_MASK) | - ((type & 0x7) << PAGE_BREAK_AFTER_SHIFT); - - return CSS_OK; -} -#undef PAGE_BREAK_AFTER_INDEX -#undef PAGE_BREAK_AFTER_SHIFT -#undef PAGE_BREAK_AFTER_MASK - -#define PAGE_BREAK_BEFORE_INDEX 0 -#define PAGE_BREAK_BEFORE_SHIFT 3 -#define PAGE_BREAK_BEFORE_MASK 0x38 -static inline css_error set_page_break_before( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - if (style->page == NULL) { - if (type == CSS_PAGE_BREAK_BEFORE_AUTO) { - return CSS_OK; - } - } - - ENSURE_PAGE; - - bits = &style->page->bits[PAGE_BREAK_BEFORE_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~PAGE_BREAK_BEFORE_MASK) | - ((type & 0x7) << PAGE_BREAK_BEFORE_SHIFT); - - return CSS_OK; -} -#undef PAGE_BREAK_BEFORE_INDEX -#undef PAGE_BREAK_BEFORE_SHIFT -#undef PAGE_BREAK_BEFORE_MASK - -#define PAGE_BREAK_INSIDE_INDEX 0 -#define PAGE_BREAK_INSIDE_SHIFT 6 -#define PAGE_BREAK_INSIDE_MASK 0xc0 -static inline css_error set_page_break_inside( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits; - - if (style->page == NULL) { - if (type == CSS_PAGE_BREAK_INSIDE_AUTO) { - return CSS_OK; - } - } - - ENSURE_PAGE; - - bits = &style->page->bits[PAGE_BREAK_INSIDE_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~PAGE_BREAK_INSIDE_MASK) | - ((type & 0x3) << PAGE_BREAK_INSIDE_SHIFT); - - return CSS_OK; -} -#undef PAGE_BREAK_INSIDE_INDEX -#undef PAGE_BREAK_INSIDE_SHIFT -#undef PAGE_BREAK_INSIDE_MASK - -#define ORPHANS_INDEX 1 -#define ORPHANS_SHIFT 0 -#define ORPHANS_MASK 0x1 -static inline css_error set_orphans( - css_computed_style *style, uint8_t type, int32_t count) -{ - uint8_t *bits; - - if (style->page == NULL) { - if (type == CSS_ORPHANS_SET && count == 2) { - return CSS_OK; - } - } - - ENSURE_PAGE; - - bits = &style->page->bits[ORPHANS_INDEX]; - - /* 1bit: type */ - *bits = (*bits & ~ORPHANS_MASK) | ((type & 0x1) << ORPHANS_SHIFT); - - style->page->orphans = count; - - return CSS_OK; -} -#undef ORPHANS_INDEX -#undef ORPHANS_SHIFT -#undef ORPHANS_MASK - -#define WIDOWS_INDEX 1 -#define WIDOWS_SHIFT 1 -#define WIDOWS_MASK 0x2 -static inline css_error set_widows( - css_computed_style *style, uint8_t type, int32_t count) -{ - uint8_t *bits; - - if (style->page == NULL) { - if (type == CSS_WIDOWS_SET && count == 2) { - return CSS_OK; - } - } - - ENSURE_PAGE; - - bits = &style->page->bits[WIDOWS_INDEX]; - - /* 1bit: type */ - *bits = (*bits & ~WIDOWS_MASK) | ((type & 0x1) << WIDOWS_SHIFT); - - style->page->widows = count; - - return CSS_OK; -} -#undef WIDOWS_INDEX -#undef WIDOWS_SHIFT -#undef WIDOWS_MASK - -#define ALIGN_CONTENT_INDEX_A 34 -#define ALIGN_CONTENT_SHIFT_A 0 -#define ALIGN_CONTENT_MASK_A 0x3 -#define ALIGN_CONTENT_INDEX_B 35 -#define ALIGN_CONTENT_SHIFT_B 1 -#define ALIGN_CONTENT_MASK_B 0x2 -static inline css_error set_align_content( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits_a = &style->i.bits[ALIGN_CONTENT_INDEX_A]; - uint8_t *bits_b = &style->i.bits[ALIGN_CONTENT_INDEX_B]; - - /* type is 3bits: assigning the least significant two */ - *bits_a = (*bits_a & ~ALIGN_CONTENT_MASK_A) | - ((type & 0x3) << ALIGN_CONTENT_SHIFT_A); - - /* type is 3bits: assigning the most significant one */ - *bits_b = (*bits_b & ~ALIGN_CONTENT_MASK_B) | - (((type & 0x4) >> 2) << ALIGN_CONTENT_SHIFT_B); - - return CSS_OK; -} -#undef ALIGN_CONTENT_MASK_A -#undef ALIGN_CONTENT_SHIFT_A -#undef ALIGN_CONTENT_INDEX_A -#undef ALIGN_CONTENT_MASK_B -#undef ALIGN_CONTENT_SHIFT_B -#undef ALIGN_CONTENT_INDEX_B - -#define FLEX_WRAP_INDEX 19 -#define FLEX_WRAP_SHIFT 0 -#define FLEX_WRAP_MASK 0x3 -static inline css_error set_flex_wrap( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[FLEX_WRAP_INDEX]; - - /* 2bits: type */ - *bits = (*bits & ~FLEX_WRAP_MASK) | - ((type & 0x3) << FLEX_WRAP_SHIFT); - - return CSS_OK; -} -#undef FLEX_WRAP_MASK -#undef FLEX_WRAP_SHIFT -#undef FLEX_WRAP_INDEX - -#define FLEX_BASIS_INDEX 35 -#define FLEX_BASIS_SHIFT 2 -#define FLEX_BASIS_MASK 0xfc -static inline css_error set_flex_basis( - css_computed_style *style, uint8_t type, - css_fixed length, css_unit unit) -{ - uint8_t *bits = &style->i.bits[FLEX_BASIS_INDEX]; - - /* 6bits: uuuutt : units | type */ - *bits = (*bits & ~FLEX_BASIS_MASK) | - (((type & 0x3) | (unit << 2)) << FLEX_BASIS_SHIFT); - - style->i.flex_basis = length; - - return CSS_OK; -} - -#undef FLEX_BASIS_MASK -#undef FLEX_BASIS_SHIFT -#undef FLEX_BASIS_INDEX - -#define FLEX_SHRINK_INDEX 20 -#define FLEX_SHRINK_SHIFT 1 -#define FLEX_SHRINK_MASK 0x2 -static inline css_error set_flex_shrink( - css_computed_style *style, uint8_t type, - css_fixed number) -{ - uint8_t *bits = &style->i.bits[FLEX_SHRINK_INDEX]; - - /* 1bit: type */ - *bits = (*bits & ~FLEX_SHRINK_MASK) | - ((type & 0x1) << FLEX_SHRINK_SHIFT); - - style->i.flex_shrink = number; - - return CSS_OK; -} - -#undef FLEX_SHRINK_MASK -#undef FLEX_SHRINK_SHIFT -#undef FLEX_SHRINK_INDEX - -#define FLEX_GROW_INDEX 20 -#define FLEX_GROW_SHIFT 0 -#define FLEX_GROW_MASK 0x1 -static inline css_error set_flex_grow( - css_computed_style *style, uint8_t type, - css_fixed number) -{ - uint8_t *bits = &style->i.bits[FLEX_GROW_INDEX]; - - /* 1bit: type */ - *bits = (*bits & ~FLEX_GROW_MASK) | - ((type & 0x1) << FLEX_GROW_SHIFT); - - style->i.flex_grow = number; - - return CSS_OK; -} - -#undef FLEX_GROW_MASK -#undef FLEX_GROW_SHIFT -#undef FLEX_GROW_INDEX - -#define FLEX_DIRECTION_INDEX 36 -#define FLEX_DIRECTION_SHIFT 5 -#define FLEX_DIRECTION_MASK 0xe0 -static inline css_error set_flex_direction( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[FLEX_DIRECTION_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~FLEX_DIRECTION_MASK) | - ((type & 0x7) << FLEX_DIRECTION_SHIFT); - - return CSS_OK; -} -#undef FLEX_DIRECTION_MASK -#undef FLEX_DIRECTION_SHIFT -#undef FLEX_DIRECTION_INDEX - -#define JUSTIFY_CONTENT_INDEX_A 35 -#define JUSTIFY_CONTENT_SHIFT_A 0 -#define JUSTIFY_CONTENT_MASK_A 0x1 -#define JUSTIFY_CONTENT_INDEX_B 36 -#define JUSTIFY_CONTENT_SHIFT_B 0 -#define JUSTIFY_CONTENT_MASK_B 0x3 -static inline css_error set_justify_content( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits_a = &style->i.bits[JUSTIFY_CONTENT_INDEX_A]; - uint8_t *bits_b = &style->i.bits[JUSTIFY_CONTENT_INDEX_B]; - - /* type is 3bits: assigning the least significant one */ - *bits_a = (*bits_a & ~JUSTIFY_CONTENT_MASK_A) | - ((type & 0x1) << JUSTIFY_CONTENT_SHIFT_A); - - /* type is 3bits: assigning the most significant two */ - *bits_b = (*bits_b & ~JUSTIFY_CONTENT_MASK_B) | - (((type & 0x6) >> 1) << JUSTIFY_CONTENT_SHIFT_B); - - return CSS_OK; -} -#undef JUSTIFY_CONTENT_MASK_A -#undef JUSTIFY_CONTENT_SHIFT_A -#undef JUSTIFY_CONTENT_INDEX_A -#undef JUSTIFY_CONTENT_MASK_B -#undef JUSTIFY_CONTENT_SHIFT_B -#undef JUSTIFY_CONTENT_INDEX_B - -#define ORDER_INDEX 37 -#define ORDER_SHIFT 1 -#define ORDER_MASK 0x2 -static inline css_error set_order( - css_computed_style *style, uint8_t type, - int32_t number) -{ - uint8_t *bits = &style->i.bits[ORDER_INDEX]; - - /* 1bit: type */ - *bits = (*bits & ~ORDER_MASK) | - ((type & 0x1) << ORDER_SHIFT); - - style->i.order = number; - - return CSS_OK; -} - -#undef ORDER_MASK -#undef ORDER_SHIFT -#undef ORDER_INDEX - -#define ALIGN_ITEMS_INDEX 37 -#define ALIGN_ITEMS_SHIFT 5 -#define ALIGN_ITEMS_MASK 0xe0 -static inline css_error set_align_items( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[ALIGN_ITEMS_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~ALIGN_ITEMS_MASK) | - ((type & 0x7) << ALIGN_ITEMS_SHIFT); - - return CSS_OK; -} -#undef ALIGN_ITEMS_MASK -#undef ALIGN_ITEMS_SHIFT -#undef ALIGN_ITEMS_INDEX - -#define ALIGN_SELF_INDEX 37 -#define ALIGN_SELF_SHIFT 2 -#define ALIGN_SELF_MASK 0x1c -static inline css_error set_align_self( - css_computed_style *style, uint8_t type) -{ - uint8_t *bits = &style->i.bits[ALIGN_SELF_INDEX]; - - /* 3bits: type */ - *bits = (*bits & ~ALIGN_SELF_MASK) | - ((type & 0x7) << ALIGN_SELF_SHIFT); - - return CSS_OK; -} -#undef ALIGN_SELF_MASK -#undef ALIGN_SELF_SHIFT -#undef ALIGN_SELF_INDEX +#include "autogenerated_propset.h" #endif -- cgit v1.2.3 From dfbf50683125344885c26d5d7407356d97f54651 Mon Sep 17 00:00:00 2001 From: Lucas Neves Date: Mon, 13 Nov 2017 21:19:03 +0000 Subject: Add support for new length units. --- docs/Bytecode | 13 ++++++++++ include/libcss/types.h | 53 +++++++++++++++++++++++++---------------- src/bytecode/bytecode.h | 13 ++++++++++ src/parse/properties/utils.c | 26 ++++++++++++++++++++ src/select/properties/helpers.c | 13 ++++++++++ 5 files changed, 98 insertions(+), 20 deletions(-) diff --git a/docs/Bytecode b/docs/Bytecode index e857193..f64656a 100644 --- a/docs/Bytecode +++ b/docs/Bytecode @@ -44,6 +44,19 @@ Length is a 32bit numeric value (as described above) and unit is as follows: 00000101 => mm 00000110 => pt 00000111 => pc + 00001000 => cap + 00001001 => ch + 00001010 => ic + 00001011 => rem + 00001100 => lh + 00001101 => rlh + 00001110 => vh + 00001111 => vw + 00010000 => vi + 00010001 => vb + 00010010 => vmin + 00010011 => vmax + 00010100 => q bit 8 set => percentage unit bits 9-31: MBZ diff --git a/include/libcss/types.h b/include/libcss/types.h index ffaf13c..4f35737 100644 --- a/include/libcss/types.h +++ b/include/libcss/types.h @@ -80,26 +80,39 @@ typedef uint32_t css_color; /* CSS unit */ typedef enum css_unit { - CSS_UNIT_PX = 0x0, - CSS_UNIT_EX = 0x1, - CSS_UNIT_EM = 0x2, - CSS_UNIT_IN = 0x3, - CSS_UNIT_CM = 0x4, - CSS_UNIT_MM = 0x5, - CSS_UNIT_PT = 0x6, - CSS_UNIT_PC = 0x7, - - CSS_UNIT_PCT = 0x8, /* Percentage */ - - CSS_UNIT_DEG = 0x9, - CSS_UNIT_GRAD = 0xa, - CSS_UNIT_RAD = 0xb, - - CSS_UNIT_MS = 0xc, - CSS_UNIT_S = 0xd, - - CSS_UNIT_HZ = 0xe, - CSS_UNIT_KHZ = 0xf + CSS_UNIT_PX = 0x00, + CSS_UNIT_EX = 0x01, + CSS_UNIT_EM = 0x02, + CSS_UNIT_IN = 0x03, + CSS_UNIT_CM = 0x04, + CSS_UNIT_MM = 0x05, + CSS_UNIT_PT = 0x06, + CSS_UNIT_PC = 0x07, + CSS_UNIT_CAP = 0x08, + CSS_UNIT_CH = 0x09, + CSS_UNIT_IC = 0x0a, + CSS_UNIT_REM = 0x0b, + CSS_UNIT_LH = 0x0c, + CSS_UNIT_RLH = 0x0d, + CSS_UNIT_VH = 0x0e, + CSS_UNIT_VW = 0x0f, + CSS_UNIT_VI = 0x10, + CSS_UNIT_VB = 0x11, + CSS_UNIT_VMIN = 0x12, + CSS_UNIT_VMAX = 0x13, + CSS_UNIT_Q = 0x14, + + CSS_UNIT_PCT = 0x15, /* Percentage */ + + CSS_UNIT_DEG = 0x16, + CSS_UNIT_GRAD = 0x17, + CSS_UNIT_RAD = 0x18, + + CSS_UNIT_MS = 0x19, + CSS_UNIT_S = 0x1a, + + CSS_UNIT_HZ = 0x1b, + CSS_UNIT_KHZ = 0x1c } css_unit; /** diff --git a/src/bytecode/bytecode.h b/src/bytecode/bytecode.h index 656d7a5..422f141 100644 --- a/src/bytecode/bytecode.h +++ b/src/bytecode/bytecode.h @@ -32,6 +32,19 @@ typedef enum unit { UNIT_MM = 5, UNIT_PT = 6, UNIT_PC = 7, + UNIT_CAP = 8, + UNIT_CH = 9, + UNIT_IC = 10, + UNIT_REM = 11, + UNIT_LH = 12, + UNIT_RLH = 13, + UNIT_VH = 14, + UNIT_VW = 15, + UNIT_VI = 16, + UNIT_VB = 17, + UNIT_VMIN = 18, + UNIT_VMAX = 19, + UNIT_Q = 20, UNIT_PCT = (1 << 8), diff --git a/src/parse/properties/utils.c b/src/parse/properties/utils.c index 47b06e3..76b406b 100644 --- a/src/parse/properties/utils.c +++ b/src/parse/properties/utils.c @@ -1007,6 +1007,10 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len, uint32_t *unit) if (len == 4) { if (strncasecmp(ptr, "grad", 4) == 0) *unit = UNIT_GRAD; + else if (strncasecmp(ptr, "vmin", 4) == 0) + *unit = UNIT_VMIN; + else if (strncasecmp(ptr, "vmax", 4) == 0) + *unit = UNIT_VMAX; else return CSS_INVALID; } else if (len == 3) { @@ -1016,6 +1020,12 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len, uint32_t *unit) *unit = UNIT_DEG; else if (strncasecmp(ptr, "rad", 3) == 0) *unit = UNIT_RAD; + else if (strncasecmp(ptr, "cap", 3) == 0) + *unit = UNIT_CAP; + else if (strncasecmp(ptr, "rem", 3) == 0) + *unit = UNIT_REM; + else if (strncasecmp(ptr, "rlh", 3) == 0) + *unit = UNIT_RLH; else return CSS_INVALID; } else if (len == 2) { @@ -1039,11 +1049,27 @@ css_error css__parse_unit_keyword(const char *ptr, size_t len, uint32_t *unit) *unit = UNIT_PT; else if (strncasecmp(ptr, "pc", 2) == 0) *unit = UNIT_PC; + else if (strncasecmp(ptr, "ch", 2) == 0) + *unit = UNIT_CH; + else if (strncasecmp(ptr, "ic", 2) == 0) + *unit = UNIT_IC; + else if (strncasecmp(ptr, "lh", 2) == 0) + *unit = UNIT_LH; + else if (strncasecmp(ptr, "vh", 2) == 0) + *unit = UNIT_VH; + else if (strncasecmp(ptr, "vw", 2) == 0) + *unit = UNIT_VW; + else if (strncasecmp(ptr, "vi", 2) == 0) + *unit = UNIT_VI; + else if (strncasecmp(ptr, "vb", 2) == 0) + *unit = UNIT_VB; else return CSS_INVALID; } else if (len == 1) { if (strncasecmp(ptr, "s", 1) == 0) *unit = UNIT_S; + else if (strncasecmp(ptr, "q", 1) == 0) + *unit = UNIT_Q; else return CSS_INVALID; } else diff --git a/src/select/properties/helpers.c b/src/select/properties/helpers.c index 36c3cba..5893919 100644 --- a/src/select/properties/helpers.c +++ b/src/select/properties/helpers.c @@ -29,6 +29,19 @@ css_unit css__to_css_unit(uint32_t u) case UNIT_MM: return CSS_UNIT_MM; case UNIT_PT: return CSS_UNIT_PT; case UNIT_PC: return CSS_UNIT_PC; + case UNIT_CAP: return CSS_UNIT_CAP; + case UNIT_CH: return CSS_UNIT_CH; + case UNIT_IC: return CSS_UNIT_IC; + case UNIT_REM: return CSS_UNIT_REM; + case UNIT_LH: return CSS_UNIT_LH; + case UNIT_RLH: return CSS_UNIT_RLH; + case UNIT_VH: return CSS_UNIT_VH; + case UNIT_VW: return CSS_UNIT_VW; + case UNIT_VI: return CSS_UNIT_VI; + case UNIT_VB: return CSS_UNIT_VB; + case UNIT_VMIN: return CSS_UNIT_VMIN; + case UNIT_VMAX: return CSS_UNIT_VMAX; + case UNIT_Q: return CSS_UNIT_Q; case UNIT_PCT: return CSS_UNIT_PCT; case UNIT_DEG: return CSS_UNIT_DEG; case UNIT_GRAD: return CSS_UNIT_GRAD; -- cgit v1.2.3 From 9dbc87e8f86654b041d5428bd15975e7df5dcea9 Mon Sep 17 00:00:00 2001 From: Lucas Neves Date: Mon, 13 Nov 2017 21:21:15 +0000 Subject: Tests: add tests for new length units. --- test/data/parse2/INDEX | 1 + test/data/parse2/units.dat | 182 ++++ test/data/select/tests1.dat | 2289 +++++++++++++++++++++++++++++++++++++++++++ test/dump.h | 39 + test/dump_computed.h | 39 + 5 files changed, 2550 insertions(+) create mode 100644 test/data/parse2/units.dat diff --git a/test/data/parse2/INDEX b/test/data/parse2/INDEX index 9a4c02b..e020747 100644 --- a/test/data/parse2/INDEX +++ b/test/data/parse2/INDEX @@ -21,3 +21,4 @@ overflow.dat Overflow property tests padding.dat Padding property tests multicol.dat Multi-column layout property tests flexbox.dat Flexbox properties and shorthands tests +units.dat Length unit tests diff --git a/test/data/parse2/units.dat b/test/data/parse2/units.dat new file mode 100644 index 0000000..1052dc5 --- /dev/null +++ b/test/data/parse2/units.dat @@ -0,0 +1,182 @@ +#data +* { width: 10invalid; } +#errors +#expected +| * +#reset + +#data +* { width: inherit; } +#errors +#expected +| * +| width: inherit +#reset + +#data +* { width: 10ex; } +#errors +#expected +| * +| width: 10ex +#reset + +#data +* { width: 10em; } +#errors +#expected +| * +| width: 10em +#reset + +#data +* { width: 10in; } +#errors +#expected +| * +| width: 10in +#reset + +#data +* { width: 10cm; } +#errors +#expected +| * +| width: 10cm +#reset + +#data +* { width: 10mm; } +#errors +#expected +| * +| width: 10mm +#reset + +#data +* { width: 10pt; } +#errors +#expected +| * +| width: 10pt +#reset + +#data +* { width: 10pc; } +#errors +#expected +| * +| width: 10pc +#reset + +#data +* { width: 10cap; } +#errors +#expected +| * +| width: 10cap +#reset + +#data +* { width: 10ch; } +#errors +#expected +| * +| width: 10ch +#reset + +#data +* { width: 10ic; } +#errors +#expected +| * +| width: 10ic +#reset + +#data +* { width: 10rem; } +#errors +#expected +| * +| width: 10rem +#reset + +#data +* { width: 10lh; } +#errors +#expected +| * +| width: 10lh +#reset + +#data +* { width: 10rlh; } +#errors +#expected +| * +| width: 10rlh +#reset + +#data +* { width: 10vh; } +#errors +#expected +| * +| width: 10vh +#reset + +#data +* { width: 10vw; } +#errors +#expected +| * +| width: 10vw +#reset + +#data +* { width: 10vi; } +#errors +#expected +| * +| width: 10vi +#reset + +#data +* { width: 10vb; } +#errors +#expected +| * +| width: 10vb +#reset + +#data +* { width: 10vmin; } +#errors +#expected +| * +| width: 10vmin +#reset + +#data +* { width: 10vmax; } +#errors +#expected +| * +| width: 10vmax +#reset + +#data +* { width: 10q; } +#errors +#expected +| * +| width: 10q +#reset + +#data +* { width: 10%; } +#errors +#expected +| * +| width: 10% +#reset diff --git a/test/data/select/tests1.dat b/test/data/select/tests1.dat index 07f200b..0b84eb4 100644 --- a/test/data/select/tests1.dat +++ b/test/data/select/tests1.dat @@ -11652,3 +11652,2292 @@ word-spacing: normal writing-mode: horizontal-tb z-index: auto #reset + +#tree +| div* +#ua +div { width: 10px; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10px +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10ex; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 5.996em +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10em; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10em +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10in; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10in +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10mm; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10mm +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10pt; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10pt +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10pc; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10pc +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10cap; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10cap +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10ch; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10ch +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10ic; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10ic +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10rem; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10rem +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10lh; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10lh +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10rlh; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10rlh +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10vh; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10vh +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10vw; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10vw +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10vi; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10vi +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10vb; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10vb +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10vmin; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10vmin +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10vmax; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10vmax +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10q; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10q +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset + +#tree +| div* +#ua +div { width: 10%; } +#errors +#expected +align-content: stretch +align-items: stretch +align-self: auto +background-attachment: scroll +background-color: #00000000 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-collapse: separate +border-spacing: 0px 0px +border-top-color: #ff000000 +border-right-color: #ff000000 +border-bottom-color: #ff000000 +border-left-color: #ff000000 +border-top-style: none +border-right-style: none +border-bottom-style: none +border-left-style: none +border-top-width: 2px +border-right-width: 2px +border-bottom-width: 2px +border-left-width: 2px +bottom: auto +box-sizing: content-box +break-after: auto +break-before: auto +break-inside: auto +caption-side: top +clear: none +clip: auto +color: #ff000000 +column-count: auto +column-fill: balance +column-gap: normal +column-rule-color: #ff000000 +column-rule-style: none +column-rule-width: 2px +column-span: none +column-width: auto +content: normal +counter-increment: none +counter-reset: none +cursor: auto +direction: ltr +display: inline +empty-cells: show +flex-basis: auto +flex-direction: row +flex-grow: 0.000 +flex-shrink: 1.000 +flex-wrap: nowrap +float: none +font-family: sans-serif +font-size: 12pt +font-style: normal +font-variant: normal +font-weight: normal +height: auto +justify-content: flex-start +left: auto +letter-spacing: normal +line-height: normal +list-style-image: none +list-style-position: outside +list-style-type: disc +margin-top: 0px +margin-right: 0px +margin-bottom: 0px +margin-left: 0px +max-height: none +max-width: none +min-height: 0px +min-width: 0px +opacity: 1.000 +order: 0 +outline-color: invert +outline-style: none +outline-width: 2px +overflow-x: visible +overflow-y: visible +padding-top: 0px +padding-right: 0px +padding-bottom: 0px +padding-left: 0px +position: static +quotes: none +right: auto +table-layout: auto +text-align: default +text-decoration: none +text-indent: 0px +text-transform: none +top: auto +unicode-bidi: normal +vertical-align: baseline +visibility: visible +white-space: normal +width: 10% +word-spacing: normal +writing-mode: horizontal-tb +z-index: auto +#reset diff --git a/test/dump.h b/test/dump.h index 64cad32..d67bb2a 100644 --- a/test/dump.h +++ b/test/dump.h @@ -584,6 +584,45 @@ static void dump_unit(css_fixed val, uint32_t unit, char **ptr) case UNIT_PC: *ptr += sprintf(*ptr, "pc"); break; + case UNIT_CAP: + *ptr += sprintf(*ptr, "cap"); + break; + case UNIT_CH: + *ptr += sprintf(*ptr, "ch"); + break; + case UNIT_IC: + *ptr += sprintf(*ptr, "ic"); + break; + case UNIT_REM: + *ptr += sprintf(*ptr, "rem"); + break; + case UNIT_LH: + *ptr += sprintf(*ptr, "lh"); + break; + case UNIT_RLH: + *ptr += sprintf(*ptr, "rlh"); + break; + case UNIT_VH: + *ptr += sprintf(*ptr, "vh"); + break; + case UNIT_VW: + *ptr += sprintf(*ptr, "vw"); + break; + case UNIT_VI: + *ptr += sprintf(*ptr, "vi"); + break; + case UNIT_VB: + *ptr += sprintf(*ptr, "vb"); + break; + case UNIT_VMIN: + *ptr += sprintf(*ptr, "vmin"); + break; + case UNIT_VMAX: + *ptr += sprintf(*ptr, "vmax"); + break; + case UNIT_Q: + *ptr += sprintf(*ptr, "q"); + break; case UNIT_PCT: *ptr += sprintf(*ptr, "%%"); break; diff --git a/test/dump_computed.h b/test/dump_computed.h index 2a8b009..b0c8bda 100644 --- a/test/dump_computed.h +++ b/test/dump_computed.h @@ -105,6 +105,45 @@ static size_t dump_css_unit(css_fixed val, css_unit unit, char *ptr, size_t len) case CSS_UNIT_PC: ret += snprintf(ptr + ret, len - ret, "pc"); break; + case CSS_UNIT_CAP: + ret += snprintf(ptr + ret, len - ret, "cap"); + break; + case CSS_UNIT_CH: + ret += snprintf(ptr + ret, len - ret, "ch"); + break; + case CSS_UNIT_IC: + ret += snprintf(ptr + ret, len - ret, "ic"); + break; + case CSS_UNIT_REM: + ret += snprintf(ptr + ret, len - ret, "rem"); + break; + case CSS_UNIT_LH: + ret += snprintf(ptr + ret, len - ret, "lh"); + break; + case CSS_UNIT_RLH: + ret += snprintf(ptr + ret, len - ret, "rlh"); + break; + case CSS_UNIT_VH: + ret += snprintf(ptr + ret, len - ret, "vh"); + break; + case CSS_UNIT_VW: + ret += snprintf(ptr + ret, len - ret, "vw"); + break; + case CSS_UNIT_VI: + ret += snprintf(ptr + ret, len - ret, "vi"); + break; + case CSS_UNIT_VB: + ret += snprintf(ptr + ret, len - ret, "vb"); + break; + case CSS_UNIT_VMIN: + ret += snprintf(ptr + ret, len - ret, "vmin"); + break; + case CSS_UNIT_VMAX: + ret += snprintf(ptr + ret, len - ret, "vmax"); + break; + case CSS_UNIT_Q: + ret += snprintf(ptr + ret, len - ret, "q"); + break; case CSS_UNIT_PCT: ret += snprintf(ptr + ret, len - ret, "%%"); break; -- cgit v1.2.3 From dbed3e2b11e9a7c9f3b8d7c8b18e3e6be77ede97 Mon Sep 17 00:00:00 2001 From: Lucas Neves Date: Sun, 19 Nov 2017 16:01:28 -0500 Subject: Select: Bug fixes in the generator. --- src/select/overrides.py | 10 +++++----- src/select/select_generator.py | 25 ++++++++++++------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/select/overrides.py b/src/select/overrides.py index fc2117b..c8d1a2a 100644 --- a/src/select/overrides.py +++ b/src/select/overrides.py @@ -32,16 +32,16 @@ static inline uint8_t get_clip( rect->top_auto = (bits & 0x20); rect->top = style->i.uncommon->i.clip_a; - rect->tunit = bits & 0x3e00000; + rect->tunit = bits & 0x3e00000 >> 21; rect->right = style->i.uncommon->i.clip_b; - rect->runit = bits & 0x1f0000; + rect->runit = bits & 0x1f0000 >> 16; rect->bottom = style->i.uncommon->i.clip_c; - rect->bunit = bits & 0xf800; + rect->bunit = (bits & 0xf800) >> 11; rect->left = style->i.uncommon->i.clip_d; - rect->lunit = bits & 0x7c0; + rect->lunit = (bits & 0x7c0) >> 6; } return (bits & 0x3); @@ -208,7 +208,7 @@ static inline uint8_t get_{0}( *unit = bits >> 2; }} - return (bits & 0x7); + return (bits & 0x3); }} static inline uint8_t get_{0}_bits( const css_computed_style *style) diff --git a/src/select/select_generator.py b/src/select/select_generator.py index d215f2b..c6a03de 100644 --- a/src/select/select_generator.py +++ b/src/select/select_generator.py @@ -218,6 +218,8 @@ class CSSProperty: self.override = get_tuple(override) self.comments = comments self.__mask = None + self.index = None + self.shift = None def make_values(self, vals): """Make list of values for this property.""" @@ -380,7 +382,7 @@ class CSSGroup: def __init__(self, config): self.name = config['name'] self.props = [ CSSProperty(*x) for x in config['props'] ] - self.__bits_array = None + self.bits_array = self.make_bits_array() @property def bits_size(self): @@ -397,20 +399,17 @@ class CSSGroup: """Sum of all property pointers.""" return sum([ p.ptr_size for p in self.props ]) - @property - def bits_array(self): + def make_bits_array(self): """Implement a `best fit first` heuristics for the bin packing - of property bits in the bits array.""" - - if self.__bits_array is not None: - return self.__bits_array + of property bits in the bits array. + Also generate index, shift and mask for each property in group.""" bin_size = 32 # We're using uint32_t as concrete bins. - self.__bits_array = [] + bits_array = [] props = sorted(self.props, key=(lambda x: x.bits_size), reverse=True) for p in props: - for b in self.__bits_array: + for b in bits_array: if b.size + p.bits_size <= bin_size: b.push(p) p.shift = (bin_size - @@ -418,17 +417,17 @@ class CSSGroup: break else: p.shift = bin_size - p.bits_size - self.__bits_array.append(Bin(p)) + bits_array.append(Bin(p)) p.mask = (sum([ 2 ** x for x in range(p.bits_size) ]) * 2 ** p.shift) - self.__bits_array.sort(key=(lambda x: x.size), reverse=True) + bits_array.sort(key=(lambda x: x.size), reverse=True) - for i, b in enumerate(self.__bits_array): + for i, b in enumerate(bits_array): for p in b.contents: p.index = i - return self.__bits_array + return bits_array def get_idot_grp(self): """Make parameters for accessing bits and values in this group.""" -- cgit v1.2.3 From 637af005876a14b4c64c0b14d39e67738e76d816 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 25 Nov 2017 16:55:46 +0000 Subject: Selection: Content prop, use CSS_CONTENT_SET as condition for generator. --- src/select/select_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/select/select_config.py b/src/select/select_config.py index 468e8dc..a543542 100644 --- a/src/select/select_config.py +++ b/src/select/select_config.py @@ -164,7 +164,7 @@ uncommon = { ('cursor', 5, 'string_arr', None, 'CSS_CURSOR_AUTO', 'Encode cursor uri(s) as an array of string objects, terminated ' 'with a blank entry'), - ('content', 2, 'content_item', 'CSS_CONTENT_NORMAL', 'CSS_CONTENT_NORMAL', + ('content', 2, 'content_item', 'CSS_CONTENT_SET', 'CSS_CONTENT_NORMAL', 'Encode content as an array of content items, terminated with ' 'a blank entry.', 'set') } -- cgit v1.2.3 From b8997eb73a1b966939fca4b7e2f4ef799b872ab9 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 25 Nov 2017 17:06:23 +0000 Subject: Selection: Autogenerated propset: Fix release of previous strings. --- src/select/select_generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/select/select_generator.py b/src/select/select_generator.py index c6a03de..f87c929 100644 --- a/src/select/select_generator.py +++ b/src/select/select_generator.py @@ -641,9 +641,9 @@ class CSSGroup: old_t, old_n_shift = shift_star(v.type, old_n) if v.name is 'string': - t.append('{} {} = style{}->{}{} = {};'.format( + t.append('{} {} = style{}->{}{};'.format( old_t, old_n_shift, - grp, i_dot, p.name + v.suffix, v.name + v.suffix)) + grp, i_dot, p.name + v.suffix)) t.append() t.append('if ({} != NULL) {{'.format(v.name + v.suffix)) t.indent(1) -- cgit v1.2.3