Add support for transform functions with an optional final argument in gecko glue

This commit is contained in:
Manish Goregaokar 2017-10-30 14:06:04 -07:00
parent e20c508a6e
commit e15695289d
No known key found for this signature in database
GPG key ID: 3BBF4D3E2EF79F98

View file

@ -2899,18 +2899,22 @@ fn static_assert() {
+ ["lon"] + ["number"]), + ["lon"] + ["number"]),
("Matrix", "matrix", ["number"] * 6), ("Matrix", "matrix", ["number"] * 6),
("PrefixedMatrix", "matrix", ["number"] * 4 + ["lopon"] * 2), ("PrefixedMatrix", "matrix", ["number"] * 4 + ["lopon"] * 2),
("Translate", "translate", ["lop", "optional_lop"]),
("Translate3D", "translate3d", ["lop", "lop", "length"]), ("Translate3D", "translate3d", ["lop", "lop", "length"]),
("TranslateX", "translatex", ["lop"]), ("TranslateX", "translatex", ["lop"]),
("TranslateY", "translatey", ["lop"]), ("TranslateY", "translatey", ["lop"]),
("TranslateZ", "translatez", ["length"]), ("TranslateZ", "translatez", ["length"]),
("Scale3D", "scale3d", ["number"] * 3), ("Scale3D", "scale3d", ["number"] * 3),
("Scale", "scale", ["number", "optional_number"]),
("ScaleX", "scalex", ["number"]), ("ScaleX", "scalex", ["number"]),
("ScaleY", "scaley", ["number"]), ("ScaleY", "scaley", ["number"]),
("ScaleZ", "scalez", ["number"]), ("ScaleZ", "scalez", ["number"]),
("Rotate", "rotate", ["angle"]),
("Rotate3D", "rotate3d", ["number"] * 3 + ["angle"]), ("Rotate3D", "rotate3d", ["number"] * 3 + ["angle"]),
("RotateX", "rotatex", ["angle"]), ("RotateX", "rotatex", ["angle"]),
("RotateY", "rotatey", ["angle"]), ("RotateY", "rotatey", ["angle"]),
("RotateZ", "rotatez", ["angle"]), ("RotateZ", "rotatez", ["angle"]),
("Skew", "skew", ["angle", "optional_angle"]),
("SkewX", "skewx", ["angle"]), ("SkewX", "skewx", ["angle"]),
("SkewY", "skewy", ["angle"]), ("SkewY", "skewy", ["angle"]),
("Perspective", "perspective", ["length"]), ("Perspective", "perspective", ["length"]),
@ -2920,6 +2924,7 @@ fn static_assert() {
%> %>
<%def name="transform_function_arm(name, keyword, items)"> <%def name="transform_function_arm(name, keyword, items)">
<% <%
has_optional = items[-1].startswith("optional_")
pattern = None pattern = None
if keyword == "matrix3d": if keyword == "matrix3d":
# m11: number1, m12: number2, .. # m11: number1, m12: number2, ..
@ -2959,19 +2964,36 @@ fn static_assert() {
} }
%> %>
::values::generics::transform::TransformOperation::${name}${pattern} => { ::values::generics::transform::TransformOperation::${name}${pattern} => {
bindings::Gecko_CSSValue_SetFunction(gecko_value, ${len(items) + 1}); % if has_optional:
let optional_present = ${items[-1] + str(len(items))}.is_some();
let len = if optional_present {
${len(items) + 1}
} else {
${len(items)}
};
% else:
let len = ${len(items) + 1};
% endif
bindings::Gecko_CSSValue_SetFunction(gecko_value, len);
bindings::Gecko_CSSValue_SetKeyword( bindings::Gecko_CSSValue_SetKeyword(
bindings::Gecko_CSSValue_GetArrayItem(gecko_value, 0), bindings::Gecko_CSSValue_GetArrayItem(gecko_value, 0),
structs::nsCSSKeyword::eCSSKeyword_${keyword} structs::nsCSSKeyword::eCSSKeyword_${keyword}
); );
% for index, item in enumerate(items): % for index, item in enumerate(items):
<% replaced_item = item.replace("optional_", "") %>
% if item.startswith("optional"):
if let Some(${replaced_item + str(index + 1)}) = ${item + str(index + 1)} {
% endif
% if item == "list": % if item == "list":
debug_assert!(!${item}${index + 1}.0.is_empty()); debug_assert!(!${item}${index + 1}.0.is_empty());
% endif % endif
${css_value_setters[item] % ( ${css_value_setters[replaced_item] % (
"bindings::Gecko_CSSValue_GetArrayItem(gecko_value, %d)" % (index + 1), "bindings::Gecko_CSSValue_GetArrayItem(gecko_value, %d)" % (index + 1),
item + str(index + 1) replaced_item + str(index + 1)
)}; )};
% if item.startswith("optional"):
}
% endif
% endfor % endfor
} }
</%def> </%def>
@ -3008,7 +3030,6 @@ fn static_assert() {
% for servo, gecko, format in transform_functions: % for servo, gecko, format in transform_functions:
${transform_function_arm(servo, gecko, format)} ${transform_function_arm(servo, gecko, format)}
% endfor % endfor
_ => unimplemented!()
} }
} }
} }
@ -3101,9 +3122,21 @@ fn static_assert() {
% elif keyword == "interpolatematrix" or keyword == "accumulatematrix": % elif keyword == "interpolatematrix" or keyword == "accumulatematrix":
${field_names[index]}: ${field_names[index]}:
% endif % endif
${css_value_getters[item] % ( <%
getter = css_value_getters[item.replace("optional_", "")] % (
"bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, %d)" % (index + 1) "bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, %d)" % (index + 1)
)}, )
%>
% if item.startswith("optional_"):
if (**gecko_value.mValue.mArray.as_ref()).mCount == ${index + 1} {
None
} else {
Some(${getter})
}
% else:
${getter}
% endif
,
% endfor % endfor
${post_symbols} ${post_symbols}
}, },