Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/layers/wr/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
  { }
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
0
  virtual WebRenderImageData* AsImageData() { return nullptr; }
65
0
  virtual WebRenderFallbackData* AsFallbackData() { return nullptr; }
66
0
  virtual WebRenderCanvasData* AsCanvasData() { return nullptr; }
67
0
  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
0
  bool IsUsed() { return mUsed; }
79
0
  void SetUsed(bool aUsed) { mUsed = aUsed; }
80
0
  nsIFrame* GetFrame() { return mFrame; }
81
0
  uint32_t GetDisplayItemKey() { return mDisplayItemKey; }
82
  void RemoveFromTable();
83
0
  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
  { }
101
102
  bool operator==(const WebRenderUserDataKey& other) const
103
0
  {
104
0
    return mFrameKey == other.mFrameKey && mType == other.mType;
105
0
  }
106
  PLDHashNumber Hash() const
107
0
  {
108
0
    return HashGeneric(mFrameKey, static_cast<std::underlying_type<decltype(mType)>::type>(mType));
109
0
  }
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
0
  virtual WebRenderImageData* AsImageData() override { return this; }
124
0
  virtual UserDataType GetType() override { return UserDataType::eImage; }
125
0
  static UserDataType Type() { return UserDataType::eImage; }
126
0
  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
0
  {
149
0
    return mPipelineId.isSome();
150
0
  }
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
0
  virtual WebRenderFallbackData* AsFallbackData() override { return this; }
170
0
  virtual UserDataType GetType() override { return UserDataType::eFallback; }
171
0
  static UserDataType Type() { return UserDataType::eFallback; }
172
  nsDisplayItemGeometry* GetGeometry() override;
173
  void SetGeometry(nsAutoPtr<nsDisplayItemGeometry> aGeometry);
174
0
  nsRect GetBounds() { return mBounds; }
175
0
  void SetBounds(const nsRect& aRect) { mBounds = aRect; }
176
0
  void SetInvalid(bool aInvalid) { mInvalid = aInvalid; }
177
0
  void SetScale(gfx::Size aScale) { mScale = aScale; }
178
0
  gfx::Size GetScale() { return mScale; }
179
0
  bool IsInvalid() { return mInvalid; }
180
0
  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
0
  virtual UserDataType GetType() override { return UserDataType::eAnimation; }
199
  static UserDataType Type() { return UserDataType::eAnimation; }
200
  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
0
  virtual WebRenderCanvasData* AsCanvasData() override { return this; }
213
0
  virtual UserDataType GetType() override { return UserDataType::eCanvas; }
214
  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
}
248
249
} // namespace layers
250
} // namespace mozilla
251
252
#endif /* GFX_WEBRENDERUSERDATA_H */