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
14 #ifdef MOZ_WIDGET_COCOA
15 # include <ApplicationServices/ApplicationServices.h>
25 class RefPtrTraits
<SkSurface
> {
27 static void Release(SkSurface
* aSurface
);
28 static void AddRef(SkSurface
* aSurface
);
33 class DataSourceSurface
;
34 class SourceSurfaceSkia
;
35 class BorrowedCGContext
;
37 class DrawTargetSkia
: public DrawTarget
{
39 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetSkia
, override
)
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
,
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 << ")";
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());
172 friend class SourceSurfaceSkia
;
174 static void ReleaseMappedSkSurface(void* aPixels
, void* aContext
);
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);
185 PushedLayer(bool aOldPermitSubpixelAA
, SourceSurface
* aMask
)
186 : mOldPermitSubpixelAA(aOldPermitSubpixelAA
), mMask(aMask
) {}
187 bool mOldPermitSubpixelAA
;
188 RefPtr
<SourceSurface
> mMask
;
190 std::vector
<PushedLayer
> mPushedLayers
;
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());
209 CGColorSpaceRef mColorSpace
;
210 uint8_t* mCanvasData
;
217 } // namespace mozilla
219 #endif // _MOZILLA_GFX_SOURCESURFACESKIA_H