Bug 1457249 - Factor out the function that converts servo's animation value to matrix. r?kats
MozReview-Commit-ID: HpdFYykOkOS
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -570,16 +570,35 @@ AsyncCompositionManager::AlignFixedAndSt
// translation.
for (Layer* child = layer->GetFirstChild(); child; child = child->GetNextSibling()) {
AlignFixedAndStickyLayers(aTransformedSubtreeRoot, child, aTransformScrollId,
aPreviousTransformForRoot, newTransform, aFixedLayerMargins, aClipPartsCache);
}
}
}
+static Matrix4x4
+ServoAnimationValueToMatrix4x4(const RefPtr<RawServoAnimationValue>& aValue,
+ const TransformData& aTransformData)
+{
+ // FIXME: Bug 1457033: We should convert servo's animation value to matrix
+ // directly without nsCSSValueSharedList.
+ RefPtr<nsCSSValueSharedList> list;
+ Servo_AnimationValue_GetTransform(aValue, &list);
+ // we expect all our transform data to arrive in device pixels
+ Point3D transformOrigin = aTransformData.transformOrigin();
+ nsDisplayTransform::FrameTransformProperties props(Move(list),
+ transformOrigin);
+
+ return nsDisplayTransform::GetResultingTransformMatrix(
+ props, aTransformData.origin(),
+ aTransformData.appUnitsPerDevPixel(),
+ 0, &aTransformData.bounds());
+}
+
static void
ApplyAnimatedValue(Layer* aLayer,
CompositorAnimationStorage* aStorage,
nsCSSPropertyID aProperty,
const AnimationData& aAnimationData,
const RefPtr<RawServoAnimationValue>& aValue)
{
if (!aValue) {
@@ -595,37 +614,29 @@ ApplyAnimatedValue(Layer* aLayer,
layerCompositor->SetShadowOpacitySetByAnimation(true);
aStorage->SetAnimatedValue(aLayer->GetCompositorAnimationsId(), opacity);
layerCompositor->SetShadowBaseTransform(aLayer->GetBaseTransform());
layerCompositor->SetShadowTransformSetByAnimation(false);
break;
}
case eCSSProperty_transform: {
- RefPtr<nsCSSValueSharedList> list;
- Servo_AnimationValue_GetTransform(aValue, &list);
const TransformData& transformData = aAnimationData.get_TransformData();
- nsPoint origin = transformData.origin();
- // we expect all our transform data to arrive in device pixels
- Point3D transformOrigin = transformData.transformOrigin();
- nsDisplayTransform::FrameTransformProperties props(Move(list),
- transformOrigin);
- Matrix4x4 transform =
- nsDisplayTransform::GetResultingTransformMatrix(props, origin,
- transformData.appUnitsPerDevPixel(),
- 0, &transformData.bounds());
- Matrix4x4 frameTransform = transform;
+ 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, origin,
+ nsLayoutUtils::PostTranslate(transform, transformData.origin(),
transformData.appUnitsPerDevPixel(),
true);
}
if (ContainerLayer* c = aLayer->AsContainerLayer()) {
transform.PostScale(c->GetInheritedXScale(), c->GetInheritedYScale(), 1);
}