mirror of
https://github.com/servo/servo.git
synced 2025-06-25 09:34:32 +01:00
Share transform function lists between set_transform and clone_transform
This will also fix https://bugzilla.mozilla.org/show_bug.cgi?id=1405881
This commit is contained in:
parent
6631594e28
commit
079b25db93
2 changed files with 57 additions and 25 deletions
|
@ -13,7 +13,7 @@ use std::marker::PhantomData;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ops::{Index, IndexMut};
|
use std::ops::{Index, IndexMut};
|
||||||
use std::slice;
|
use std::slice;
|
||||||
use values::computed::{Angle, LengthOrPercentage, Percentage};
|
use values::computed::{Angle, Length, LengthOrPercentage, Percentage};
|
||||||
use values::specified::url::SpecifiedUrl;
|
use values::specified::url::SpecifiedUrl;
|
||||||
|
|
||||||
impl nsCSSValue {
|
impl nsCSSValue {
|
||||||
|
@ -104,7 +104,6 @@ impl nsCSSValue {
|
||||||
|
|
||||||
/// Returns LengthOrPercentage value.
|
/// Returns LengthOrPercentage value.
|
||||||
pub unsafe fn get_lop(&self) -> LengthOrPercentage {
|
pub unsafe fn get_lop(&self) -> LengthOrPercentage {
|
||||||
use values::computed::Length;
|
|
||||||
match self.mUnit {
|
match self.mUnit {
|
||||||
nsCSSUnit::eCSSUnit_Pixel => {
|
nsCSSUnit::eCSSUnit_Pixel => {
|
||||||
LengthOrPercentage::Length(Length::new(bindings::Gecko_CSSValue_GetNumber(self)))
|
LengthOrPercentage::Length(Length::new(bindings::Gecko_CSSValue_GetNumber(self)))
|
||||||
|
@ -119,6 +118,16 @@ impl nsCSSValue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns Length value.
|
||||||
|
pub unsafe fn get_length(&self) -> Length {
|
||||||
|
match self.mUnit {
|
||||||
|
nsCSSUnit::eCSSUnit_Pixel => {
|
||||||
|
Length::new(bindings::Gecko_CSSValue_GetNumber(self))
|
||||||
|
},
|
||||||
|
x => panic!("The unit should not be {:?}", x),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn set_valueless_unit(&mut self, unit: nsCSSUnit) {
|
fn set_valueless_unit(&mut self, unit: nsCSSUnit) {
|
||||||
debug_assert_eq!(self.mUnit, nsCSSUnit::eCSSUnit_Null);
|
debug_assert_eq!(self.mUnit, nsCSSUnit::eCSSUnit_Null);
|
||||||
debug_assert!(unit as u32 <= nsCSSUnit::eCSSUnit_DummyInherit as u32, "Not a valueless unit");
|
debug_assert!(unit as u32 <= nsCSSUnit::eCSSUnit_DummyInherit as u32, "Not a valueless unit");
|
||||||
|
|
|
@ -2892,7 +2892,19 @@ fn static_assert() {
|
||||||
}
|
}
|
||||||
|
|
||||||
${impl_css_url('_moz_binding', 'mBinding.mPtr')}
|
${impl_css_url('_moz_binding', 'mBinding.mPtr')}
|
||||||
|
<%
|
||||||
|
transform_functions = [
|
||||||
|
("Matrix3D", "matrix3d", ["number"] * 16),
|
||||||
|
("PrefixedMatrix3D", "matrix3d", ["number"] * 12 + ["lopon"] * 2
|
||||||
|
+ ["lon"] + ["number"]),
|
||||||
|
("Translate3D", "translate3d", ["lop", "lop", "length"]),
|
||||||
|
("Scale3D", "scale3d", ["number"] * 3),
|
||||||
|
("Rotate3D", "rotate3d", ["number"] * 3 + ["angle"]),
|
||||||
|
("Perspective", "perspective", ["length"]),
|
||||||
|
("InterpolateMatrix", "interpolatematrix", ["list"] * 2 + ["percentage"]),
|
||||||
|
("AccumulateMatrix", "accumulatematrix", ["list"] * 2 + ["integer_to_percentage"])
|
||||||
|
]
|
||||||
|
%>
|
||||||
<%def name="transform_function_arm(name, keyword, items)">
|
<%def name="transform_function_arm(name, keyword, items)">
|
||||||
<%
|
<%
|
||||||
pattern = None
|
pattern = None
|
||||||
|
@ -2978,17 +2990,9 @@ fn static_assert() {
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
match *servo_value {
|
match *servo_value {
|
||||||
${transform_function_arm("Matrix3D", "matrix3d", ["number"] * 16)}
|
% for servo, gecko, format in transform_functions:
|
||||||
${transform_function_arm("PrefixedMatrix3D", "matrix3d", ["number"] * 12 + ["lopon"] * 2
|
${transform_function_arm(servo, gecko, format)}
|
||||||
+ ["lon"] + ["number"])}
|
% endfor
|
||||||
${transform_function_arm("Translate3D", "translate3d", ["lop", "lop", "length"])}
|
|
||||||
${transform_function_arm("Scale3D", "scale3d", ["number"] * 3)}
|
|
||||||
${transform_function_arm("Rotate3D", "rotate3d", ["number"] * 3 + ["angle"])}
|
|
||||||
${transform_function_arm("Perspective", "perspective", ["length"])}
|
|
||||||
${transform_function_arm("InterpolateMatrix", "interpolatematrix",
|
|
||||||
["list"] * 2 + ["percentage"])}
|
|
||||||
${transform_function_arm("AccumulateMatrix", "accumulatematrix",
|
|
||||||
["list"] * 2 + ["integer_to_percentage"])}
|
|
||||||
_ => unimplemented!()
|
_ => unimplemented!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3035,10 +3039,12 @@ fn static_assert() {
|
||||||
css_value_getters = {
|
css_value_getters = {
|
||||||
"length" : "Length::new(bindings::Gecko_CSSValue_GetNumber(%s))",
|
"length" : "Length::new(bindings::Gecko_CSSValue_GetNumber(%s))",
|
||||||
"lop" : "%s.get_lop()",
|
"lop" : "%s.get_lop()",
|
||||||
|
"lopon" : "Either::Second(%s.get_lop())",
|
||||||
|
"lon" : "Either::First(%s.get_length())",
|
||||||
"angle" : "%s.get_angle()",
|
"angle" : "%s.get_angle()",
|
||||||
"number" : "bindings::Gecko_CSSValue_GetNumber(%s)",
|
"number" : "bindings::Gecko_CSSValue_GetNumber(%s)",
|
||||||
"percentage" : "Percentage(bindings::Gecko_CSSValue_GetPercentage(%s))",
|
"percentage" : "Percentage(bindings::Gecko_CSSValue_GetPercentage(%s))",
|
||||||
"percentage_to_integer" : "bindings::Gecko_CSSValue_GetPercentage(%s) as i32",
|
"integer_to_percentage" : "bindings::Gecko_CSSValue_GetPercentage(%s) as i32",
|
||||||
"list" : "Transform(convert_shared_list_to_operations(%s))",
|
"list" : "Transform(convert_shared_list_to_operations(%s))",
|
||||||
}
|
}
|
||||||
pre_symbols = "("
|
pre_symbols = "("
|
||||||
|
@ -3056,8 +3062,18 @@ fn static_assert() {
|
||||||
field_names = ["from_list", "to_list", "progress"]
|
field_names = ["from_list", "to_list", "progress"]
|
||||||
elif keyword == "accumulatematrix":
|
elif keyword == "accumulatematrix":
|
||||||
field_names = ["from_list", "to_list", "count"]
|
field_names = ["from_list", "to_list", "count"]
|
||||||
|
|
||||||
%>
|
%>
|
||||||
structs::nsCSSKeyword::eCSSKeyword_${keyword} => {
|
<%
|
||||||
|
|
||||||
|
guard = ""
|
||||||
|
if name == "Matrix3D":
|
||||||
|
guard = "if !needs_prefix "
|
||||||
|
elif name == "PrefixedMatrix3D":
|
||||||
|
guard = "if needs_prefix "
|
||||||
|
|
||||||
|
%>
|
||||||
|
structs::nsCSSKeyword::eCSSKeyword_${keyword} ${guard}=> {
|
||||||
::values::generics::transform::TransformOperation::${name}${pre_symbols}
|
::values::generics::transform::TransformOperation::${name}${pre_symbols}
|
||||||
% for index, item in enumerate(items):
|
% for index, item in enumerate(items):
|
||||||
% if keyword == "matrix3d":
|
% if keyword == "matrix3d":
|
||||||
|
@ -3096,17 +3112,24 @@ fn static_assert() {
|
||||||
bindings::Gecko_CSSValue_GetKeyword(bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, 0))
|
bindings::Gecko_CSSValue_GetKeyword(bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, 0))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let needs_prefix = if transform_function == structs::nsCSSKeyword::eCSSKeyword_matrix3d {
|
||||||
|
unsafe {
|
||||||
|
bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, 13).mUnit
|
||||||
|
!= structs::nsCSSUnit::eCSSUnit_Number ||
|
||||||
|
bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, 14).mUnit
|
||||||
|
!= structs::nsCSSUnit::eCSSUnit_Number ||
|
||||||
|
bindings::Gecko_CSSValue_GetArrayItemConst(gecko_value, 15).mUnit
|
||||||
|
!= structs::nsCSSUnit::eCSSUnit_Number
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
match transform_function {
|
match transform_function {
|
||||||
${computed_operation_arm("Matrix3D", "matrix3d", ["number"] * 16)}
|
% for servo, gecko, format in transform_functions:
|
||||||
${computed_operation_arm("Translate3D", "translate3d", ["lop", "lop", "length"])}
|
${computed_operation_arm(servo, gecko, format)}
|
||||||
${computed_operation_arm("Scale3D", "scale3d", ["number"] * 3)}
|
% endfor
|
||||||
${computed_operation_arm("Rotate3D", "rotate3d", ["number"] * 3 + ["angle"])}
|
|
||||||
${computed_operation_arm("Perspective", "perspective", ["length"])}
|
|
||||||
${computed_operation_arm("InterpolateMatrix", "interpolatematrix",
|
|
||||||
["list"] * 2 + ["percentage"])}
|
|
||||||
${computed_operation_arm("AccumulateMatrix", "accumulatematrix",
|
|
||||||
["list"] * 2 + ["percentage_to_integer"])}
|
|
||||||
_ => panic!("{:?} is not an acceptable transform function", transform_function),
|
_ => panic!("{:?} is not an acceptable transform function", transform_function),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue