/* -*- 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_WEBRENDERUSERDATA_H #define GFX_WEBRENDERUSERDATA_H #include #include "BasicLayers.h" // for BasicLayerManager #include "mozilla/layers/StackingContextHelper.h" #include "mozilla/webrender/WebRenderAPI.h" #include "mozilla/layers/AnimationInfo.h" #include "nsIFrame.h" class nsDisplayItemGeometry; namespace mozilla { namespace wr { class IpcResourceUpdateQueue; } namespace gfx { class SourceSurface; } namespace layers { class CanvasLayer; class ImageClient; class ImageContainer; class WebRenderBridgeChild; class WebRenderCanvasData; class WebRenderCanvasRendererAsync; class WebRenderImageData; class WebRenderFallbackData; class WebRenderLayerManager; class WebRenderGroupData; class WebRenderBackgroundData { public: WebRenderBackgroundData(wr::LayoutRect aBounds, wr::ColorF aColor) : mBounds(aBounds) , mColor(aColor) { } void AddWebRenderCommands(wr::DisplayListBuilder& aBuilder); protected: wr::LayoutRect mBounds; wr::ColorF mColor; }; class WebRenderUserData { public: typedef nsTHashtable > WebRenderUserDataRefTable; static bool SupportsAsyncUpdate(nsIFrame* aFrame); NS_INLINE_DECL_REFCOUNTING(WebRenderUserData) WebRenderUserData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); virtual WebRenderImageData* AsImageData() { return nullptr; } virtual WebRenderFallbackData* AsFallbackData() { return nullptr; } virtual WebRenderCanvasData* AsCanvasData() { return nullptr; } virtual WebRenderGroupData* AsGroupData() { return nullptr; } enum class UserDataType { eImage, eFallback, eAnimation, eCanvas, eGroup, }; virtual UserDataType GetType() = 0; bool IsUsed() { return mUsed; } void SetUsed(bool aUsed) { mUsed = aUsed; } nsIFrame* GetFrame() { return mFrame; } uint32_t GetDisplayItemKey() { return mDisplayItemKey; } void RemoveFromTable(); virtual nsDisplayItemGeometry* GetGeometry() { return nullptr; } protected: virtual ~WebRenderUserData(); WebRenderBridgeChild* WrBridge() const; RefPtr mWRManager; nsIFrame* mFrame; uint32_t mDisplayItemKey; WebRenderUserDataRefTable* mTable; bool mUsed; }; struct WebRenderUserDataKey { WebRenderUserDataKey(uint32_t aFrameKey, WebRenderUserData::UserDataType aType) : mFrameKey(aFrameKey) , mType(aType) { } bool operator==(const WebRenderUserDataKey& other) const { return mFrameKey == other.mFrameKey && mType == other.mType; } PLDHashNumber Hash() const { return HashGeneric(mFrameKey, static_cast::type>(mType)); } uint32_t mFrameKey; WebRenderUserData::UserDataType mType; }; typedef nsRefPtrHashtable, WebRenderUserData> WebRenderUserDataTable; class WebRenderImageData : public WebRenderUserData { public: WebRenderImageData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); virtual ~WebRenderImageData(); virtual WebRenderImageData* AsImageData() override { return this; } virtual UserDataType GetType() override { return UserDataType::eImage; } static UserDataType Type() { return UserDataType::eImage; } Maybe GetKey() { return mKey; } void SetKey(const wr::ImageKey& aKey); already_AddRefed GetImageClient(); Maybe UpdateImageKey(ImageContainer* aContainer, wr::IpcResourceUpdateQueue& aResources, bool aFallback = false); void CreateAsyncImageWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder, ImageContainer* aContainer, const StackingContextHelper& aSc, const LayoutDeviceRect& aBounds, const LayoutDeviceRect& aSCBounds, const gfx::Matrix4x4& aSCTransform, const gfx::MaybeIntSize& aScaleToSize, const wr::ImageRendering& aFilter, const wr::MixBlendMode& aMixBlendMode, bool aIsBackfaceVisible); void CreateImageClientIfNeeded(); bool IsAsync() { return mPipelineId.isSome(); } protected: void ClearImageKey(); RefPtr mTextureOfImage; Maybe mKey; RefPtr mImageClient; Maybe mPipelineId; RefPtr mContainer; bool mOwnsKey; }; class WebRenderFallbackData : public WebRenderImageData { public: WebRenderFallbackData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); virtual ~WebRenderFallbackData(); virtual WebRenderFallbackData* AsFallbackData() override { return this; } virtual UserDataType GetType() override { return UserDataType::eFallback; } static UserDataType Type() { return UserDataType::eFallback; } nsDisplayItemGeometry* GetGeometry() override; void SetGeometry(nsAutoPtr aGeometry); nsRect GetBounds() { return mBounds; } void SetBounds(const nsRect& aRect) { mBounds = aRect; } void SetInvalid(bool aInvalid) { mInvalid = aInvalid; } void SetScale(gfx::Size aScale) { mScale = aScale; } gfx::Size GetScale() { return mScale; } bool IsInvalid() { return mInvalid; } RefPtr mBasicLayerManager; std::vector> mExternalSurfaces; protected: nsAutoPtr mGeometry; nsRect mBounds; bool mInvalid; gfx::Size mScale; }; class WebRenderAnimationData : public WebRenderUserData { public: WebRenderAnimationData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); virtual ~WebRenderAnimationData(); virtual UserDataType GetType() override { return UserDataType::eAnimation; } static UserDataType Type() { return UserDataType::eAnimation; } AnimationInfo& GetAnimationInfo() { return mAnimationInfo; } protected: AnimationInfo mAnimationInfo; }; class WebRenderCanvasData : public WebRenderUserData { public: WebRenderCanvasData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); virtual ~WebRenderCanvasData(); virtual WebRenderCanvasData* AsCanvasData() override { return this; } virtual UserDataType GetType() override { return UserDataType::eCanvas; } static UserDataType Type() { return UserDataType::eCanvas; } void ClearCanvasRenderer(); WebRenderCanvasRendererAsync* GetCanvasRenderer(); WebRenderCanvasRendererAsync* CreateCanvasRenderer(); protected: UniquePtr mCanvasRenderer; }; extern void DestroyWebRenderUserDataTable(WebRenderUserDataTable* aTable); struct WebRenderUserDataProperty { NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(Key, WebRenderUserDataTable, DestroyWebRenderUserDataTable) }; template already_AddRefed GetWebRenderUserData(nsIFrame* aFrame, uint32_t aPerFrameKey) { MOZ_ASSERT(aFrame); WebRenderUserDataTable* userDataTable = aFrame->GetProperty(WebRenderUserDataProperty::Key()); if (!userDataTable) { return nullptr; } WebRenderUserData* data = userDataTable->GetWeak(WebRenderUserDataKey(aPerFrameKey, T::Type())); if (data) { RefPtr result = static_cast(data); return result.forget(); } return nullptr; } } // namespace layers } // namespace mozilla #endif /* GFX_WEBRENDERUSERDATA_H */