SkPictureRecord.h revision e9e08cc7b29f97ee9e823e68c3daf0f55c84b21a
1#ifndef SkPictureRecord_DEFINED
2#define SkPictureRecord_DEFINED
3
4#include "SkCanvas.h"
5#include "SkFlattenable.h"
6#include "SkPathHeap.h"
7#include "SkPicture.h"
8#include "SkPictureFlat.h"
9#include "SkTemplates.h"
10#include "SkWriter32.h"
11
12class SkPictureRecord : public SkCanvas {
13public:
14    SkPictureRecord(uint32_t recordFlags);
15    virtual ~SkPictureRecord();
16
17    // overrides from SkCanvas
18    virtual int save(SaveFlags);
19    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags);
20    virtual void restore();
21    virtual bool translate(SkScalar dx, SkScalar dy);
22    virtual bool scale(SkScalar sx, SkScalar sy);
23    virtual bool rotate(SkScalar degrees);
24    virtual bool skew(SkScalar sx, SkScalar sy);
25    virtual bool concat(const SkMatrix& matrix);
26    virtual void setMatrix(const SkMatrix& matrix);
27    virtual bool clipRect(const SkRect& rect, SkRegion::Op op);
28    virtual bool clipPath(const SkPath& path, SkRegion::Op op);
29    virtual bool clipRegion(const SkRegion& region, SkRegion::Op op);
30    virtual void clear(SkColor);
31    virtual void drawPaint(const SkPaint& paint);
32    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
33                            const SkPaint&);
34    virtual void drawRect(const SkRect& rect, const SkPaint&);
35    virtual void drawPath(const SkPath& path, const SkPaint&);
36    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
37                            const SkPaint*);
38    virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src,
39                                const SkRect& dst, const SkPaint*);
40    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
41                                  const SkPaint*);
42    virtual void drawSprite(const SkBitmap&, int left, int top,
43                            const SkPaint*);
44    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
45                          SkScalar y, const SkPaint&);
46    virtual void drawPosText(const void* text, size_t byteLength,
47                             const SkPoint pos[], const SkPaint&);
48    virtual void drawPosTextH(const void* text, size_t byteLength,
49                      const SkScalar xpos[], SkScalar constY, const SkPaint&);
50    virtual void drawTextOnPath(const void* text, size_t byteLength,
51                            const SkPath& path, const SkMatrix* matrix,
52                                const SkPaint&);
53    virtual void drawPicture(SkPicture& picture);
54    virtual void drawShape(SkShape*);
55    virtual void drawVertices(VertexMode, int vertexCount,
56                          const SkPoint vertices[], const SkPoint texs[],
57                          const SkColor colors[], SkXfermode*,
58                          const uint16_t indices[], int indexCount,
59                              const SkPaint&);
60    virtual void drawData(const void*, size_t);
61
62    void addFontMetricsTopBottom(const SkPaint& paint, SkScalar baselineY);
63
64    const SkTDArray<const SkFlatBitmap* >& getBitmaps() const {
65        return fBitmaps;
66    }
67    const SkTDArray<const SkFlatMatrix* >& getMatrices() const {
68        return fMatrices;
69    }
70    const SkTDArray<const SkFlatPaint* >& getPaints() const {
71        return fPaints;
72    }
73    const SkTDArray<SkPicture* >& getPictureRefs() const {
74        return fPictureRefs;
75    }
76    const SkTDArray<SkShape* >& getShapes() const {
77        return fShapes;
78    }
79    const SkTDArray<const SkFlatRegion* >& getRegions() const {
80        return fRegions;
81    }
82
83    void reset();
84
85    const SkWriter32& writeStream() const {
86        return fWriter;
87    }
88
89private:
90    SkTDArray<uint32_t> fRestoreOffsetStack;
91
92    void addDraw(DrawType drawType) {
93#ifdef SK_DEBUG_TRACE
94        SkDebugf("add %s\n", DrawTypeToString(drawType));
95#endif
96        fWriter.writeInt(drawType);
97    }
98    void addInt(int value) {
99        fWriter.writeInt(value);
100    }
101    void addScalar(SkScalar scalar) {
102        fWriter.writeScalar(scalar);
103    }
104
105    void addBitmap(const SkBitmap& bitmap);
106    void addMatrix(const SkMatrix& matrix);
107    void addMatrixPtr(const SkMatrix* matrix);
108    void addPaint(const SkPaint& paint);
109    void addPaintPtr(const SkPaint* paint);
110    void addPath(const SkPath& path);
111    void addPicture(SkPicture& picture);
112    void addPoint(const SkPoint& point);
113    void addPoints(const SkPoint pts[], int count);
114    void addRect(const SkRect& rect);
115    void addRectPtr(const SkRect* rect);
116    void addIRectPtr(const SkIRect* rect);
117    void addRegion(const SkRegion& region);
118    void addText(const void* text, size_t byteLength);
119
120    int find(SkTDArray<const SkFlatBitmap* >& bitmaps,
121                   const SkBitmap& bitmap);
122    int find(SkTDArray<const SkFlatMatrix* >& matrices,
123                   const SkMatrix* matrix);
124    int find(SkTDArray<const SkFlatPaint* >& paints, const SkPaint* paint);
125    int find(SkTDArray<const SkFlatRegion* >& regions, const SkRegion& region);
126
127#ifdef SK_DEBUG_DUMP
128public:
129    void dumpMatrices();
130    void dumpPaints();
131#endif
132
133#ifdef SK_DEBUG_SIZE
134public:
135    size_t size() const;
136    int bitmaps(size_t* size) const;
137    int matrices(size_t* size) const;
138    int paints(size_t* size) const;
139    int paths(size_t* size) const;
140    int regions(size_t* size) const;
141    size_t streamlen() const;
142
143    size_t fPointBytes, fRectBytes, fTextBytes;
144    int fPointWrites, fRectWrites, fTextWrites;
145#endif
146
147#ifdef SK_DEBUG_VALIDATE
148public:
149    void validate() const;
150private:
151    void validateBitmaps() const;
152    void validateMatrices() const;
153    void validatePaints() const;
154    void validatePaths() const;
155    void validateRegions() const;
156#else
157public:
158    void validate() const {}
159#endif
160
161private:
162    SkChunkAlloc fHeap;
163    int fBitmapIndex;
164    SkTDArray<const SkFlatBitmap* > fBitmaps;
165    int fMatrixIndex;
166    SkTDArray<const SkFlatMatrix* > fMatrices;
167    int fPaintIndex;
168    SkTDArray<const SkFlatPaint* > fPaints;
169    int fRegionIndex;
170    SkTDArray<const SkFlatRegion* > fRegions;
171    SkPathHeap* fPathHeap;  // reference counted
172    SkWriter32 fWriter;
173
174    // we ref each item in these arrays
175    SkTDArray<SkPicture*> fPictureRefs;
176    SkTDArray<SkShape*> fShapes;
177
178    SkRefCntSet fRCSet;
179    SkRefCntSet fTFSet;
180
181    uint32_t fRecordFlags;
182
183    friend class SkPicturePlayback;
184
185    typedef SkCanvas INHERITED;
186};
187
188#endif
189