blob: 5325e1e38685a857f3983fb1bd9013927e163409 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#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:
reed@android.comae814c82009-02-13 14:56:09 +000014 SkPictureRecord(uint32_t recordFlags);
reed@android.com8a1c16f2008-12-17 15:59:43 +000015 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);
reed@android.com6e073b92009-01-06 15:03:30 +000026 virtual void setMatrix(const SkMatrix& matrix);
reed@android.com8a1c16f2008-12-17 15:59:43 +000027 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 drawPaint(const SkPaint& paint);
31 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
32 const SkPaint&);
33 virtual void drawRect(const SkRect& rect, const SkPaint&);
34 virtual void drawPath(const SkPath& path, const SkPaint&);
35 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
36 const SkPaint*);
37 virtual void drawBitmapRect(const SkBitmap&, const SkIRect* src,
38 const SkRect& dst, const SkPaint*);
39 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
40 const SkPaint*);
41 virtual void drawSprite(const SkBitmap&, int left, int top,
42 const SkPaint*);
43 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
44 SkScalar y, const SkPaint&);
45 virtual void drawPosText(const void* text, size_t byteLength,
46 const SkPoint pos[], const SkPaint&);
47 virtual void drawPosTextH(const void* text, size_t byteLength,
48 const SkScalar xpos[], SkScalar constY, const SkPaint&);
49 virtual void drawTextOnPath(const void* text, size_t byteLength,
50 const SkPath& path, const SkMatrix* matrix,
51 const SkPaint&);
52 virtual void drawPicture(SkPicture& picture);
53 virtual void drawVertices(VertexMode, int vertexCount,
54 const SkPoint vertices[], const SkPoint texs[],
55 const SkColor colors[], SkXfermode*,
56 const uint16_t indices[], int indexCount,
57 const SkPaint&);
58
59 void addFontMetricsTopBottom(const SkPaint& paint, SkScalar baselineY);
60
61 const SkTDArray<const SkFlatBitmap* >& getBitmaps() const {
62 return fBitmaps;
63 }
64 const SkTDArray<const SkFlatMatrix* >& getMatrices() const {
65 return fMatrices;
66 }
67 const SkTDArray<const SkFlatPaint* >& getPaints() const {
68 return fPaints;
69 }
70 const SkTDArray<SkPicture* >& getPictureRefs() const {
71 return fPictureRefs;
72 }
73 const SkTDArray<const SkFlatRegion* >& getRegions() const {
74 return fRegions;
75 }
76
77 void reset();
78
79 const SkWriter32& writeStream() const {
80 return fWriter;
81 }
82
83private:
84 SkTDArray<uint32_t> fRestoreOffsetStack;
85
86 void addDraw(DrawType drawType) {
87#ifdef SK_DEBUG_TRACE
88 SkDebugf("add %s\n", DrawTypeToString(drawType));
89#endif
90 fWriter.writeInt(drawType);
91 }
92 void addInt(int value) {
93 fWriter.writeInt(value);
94 }
95 void addScalar(SkScalar scalar) {
96 fWriter.writeScalar(scalar);
97 }
98
99 void addBitmap(const SkBitmap& bitmap);
100 void addMatrix(const SkMatrix& matrix);
101 void addMatrixPtr(const SkMatrix* matrix);
102 void addPaint(const SkPaint& paint);
103 void addPaintPtr(const SkPaint* paint);
104 void addPath(const SkPath& path);
105 void addPicture(SkPicture& picture);
106 void addPoint(const SkPoint& point);
107 void addPoints(const SkPoint pts[], int count);
108 void addRect(const SkRect& rect);
109 void addRectPtr(const SkRect* rect);
110 void addIRectPtr(const SkIRect* rect);
111 void addRegion(const SkRegion& region);
112 void addText(const void* text, size_t byteLength);
113
114 int find(SkTDArray<const SkFlatBitmap* >& bitmaps,
115 const SkBitmap& bitmap);
116 int find(SkTDArray<const SkFlatMatrix* >& matrices,
117 const SkMatrix* matrix);
118 int find(SkTDArray<const SkFlatPaint* >& paints, const SkPaint* paint);
119 int find(SkTDArray<const SkFlatRegion* >& regions, const SkRegion& region);
120
121#ifdef SK_DEBUG_DUMP
122public:
123 void dumpMatrices();
124 void dumpPaints();
125#endif
126
127#ifdef SK_DEBUG_SIZE
128public:
129 size_t size() const;
130 int bitmaps(size_t* size) const;
131 int matrices(size_t* size) const;
132 int paints(size_t* size) const;
133 int paths(size_t* size) const;
134 int regions(size_t* size) const;
135 size_t streamlen() const;
136
137 size_t fPointBytes, fRectBytes, fTextBytes;
138 int fPointWrites, fRectWrites, fTextWrites;
139#endif
140
141#ifdef SK_DEBUG_VALIDATE
142public:
143 void validate() const;
144private:
145 void validateBitmaps() const;
146 void validateMatrices() const;
147 void validatePaints() const;
148 void validatePaths() const;
149 void validateRegions() const;
150#else
151public:
152 void validate() const {}
153#endif
154
155private:
156 SkChunkAlloc fHeap;
157 int fBitmapIndex;
158 SkTDArray<const SkFlatBitmap* > fBitmaps;
159 int fMatrixIndex;
160 SkTDArray<const SkFlatMatrix* > fMatrices;
161 int fPaintIndex;
162 SkTDArray<const SkFlatPaint* > fPaints;
163 int fRegionIndex;
164 SkTDArray<const SkFlatRegion* > fRegions;
165 SkPathHeap* fPathHeap; // reference counted
166 SkWriter32 fWriter;
167
168 // we ref each item in this array
169 SkTDArray<SkPicture*> fPictureRefs;
170
171 SkRefCntRecorder fRCRecorder;
172 SkRefCntRecorder fTFRecorder;
173
reed@android.comae814c82009-02-13 14:56:09 +0000174 uint32_t fRecordFlags;
175
reed@android.com8a1c16f2008-12-17 15:59:43 +0000176 friend class SkPicturePlayback;
177
178 typedef SkCanvas INHERITED;
179};
180
181#endif