Bug 1337889 - use animatedPropKey to query Opacity/Transform animation
MozReview-Commit-ID: 3s1kzOQAfrd
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -3668,17 +3668,17 @@ nsDOMWindowUtils::GetOMTAStyle(nsIDOMEle
FrameLayerBuilder::GetDedicatedLayer(frame,
nsDisplayItem::TYPE_OPACITY);
if (layer) {
ShadowLayerForwarder* forwarder = layer->Manager()->AsShadowForwarder();
if (forwarder && forwarder->HasShadowManager()) {
float value;
bool hadAnimatedOpacity;
forwarder->GetShadowManager()->SendGetAnimationOpacity(
- layer->AsShadowableLayer()->GetShadow(),
+ layer->GetAnimatedPropKey(),
&value, &hadAnimatedOpacity);
if (hadAnimatedOpacity) {
cssValue = new nsROCSSPrimitiveValue;
cssValue->SetNumber(value);
}
}
}
--- a/gfx/layers/AnimationHelper.cpp
+++ b/gfx/layers/AnimationHelper.cpp
@@ -16,16 +16,54 @@
namespace mozilla {
namespace layers {
struct StyleAnimationValueCompositePair {
StyleAnimationValue mValue;
dom::CompositeOperation mComposite;
};
+typedef Pair<uint64_t, StyleAnimationValue> AnimatedPropPair;
+typedef nsTArray<AnimatedPropPair> AnimatedPropArray;
+//TODO this should be only created in parent side.
+static StaticAutoPtr<AnimatedPropArray> sAnimatedPropArray;
+
+void
+AnimationHelper::InitAnimatedPropArray()
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+ if (!sAnimatedPropArray) {
+ sAnimatedPropArray = new AnimatedPropArray;
+ }
+ sAnimatedPropArray->Clear();
+}
+
+bool
+AnimationHelper::GetAnimatedPropValue(uint64_t aKey, StyleAnimationValue& aValue)
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+ bool ret = false;
+ for (auto pair : *sAnimatedPropArray) {
+ if (pair.first() == aKey) {
+ aValue = pair.second();
+ ret = true;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+void
+AnimationHelper::StoreAnimatedPropValue(uint64_t aKey, const StyleAnimationValue& aValue)
+{
+ MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+ sAnimatedPropArray->AppendElement(AnimatedPropPair(aKey, aValue));
+}
+
static StyleAnimationValue
SampleValue(float aPortion, const layers::Animation& aAnimation,
const StyleAnimationValueCompositePair& aStart,
const StyleAnimationValueCompositePair& aEnd,
const StyleAnimationValue& aLastValue,
uint64_t aCurrentIteration,
const StyleAnimationValue& aUnderlyingValue)
{
--- a/gfx/layers/AnimationHelper.h
+++ b/gfx/layers/AnimationHelper.h
@@ -34,15 +34,22 @@ public:
InfallibleTArray<AnimData>& aAnimationData,
StyleAnimationValue& aAnimationValue,
bool& aHasInEffectAnimations);
static void
SetAnimations(AnimationArray& aAnimations,
InfallibleTArray<AnimData>& aAnimData,
StyleAnimationValue& aBaseAnimationStyle);
+
static uint64_t GetNextAnimatedPropKey();
+
+ // AnimatedPropArray will only be used inside compositor thread.
+ // Store new AnimatedProp pair after sampling the new animation value.
+ static void InitAnimatedPropArray();
+ static void StoreAnimatedPropValue(uint64_t aKey, const StyleAnimationValue& aValue);
+ static bool GetAnimatedPropValue(uint64_t aKey, StyleAnimationValue& aValue);
};
} // namespace layers
} // namespace mozilla
#endif // mozilla_layers_AnimationHelper_h
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -582,16 +582,19 @@ ApplyAnimatedValue(Layer* aLayer,
{
HostLayer* layerCompositor = aLayer->AsHostLayer();
switch (aProperty) {
case eCSSProperty_opacity: {
MOZ_ASSERT(aValue.GetUnit() == StyleAnimationValue::eUnit_Float,
"Interpolated value for opacity should be float");
layerCompositor->SetShadowOpacity(aValue.GetFloatValue());
layerCompositor->SetShadowOpacitySetByAnimation(true);
+ AnimationHelper::StoreAnimatedPropValue(aLayer->GetAnimatedPropKey(),
+ aValue);
+
break;
}
case eCSSProperty_transform: {
MOZ_ASSERT(aValue.GetUnit() == StyleAnimationValue::eUnit_Transform,
"The unit of interpolated value for transform should be "
"transform");
nsCSSValueSharedList* list = aValue.GetCSSValueSharedListValue();
@@ -616,28 +619,32 @@ ApplyAnimatedValue(Layer* aLayer,
transformData.appUnitsPerDevPixel(),
flags, &transformData.bounds());
if (ContainerLayer* c = aLayer->AsContainerLayer()) {
transform.PostScale(c->GetInheritedXScale(), c->GetInheritedYScale(), 1);
}
layerCompositor->SetShadowBaseTransform(transform);
layerCompositor->SetShadowTransformSetByAnimation(true);
+ AnimationHelper::StoreAnimatedPropValue(aLayer->GetAnimatedPropKey(),
+ aValue);
+
break;
}
default:
MOZ_ASSERT_UNREACHABLE("Unhandled animated property");
}
}
static bool
SampleAnimations(Layer* aLayer, TimeStamp aPoint)
{
bool activeAnimations = false;
+ AnimationHelper::InitAnimatedPropArray();
ForEachNode<ForwardIterator>(
aLayer,
[&activeAnimations, &aPoint] (Layer* layer)
{
bool hasInEffectAnimations = false;
StyleAnimationValue animationValue = layer->GetBaseAnimationStyle();
activeAnimations |=
AnimationHelper::SampleAnimationForEachNode(aPoint,
--- a/gfx/layers/ipc/LayerTransactionParent.cpp
+++ b/gfx/layers/ipc/LayerTransactionParent.cpp
@@ -10,16 +10,17 @@
#include "apz/src/AsyncPanZoomController.h"
#include "CompositableHost.h" // for CompositableParent, Get, etc
#include "ImageLayers.h" // for ImageLayer
#include "Layers.h" // for Layer, ContainerLayer, etc
#include "CompositableTransactionParent.h" // for EditReplyVector
#include "CompositorBridgeParent.h"
#include "gfxPrefs.h"
#include "mozilla/gfx/BasePoint3D.h" // for BasePoint3D
+#include "mozilla/layers/AnimationHelper.h" // for GetAnimatedPropValue
#include "mozilla/layers/CanvasLayerComposite.h"
#include "mozilla/layers/ColorLayerComposite.h"
#include "mozilla/layers/Compositor.h" // for Compositor
#include "mozilla/layers/ContainerLayerComposite.h"
#include "mozilla/layers/ImageBridgeParent.h" // for ImageBridgeParent
#include "mozilla/layers/ImageLayerComposite.h"
#include "mozilla/layers/LayerManagerComposite.h"
#include "mozilla/layers/LayersMessages.h" // for EditReply, etc
@@ -697,37 +698,35 @@ LayerTransactionParent::RecvSetTestSampl
mozilla::ipc::IPCResult
LayerTransactionParent::RecvLeaveTestMode()
{
mCompositorBridge->LeaveTestMode(this);
return IPC_OK();
}
mozilla::ipc::IPCResult
-LayerTransactionParent::RecvGetAnimationOpacity(const LayerHandle& aParent,
+LayerTransactionParent::RecvGetAnimationOpacity(const uint64_t& aAnimatedPropKey,
float* aOpacity,
bool* aHasAnimationOpacity)
{
*aHasAnimationOpacity = false;
if (mDestroyed || !layer_manager() || layer_manager()->IsDestroyed()) {
return IPC_FAIL_NO_REASON(this);
}
- RefPtr<Layer> layer = AsLayer(aParent);
- if (!layer) {
- return IPC_FAIL_NO_REASON(this);
- }
-
mCompositorBridge->ApplyAsyncProperties(this);
- if (!layer->AsHostLayer()->GetShadowOpacitySetByAnimation()) {
+ StyleAnimationValue value;
+ AnimationHelper::GetAnimatedPropValue(aAnimatedPropKey, value);
+
+ if (value.IsNull()) {
return IPC_OK();
}
- *aOpacity = layer->GetLocalOpacity();
+ *aOpacity = value.GetFloatValue();
*aHasAnimationOpacity = true;
return IPC_OK();
}
mozilla::ipc::IPCResult
LayerTransactionParent::RecvGetAnimationTransform(const LayerHandle& aLayerHandle,
MaybeTransform* aTransform)
{
--- a/gfx/layers/ipc/LayerTransactionParent.h
+++ b/gfx/layers/ipc/LayerTransactionParent.h
@@ -122,17 +122,17 @@ protected:
const TextureInfo& aInfo) override;
virtual mozilla::ipc::IPCResult RecvReleaseLayer(const LayerHandle& aHandle) override;
virtual mozilla::ipc::IPCResult RecvReleaseCompositable(const CompositableHandle& aHandle) override;
virtual mozilla::ipc::IPCResult RecvClearCachedResources() override;
virtual mozilla::ipc::IPCResult RecvForceComposite() override;
virtual mozilla::ipc::IPCResult RecvSetTestSampleTime(const TimeStamp& aTime) override;
virtual mozilla::ipc::IPCResult RecvLeaveTestMode() override;
- virtual mozilla::ipc::IPCResult RecvGetAnimationOpacity(const LayerHandle& aLayerHandle,
+ virtual mozilla::ipc::IPCResult RecvGetAnimationOpacity(const uint64_t& aAnimatdPropKey,
float* aOpacity,
bool* aHasAnimationOpacity) override;
virtual mozilla::ipc::IPCResult RecvGetAnimationTransform(const LayerHandle& aLayerHandle,
MaybeTransform* aTransform)
override;
virtual mozilla::ipc::IPCResult RecvSetAsyncScrollOffset(const FrameMetrics::ViewID& aId,
const float& aX, const float& aY) override;
virtual mozilla::ipc::IPCResult RecvSetAsyncZoom(const FrameMetrics::ViewID& aId,
--- a/gfx/layers/ipc/PLayerTransaction.ipdl
+++ b/gfx/layers/ipc/PLayerTransaction.ipdl
@@ -75,17 +75,17 @@ parent:
// animations. sampleTime must not be null.
sync SetTestSampleTime(TimeStamp sampleTime);
// Leave test mode and resume normal compositing
sync LeaveTestMode();
// Returns the value of the opacity applied to the layer by animation.
// |hasAnimationOpacity| is true if the layer has an opacity value
// specified by animation. If it's false, |opacity| value is indefinite.
- sync GetAnimationOpacity(LayerHandle layer) returns (float opacity,
+ sync GetAnimationOpacity(uint64_t aAnimatedPropKey) returns (float opacity,
bool hasAnimationOpacity);
// Returns the value of the transform applied to the layer by animation after
// factoring out translation components introduced to account for the offset
// of the corresponding frame and transform origin and after converting to CSS
// pixels. If the layer is not transformed by animation, the return value will
// be void_t.
sync GetAnimationTransform(LayerHandle layer) returns (MaybeTransform transform);