1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkSVGDevice_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkSVGDevice_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTypeTraits.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/utils/SkParsePath.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkClipStackDevice.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 20*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 21*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 22*c8dee2aaSAndroid Build Coastguard Worker #include <type_traits> 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { 25*c8dee2aaSAndroid Build Coastguard Worker class GlyphRunList; 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker class SkDevice; 29*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap; 30*c8dee2aaSAndroid Build Coastguard Worker class SkBlender; 31*c8dee2aaSAndroid Build Coastguard Worker class SkClipStack; 32*c8dee2aaSAndroid Build Coastguard Worker class SkData; 33*c8dee2aaSAndroid Build Coastguard Worker class SkImage; 34*c8dee2aaSAndroid Build Coastguard Worker class SkMesh; 35*c8dee2aaSAndroid Build Coastguard Worker class SkPaint; 36*c8dee2aaSAndroid Build Coastguard Worker class SkPath; 37*c8dee2aaSAndroid Build Coastguard Worker class SkRRect; 38*c8dee2aaSAndroid Build Coastguard Worker class SkVertices; 39*c8dee2aaSAndroid Build Coastguard Worker class SkXMLWriter; 40*c8dee2aaSAndroid Build Coastguard Worker struct SkISize; 41*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint; 42*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 43*c8dee2aaSAndroid Build Coastguard Worker struct SkSamplingOptions; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker class SkSVGDevice final : public SkClipStackDevice { 46*c8dee2aaSAndroid Build Coastguard Worker public: 47*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkDevice> Make(const SkISize& size, std::unique_ptr<SkXMLWriter>, uint32_t flags); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker void drawPaint(const SkPaint& paint) override; 50*c8dee2aaSAndroid Build Coastguard Worker void drawAnnotation(const SkRect& rect, const char key[], SkData* value) override; 51*c8dee2aaSAndroid Build Coastguard Worker void drawPoints(SkCanvas::PointMode mode, size_t count, 52*c8dee2aaSAndroid Build Coastguard Worker const SkPoint[], const SkPaint& paint) override; 53*c8dee2aaSAndroid Build Coastguard Worker void drawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, 54*c8dee2aaSAndroid Build Coastguard Worker const SkSamplingOptions&, const SkPaint& paint, 55*c8dee2aaSAndroid Build Coastguard Worker SkCanvas::SrcRectConstraint constraint) override; 56*c8dee2aaSAndroid Build Coastguard Worker void drawRect(const SkRect& r, const SkPaint& paint) override; 57*c8dee2aaSAndroid Build Coastguard Worker void drawOval(const SkRect& oval, const SkPaint& paint) override; 58*c8dee2aaSAndroid Build Coastguard Worker void drawRRect(const SkRRect& rr, const SkPaint& paint) override; 59*c8dee2aaSAndroid Build Coastguard Worker void drawPath(const SkPath& path, 60*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& paint, 61*c8dee2aaSAndroid Build Coastguard Worker bool pathIsMutable = false) override; 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker void drawVertices(const SkVertices*, sk_sp<SkBlender>, const SkPaint&, bool) override; 64*c8dee2aaSAndroid Build Coastguard Worker void drawMesh(const SkMesh&, sk_sp<SkBlender>, const SkPaint&) override; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker private: 67*c8dee2aaSAndroid Build Coastguard Worker SkSVGDevice(const SkISize& size, std::unique_ptr<SkXMLWriter>, uint32_t); 68*c8dee2aaSAndroid Build Coastguard Worker ~SkSVGDevice() override; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker void onDrawGlyphRunList(SkCanvas*, const sktext::GlyphRunList&, const SkPaint& paint) override; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker struct MxCp; 73*c8dee2aaSAndroid Build Coastguard Worker void drawBitmapCommon(const MxCp&, const SkBitmap& bm, const SkPaint& paint); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker void syncClipStack(const SkClipStack&); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker SkParsePath::PathEncoding pathEncoding() const; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker class AutoElement; 80*c8dee2aaSAndroid Build Coastguard Worker class ResourceBucket; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker const std::unique_ptr<SkXMLWriter> fWriter; 83*c8dee2aaSAndroid Build Coastguard Worker const std::unique_ptr<ResourceBucket> fResourceBucket; 84*c8dee2aaSAndroid Build Coastguard Worker const uint32_t fFlags; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker struct ClipRec { 87*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<AutoElement> fClipPathElem; 88*c8dee2aaSAndroid Build Coastguard Worker uint32_t fGenID; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker static_assert(::sk_is_trivially_relocatable<decltype(fClipPathElem)>::value); 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker using sk_is_trivially_relocatable = std::true_type; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<AutoElement> fRootElement; 96*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<ClipRec> fClipStack; 97*c8dee2aaSAndroid Build Coastguard Worker }; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker #endif // SkSVGDevice_DEFINED 100