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