DrawTargetSkia.h (9616B)
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_DRAWTARGETSKIA_H 8 #define _MOZILLA_GFX_DRAWTARGETSKIA_H 9 10 #include "2D.h" 11 #include <sstream> 12 #include <vector> 13 14 #ifdef XP_DARWIN 15 # include <CoreGraphics/CGColorSpace.h> 16 #endif 17 18 class SkCanvas; 19 class SkShader; 20 class SkSurface; 21 22 namespace mozilla { 23 24 template <> 25 class RefPtrTraits<SkSurface> { 26 public: 27 static void Release(SkSurface* aSurface); 28 static void AddRef(SkSurface* aSurface); 29 }; 30 31 namespace gfx { 32 33 class DataSourceSurface; 34 class SourceSurfaceSkia; 35 class BorrowedCGContext; 36 37 class DrawTargetSkia : public DrawTarget { 38 public: 39 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTargetSkia, override) 40 DrawTargetSkia(); 41 virtual ~DrawTargetSkia(); 42 43 virtual DrawTargetType GetType() const override; 44 virtual BackendType GetBackendType() const override { 45 return BackendType::SKIA; 46 } 47 already_AddRefed<SourceSurface> Snapshot(SurfaceFormat aFormat); 48 virtual already_AddRefed<SourceSurface> Snapshot() override { 49 return Snapshot(mFormat); 50 } 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 Blur(const GaussianBlur& aBlur) override; 70 virtual void ClearRect(const Rect& aRect) override; 71 virtual void CopySurface(SourceSurface* aSurface, const IntRect& aSourceRect, 72 const IntPoint& aDestination) override; 73 virtual void FillRect(const Rect& aRect, const Pattern& aPattern, 74 const DrawOptions& aOptions = DrawOptions()) override; 75 virtual void StrokeRect(const Rect& aRect, const Pattern& aPattern, 76 const StrokeOptions& aStrokeOptions = StrokeOptions(), 77 const DrawOptions& aOptions = DrawOptions()) override; 78 virtual void StrokeLine(const Point& aStart, const Point& aEnd, 79 const Pattern& aPattern, 80 const StrokeOptions& aStrokeOptions = StrokeOptions(), 81 const DrawOptions& aOptions = DrawOptions()) override; 82 virtual void Stroke(const Path* aPath, const Pattern& aPattern, 83 const StrokeOptions& aStrokeOptions = StrokeOptions(), 84 const DrawOptions& aOptions = DrawOptions()) override; 85 virtual void Fill(const Path* aPath, const Pattern& aPattern, 86 const DrawOptions& aOptions = DrawOptions()) override; 87 88 virtual void FillGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer, 89 const Pattern& aPattern, 90 const DrawOptions& aOptions = DrawOptions()) override; 91 virtual void StrokeGlyphs( 92 ScaledFont* aFont, const GlyphBuffer& aBuffer, const Pattern& aPattern, 93 const StrokeOptions& aStrokeOptions = StrokeOptions(), 94 const DrawOptions& aOptions = DrawOptions()) override; 95 virtual void Mask(const Pattern& aSource, const Pattern& aMask, 96 const DrawOptions& aOptions = DrawOptions()) override; 97 virtual void MaskSurface( 98 const Pattern& aSource, SourceSurface* aMask, Point aOffset, 99 const DrawOptions& aOptions = DrawOptions()) override; 100 virtual bool Draw3DTransformedSurface(SourceSurface* aSurface, 101 const Matrix4x4& aMatrix) override; 102 virtual void PushClip(const Path* aPath) override; 103 virtual void PushClipRect(const Rect& aRect) override; 104 virtual void PushDeviceSpaceClipRects(const IntRect* aRects, 105 uint32_t aCount) override; 106 virtual void PopClip() override; 107 virtual bool RemoveAllClips() override; 108 virtual void PushLayer(bool aOpaque, Float aOpacity, SourceSurface* aMask, 109 const Matrix& aMaskTransform, 110 const IntRect& aBounds = IntRect(), 111 bool aCopyBackground = false) override; 112 virtual void PushLayerWithBlend( 113 bool aOpaque, Float aOpacity, SourceSurface* aMask, 114 const Matrix& aMaskTransform, const IntRect& aBounds = IntRect(), 115 bool aCopyBackground = false, 116 CompositionOp aCompositionOp = CompositionOp::OP_OVER) override; 117 virtual void PopLayer() override; 118 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData( 119 unsigned char* aData, const IntSize& aSize, int32_t aStride, 120 SurfaceFormat aFormat) const override; 121 virtual already_AddRefed<SourceSurface> OptimizeSourceSurface( 122 SourceSurface* aSurface) const override; 123 virtual already_AddRefed<SourceSurface> OptimizeSourceSurfaceForUnknownAlpha( 124 SourceSurface* aSurface) const override; 125 virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromNativeSurface( 126 const NativeSurface& aSurface) const override; 127 virtual already_AddRefed<DrawTarget> CreateSimilarDrawTarget( 128 const IntSize& aSize, SurfaceFormat aFormat) const override; 129 virtual bool CanCreateSimilarDrawTarget(const IntSize& aSize, 130 SurfaceFormat aFormat) const override; 131 virtual RefPtr<DrawTarget> CreateClippedDrawTarget( 132 const Rect& aBounds, SurfaceFormat aFormat) override; 133 134 virtual already_AddRefed<PathBuilder> CreatePathBuilder( 135 FillRule aFillRule = FillRule::FILL_WINDING) const override; 136 137 virtual already_AddRefed<GradientStops> CreateGradientStops( 138 GradientStop* aStops, uint32_t aNumStops, 139 ExtendMode aExtendMode = ExtendMode::CLAMP) const override; 140 virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) override; 141 virtual void SetTransform(const Matrix& aTransform) override; 142 virtual void* GetNativeSurface(NativeSurfaceType aType) override; 143 virtual void DetachAllSnapshots() override; 144 145 bool Init(const IntSize& aSize, SurfaceFormat aFormat); 146 bool Init(unsigned char* aData, const IntSize& aSize, int32_t aStride, 147 SurfaceFormat aFormat, bool aUninitialized = false, 148 bool aIsClear = false); 149 bool Init(SkCanvas* aCanvas); 150 bool Init(RefPtr<DataSourceSurface>&& aSurface); 151 152 // Skia assumes that texture sizes fit in 16-bit signed integers. 153 static size_t GetMaxSurfaceSize() { return 32767; } 154 155 operator std::string() const { 156 std::stringstream stream; 157 stream << "DrawTargetSkia(" << this << ")"; 158 return stream.str(); 159 } 160 161 Maybe<IntRect> GetDeviceClipRect(bool aAllowComplex = false) const; 162 bool IsClipEmpty() const; 163 164 Maybe<Rect> GetGlyphLocalBounds(ScaledFont* aFont, const GlyphBuffer& aBuffer, 165 const Pattern& aPattern, 166 const StrokeOptions* aStrokeOptions, 167 const DrawOptions& aOptions); 168 169 void DrawGlyphMask(ScaledFont* aFont, const GlyphBuffer& aBuffer, 170 const DeviceColor& aColor, 171 const StrokeOptions* aStrokeOptions = nullptr, 172 const DrawOptions& aOptions = DrawOptions()); 173 174 private: 175 friend class SourceSurfaceSkia; 176 177 static void ReleaseMappedSkSurface(void* aPixels, void* aContext); 178 179 void MarkChanged(); 180 181 void DrawGlyphs(ScaledFont* aFont, const GlyphBuffer& aBuffer, 182 const Pattern& aPattern, 183 const StrokeOptions* aStrokeOptions = nullptr, 184 const DrawOptions& aOptions = DrawOptions(), 185 SkShader* aShader = nullptr); 186 187 struct PushedLayer { 188 PushedLayer(bool aOldPermitSubpixelAA, SourceSurface* aMask) 189 : mOldPermitSubpixelAA(aOldPermitSubpixelAA), mMask(aMask) {} 190 bool mOldPermitSubpixelAA; 191 RefPtr<SourceSurface> mMask; 192 }; 193 std::vector<PushedLayer> mPushedLayers; 194 195 IntSize mSize; 196 RefPtr<SkSurface> mSurface; 197 SkCanvas* mCanvas = nullptr; 198 RefPtr<DataSourceSurface> mBackingSurface; 199 RefPtr<SourceSurfaceSkia> mSnapshot; 200 Mutex mSnapshotLock MOZ_UNANNOTATED; 201 bool mIsClear = false; 202 203 #ifdef XP_DARWIN 204 friend class BorrowedCGContext; 205 206 CGContextRef BorrowCGContext(const DrawOptions& aOptions); 207 void ReturnCGContext(CGContextRef); 208 bool FillGlyphsWithCG(ScaledFont* aFont, const GlyphBuffer& aBuffer, 209 const Pattern& aPattern, 210 const DrawOptions& aOptions = DrawOptions()); 211 212 CGContextRef mCG; 213 CGColorSpaceRef mColorSpace; 214 uint8_t* mCanvasData; 215 IntSize mCGSize; 216 bool mNeedLayer; 217 #endif 218 }; 219 220 } // namespace gfx 221 } // namespace mozilla 222 223 #endif // _MOZILLA_GFX_SOURCESURFACESKIA_H