/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- *//* vim: set ts=8 sts=2 et sw=2 tw=80: *//* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */#ifndef GFX_ANIMATIONINFO_H#define GFX_ANIMATIONINFO_H#include"nsCSSPropertyIDSet.h"#include"nsDisplayItemTypes.h"#include"mozilla/Array.h"#include"mozilla/UniquePtr.h"#include"mozilla/FunctionRef.h"#include"mozilla/layers/AnimationStorageData.h"#include"mozilla/layers/LayersMessages.h" // for TransformDatastructRawServoAnimationValue;classnsIContent;classnsIFrame;namespacemozilla{classnsDisplayItem;classnsDisplayListBuilder;classEffectSet;structAnimationProperty;namespacedom{classAnimation;}// namespace domnamespacegfx{classPath;}// namespace gfxnamespacelayers{classAnimation;classCompositorAnimations;classLayer;classWebRenderLayerManager;structCompositorAnimationData;structPropertyAnimationGroup;classAnimationInfofinal{typedefnsTArray<Animation>AnimationArray;public:AnimationInfo();~AnimationInfo();// Ensure that this AnimationInfo has a valid (non-zero) animations id. This// value is unique across layers.voidEnsureAnimationsId();// Call AddAnimation to add a new animation to this layer from layout code.// Caller must fill in all the properties of the returned animation.// A later animation overrides an earlier one.Animation*AddAnimation();// These are a parallel to AddAnimation and clearAnimations, except// they add pending animations that apply only when the next// transaction is begun. (See also// SetBaseTransformForNextTransaction.)Animation*AddAnimationForNextTransaction();voidSetAnimationGeneration(uint64_taCount){mAnimationGeneration=Some(aCount);}Maybe<uint64_t>GetAnimationGeneration()const{returnmAnimationGeneration;}// ClearAnimations clears animations on this layer.voidClearAnimations();voidClearAnimationsForNextTransaction();voidSetCompositorAnimations(constLayersId&aLayersId,constCompositorAnimations&aCompositorAnimations);boolStartPendingAnimations(constTimeStamp&aReadyTime);voidTransferMutatedFlagToLayer(Layer*aLayer);uint64_tGetCompositorAnimationsId(){returnmCompositorAnimationsId;}// Note: We don't set mAnimations on the compositor thread, so this will// always return an empty array on the compositor thread.AnimationArray&GetAnimations(){returnmAnimations;}nsTArray<PropertyAnimationGroup>&GetPropertyAnimationGroups(){returnmStorageData.mAnimation;}constMaybe<TransformData>&GetTransformData()const{returnmStorageData.mTransformData;}constLayersId&GetLayersId()const{returnmStorageData.mLayersId;}boolApplyPendingUpdatesForThisTransaction();boolHasTransformAnimation()const;gfx::Path*CachedMotionPath(){returnmStorageData.mCachedMotionPath;}// In case of continuation, |aFrame| must be the first or the last// continuation frame, otherwise this function might return Nothing().staticMaybe<uint64_t>GetGenerationFromFrame(nsIFrame*aFrame,DisplayItemTypeaDisplayItemKey);usingCompositorAnimatableDisplayItemTypes=Array<DisplayItemType,nsCSSPropertyIDSet::CompositorAnimatableDisplayItemCount()>;usingAnimationGenerationCallback=FunctionRef<bool(constMaybe<uint64_t>&aGeneration,DisplayItemTypeaDisplayItemType)>;// Enumerates animation generations on |aFrame| for the given display item// types and calls |aCallback| with the animation generation.//// The enumeration stops if |aCallback| returns false.staticvoidEnumerateGenerationOnFrame(constnsIFrame*aFrame,constnsIContent*aContent,constCompositorAnimatableDisplayItemTypes&aDisplayItemTypes,AnimationGenerationCallback);voidAddAnimationsForDisplayItem(nsIFrame*aFrame,nsDisplayListBuilder*aBuilder,nsDisplayItem*aItem,DisplayItemTypeaType,WebRenderLayerManager*aLayerManager,constMaybe<LayoutDevicePoint>&aPosition=Nothing());private:enumclassSend{NextTransaction,Immediate,};voidAddAnimationForProperty(nsIFrame*aFrame,constAnimationProperty&aProperty,dom::Animation*aAnimation,constMaybe<TransformData>&aTransformData,SendaSendFlag);boolAddAnimationsForProperty(nsIFrame*aFrame,constEffectSet*aEffects,constnsTArray<RefPtr<dom::Animation>>&aCompositorAnimations,constMaybe<TransformData>&aTransformData,nsCSSPropertyIDaProperty,SendaSendFlag,WebRenderLayerManager*aLayerManager);voidAddNonAnimatingTransformLikePropertiesStyles(constnsCSSPropertyIDSet&aNonAnimatingProperties,nsIFrame*aFrame,SendaSendFlag);protected:// mAnimations (and mPendingAnimations) are only set on the main thread.//// Once the animations are received on the compositor thread/process we// use AnimationHelper::ExtractAnimations to transform the rather compact// representation of animation data we transfer into something we can more// readily use for sampling and then store it in mPropertyAnimationGroups// (below) or CompositorAnimationStorage.mAnimations for WebRender.AnimationArraymAnimations;UniquePtr<AnimationArray>mPendingAnimations;uint64_tmCompositorAnimationsId;// The extracted data produced by AnimationHelper::ExtractAnimations().AnimationStorageDatamStorageData;// If this layer is used for OMTA, then this counter is used to ensure we// stay in sync with the animation managerMaybe<uint64_t>mAnimationGeneration;boolmMutated;};}// namespace layers}// namespace mozilla#endif // GFX_ANIMATIONINFO_H