blob: 9e7fc5e4ffbbb8c15c9dfa43b70a26627bd674fd [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#ifndef SkPictureFlat_DEFINED
2#define SkPictureFlat_DEFINED
3
4#include "SkChunkAlloc.h"
5#include "SkBitmap.h"
6#include "SkPicture.h"
7#include "SkMatrix.h"
8#include "SkPaint.h"
9#include "SkPath.h"
10#include "SkRegion.h"
11
12enum DrawType {
13 UNUSED,
14 CLIP_PATH,
15 CLIP_REGION,
16 CLIP_RECT,
17 CONCAT,
18 DRAW_BITMAP,
19 DRAW_BITMAP_MATRIX,
20 DRAW_BITMAP_RECT,
21 DRAW_PAINT,
22 DRAW_PATH,
23 DRAW_PICTURE,
24 DRAW_POINTS,
25 DRAW_POS_TEXT,
26 DRAW_POS_TEXT_H,
27 DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H
28 DRAW_RECT,
29 DRAW_SPRITE,
30 DRAW_TEXT,
31 DRAW_TEXT_ON_PATH,
32 DRAW_TEXT_TOP_BOTTOM, // fast variant of DRAW_TEXT
33 DRAW_VERTICES,
34 RESTORE,
35 ROTATE,
36 SAVE,
37 SAVE_LAYER,
38 SCALE,
39 SKEW,
40 TRANSLATE
41};
42
43enum DrawVertexFlags {
44 DRAW_VERTICES_HAS_TEXS = 0x01,
45 DRAW_VERTICES_HAS_COLORS = 0x02,
46 DRAW_VERTICES_HAS_INDICES = 0x04
47};
48
49class SkRefCntPlayback {
50public:
51 SkRefCntPlayback();
52 ~SkRefCntPlayback();
53
54 int count() const { return fCount; }
55
56 void reset(const SkRefCntRecorder*);
57
58 void setCount(int count);
59 SkRefCnt* set(int index, SkRefCnt*);
60
61 virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const {
62 buffer.setRefCntArray(fArray, fCount);
63 }
64
65protected:
66 int fCount;
67 SkRefCnt** fArray;
68};
69
70class SkTypefacePlayback : public SkRefCntPlayback {
71public:
72 virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const {
73 buffer.setTypefaceArray((SkTypeface**)fArray, fCount);
74 }
75};
76
77class SkFactoryPlayback {
78public:
79 SkFactoryPlayback(int count) : fCount(count) {
80 fArray = SkNEW_ARRAY(SkFlattenable::Factory, count);
81 }
82
83 ~SkFactoryPlayback() {
84 SkDELETE_ARRAY(fArray);
85 }
86
87 SkFlattenable::Factory* base() const { return fArray; }
88
89 void setupBuffer(SkFlattenableReadBuffer& buffer) const {
90 buffer.setFactoryPlayback(fArray, fCount);
91 }
92
93private:
94 int fCount;
95 SkFlattenable::Factory* fArray;
96};
97
98class SkFlatData {
99public:
100 static int Compare(const SkFlatData* a, const SkFlatData* b) {
101 return memcmp(&a->fAllocSize, &b->fAllocSize, a->fAllocSize);
102 }
103
104 int index() const { return fIndex; }
105
106#ifdef SK_DEBUG_SIZE
107 size_t size() const { return sizeof(fIndex) + fAllocSize; }
108#endif
109
110protected:
111 static SkFlatData* Alloc(SkChunkAlloc* heap, int32_t size, int index);
112
113 int fIndex;
114 int32_t fAllocSize;
115};
116
117class SkFlatBitmap : public SkFlatData {
118public:
119 static SkFlatBitmap* Flatten(SkChunkAlloc*, const SkBitmap&, int index,
120 SkRefCntRecorder*);
121
122 void unflatten(SkBitmap* bitmap, SkRefCntPlayback* rcp) const {
123 SkFlattenableReadBuffer buffer(fBitmapData);
124 if (rcp) {
125 rcp->setupBuffer(buffer);
126 }
127 bitmap->unflatten(buffer);
128 }
129
130#ifdef SK_DEBUG_VALIDATE
131 void validate() const {
132 // to be written
133 }
134#endif
135
136private:
137 char fBitmapData[1];
138 typedef SkFlatData INHERITED;
139};
140
141class SkFlatMatrix : public SkFlatData {
142public:
143 static SkFlatMatrix* Flatten(SkChunkAlloc* heap, const SkMatrix& matrix, int index);
144
145 void unflatten(SkMatrix* result) const {
146 memcpy(result, fMatrixData, sizeof(SkMatrix));
147 }
148
149#ifdef SK_DEBUG_DUMP
150 void dump() const;
151#endif
152
153#ifdef SK_DEBUG_VALIDATE
154 void validate() const {
155 // to be written
156 }
157#endif
158
159private:
160 char fMatrixData[1];
161 typedef SkFlatData INHERITED;
162};
163
164class SkFlatPaint : public SkFlatData {
165public:
166 static SkFlatPaint* Flatten(SkChunkAlloc* heap, const SkPaint& paint,
167 int index, SkRefCntRecorder*,
168 SkRefCntRecorder* faceRecorder);
169
170 void unflatten(SkPaint* result, SkRefCntPlayback* rcp,
171 SkTypefacePlayback* facePlayback) const {
172 Read(fPaintData, result, rcp, facePlayback);
173 }
174
175 static void Read(const void* storage, SkPaint* paint, SkRefCntPlayback*,
176 SkTypefacePlayback* facePlayback);
177
178#ifdef SK_DEBUG_DUMP
179 void dump() const;
180#endif
181
182private:
183 char fPaintData[1];
184 typedef SkFlatData INHERITED;
185};
186
187class SkFlatRegion : public SkFlatData {
188public:
189 static SkFlatRegion* Flatten(SkChunkAlloc* heap, const SkRegion& region, int index);
190
191 void unflatten(SkRegion* result) const {
192 result->unflatten(fRegionData);
193 }
194
195#ifdef SK_DEBUG_VALIDATE
196 void validate() const {
197 // to be written
198 }
199#endif
200
201private:
202 char fRegionData[1];
203 typedef SkFlatData INHERITED;
204};
205
206#endif