1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkSVGDevice_DEFINED
9 #define SkSVGDevice_DEFINED
10 
11 #include "SkDevice.h"
12 
13 class SkXMLWriter;
14 
15 class SkSVGDevice : public SkBaseDevice {
16 public:
17     static SkBaseDevice* Create(const SkISize& size, SkXMLWriter* writer);
18 
19     SkImageInfo imageInfo() const override;
20 
21 protected:
22     void drawPaint(const SkDraw&, const SkPaint& paint) override;
23     void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
24                     const SkPoint[], const SkPaint& paint) override;
25     void drawRect(const SkDraw&, const SkRect& r, const SkPaint& paint) override;
26     void drawOval(const SkDraw&, const SkRect& oval, const SkPaint& paint) override;
27     void drawRRect(const SkDraw&, const SkRRect& rr, const SkPaint& paint) override;
28     void drawPath(const SkDraw&, const SkPath& path,
29                   const SkPaint& paint,
30                   const SkMatrix* prePathMatrix = NULL,
31                   bool pathIsMutable = false) override;
32 
33     void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
34                     const SkMatrix& matrix, const SkPaint& paint) override;
35     void drawSprite(const SkDraw&, const SkBitmap& bitmap,
36                     int x, int y, const SkPaint& paint) override;
37     void drawBitmapRect(const SkDraw&, const SkBitmap&,
38                         const SkRect* srcOrNull, const SkRect& dst,
39                         const SkPaint& paint,
40                         SkCanvas::DrawBitmapRectFlags flags) override;
41 
42     void drawText(const SkDraw&, const void* text, size_t len,
43                   SkScalar x, SkScalar y, const SkPaint& paint) override;
44     void drawPosText(const SkDraw&, const void* text, size_t len,
45                      const SkScalar pos[], int scalarsPerPos,
46                      const SkPoint& offset, const SkPaint& paint) override;
47     void drawTextOnPath(const SkDraw&, const void* text, size_t len,
48                         const SkPath& path, const SkMatrix* matrix,
49                         const SkPaint& paint) override;
50     void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
51                       const SkPoint verts[], const SkPoint texs[],
52                       const SkColor colors[], SkXfermode* xmode,
53                       const uint16_t indices[], int indexCount,
54                       const SkPaint& paint) override;
55 
56     void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
57                     const SkPaint&) override;
58     const SkBitmap& onAccessBitmap() override;
59 
60 private:
61     SkSVGDevice(const SkISize& size, SkXMLWriter* writer);
62     virtual ~SkSVGDevice();
63 
64     void drawBitmapCommon(const SkDraw& draw, const SkBitmap& bm, const SkPaint& paint);
65 
66     class AutoElement;
67     class ResourceBucket;
68 
69     SkXMLWriter*                  fWriter;
70     SkAutoTDelete<AutoElement>    fRootElement;
71     SkAutoTDelete<ResourceBucket> fResourceBucket;
72     SkBitmap                      fLegacyBitmap;
73 };
74 
75 #endif // SkSVGDevice_DEFINED
76