• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 #ifndef SkPictureFlat_DEFINED
9 #define SkPictureFlat_DEFINED
10 
11 #include "SkChunkAlloc.h"
12 #include "SkBitmap.h"
13 #include "SkPicture.h"
14 #include "SkMatrix.h"
15 #include "SkPaint.h"
16 #include "SkPath.h"
17 #include "SkRegion.h"
18 
19 enum DrawType {
20     UNUSED,
21     CLIP_PATH,
22     CLIP_REGION,
23     CLIP_RECT,
24     CONCAT,
25     DRAW_BITMAP,
26     DRAW_BITMAP_MATRIX,
27     DRAW_BITMAP_RECT,
28     DRAW_CLEAR,
29     DRAW_DATA,
30     DRAW_PAINT,
31     DRAW_PATH,
32     DRAW_PICTURE,
33     DRAW_POINTS,
34     DRAW_POS_TEXT,
35     DRAW_POS_TEXT_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT
36     DRAW_POS_TEXT_H,
37     DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H
38     DRAW_RECT,
39     DRAW_SHAPE,
40     DRAW_SPRITE,
41     DRAW_TEXT,
42     DRAW_TEXT_ON_PATH,
43     DRAW_TEXT_TOP_BOTTOM,   // fast variant of DRAW_TEXT
44     DRAW_VERTICES,
45     RESTORE,
46     ROTATE,
47     SAVE,
48     SAVE_LAYER,
49     SCALE,
50     SET_MATRIX,
51     SKEW,
52     TRANSLATE,
53     DRAW_BITMAP_NINE
54 };
55 
56 enum DrawVertexFlags {
57     DRAW_VERTICES_HAS_TEXS    = 0x01,
58     DRAW_VERTICES_HAS_COLORS  = 0x02,
59     DRAW_VERTICES_HAS_INDICES = 0x04
60 };
61 
62 ///////////////////////////////////////////////////////////////////////////////
63 // clipparams are packed in 5 bits
64 //  doAA:1 | regionOp:4
65 
ClipParams_pack(SkRegion::Op op,bool doAA)66 static inline uint32_t ClipParams_pack(SkRegion::Op op, bool doAA) {
67     unsigned doAABit = doAA ? 1 : 0;
68     return (doAABit << 4) | op;
69 }
70 
ClipParams_unpackRegionOp(uint32_t packed)71 static inline SkRegion::Op ClipParams_unpackRegionOp(uint32_t packed) {
72     return (SkRegion::Op)(packed & 0xF);
73 }
74 
ClipParams_unpackDoAA(uint32_t packed)75 static inline bool ClipParams_unpackDoAA(uint32_t packed) {
76     return SkToBool((packed >> 4) & 1);
77 }
78 
79 ///////////////////////////////////////////////////////////////////////////////
80 
81 class SkRefCntPlayback {
82 public:
83     SkRefCntPlayback();
84     virtual ~SkRefCntPlayback();
85 
count()86     int count() const { return fCount; }
87 
88     void reset(const SkRefCntSet*);
89 
90     void setCount(int count);
91     SkRefCnt* set(int index, SkRefCnt*);
92 
setupBuffer(SkFlattenableReadBuffer & buffer)93     virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const {
94         buffer.setRefCntArray(fArray, fCount);
95     }
96 
97 protected:
98     int fCount;
99     SkRefCnt** fArray;
100 };
101 
102 class SkTypefacePlayback : public SkRefCntPlayback {
103 public:
setupBuffer(SkFlattenableReadBuffer & buffer)104     virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const {
105         buffer.setTypefaceArray((SkTypeface**)fArray, fCount);
106     }
107 };
108 
109 class SkFactoryPlayback {
110 public:
SkFactoryPlayback(int count)111     SkFactoryPlayback(int count) : fCount(count) {
112         fArray = SkNEW_ARRAY(SkFlattenable::Factory, count);
113     }
114 
~SkFactoryPlayback()115     ~SkFactoryPlayback() {
116         SkDELETE_ARRAY(fArray);
117     }
118 
base()119     SkFlattenable::Factory* base() const { return fArray; }
120 
setupBuffer(SkFlattenableReadBuffer & buffer)121     void setupBuffer(SkFlattenableReadBuffer& buffer) const {
122         buffer.setFactoryPlayback(fArray, fCount);
123     }
124 
125 private:
126     int fCount;
127     SkFlattenable::Factory* fArray;
128 };
129 
130 class SkFlatData {
131 public:
Compare(const SkFlatData * a,const SkFlatData * b)132     static int Compare(const SkFlatData* a, const SkFlatData* b) {
133         return memcmp(&a->fAllocSize, &b->fAllocSize, a->fAllocSize);
134     }
135 
index()136     int index() const { return fIndex; }
137 
138 #ifdef SK_DEBUG_SIZE
size()139     size_t size() const { return sizeof(fIndex) + fAllocSize; }
140 #endif
141 
142 protected:
143     static SkFlatData* Alloc(SkChunkAlloc* heap, int32_t size, int index);
144 
145     int fIndex;
146     int32_t fAllocSize;
147 };
148 
149 class SkFlatBitmap : public SkFlatData {
150 public:
151     static SkFlatBitmap* Flatten(SkChunkAlloc*, const SkBitmap&, int index,
152                                  SkRefCntSet*);
153 
unflatten(SkBitmap * bitmap,SkRefCntPlayback * rcp)154     void unflatten(SkBitmap* bitmap, SkRefCntPlayback* rcp) const {
155         SkFlattenableReadBuffer buffer(fBitmapData);
156         if (rcp) {
157             rcp->setupBuffer(buffer);
158         }
159         bitmap->unflatten(buffer);
160     }
161 
162 #ifdef SK_DEBUG_VALIDATE
validate()163     void validate() const {
164         // to be written
165     }
166 #endif
167 
168 private:
169     char fBitmapData[1];
170     typedef SkFlatData INHERITED;
171 };
172 
173 class SkFlatMatrix : public SkFlatData {
174 public:
175     static SkFlatMatrix* Flatten(SkChunkAlloc* heap, const SkMatrix& matrix, int index);
176 
unflatten(SkMatrix * result)177     void unflatten(SkMatrix* result) const {
178         result->unflatten(fMatrixData);
179     }
180 
181 #ifdef SK_DEBUG_DUMP
182     void dump() const;
183 #endif
184 
185 #ifdef SK_DEBUG_VALIDATE
validate()186     void validate() const {
187         // to be written
188     }
189 #endif
190 
191 private:
192     char fMatrixData[1];
193     typedef SkFlatData INHERITED;
194 };
195 
196 class SkFlatPaint : public SkFlatData {
197 public:
198     static SkFlatPaint* Flatten(SkChunkAlloc* heap, const SkPaint& paint,
199                                 int index, SkRefCntSet*,
200                                 SkRefCntSet* faceRecorder);
201 
unflatten(SkPaint * result,SkRefCntPlayback * rcp,SkTypefacePlayback * facePlayback)202     void unflatten(SkPaint* result, SkRefCntPlayback* rcp,
203                    SkTypefacePlayback* facePlayback) const {
204         Read(fPaintData, result, rcp, facePlayback);
205     }
206 
207     static void Read(const void* storage, SkPaint* paint, SkRefCntPlayback*,
208                      SkTypefacePlayback* facePlayback);
209 
210 #ifdef SK_DEBUG_DUMP
211     void dump() const;
212 #endif
213 
214 private:
215     char fPaintData[1];
216     typedef SkFlatData INHERITED;
217 };
218 
219 class SkFlatRegion : public SkFlatData {
220 public:
221     static SkFlatRegion* Flatten(SkChunkAlloc* heap, const SkRegion& region, int index);
222 
unflatten(SkRegion * result)223     void unflatten(SkRegion* result) const {
224         result->unflatten(fRegionData);
225     }
226 
227 #ifdef SK_DEBUG_VALIDATE
validate()228     void validate() const {
229         // to be written
230     }
231 #endif
232 
233 private:
234     char fRegionData[1];
235     typedef SkFlatData INHERITED;
236 };
237 
238 #endif
239