Bug 1457249 - Factor out the function that converts transform into device space. r?kats draft
authorHiroyuki Ikezoe <hikezoe@mozilla.com>
Sat, 28 Apr 2018 18:08:15 +0900
changeset 789343 cf1ccb0a01739d610b225d94c4239db3b1556851
parent 789342 2f0bfa00a8eb04c05ec8669231d3ac80cd68c522
child 789344 e622c8dd136d651a720d35a7cbae02ca2aa6f09e
push id108255
push userhikezoe@mozilla.com
push dateSat, 28 Apr 2018 09:12:02 +0000
reviewerskats
bugs1457249
milestone61.0a1
Bug 1457249 - Factor out the function that converts transform into device space. r?kats MozReview-Commit-ID: L7CDcSdIj4D
gfx/layers/composite/AsyncCompositionManager.cpp
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -589,16 +589,42 @@ ServoAnimationValueToMatrix4x4(const Ref
                                                      transformOrigin);
 
   return nsDisplayTransform::GetResultingTransformMatrix(
     props, aTransformData.origin(),
     aTransformData.appUnitsPerDevPixel(),
     0, &aTransformData.bounds());
 }
 
+
+static Matrix4x4
+FrameTransformToTransformInDevice(const Matrix4x4& aFrameTransform,
+                                  Layer* aLayer,
+                                  const TransformData& aTransformData)
+{
+  Matrix4x4 transformInDevice = aFrameTransform;
+  // If our parent layer is a perspective layer, then the offset into reference
+  // frame coordinates is already on that layer. If not, then we need to ask
+  // for it to be added here.
+  if (!aLayer->GetParent() ||
+      !aLayer->GetParent()->GetTransformIsPerspective()) {
+    nsLayoutUtils::PostTranslate(transformInDevice, aTransformData.origin(),
+      aTransformData.appUnitsPerDevPixel(),
+      true);
+  }
+
+  if (ContainerLayer* c = aLayer->AsContainerLayer()) {
+    transformInDevice.PostScale(c->GetInheritedXScale(),
+                                c->GetInheritedYScale(),
+                                1);
+  }
+
+  return transformInDevice;
+}
+
 static void
 ApplyAnimatedValue(Layer* aLayer,
                    CompositorAnimationStorage* aStorage,
                    nsCSSPropertyID aProperty,
                    const AnimationData& aAnimationData,
                    const RefPtr<RawServoAnimationValue>& aValue)
 {
   if (!aValue) {
@@ -619,31 +645,20 @@ ApplyAnimatedValue(Layer* aLayer,
       break;
     }
     case eCSSProperty_transform: {
       const TransformData& transformData = aAnimationData.get_TransformData();
 
       Matrix4x4 frameTransform =
         ServoAnimationValueToMatrix4x4(aValue, transformData);
 
-      Matrix4x4 transform = frameTransform;
-
-      // If our parent layer is a perspective layer, then the offset into reference
-      // frame coordinates is already on that layer. If not, then we need to ask
-      // for it to be added here.
-      if (!aLayer->GetParent() ||
-          !aLayer->GetParent()->GetTransformIsPerspective()) {
-        nsLayoutUtils::PostTranslate(transform, transformData.origin(),
-                                     transformData.appUnitsPerDevPixel(),
-                                     true);
-      }
-
-      if (ContainerLayer* c = aLayer->AsContainerLayer()) {
-        transform.PostScale(c->GetInheritedXScale(), c->GetInheritedYScale(), 1);
-      }
+      Matrix4x4 transform =
+        FrameTransformToTransformInDevice(frameTransform,
+                                          aLayer,
+                                          transformData);
 
       layerCompositor->SetShadowBaseTransform(transform);
       layerCompositor->SetShadowTransformSetByAnimation(true);
       aStorage->SetAnimatedValue(aLayer->GetCompositorAnimationsId(),
                                  Move(transform), Move(frameTransform),
                                  transformData);
 
       layerCompositor->SetShadowOpacity(aLayer->GetOpacity());