| {% from 'macros.tmpl' import license, print_if %} |
| {% from 'fields/field.tmpl' import encode, getter_expression, setter_expression, fieldwise_copy, fieldwise_diff %} |
| {% from 'fields/group.tmpl' import define_field_group_class %} |
| {{license()}} |
| |
| #include "core/ComputedStyleBase.h" |
| #include "core/style/ComputedStyle.h" |
| #include "platform/wtf/SizeAssertions.h" |
| |
| namespace blink { |
| |
| struct SameSizeAsComputedStyleBase { |
| {% if computed_style.subgroups is defined %} |
| void* dataRefs[{{computed_style.subgroups|length}}]; |
| {% endif %} |
| {% for field in computed_style.fields|rejectattr("is_bit_field") %} |
| {{field.type_name}} {{field.name}}; |
| {% endfor %} |
| unsigned m_bit_fields[{{computed_style.num_32_bit_words_for_bit_fields}}]; |
| }; |
| |
| // If this fails, the packing algorithm in make_computed_style_base.py has |
| // failed to produce the optimal packed size. To fix, update the algorithm to |
| // ensure that the buckets are placed so that each takes up at most 1 word. |
| ASSERT_SIZE(ComputedStyleBase, SameSizeAsComputedStyleBase); |
| |
| // Constructor and destructor are protected so that only the parent class ComputedStyle |
| // can instantiate this class. |
| ComputedStyleBase::ComputedStyleBase() : |
| {% for field in computed_style.fields %} |
| {{field.name}}({{encode(field, field.default_value)}}){{print_if(not loop.last, ',')}} |
| {% endfor %} |
| { |
| {% for subgroup in computed_style.subgroups %} |
| {{subgroup.member_name}}.Init(); |
| {% endfor %} |
| } |
| |
| void ComputedStyleBase::InheritFrom(const ComputedStyleBase& other, |
| IsAtShadowBoundary isAtShadowBoundary) { |
| {{fieldwise_copy(computed_style, computed_style.all_fields |
| |selectattr("is_property") |
| |selectattr("is_inherited") |
| |list |
| )|indent(2)}} |
| } |
| |
| void ComputedStyleBase::CopyNonInheritedFromCached( |
| const ComputedStyleBase& other) { |
| {{fieldwise_copy(computed_style, computed_style.all_fields |
| |rejectattr("has_custom_compare_and_copy") |
| |rejectattr("is_inherited") |
| |list |
| )|indent(2)}} |
| } |
| |
| void ComputedStyleBase::PropagateIndependentInheritedProperties( |
| const ComputedStyleBase& parentStyle) { |
| {% for field in computed_style.all_fields if field.is_property and field.is_independent %} |
| if ({{field.is_inherited_method_name}}()) |
| {{setter_expression(field)}} = parentStyle.{{getter_expression(field)}}; |
| {% endfor %} |
| } |
| |
| {% for name, groups_to_diff in diff_functions_map.items() %} |
| bool ComputedStyleBase::{{name}}(const ComputedStyle& a, const ComputedStyle& b) { |
| {{fieldwise_diff(groups_to_diff)|indent(4)}} |
| return false; |
| } |
| |
| {% endfor %} |
| |
| {% for group in computed_style.subgroups %} |
| {{define_field_group_class(group)}} |
| |
| {% endfor %} |
| |
| } // namespace blink |