Bug 1922722 - Remove default argument from WebRenderBridgeParent::FlushRendering...
[gecko.git] / gfx / 2d / DrawTargetSkia.h
blobc8575c522f2469a9783417486368251a1f6ea60b
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_DRAWTARGETSKIA_H
8 #define _MOZILLA_GFX_DRAWTARGETSKIA_H
10 #include "2D.h"
11 #include <sstream>
12 #include <vector>
14 #ifdef MOZ_WIDGET_COCOA
15 # include <ApplicationServices/ApplicationServices.h>
16 #endif
18 class SkCanvas;
19 class SkShader;
20 class SkSurface;
22 namespace mozilla {
24 template <>
25 class RefPtrTraits<SkSurface> {
26 public:
27 static void Release(SkSurface* aSurface);
28 static void AddRef(SkSurface* aSurface);
31 namespace gfx {
33 class DataSourceSurface;
34 class SourceSurfaceSkia;
35 class BorrowedCGContext;
37 class DrawTargetSkia : public DrawTarget {
38 public:
39 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetSkia, override)
40 DrawTargetSkia();
41 virtual ~DrawTargetSkia();
43 virtual DrawTargetType GetType() const override;
44 virtual BackendType GetBackendType() const override {
45 return BackendType::SKIA;
47 already_AddRefed<SourceSurface> Snapshot(SurfaceFormat aFormat);
48 virtual already_AddRefed<SourceSurface> Snapshot() override {
49 return Snapshot(mFormat);
51 already_AddRefed<SourceSurface> GetBackingSurface() override;
52 virtual IntSize GetSize() const override { return mSize; };
53 virtual bool LockBits(uint8_t** aData, IntSize* aSize, int32_t* aStride,
54 SurfaceFormat* aFormat,
55 IntPoint* aOrigin = nullptr) override;
56 virtual void ReleaseBits(uint8_t* aData) override;
57 virtual void Flush() override;
58 virtual void DrawSurface(
59 SourceSurface* aSurface, const Rect& aDest, const Rect& aSource,
60 const DrawSurfaceOptions& aSurfOptions = DrawSurfaceOptions(),
61 const DrawOptions& aOptions = DrawOptions()) override;
62 virtual void DrawFilter(FilterNode* aNode, const Rect& aSourceRect,
63 const Point& aDestPoint,
64 const DrawOptions& aOptions = DrawOptions()) override;
65 virtual void DrawSurfaceWithShadow(SourceSurface* aSurface,
66 const Point& aDest,
67 const ShadowOptions& aShadow,
68 CompositionOp aOperator) override;
69 virtual void ClearRect(const Rect& aRect) override;
70 virtual void CopySurface(SourceSurface* aSurface, const IntRect& aSourceRect,
71 const IntPoint& aDestination) override;
72 virtual void FillRect(const Rect& aRect, const Pattern& aPattern,
73 const DrawOptions& aOptions = DrawOptions()) override;
74 virtual void StrokeRect(const Rect& aRect, const Pattern& aPattern,
75 const StrokeOptions& aStrokeOptions = StrokeOptions(),
76 const DrawOptions& aOptions = DrawOptions()) override;
77 virtual void StrokeLine(const Point& aStart, const Point& aEnd,
78 const Pattern& aPattern,
79 const StrokeOptions& aStrokeOptions = StrokeOptions(),
80 const DrawOptions& aOptions = DrawOptions()) override;
81 virtual void Stroke(const Path* aPath, const Pattern& aPattern,
82 const StrokeOptions& aStrokeOptions = StrokeOptions(),
83 const DrawOptions& aOptions = DrawOptions()) override;
84 virtual void Fill(const Path* aPath, const Pattern& aPattern,
85 const DrawOptions& aOptions = DrawOptions()) override;
87 virtual void FillGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer,
88 const Pattern& aPattern,
89 const DrawOptions& aOptions = DrawOptions()) override;
90 virtual void StrokeGlyphs(
91 ScaledFont* aFont, const GlyphBuffer& aBuffer, const Pattern& aPattern,
92 const StrokeOptions& aStrokeOptions = StrokeOptions(),
93 const DrawOptions& aOptions = DrawOptions()) override;
94 virtual void Mask(const Pattern& aSource, const Pattern& aMask,
95 const DrawOptions& aOptions = DrawOptions()) override;
96 virtual void MaskSurface(
97 const Pattern& aSource, SourceSurface* aMask, Point aOffset,
98 const DrawOptions& aOptions = DrawOptions()) override;
99 virtual bool Draw3DTransformedSurface(SourceSurface* aSurface,
100 const Matrix4x4& aMatrix) override;
101 virtual void PushClip(const Path* aPath) override;
102 virtual void PushClipRect(const Rect& aRect) override;
103 virtual void PushDeviceSpaceClipRects(const IntRect* aRects,
104 uint32_t aCount) override;
105 virtual void PopClip() override;
106 virtual bool RemoveAllClips() override;
107 virtual void PushLayer(bool aOpaque, Float aOpacity, SourceSurface* aMask,
108 const Matrix& aMaskTransform,
109 const IntRect& aBounds = IntRect(),
110 bool aCopyBackground = false) override;
111 virtual void PushLayerWithBlend(
112 bool aOpaque, Float aOpacity, SourceSurface* aMask,
113 const Matrix& aMaskTransform, const IntRect& aBounds = IntRect(),
114 bool aCopyBackground = false,
115 CompositionOp aCompositionOp = CompositionOp::OP_OVER) override;
116 virtual void PopLayer() override;
117 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData(
118 unsigned char* aData, const IntSize& aSize, int32_t aStride,
119 SurfaceFormat aFormat) const override;
120 virtual already_AddRefed<SourceSurface> OptimizeSourceSurface(
121 SourceSurface* aSurface) const override;
122 virtual already_AddRefed<SourceSurface> OptimizeSourceSurfaceForUnknownAlpha(
123 SourceSurface* aSurface) const override;
124 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromNativeSurface(
125 const NativeSurface& aSurface) const override;
126 virtual already_AddRefed<DrawTarget> CreateSimilarDrawTarget(
127 const IntSize& aSize, SurfaceFormat aFormat) const override;
128 virtual bool CanCreateSimilarDrawTarget(const IntSize& aSize,
129 SurfaceFormat aFormat) const override;
130 virtual RefPtr<DrawTarget> CreateClippedDrawTarget(
131 const Rect& aBounds, SurfaceFormat aFormat) override;
133 virtual already_AddRefed<PathBuilder> CreatePathBuilder(
134 FillRule aFillRule = FillRule::FILL_WINDING) const override;
136 virtual already_AddRefed<GradientStops> CreateGradientStops(
137 GradientStop* aStops, uint32_t aNumStops,
138 ExtendMode aExtendMode = ExtendMode::CLAMP) const override;
139 virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) override;
140 virtual void SetTransform(const Matrix& aTransform) override;
141 virtual void* GetNativeSurface(NativeSurfaceType aType) override;
142 virtual void DetachAllSnapshots() override { MarkChanged(); }
144 bool Init(const IntSize& aSize, SurfaceFormat aFormat);
145 bool Init(unsigned char* aData, const IntSize& aSize, int32_t aStride,
146 SurfaceFormat aFormat, bool aUninitialized = false);
147 bool Init(SkCanvas* aCanvas);
148 bool Init(RefPtr<DataSourceSurface>&& aSurface);
150 // Skia assumes that texture sizes fit in 16-bit signed integers.
151 static size_t GetMaxSurfaceSize() { return 32767; }
153 operator std::string() const {
154 std::stringstream stream;
155 stream << "DrawTargetSkia(" << this << ")";
156 return stream.str();
159 Maybe<IntRect> GetDeviceClipRect(bool aAllowComplex = false) const;
161 Maybe<Rect> GetGlyphLocalBounds(ScaledFont* aFont, const GlyphBuffer& aBuffer,
162 const Pattern& aPattern,
163 const StrokeOptions* aStrokeOptions,
164 const DrawOptions& aOptions);
166 void DrawGlyphMask(ScaledFont* aFont, const GlyphBuffer& aBuffer,
167 const DeviceColor& aColor,
168 const StrokeOptions* aStrokeOptions = nullptr,
169 const DrawOptions& aOptions = DrawOptions());
171 private:
172 friend class SourceSurfaceSkia;
174 static void ReleaseMappedSkSurface(void* aPixels, void* aContext);
176 void MarkChanged();
178 void DrawGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer,
179 const Pattern& aPattern,
180 const StrokeOptions* aStrokeOptions = nullptr,
181 const DrawOptions& aOptions = DrawOptions(),
182 SkShader* aShader = nullptr);
184 struct PushedLayer {
185 PushedLayer(bool aOldPermitSubpixelAA, SourceSurface* aMask)
186 : mOldPermitSubpixelAA(aOldPermitSubpixelAA), mMask(aMask) {}
187 bool mOldPermitSubpixelAA;
188 RefPtr<SourceSurface> mMask;
190 std::vector<PushedLayer> mPushedLayers;
192 IntSize mSize;
193 RefPtr<SkSurface> mSurface;
194 SkCanvas* mCanvas = nullptr;
195 RefPtr<DataSourceSurface> mBackingSurface;
196 RefPtr<SourceSurfaceSkia> mSnapshot;
197 Mutex mSnapshotLock MOZ_UNANNOTATED;
199 #ifdef MOZ_WIDGET_COCOA
200 friend class BorrowedCGContext;
202 CGContextRef BorrowCGContext(const DrawOptions& aOptions);
203 void ReturnCGContext(CGContextRef);
204 bool FillGlyphsWithCG(ScaledFont* aFont, const GlyphBuffer& aBuffer,
205 const Pattern& aPattern,
206 const DrawOptions& aOptions = DrawOptions());
208 CGContextRef mCG;
209 CGColorSpaceRef mColorSpace;
210 uint8_t* mCanvasData;
211 IntSize mCGSize;
212 bool mNeedLayer;
213 #endif
216 } // namespace gfx
217 } // namespace mozilla
219 #endif // _MOZILLA_GFX_SOURCESURFACESKIA_H