Bug 1207734 - Part 4.b. (stylo) Update nsStyleDisplay::mCombinedTransform once transform value changed. draft
authorcku <cku@mozilla.com>
Wed, 13 Dec 2017 01:19:55 +0800
changeset 711205 175d971ea807ec342de30f779aa0bf5d3b080378
parent 711204 742a14bf9414cb9ab24acbe391e84761a9349e68
child 711206 ab816c8c3f5433c79737e86aa4c753c698d0a6cf
push id93016
push userbmo:cku@mozilla.com
push dateWed, 13 Dec 2017 13:30:55 +0000
bugs1207734
milestone59.0a1
Bug 1207734 - Part 4.b. (stylo) Update nsStyleDisplay::mCombinedTransform once transform value changed. MozReview-Commit-ID: bOB3ULxzPG
servo/components/style/properties/gecko.mako.rs
--- a/servo/components/style/properties/gecko.mako.rs
+++ b/servo/components/style/properties/gecko.mako.rs
@@ -542,16 +542,17 @@ def set_gecko_property(ffi_name, expr):
     }
 </%def>
 
 <%def name="impl_rotate(ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
     pub fn set_${ident}(&mut self, other: values::computed::Rotate) {
         use values::generics::transform::Rotate;
         use values::generics::transform::TransformOperation;
+        use gecko_bindings::bindings::Gecko_UpdateTransform;
 
         unsafe { self.gecko.${gecko_ffi_name}.clear() };
 
         match other {
             Rotate::None => (),
             Rotate::Specified(Some(rx), Some(ry), Some(rz), angle) => {
                 let operation = vec![TransformOperation::Rotate3D(rx, ry, rz, angle)];
                 convert_transform(&operation, &mut self.gecko.${gecko_ffi_name});
@@ -559,16 +560,19 @@ def set_gecko_property(ffi_name, expr):
             Rotate::Specified(None, _, _, angle) => {
                 let operation = vec![TransformOperation::Rotate(angle)];
                 convert_transform(&operation, &mut self.gecko.${gecko_ffi_name});
             },
             x => {
                 panic!("Found unexpected value in style struct for rotate property: {:?}", x)
             }
         }
+        unsafe {
+            Gecko_UpdateTransform(&mut self.gecko);
+        }
     }
 
     #[allow(non_snake_case)]
     pub fn copy_${ident}_from(&mut self, other: &Self) {
         unsafe { self.gecko.${gecko_ffi_name}.set(&other.gecko.${gecko_ffi_name}); }
     }
 
     #[allow(non_snake_case)]
@@ -603,16 +607,17 @@ def set_gecko_property(ffi_name, expr):
     }
 </%def>
 
 <%def name="impl_translate(ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
     pub fn set_${ident}(&mut self, other: values::computed::Translate) {
         use values::generics::transform::Translate;
         use values::generics::transform::TransformOperation;
+        use gecko_bindings::bindings::Gecko_UpdateTransform;
 
         unsafe { self.gecko.${gecko_ffi_name}.clear() };
 
         match other {
             Translate::None => (),
             Translate::Specified(tx, None, None) => {
                 let operation = vec![TransformOperation::TranslateX(tx)];
                 convert_transform(&operation, &mut self.gecko.${gecko_ffi_name});
@@ -624,16 +629,19 @@ def set_gecko_property(ffi_name, expr):
             Translate::Specified(sx, Some(sy), Some(sz)) => {
                 let operation = vec![TransformOperation::Translate3D(sx, sy, sz)];
                 convert_transform(&operation, &mut self.gecko.${gecko_ffi_name});
             },
             x => {
                 panic!("Found unexpected value in style struct for scale property: {:?}", x)
             }
         }
+        unsafe {
+            Gecko_UpdateTransform(&mut self.gecko);
+        }
     }
 
     #[allow(non_snake_case)]
     pub fn copy_${ident}_from(&mut self, other: &Self) {
         unsafe { self.gecko.${gecko_ffi_name}.set(&other.gecko.${gecko_ffi_name}); }
     }
 
     #[allow(non_snake_case)]
@@ -671,16 +679,17 @@ def set_gecko_property(ffi_name, expr):
     }
 </%def>
 
 <%def name="impl_scale(ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
     pub fn set_${ident}(&mut self, other: values::computed::Scale) {
         use values::generics::transform::Scale;
         use values::generics::transform::TransformOperation;
+        use gecko_bindings::bindings::Gecko_UpdateTransform;
 
         unsafe { self.gecko.${gecko_ffi_name}.clear() };
 
         match other {
             Scale::None => (),
             Scale::Specified(sx, None, None) => {
                 let operation = vec![TransformOperation::ScaleX(sx)];
                 convert_transform(&operation, &mut self.gecko.${gecko_ffi_name});
@@ -692,16 +701,19 @@ def set_gecko_property(ffi_name, expr):
             Scale::Specified(sx, Some(sy), Some(sz)) => {
                 let operation = vec![TransformOperation::Scale3D(sx, sy, sz)];
                 convert_transform(&operation, &mut self.gecko.${gecko_ffi_name});
             },
             x => {
                 panic!("Found unexpected value in style struct for scale property: {:?}", x)
             }
         }
+        unsafe {
+            Gecko_UpdateTransform(&mut self.gecko);
+        }
     }
 
     #[allow(non_snake_case)]
     pub fn copy_${ident}_from(&mut self, other: &Self) {
         unsafe { self.gecko.${gecko_ffi_name}.set(&other.gecko.${gecko_ffi_name}); }
     }
 
     #[allow(non_snake_case)]
@@ -1484,23 +1496,32 @@ pub fn clone_transform_from_list(
     };
     Transform(result)
 }
 
 <%def name="impl_transform(ident, gecko_ffi_name)">
     #[allow(non_snake_case)]
     pub fn set_${ident}(&mut self, other: values::computed::Transform) {
         use gecko_properties::convert_transform;
+        % if gecko_ffi_name is "mSpecifiedTransform":
+        use gecko_bindings::bindings::Gecko_UpdateTransform;
+        %endif
         if other.0.is_empty() {
             unsafe {
                 self.gecko.${gecko_ffi_name}.clear();
             }
             return;
         };
         convert_transform(&other.0, &mut self.gecko.${gecko_ffi_name});
+
+        % if gecko_ffi_name is "mSpecifiedTransform":
+        unsafe {
+            Gecko_UpdateTransform(&mut self.gecko);
+        }
+        %endif
     }
 
     #[allow(non_snake_case)]
     pub fn copy_${ident}_from(&mut self, other: &Self) {
         unsafe { self.gecko.${gecko_ffi_name}.set(&other.gecko.${gecko_ffi_name}); }
     }
 
     #[allow(non_snake_case)]