OLD | NEW |
1 | |
2 /* | 1 /* |
3 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
4 * | 3 * |
5 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 5 * found in the LICENSE file. |
7 */ | 6 */ |
8 | 7 |
9 #ifndef SkPictureData_DEFINED | 8 #ifndef SkPictureData_DEFINED |
10 #define SkPictureData_DEFINED | 9 #define SkPictureData_DEFINED |
11 | 10 |
12 #include "SkBitmap.h" | 11 #include "SkBitmap.h" |
13 #include "SkPathHeap.h" | 12 #include "SkPathHeap.h" |
14 #include "SkPicture.h" | 13 #include "SkPicture.h" |
15 #include "SkPictureFlat.h" | 14 #include "SkPictureFlat.h" |
16 | 15 |
17 #ifdef SK_BUILD_FOR_ANDROID | |
18 #include "SkThread.h" | |
19 #endif | |
20 | |
21 class SkData; | 16 class SkData; |
22 class SkPictureRecord; | 17 class SkPictureRecord; |
23 class SkReader32; | 18 class SkReader32; |
24 class SkStream; | 19 class SkStream; |
25 class SkWStream; | 20 class SkWStream; |
26 class SkBBoxHierarchy; | 21 class SkBBoxHierarchy; |
27 class SkMatrix; | 22 class SkMatrix; |
28 class SkPaint; | 23 class SkPaint; |
29 class SkPath; | 24 class SkPath; |
30 class SkPictureStateTree; | 25 class SkPictureStateTree; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 124 |
130 bool initialized; | 125 bool initialized; |
131 SkChunkFlatController controller; | 126 SkChunkFlatController controller; |
132 SkTDArray<SkFlatData*> paintData; | 127 SkTDArray<SkFlatData*> paintData; |
133 }; | 128 }; |
134 #endif | 129 #endif |
135 | 130 |
136 class SkPictureData { | 131 class SkPictureData { |
137 public: | 132 public: |
138 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE | 133 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE |
139 SkPictureData(const SkPictureData& src, | 134 SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyInfo = NULL)
; |
140 SkPictCopyInfo* deepCopyInfo = NULL); | |
141 #else | 135 #else |
142 SkPictureData(const SkPictureData& src); | 136 SkPictureData(const SkPictureData& src); |
143 #endif | 137 #endif |
144 SkPictureData(const SkPictureRecord& record, const SkPictInfo&, bool deepCop
yOps); | 138 SkPictureData(const SkPictureRecord& record, const SkPictInfo&, bool deepCop
yOps); |
145 static SkPictureData* CreateFromStream(SkStream*, | 139 static SkPictureData* CreateFromStream(SkStream*, |
146 const SkPictInfo&, | 140 const SkPictInfo&, |
147 SkPicture::InstallPixelRefProc); | 141 SkPicture::InstallPixelRefProc); |
148 static SkPictureData* CreateFromBuffer(SkReadBuffer&, | 142 static SkPictureData* CreateFromBuffer(SkReadBuffer&, const SkPictInfo&); |
149 const SkPictInfo&); | |
150 | 143 |
151 virtual ~SkPictureData(); | 144 virtual ~SkPictureData(); |
152 | 145 |
153 const SkPicture::OperationList& getActiveOps(const SkIRect& queryRect); | 146 const SkPicture::OperationList* getActiveOps(const SkIRect& queryRect) const
; |
154 | |
155 void setUseBBH(bool useBBH) { fUseBBH = useBBH; } | |
156 | |
157 void draw(SkCanvas& canvas, SkDrawPictureCallback*); | |
158 | 147 |
159 void serialize(SkWStream*, SkPicture::EncodeBitmap) const; | 148 void serialize(SkWStream*, SkPicture::EncodeBitmap) const; |
160 void flatten(SkWriteBuffer&) const; | 149 void flatten(SkWriteBuffer&) const; |
161 | 150 |
162 void dumpSize() const; | 151 void dumpSize() const; |
163 | 152 |
164 bool containsBitmaps() const; | 153 bool containsBitmaps() const; |
165 | 154 |
166 #ifdef SK_BUILD_FOR_ANDROID | |
167 // Can be called in the middle of playback (the draw() call). WIll abort the | |
168 // drawing and return from draw() after the "current" op code is done | |
169 void abort() { fAbortCurrentPlayback = true; } | |
170 #endif | |
171 | |
172 size_t curOpID() const { return fCurOffset; } | |
173 void resetOpID() { fCurOffset = 0; } | |
174 | |
175 protected: | 155 protected: |
176 explicit SkPictureData(const SkPictInfo& info); | 156 explicit SkPictureData(const SkPictInfo& info); |
177 | 157 |
178 bool parseStream(SkStream*, SkPicture::InstallPixelRefProc); | 158 bool parseStream(SkStream*, SkPicture::InstallPixelRefProc); |
179 bool parseBuffer(SkReadBuffer& buffer); | 159 bool parseBuffer(SkReadBuffer& buffer); |
180 #ifdef SK_DEVELOPER | |
181 virtual bool preDraw(int opIndex, int type); | |
182 virtual void postDraw(int opIndex); | |
183 #endif | |
184 | 160 |
185 private: | 161 private: |
186 class TextContainer { | |
187 public: | |
188 size_t length() { return fByteLength; } | |
189 const void* text() { return (const void*) fText; } | |
190 size_t fByteLength; | |
191 const char* fText; | |
192 }; | |
193 | 162 |
194 const SkBitmap& getBitmap(SkReader32& reader) { | 163 const SkBitmap& getBitmap(SkReader32& reader) const { |
195 const int index = reader.readInt(); | 164 const int index = reader.readInt(); |
196 if (SkBitmapHeap::INVALID_SLOT == index) { | 165 if (SkBitmapHeap::INVALID_SLOT == index) { |
197 #ifdef SK_DEBUG | 166 #ifdef SK_DEBUG |
198 SkDebugf("An invalid bitmap was recorded!\n"); | 167 SkDebugf("An invalid bitmap was recorded!\n"); |
199 #endif | 168 #endif |
200 return fBadBitmap; | 169 return fBadBitmap; |
201 } | 170 } |
202 return (*fBitmaps)[index]; | 171 return (*fBitmaps)[index]; |
203 } | 172 } |
204 | 173 |
205 void getMatrix(SkReader32& reader, SkMatrix* matrix) { | 174 const SkPath& getPath(SkReader32& reader) const { |
206 reader.readMatrix(matrix); | |
207 } | |
208 | |
209 const SkPath& getPath(SkReader32& reader) { | |
210 int index = reader.readInt() - 1; | 175 int index = reader.readInt() - 1; |
211 return (*fPathHeap.get())[index]; | 176 return (*fPathHeap.get())[index]; |
212 } | 177 } |
213 | 178 |
214 const SkPicture* getPicture(SkReader32& reader) { | 179 const SkPicture* getPicture(SkReader32& reader) const { |
215 int index = reader.readInt(); | 180 int index = reader.readInt(); |
216 SkASSERT(index > 0 && index <= fPictureCount); | 181 SkASSERT(index > 0 && index <= fPictureCount); |
217 return fPictureRefs[index - 1]; | 182 return fPictureRefs[index - 1]; |
218 } | 183 } |
219 | 184 |
220 const SkPaint* getPaint(SkReader32& reader) { | 185 const SkPaint* getPaint(SkReader32& reader) const { |
221 int index = reader.readInt(); | 186 int index = reader.readInt(); |
222 if (index == 0) { | 187 if (index == 0) { |
223 return NULL; | 188 return NULL; |
224 } | 189 } |
225 return &(*fPaints)[index - 1]; | 190 return &(*fPaints)[index - 1]; |
226 } | 191 } |
227 | 192 |
228 const SkRect* getRectPtr(SkReader32& reader) { | |
229 if (reader.readBool()) { | |
230 return &reader.skipT<SkRect>(); | |
231 } else { | |
232 return NULL; | |
233 } | |
234 } | |
235 | |
236 const SkIRect* getIRectPtr(SkReader32& reader) { | |
237 if (reader.readBool()) { | |
238 return &reader.skipT<SkIRect>(); | |
239 } else { | |
240 return NULL; | |
241 } | |
242 } | |
243 | |
244 void getRegion(SkReader32& reader, SkRegion* region) { | |
245 reader.readRegion(region); | |
246 } | |
247 | |
248 void getText(SkReader32& reader, TextContainer* text) { | |
249 size_t length = text->fByteLength = reader.readInt(); | |
250 text->fText = (const char*)reader.skip(length); | |
251 } | |
252 | |
253 void init(); | 193 void init(); |
254 | 194 |
255 #ifdef SK_DEBUG_SIZE | 195 #ifdef SK_DEBUG_SIZE |
256 public: | 196 public: |
257 int size(size_t* sizePtr); | 197 int size(size_t* sizePtr); |
258 int bitmaps(size_t* size); | 198 int bitmaps(size_t* size); |
259 int paints(size_t* size); | 199 int paints(size_t* size); |
260 int paths(size_t* size); | 200 int paths(size_t* size); |
261 #endif | 201 #endif |
262 | 202 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 GrPixelConfig config, SkScalar dpi) const; | 239 GrPixelConfig config, SkScalar dpi) const; |
300 #endif | 240 #endif |
301 | 241 |
302 private: // these help us with reading/writing | 242 private: // these help us with reading/writing |
303 bool parseStreamTag(SkStream*, uint32_t tag, uint32_t size, SkPicture::Insta
llPixelRefProc); | 243 bool parseStreamTag(SkStream*, uint32_t tag, uint32_t size, SkPicture::Insta
llPixelRefProc); |
304 bool parseBufferTag(SkReadBuffer&, uint32_t tag, uint32_t size); | 244 bool parseBufferTag(SkReadBuffer&, uint32_t tag, uint32_t size); |
305 void flattenToBuffer(SkWriteBuffer&) const; | 245 void flattenToBuffer(SkWriteBuffer&) const; |
306 | 246 |
307 private: | 247 private: |
308 friend class SkPicture; | 248 friend class SkPicture; |
309 friend class SkGpuDevice; // for access to setDrawLimits & setReplacements | 249 friend class SkPicturePlayback; |
310 | 250 |
311 // Only used by getBitmap() if the passed in index is SkBitmapHeap::INVALID_
SLOT. This empty | 251 // Only used by getBitmap() if the passed in index is SkBitmapHeap::INVALID_
SLOT. This empty |
312 // bitmap allows playback to draw nothing and move on. | 252 // bitmap allows playback to draw nothing and move on. |
313 SkBitmap fBadBitmap; | 253 SkBitmap fBadBitmap; |
314 | 254 |
315 SkAutoTUnref<SkBitmapHeap> fBitmapHeap; | 255 SkAutoTUnref<SkBitmapHeap> fBitmapHeap; |
316 | 256 |
317 SkTRefArray<SkBitmap>* fBitmaps; | 257 SkTRefArray<SkBitmap>* fBitmaps; |
318 SkTRefArray<SkPaint>* fPaints; | 258 SkTRefArray<SkPaint>* fPaints; |
319 | 259 |
320 SkData* fOpData; // opcodes and parameters | 260 SkData* fOpData; // opcodes and parameters |
321 | 261 |
322 SkAutoTUnref<const SkPathHeap> fPathHeap; // reference counted | 262 SkAutoTUnref<const SkPathHeap> fPathHeap; // reference counted |
323 | 263 |
324 const SkPicture** fPictureRefs; | 264 const SkPicture** fPictureRefs; |
325 int fPictureCount; | 265 int fPictureCount; |
326 | 266 |
327 SkBBoxHierarchy* fBoundingHierarchy; | 267 SkBBoxHierarchy* fBoundingHierarchy; |
328 SkPictureStateTree* fStateTree; | 268 SkPictureStateTree* fStateTree; |
329 | 269 |
330 SkPictureContentInfo fContentInfo; | 270 SkPictureContentInfo fContentInfo; |
331 | 271 |
332 // Limit the opcode playback to be between the offsets 'start' and 'stop'. | 272 class OperationList : public SkPicture::OperationList { |
333 // The opcode at 'start' should be a saveLayer while the opcode at | |
334 // 'stop' should be a restore. Neither of those commands will be issued. | |
335 // Set both start & stop to 0 to disable draw limiting | |
336 // Draw limiting cannot be enabled at the same time as draw replacing | |
337 void setDrawLimits(size_t start, size_t stop) { | |
338 SkASSERT(NULL == fReplacements); | |
339 fStart = start; | |
340 fStop = stop; | |
341 } | |
342 | |
343 // PlaybackReplacements collects op ranges that can be replaced with | |
344 // a single drawBitmap call (using a precomputed bitmap). | |
345 class PlaybackReplacements { | |
346 public: | 273 public: |
347 // All the operations between fStart and fStop (inclusive) will be repla
ced with | 274 OperationList() { } |
348 // a single drawBitmap call using fPos, fBM and fPaint. | |
349 // fPaint will be NULL if the picture's paint wasn't copyable | |
350 struct ReplacementInfo { | |
351 size_t fStart; | |
352 size_t fStop; | |
353 SkIPoint fPos; | |
354 SkBitmap* fBM; // fBM is allocated so ReplacementInfo can
remain POD | |
355 const SkPaint* fPaint; // Note: this object doesn't own the paint | |
356 | |
357 SkIRect fSrcRect; | |
358 }; | |
359 | |
360 ~PlaybackReplacements() { this->freeAll(); } | |
361 | |
362 // Add a new replacement range. The replacement ranges should be | |
363 // sorted in increasing order and non-overlapping (esp. no nested | |
364 // saveLayers). | |
365 ReplacementInfo* push(); | |
366 | |
367 private: | |
368 friend class SkPictureData; // for access to lookupByStart | |
369 | |
370 // look up a replacement range by its start offset | |
371 ReplacementInfo* lookupByStart(size_t start); | |
372 | |
373 void freeAll(); | |
374 | |
375 #ifdef SK_DEBUG | |
376 void validate() const; | |
377 #endif | |
378 | |
379 SkTDArray<ReplacementInfo> fReplacements; | |
380 }; | |
381 | |
382 // Replace all the draw ops in the replacement ranges in 'replacements' with | |
383 // the associated drawBitmap call | |
384 // Draw replacing cannot be enabled at the same time as draw limiting | |
385 void setReplacements(PlaybackReplacements* replacements) { | |
386 SkASSERT(fStart == 0 && fStop == 0); | |
387 fReplacements = replacements; | |
388 } | |
389 | |
390 bool fUseBBH; | |
391 size_t fStart; | |
392 size_t fStop; | |
393 PlaybackReplacements* fReplacements; | |
394 | |
395 class CachedOperationList : public SkPicture::OperationList { | |
396 public: | |
397 CachedOperationList() { | |
398 fCacheQueryRect.setEmpty(); | |
399 } | |
400 | |
401 virtual bool valid() const { return true; } | |
402 virtual int numOps() const SK_OVERRIDE { return fOps.count(); } | 275 virtual int numOps() const SK_OVERRIDE { return fOps.count(); } |
403 virtual uint32_t offset(int index) const SK_OVERRIDE; | 276 virtual uint32_t offset(int index) const SK_OVERRIDE; |
404 virtual const SkMatrix& matrix(int index) const SK_OVERRIDE; | 277 virtual const SkMatrix& matrix(int index) const SK_OVERRIDE; |
405 | 278 |
406 // The query rect for which the cached active ops are valid | |
407 SkIRect fCacheQueryRect; | |
408 | |
409 // The operations which are active within 'fCachedQueryRect' | 279 // The operations which are active within 'fCachedQueryRect' |
410 SkTDArray<void*> fOps; | 280 SkTDArray<void*> fOps; |
411 | 281 |
412 private: | 282 private: |
413 typedef SkPicture::OperationList INHERITED; | 283 typedef SkPicture::OperationList INHERITED; |
414 }; | 284 }; |
415 | 285 |
416 CachedOperationList* fCachedActiveOps; | |
417 | |
418 SkTypefacePlayback fTFPlayback; | 286 SkTypefacePlayback fTFPlayback; |
419 SkFactoryPlayback* fFactoryPlayback; | 287 SkFactoryPlayback* fFactoryPlayback; |
420 | 288 |
421 // The offset of the current operation when within the draw method | |
422 size_t fCurOffset; | |
423 | |
424 const SkPictInfo fInfo; | 289 const SkPictInfo fInfo; |
425 | 290 |
426 static void WriteFactories(SkWStream* stream, const SkFactorySet& rec); | 291 static void WriteFactories(SkWStream* stream, const SkFactorySet& rec); |
427 static void WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec); | 292 static void WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec); |
428 | 293 |
429 void initForPlayback() const; | 294 void initForPlayback() const; |
430 | |
431 #ifdef SK_BUILD_FOR_ANDROID | |
432 SkMutex fDrawMutex; | |
433 bool fAbortCurrentPlayback; | |
434 #endif | |
435 }; | 295 }; |
436 | 296 |
437 #endif | 297 #endif |
OLD | NEW |