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 MOZILLA_GFX_DRAWTARGETDUAL_H_ 8 #define MOZILLA_GFX_DRAWTARGETDUAL_H_ 9 10 #include <vector> 11 #include <sstream> 12 13 #include "SourceSurfaceDual.h" 14 15 #include "2D.h" 16 #include "Filters.h" 17 18 namespace mozilla { 19 namespace gfx { 20 21 #define FORWARD_FUNCTION(funcName) \ 22 virtual void funcName() override { \ 23 mA->funcName(); \ 24 mB->funcName(); \ 25 } 26 #define FORWARD_FUNCTION1(funcName, var1Type, var1Name) \ 27 virtual void funcName(var1Type var1Name) override { \ 28 mA->funcName(var1Name); \ 29 mB->funcName(var1Name); \ 30 } 31 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. 41 */ 42 class DrawTargetDual : public DrawTarget { 43 public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetDual,override)44 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetDual, override) 45 DrawTargetDual(DrawTarget *aA, DrawTarget *aB) : mA(aA), mB(aB) { 46 mFormat = aA->GetFormat(); 47 } 48 GetType()49 virtual DrawTargetType GetType() const override { return mA->GetType(); } GetBackendType()50 virtual BackendType GetBackendType() const override { 51 return mA->GetBackendType(); 52 } Snapshot()53 virtual already_AddRefed<SourceSurface> Snapshot() override { 54 return MakeAndAddRef<SourceSurfaceDual>(mA, mB); 55 } GetSize()56 virtual IntSize GetSize() const override { return mA->GetSize(); } 57 58 virtual void DetachAllSnapshots() override; 59 60 FORWARD_FUNCTION(Flush) FORWARD_FUNCTION1(PushClip,const Path *,aPath)61 FORWARD_FUNCTION1(PushClip, const Path *, aPath) 62 FORWARD_FUNCTION1(PushClipRect, const Rect &, aRect) 63 FORWARD_FUNCTION(PopClip) 64 FORWARD_FUNCTION(PopLayer) 65 FORWARD_FUNCTION1(ClearRect, const Rect &, aRect) 66 67 virtual void SetTransform(const Matrix &aTransform) override { 68 mTransform = aTransform; 69 mA->SetTransform(aTransform); 70 mB->SetTransform(aTransform); 71 } 72 73 virtual void DrawSurface(SourceSurface *aSurface, const Rect &aDest, 74 const Rect &aSource, 75 const DrawSurfaceOptions &aSurfOptions, 76 const DrawOptions &aOptions) override; 77 78 virtual void DrawFilter( 79 FilterNode *aNode, const Rect &aSourceRect, const Point &aDestPoint, 80 const DrawOptions &aOptions = DrawOptions()) override { 81 mA->DrawFilter(aNode, aSourceRect, aDestPoint, aOptions); 82 mB->DrawFilter(aNode, aSourceRect, aDestPoint, aOptions); 83 } 84 85 virtual void MaskSurface( 86 const Pattern &aSource, SourceSurface *aMask, Point aOffset, 87 const DrawOptions &aOptions = DrawOptions()) override; 88 89 virtual void DrawSurfaceWithShadow(SourceSurface *aSurface, 90 const Point &aDest, const Color &aColor, 91 const Point &aOffset, Float aSigma, 92 CompositionOp aOp) override; 93 94 virtual void CopySurface(SourceSurface *aSurface, const IntRect &aSourceRect, 95 const IntPoint &aDestination) override; 96 97 virtual void FillRect(const Rect &aRect, const Pattern &aPattern, 98 const DrawOptions &aOptions) override; 99 100 virtual void StrokeRect(const Rect &aRect, const Pattern &aPattern, 101 const StrokeOptions &aStrokeOptions, 102 const DrawOptions &aOptions) override; 103 104 virtual void StrokeLine(const Point &aStart, const Point &aEnd, 105 const Pattern &aPattern, 106 const StrokeOptions &aStrokeOptions, 107 const DrawOptions &aOptions) override; 108 109 virtual void Stroke(const Path *aPath, const Pattern &aPattern, 110 const StrokeOptions &aStrokeOptions, 111 const DrawOptions &aOptions) override; 112 113 virtual void Fill(const Path *aPath, const Pattern &aPattern, 114 const DrawOptions &aOptions) override; 115 116 virtual void FillGlyphs(ScaledFont *aScaledFont, const GlyphBuffer &aBuffer, 117 const Pattern &aPattern, 118 const DrawOptions &aOptions) override; 119 120 virtual void Mask(const Pattern &aSource, const Pattern &aMask, 121 const DrawOptions &aOptions) override; 122 123 virtual void PushLayer(bool aOpaque, Float aOpacity, SourceSurface *aMask, 124 const Matrix &aMaskTransform, 125 const IntRect &aBounds = IntRect(), 126 bool aCopyBackground = false) override; 127 CreateSourceSurfaceFromData(unsigned char * aData,const IntSize & aSize,int32_t aStride,SurfaceFormat aFormat)128 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData( 129 unsigned char *aData, const IntSize &aSize, int32_t aStride, 130 SurfaceFormat aFormat) const override { 131 return mA->CreateSourceSurfaceFromData(aData, aSize, aStride, aFormat); 132 } 133 OptimizeSourceSurface(SourceSurface * aSurface)134 virtual already_AddRefed<SourceSurface> OptimizeSourceSurface( 135 SourceSurface *aSurface) const override { 136 return mA->OptimizeSourceSurface(aSurface); 137 } 138 CreateSourceSurfaceFromNativeSurface(const NativeSurface & aSurface)139 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromNativeSurface( 140 const NativeSurface &aSurface) const override { 141 return mA->CreateSourceSurfaceFromNativeSurface(aSurface); 142 } 143 144 virtual already_AddRefed<DrawTarget> CreateSimilarDrawTarget( 145 const IntSize &aSize, SurfaceFormat aFormat) const override; 146 147 virtual already_AddRefed<PathBuilder> CreatePathBuilder( 148 FillRule aFillRule = FillRule::FILL_WINDING) const override { 149 return mA->CreatePathBuilder(aFillRule); 150 } 151 152 virtual already_AddRefed<GradientStops> CreateGradientStops( 153 GradientStop *aStops, uint32_t aNumStops, 154 ExtendMode aExtendMode = ExtendMode::CLAMP) const override { 155 return mA->CreateGradientStops(aStops, aNumStops, aExtendMode); 156 } 157 CreateFilter(FilterType aType)158 virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) override { 159 return mA->CreateFilter(aType); 160 } 161 GetNativeSurface(NativeSurfaceType aType)162 virtual void *GetNativeSurface(NativeSurfaceType aType) override { 163 return nullptr; 164 } 165 IsDualDrawTarget()166 virtual bool IsDualDrawTarget() const override { return true; } 167 IsCurrentGroupOpaque()168 virtual bool IsCurrentGroupOpaque() override { 169 return mA->IsCurrentGroupOpaque(); 170 } 171 172 private: 173 RefPtr<DrawTarget> mA; 174 RefPtr<DrawTarget> mB; 175 }; 176 177 } // namespace gfx 178 } // namespace mozilla 179 180 #endif /* MOZILLA_GFX_DRAWTARGETDUAL_H_ */ 181