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_DRAWTARGETDUAL_H_
8 #define MOZILLA_GFX_DRAWTARGETDUAL_H_
13 #include "SourceSurfaceDual.h"
21 #define FORWARD_FUNCTION(funcName) \
22 virtual void funcName() override { \
26 #define FORWARD_FUNCTION1(funcName, var1Type, var1Name) \
27 virtual void funcName(var1Type var1Name) override { \
28 mA->funcName(var1Name); \
29 mB->funcName(var1Name); \
32 /* This is a special type of DrawTarget. It duplicates all drawing calls
33 * accross two drawtargets. An exception to this is when a snapshot of another
34 * dual DrawTarget is used as the source for any surface data. In this case
35 * the snapshot of the first source DrawTarget is used as a source for the call
36 * to the first destination DrawTarget (mA) and the snapshot of the second
37 * source DrawTarget is used at the source for the second destination
38 * DrawTarget (mB). This class facilitates black-background/white-background
39 * drawing for per-component alpha extraction for backends which do not support
40 * native component alpha.
42 class DrawTargetDual
: public DrawTarget
{
44 virtual bool IsValid() const override
{
45 return mA
->IsValid() && mB
->IsValid();
48 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetDual
, override
)
49 DrawTargetDual(DrawTarget
* aA
, DrawTarget
* aB
) : mA(aA
), mB(aB
) {
50 mFormat
= aA
->GetFormat();
53 virtual DrawTargetType
GetType() const override
{ return mA
->GetType(); }
54 virtual BackendType
GetBackendType() const override
{
55 return mA
->GetBackendType();
57 virtual already_AddRefed
<SourceSurface
> Snapshot() override
{
58 return MakeAndAddRef
<SourceSurfaceDual
>(mA
, mB
);
60 virtual IntSize
GetSize() const override
{ return mA
->GetSize(); }
62 virtual void DetachAllSnapshots() override
;
64 FORWARD_FUNCTION(Flush
)
65 FORWARD_FUNCTION1(PushClip
, const Path
*, aPath
)
66 FORWARD_FUNCTION1(PushClipRect
, const Rect
&, aRect
)
67 FORWARD_FUNCTION(PopClip
)
68 FORWARD_FUNCTION(PopLayer
)
70 virtual void SetTransform(const Matrix
& aTransform
) override
{
71 mTransform
= aTransform
;
72 mA
->SetTransform(aTransform
);
73 mB
->SetTransform(aTransform
);
76 virtual bool SupportsRegionClipping() const override
{
77 return mA
->SupportsRegionClipping() && mB
->SupportsRegionClipping();
80 virtual void DrawSurface(SourceSurface
* aSurface
, const Rect
& aDest
,
82 const DrawSurfaceOptions
& aSurfOptions
,
83 const DrawOptions
& aOptions
) override
;
85 virtual void DrawFilter(
86 FilterNode
* aNode
, const Rect
& aSourceRect
, const Point
& aDestPoint
,
87 const DrawOptions
& aOptions
= DrawOptions()) override
{
88 mA
->DrawFilter(aNode
, aSourceRect
, aDestPoint
, aOptions
);
89 mB
->DrawFilter(aNode
, aSourceRect
, aDestPoint
, aOptions
);
92 virtual void MaskSurface(
93 const Pattern
& aSource
, SourceSurface
* aMask
, Point aOffset
,
94 const DrawOptions
& aOptions
= DrawOptions()) override
;
96 virtual void DrawSurfaceWithShadow(SourceSurface
* aSurface
,
98 const DeviceColor
& aColor
,
99 const Point
& aOffset
, Float aSigma
,
100 CompositionOp aOp
) override
;
102 virtual void ClearRect(const Rect
& aRect
) override
;
104 virtual void CopySurface(SourceSurface
* aSurface
, const IntRect
& aSourceRect
,
105 const IntPoint
& aDestination
) override
;
107 virtual void FillRect(const Rect
& aRect
, const Pattern
& aPattern
,
108 const DrawOptions
& aOptions
) override
;
110 virtual void StrokeRect(const Rect
& aRect
, const Pattern
& aPattern
,
111 const StrokeOptions
& aStrokeOptions
,
112 const DrawOptions
& aOptions
) override
;
114 virtual void StrokeLine(const Point
& aStart
, const Point
& aEnd
,
115 const Pattern
& aPattern
,
116 const StrokeOptions
& aStrokeOptions
,
117 const DrawOptions
& aOptions
) override
;
119 virtual void Stroke(const Path
* aPath
, const Pattern
& aPattern
,
120 const StrokeOptions
& aStrokeOptions
,
121 const DrawOptions
& aOptions
) override
;
123 virtual void Fill(const Path
* aPath
, const Pattern
& aPattern
,
124 const DrawOptions
& aOptions
) override
;
126 virtual void FillGlyphs(ScaledFont
* aScaledFont
, const GlyphBuffer
& aBuffer
,
127 const Pattern
& aPattern
,
128 const DrawOptions
& aOptions
) override
;
130 virtual void Mask(const Pattern
& aSource
, const Pattern
& aMask
,
131 const DrawOptions
& aOptions
) override
;
133 virtual void PushLayer(bool aOpaque
, Float aOpacity
, SourceSurface
* aMask
,
134 const Matrix
& aMaskTransform
,
135 const IntRect
& aBounds
= IntRect(),
136 bool aCopyBackground
= false) override
;
138 virtual bool Unrotate(IntPoint aRotation
) override
{
139 return mA
->Unrotate(aRotation
) && mB
->Unrotate(aRotation
);
142 virtual already_AddRefed
<SourceSurface
> CreateSourceSurfaceFromData(
143 unsigned char* aData
, const IntSize
& aSize
, int32_t aStride
,
144 SurfaceFormat aFormat
) const override
{
145 return mA
->CreateSourceSurfaceFromData(aData
, aSize
, aStride
, aFormat
);
148 virtual already_AddRefed
<SourceSurface
> OptimizeSourceSurface(
149 SourceSurface
* aSurface
) const override
{
150 return mA
->OptimizeSourceSurface(aSurface
);
153 virtual already_AddRefed
<SourceSurface
> CreateSourceSurfaceFromNativeSurface(
154 const NativeSurface
& aSurface
) const override
{
155 return mA
->CreateSourceSurfaceFromNativeSurface(aSurface
);
158 virtual already_AddRefed
<DrawTarget
> CreateSimilarDrawTarget(
159 const IntSize
& aSize
, SurfaceFormat aFormat
) const override
;
160 virtual bool CanCreateSimilarDrawTarget(const IntSize
& aSize
,
161 SurfaceFormat aFormat
) const override
;
162 virtual RefPtr
<DrawTarget
> CreateClippedDrawTarget(
163 const Rect
& aBounds
, SurfaceFormat aFormat
) override
;
165 virtual already_AddRefed
<PathBuilder
> CreatePathBuilder(
166 FillRule aFillRule
= FillRule::FILL_WINDING
) const override
{
167 return mA
->CreatePathBuilder(aFillRule
);
170 virtual already_AddRefed
<GradientStops
> CreateGradientStops(
171 GradientStop
* aStops
, uint32_t aNumStops
,
172 ExtendMode aExtendMode
= ExtendMode::CLAMP
) const override
{
173 return mA
->CreateGradientStops(aStops
, aNumStops
, aExtendMode
);
176 virtual already_AddRefed
<FilterNode
> CreateFilter(FilterType aType
) override
{
177 return mA
->CreateFilter(aType
);
180 virtual void* GetNativeSurface(NativeSurfaceType aType
) override
{
184 virtual bool IsDualDrawTarget() const override
{ return true; }
186 virtual bool IsCurrentGroupOpaque() override
{
187 return mA
->IsCurrentGroupOpaque();
191 RefPtr
<DrawTarget
> mA
;
192 RefPtr
<DrawTarget
> mB
;
196 } // namespace mozilla
198 #endif /* MOZILLA_GFX_DRAWTARGETDUAL_H_ */