/work/obj-fuzz/dist/include/mozilla/layers/WebRenderUserData.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #ifndef GFX_WEBRENDERUSERDATA_H |
8 | | #define GFX_WEBRENDERUSERDATA_H |
9 | | |
10 | | #include <vector> |
11 | | #include "BasicLayers.h" // for BasicLayerManager |
12 | | #include "mozilla/layers/StackingContextHelper.h" |
13 | | #include "mozilla/webrender/WebRenderAPI.h" |
14 | | #include "mozilla/layers/AnimationInfo.h" |
15 | | #include "nsIFrame.h" |
16 | | |
17 | | class nsDisplayItemGeometry; |
18 | | |
19 | | namespace mozilla { |
20 | | namespace wr { |
21 | | class IpcResourceUpdateQueue; |
22 | | } |
23 | | |
24 | | namespace gfx { |
25 | | class SourceSurface; |
26 | | } |
27 | | |
28 | | namespace layers { |
29 | | class CanvasLayer; |
30 | | class ImageClient; |
31 | | class ImageContainer; |
32 | | class WebRenderBridgeChild; |
33 | | class WebRenderCanvasData; |
34 | | class WebRenderCanvasRendererAsync; |
35 | | class WebRenderImageData; |
36 | | class WebRenderFallbackData; |
37 | | class WebRenderLayerManager; |
38 | | class WebRenderGroupData; |
39 | | |
40 | | class WebRenderBackgroundData |
41 | | { |
42 | | public: |
43 | | WebRenderBackgroundData(wr::LayoutRect aBounds, wr::ColorF aColor) |
44 | | : mBounds(aBounds) |
45 | | , mColor(aColor) |
46 | 0 | { } |
47 | | void AddWebRenderCommands(wr::DisplayListBuilder& aBuilder); |
48 | | protected: |
49 | | wr::LayoutRect mBounds; |
50 | | wr::ColorF mColor; |
51 | | }; |
52 | | |
53 | | class WebRenderUserData |
54 | | { |
55 | | public: |
56 | | typedef nsTHashtable<nsRefPtrHashKey<WebRenderUserData> > WebRenderUserDataRefTable; |
57 | | |
58 | | static bool SupportsAsyncUpdate(nsIFrame* aFrame); |
59 | | |
60 | | NS_INLINE_DECL_REFCOUNTING(WebRenderUserData) |
61 | | |
62 | | WebRenderUserData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); |
63 | | |
64 | | virtual WebRenderImageData* AsImageData() { return nullptr; } |
65 | | virtual WebRenderFallbackData* AsFallbackData() { return nullptr; } |
66 | | virtual WebRenderCanvasData* AsCanvasData() { return nullptr; } |
67 | | virtual WebRenderGroupData* AsGroupData() { return nullptr; } |
68 | | |
69 | | enum class UserDataType { |
70 | | eImage, |
71 | | eFallback, |
72 | | eAnimation, |
73 | | eCanvas, |
74 | | eGroup, |
75 | | }; |
76 | | |
77 | | virtual UserDataType GetType() = 0; |
78 | | bool IsUsed() { return mUsed; } |
79 | | void SetUsed(bool aUsed) { mUsed = aUsed; } |
80 | | nsIFrame* GetFrame() { return mFrame; } |
81 | | uint32_t GetDisplayItemKey() { return mDisplayItemKey; } |
82 | | void RemoveFromTable(); |
83 | | virtual nsDisplayItemGeometry* GetGeometry() { return nullptr; } |
84 | | protected: |
85 | | virtual ~WebRenderUserData(); |
86 | | |
87 | | WebRenderBridgeChild* WrBridge() const; |
88 | | |
89 | | RefPtr<WebRenderLayerManager> mWRManager; |
90 | | nsIFrame* mFrame; |
91 | | uint32_t mDisplayItemKey; |
92 | | WebRenderUserDataRefTable* mTable; |
93 | | bool mUsed; |
94 | | }; |
95 | | |
96 | | struct WebRenderUserDataKey { |
97 | | WebRenderUserDataKey(uint32_t aFrameKey, WebRenderUserData::UserDataType aType) |
98 | | : mFrameKey(aFrameKey) |
99 | | , mType(aType) |
100 | 0 | { } |
101 | | |
102 | | bool operator==(const WebRenderUserDataKey& other) const |
103 | | { |
104 | | return mFrameKey == other.mFrameKey && mType == other.mType; |
105 | | } |
106 | | PLDHashNumber Hash() const |
107 | | { |
108 | | return HashGeneric(mFrameKey, static_cast<std::underlying_type<decltype(mType)>::type>(mType)); |
109 | | } |
110 | | |
111 | | uint32_t mFrameKey; |
112 | | WebRenderUserData::UserDataType mType; |
113 | | }; |
114 | | |
115 | | typedef nsRefPtrHashtable<nsGenericHashKey<mozilla::layers::WebRenderUserDataKey>, WebRenderUserData> WebRenderUserDataTable; |
116 | | |
117 | | class WebRenderImageData : public WebRenderUserData |
118 | | { |
119 | | public: |
120 | | WebRenderImageData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); |
121 | | virtual ~WebRenderImageData(); |
122 | | |
123 | | virtual WebRenderImageData* AsImageData() override { return this; } |
124 | | virtual UserDataType GetType() override { return UserDataType::eImage; } |
125 | | static UserDataType Type() { return UserDataType::eImage; } |
126 | | Maybe<wr::ImageKey> GetKey() { return mKey; } |
127 | | void SetKey(const wr::ImageKey& aKey); |
128 | | already_AddRefed<ImageClient> GetImageClient(); |
129 | | |
130 | | Maybe<wr::ImageKey> UpdateImageKey(ImageContainer* aContainer, |
131 | | wr::IpcResourceUpdateQueue& aResources, |
132 | | bool aFallback = false); |
133 | | |
134 | | void CreateAsyncImageWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder, |
135 | | ImageContainer* aContainer, |
136 | | const StackingContextHelper& aSc, |
137 | | const LayoutDeviceRect& aBounds, |
138 | | const LayoutDeviceRect& aSCBounds, |
139 | | const gfx::Matrix4x4& aSCTransform, |
140 | | const gfx::MaybeIntSize& aScaleToSize, |
141 | | const wr::ImageRendering& aFilter, |
142 | | const wr::MixBlendMode& aMixBlendMode, |
143 | | bool aIsBackfaceVisible); |
144 | | |
145 | | void CreateImageClientIfNeeded(); |
146 | | |
147 | | bool IsAsync() |
148 | | { |
149 | | return mPipelineId.isSome(); |
150 | | } |
151 | | |
152 | | protected: |
153 | | void ClearImageKey(); |
154 | | |
155 | | RefPtr<TextureClient> mTextureOfImage; |
156 | | Maybe<wr::ImageKey> mKey; |
157 | | RefPtr<ImageClient> mImageClient; |
158 | | Maybe<wr::PipelineId> mPipelineId; |
159 | | RefPtr<ImageContainer> mContainer; |
160 | | bool mOwnsKey; |
161 | | }; |
162 | | |
163 | | class WebRenderFallbackData : public WebRenderImageData |
164 | | { |
165 | | public: |
166 | | WebRenderFallbackData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); |
167 | | virtual ~WebRenderFallbackData(); |
168 | | |
169 | | virtual WebRenderFallbackData* AsFallbackData() override { return this; } |
170 | | virtual UserDataType GetType() override { return UserDataType::eFallback; } |
171 | | static UserDataType Type() { return UserDataType::eFallback; } |
172 | | nsDisplayItemGeometry* GetGeometry() override; |
173 | | void SetGeometry(nsAutoPtr<nsDisplayItemGeometry> aGeometry); |
174 | | nsRect GetBounds() { return mBounds; } |
175 | | void SetBounds(const nsRect& aRect) { mBounds = aRect; } |
176 | | void SetInvalid(bool aInvalid) { mInvalid = aInvalid; } |
177 | | void SetScale(gfx::Size aScale) { mScale = aScale; } |
178 | | gfx::Size GetScale() { return mScale; } |
179 | | bool IsInvalid() { return mInvalid; } |
180 | | void SetFonts(const std::vector<RefPtr<gfx::ScaledFont>>& aFonts) { mFonts = aFonts; } |
181 | | |
182 | | RefPtr<BasicLayerManager> mBasicLayerManager; |
183 | | std::vector<RefPtr<gfx::SourceSurface>> mExternalSurfaces; |
184 | | protected: |
185 | | nsAutoPtr<nsDisplayItemGeometry> mGeometry; |
186 | | nsRect mBounds; |
187 | | bool mInvalid; |
188 | | gfx::Size mScale; |
189 | | std::vector<RefPtr<gfx::ScaledFont>> mFonts; |
190 | | }; |
191 | | |
192 | | class WebRenderAnimationData : public WebRenderUserData |
193 | | { |
194 | | public: |
195 | | WebRenderAnimationData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); |
196 | | virtual ~WebRenderAnimationData(); |
197 | | |
198 | | virtual UserDataType GetType() override { return UserDataType::eAnimation; } |
199 | 0 | static UserDataType Type() { return UserDataType::eAnimation; } |
200 | 0 | AnimationInfo& GetAnimationInfo() { return mAnimationInfo; } |
201 | | |
202 | | protected: |
203 | | AnimationInfo mAnimationInfo; |
204 | | }; |
205 | | |
206 | | class WebRenderCanvasData : public WebRenderUserData |
207 | | { |
208 | | public: |
209 | | WebRenderCanvasData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem); |
210 | | virtual ~WebRenderCanvasData(); |
211 | | |
212 | | virtual WebRenderCanvasData* AsCanvasData() override { return this; } |
213 | | virtual UserDataType GetType() override { return UserDataType::eCanvas; } |
214 | 0 | static UserDataType Type() { return UserDataType::eCanvas; } |
215 | | |
216 | | void ClearCanvasRenderer(); |
217 | | WebRenderCanvasRendererAsync* GetCanvasRenderer(); |
218 | | WebRenderCanvasRendererAsync* CreateCanvasRenderer(); |
219 | | protected: |
220 | | |
221 | | UniquePtr<WebRenderCanvasRendererAsync> mCanvasRenderer; |
222 | | }; |
223 | | |
224 | | extern void DestroyWebRenderUserDataTable(WebRenderUserDataTable* aTable); |
225 | | |
226 | | struct WebRenderUserDataProperty { |
227 | | NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(Key, WebRenderUserDataTable, DestroyWebRenderUserDataTable) |
228 | | }; |
229 | | |
230 | | template<class T> already_AddRefed<T> |
231 | | GetWebRenderUserData(nsIFrame* aFrame, uint32_t aPerFrameKey) |
232 | 0 | { |
233 | 0 | MOZ_ASSERT(aFrame); |
234 | 0 | WebRenderUserDataTable* userDataTable = |
235 | 0 | aFrame->GetProperty(WebRenderUserDataProperty::Key()); |
236 | 0 | if (!userDataTable) { |
237 | 0 | return nullptr; |
238 | 0 | } |
239 | 0 | |
240 | 0 | WebRenderUserData* data = userDataTable->GetWeak(WebRenderUserDataKey(aPerFrameKey, T::Type())); |
241 | 0 | if (data) { |
242 | 0 | RefPtr<T> result = static_cast<T*>(data); |
243 | 0 | return result.forget(); |
244 | 0 | } |
245 | 0 | |
246 | 0 | return nullptr; |
247 | 0 | } Unexecuted instantiation: already_AddRefed<mozilla::layers::WebRenderAnimationData> mozilla::layers::GetWebRenderUserData<mozilla::layers::WebRenderAnimationData>(nsIFrame*, unsigned int) Unexecuted instantiation: already_AddRefed<mozilla::layers::WebRenderCanvasData> mozilla::layers::GetWebRenderUserData<mozilla::layers::WebRenderCanvasData>(nsIFrame*, unsigned int) Unexecuted instantiation: already_AddRefed<mozilla::layers::WebRenderFallbackData> mozilla::layers::GetWebRenderUserData<mozilla::layers::WebRenderFallbackData>(nsIFrame*, unsigned int) |
248 | | |
249 | | } // namespace layers |
250 | | } // namespace mozilla |
251 | | |
252 | | #endif /* GFX_WEBRENDERUSERDATA_H */ |