Bug 1686855 [wpt PR 27197] - PlzDedicatedWorker: WPT for clients.matchAll() with...
[gecko.git] / gfx / 2d / FilterNodeD2D1.h
blob18d475c7e70b3e3ff6727337823b6297b4f57f2f
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/. */
7 #ifndef MOZILLA_GFX_FILTERNODED2D1_H_
8 #define MOZILLA_GFX_FILTERNODED2D1_H_
10 #include "2D.h"
11 #include "Filters.h"
12 #include <vector>
13 #include <d2d1_1.h>
14 #include <cguid.h>
16 namespace mozilla {
17 namespace gfx {
19 class FilterNodeD2D1 : public FilterNode {
20 public:
21 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeD2D1, override)
23 static already_AddRefed<FilterNode> Create(ID2D1DeviceContext* aDC,
24 FilterType aType);
26 FilterNodeD2D1(ID2D1Effect* aEffect, FilterType aType)
27 : mEffect(aEffect), mType(aType) {
28 InitUnmappedProperties();
31 virtual FilterBackend GetBackendType() { return FILTER_BACKEND_DIRECT2D1_1; }
33 virtual void SetInput(uint32_t aIndex, SourceSurface* aSurface);
34 virtual void SetInput(uint32_t aIndex, FilterNode* aFilter);
36 virtual void SetAttribute(uint32_t aIndex, uint32_t aValue);
37 virtual void SetAttribute(uint32_t aIndex, Float aValue);
38 virtual void SetAttribute(uint32_t aIndex, const Point& aValue);
39 virtual void SetAttribute(uint32_t aIndex, const Matrix5x4& aValue);
40 virtual void SetAttribute(uint32_t aIndex, const Point3D& aValue);
41 virtual void SetAttribute(uint32_t aIndex, const Size& aValue);
42 virtual void SetAttribute(uint32_t aIndex, const IntSize& aValue);
43 virtual void SetAttribute(uint32_t aIndex, const DeviceColor& aValue);
44 virtual void SetAttribute(uint32_t aIndex, const Rect& aValue);
45 virtual void SetAttribute(uint32_t aIndex, const IntRect& aValue);
46 virtual void SetAttribute(uint32_t aIndex, bool aValue);
47 virtual void SetAttribute(uint32_t aIndex, const Float* aValues,
48 uint32_t aSize);
49 virtual void SetAttribute(uint32_t aIndex, const IntPoint& aValue);
50 virtual void SetAttribute(uint32_t aIndex, const Matrix& aValue);
52 // Called by DrawTarget before it draws our OutputEffect, and recursively
53 // by the filter nodes that have this filter as one of their inputs. This
54 // gives us a chance to convert any input surfaces to the target format for
55 // the DrawTarget that we will draw to.
56 virtual void WillDraw(DrawTarget* aDT);
58 virtual ID2D1Effect* MainEffect() { return mEffect.get(); }
59 virtual ID2D1Effect* InputEffect() { return mEffect.get(); }
60 virtual ID2D1Effect* OutputEffect() { return mEffect.get(); }
62 protected:
63 friend class DrawTargetD2D1;
64 friend class DrawTargetD2D;
65 friend class FilterNodeConvolveD2D1;
67 void InitUnmappedProperties();
69 RefPtr<ID2D1Effect> mEffect;
70 std::vector<RefPtr<FilterNodeD2D1>> mInputFilters;
71 std::vector<RefPtr<SourceSurface>> mInputSurfaces;
72 FilterType mType;
74 private:
75 using FilterNode::SetAttribute;
76 using FilterNode::SetInput;
79 class FilterNodeConvolveD2D1 : public FilterNodeD2D1 {
80 public:
81 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeConvolveD2D1, override)
82 explicit FilterNodeConvolveD2D1(ID2D1DeviceContext* aDC);
84 void SetInput(uint32_t aIndex, FilterNode* aFilter) override;
86 void SetAttribute(uint32_t aIndex, uint32_t aValue) override;
87 void SetAttribute(uint32_t aIndex, const IntSize& aValue) override;
88 void SetAttribute(uint32_t aIndex, const IntPoint& aValue) override;
89 void SetAttribute(uint32_t aIndex, const IntRect& aValue) override;
91 ID2D1Effect* InputEffect() override;
93 private:
94 using FilterNode::SetAttribute;
95 using FilterNode::SetInput;
97 void UpdateChain();
98 void UpdateOffset();
99 void UpdateSourceRect();
101 RefPtr<ID2D1Effect> mExtendInputEffect;
102 RefPtr<ID2D1Effect> mBorderEffect;
103 ConvolveMatrixEdgeMode mEdgeMode;
104 IntPoint mTarget;
105 IntSize mKernelSize;
106 IntRect mSourceRect;
109 class FilterNodeOpacityD2D1 : public FilterNodeD2D1 {
110 public:
111 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeOpacityD2D1, override)
112 FilterNodeOpacityD2D1(ID2D1Effect* aEffect, FilterType aType)
113 : FilterNodeD2D1(aEffect, aType) {}
115 void SetAttribute(uint32_t aIndex, Float aValue) override;
118 class FilterNodeExtendInputAdapterD2D1 : public FilterNodeD2D1 {
119 public:
120 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeExtendInputAdapterD2D1,
121 override)
122 FilterNodeExtendInputAdapterD2D1(ID2D1DeviceContext* aDC,
123 FilterNodeD2D1* aFilterNode,
124 FilterType aType);
126 ID2D1Effect* InputEffect() override { return mExtendInputEffect.get(); }
127 ID2D1Effect* OutputEffect() override {
128 return mWrappedFilterNode->OutputEffect();
131 private:
132 RefPtr<FilterNodeD2D1> mWrappedFilterNode;
133 RefPtr<ID2D1Effect> mExtendInputEffect;
136 class FilterNodePremultiplyAdapterD2D1 : public FilterNodeD2D1 {
137 public:
138 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodePremultiplyAdapterD2D1,
139 override)
140 FilterNodePremultiplyAdapterD2D1(ID2D1DeviceContext* aDC,
141 FilterNodeD2D1* aFilterNode,
142 FilterType aType);
144 ID2D1Effect* InputEffect() override { return mPrePremultiplyEffect.get(); }
145 ID2D1Effect* OutputEffect() override {
146 return mPostUnpremultiplyEffect.get();
149 private:
150 RefPtr<ID2D1Effect> mPrePremultiplyEffect;
151 RefPtr<ID2D1Effect> mPostUnpremultiplyEffect;
154 } // namespace gfx
155 } // namespace mozilla
157 #endif