OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * 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 |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 #include <new> | 7 #include <new> |
8 #include "SkBBoxHierarchy.h" | 8 #include "SkBBoxHierarchy.h" |
9 #include "SkPicturePlayback.h" | 9 #include "SkPicturePlayback.h" |
10 #include "SkPictureRecord.h" | 10 #include "SkPictureRecord.h" |
11 #include "SkPictureStateTree.h" | 11 #include "SkPictureStateTree.h" |
12 #include "SkReadBuffer.h" | 12 #include "SkReadBuffer.h" |
13 #include "SkTypeface.h" | 13 #include "SkTypeface.h" |
14 #include "SkTSort.h" | 14 #include "SkTSort.h" |
15 #include "SkWriteBuffer.h" | 15 #include "SkWriteBuffer.h" |
16 | 16 |
17 template <typename T> int SafeCount(const T* obj) { | 17 template <typename T> int SafeCount(const T* obj) { |
18 return obj ? obj->count() : 0; | 18 return obj ? obj->count() : 0; |
19 } | 19 } |
20 | 20 |
21 /* Define this to spew out a debug statement whenever we skip the remainder of | 21 /* Define this to spew out a debug statement whenever we skip the remainder of |
22 a save/restore block because a clip... command returned false (empty). | 22 a save/restore block because a clip... command returned false (empty). |
23 */ | 23 */ |
24 #define SPEW_CLIP_SKIPPINGx | 24 #define SPEW_CLIP_SKIPPINGx |
25 | 25 |
26 SkPicturePlayback::SkPicturePlayback(const SkPictInfo& info) : fInfo(info) { | 26 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPictInfo&
info) |
| 27 : fPicture(picture) |
| 28 , fInfo(info) { |
27 this->init(); | 29 this->init(); |
28 } | 30 } |
29 | 31 |
30 SkPicturePlayback::SkPicturePlayback(const SkPictureRecord& record, | 32 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, |
| 33 const SkPictureRecord& record, |
31 const SkPictInfo& info, | 34 const SkPictInfo& info, |
32 bool deepCopy) | 35 bool deepCopy) |
33 : fInfo(info) { | 36 : fPicture(picture) |
| 37 , fInfo(info) { |
34 #ifdef SK_DEBUG_SIZE | 38 #ifdef SK_DEBUG_SIZE |
35 size_t overallBytes, bitmapBytes, matricesBytes, | 39 size_t overallBytes, bitmapBytes, matricesBytes, |
36 paintBytes, pathBytes, pictureBytes, regionBytes; | 40 paintBytes, pathBytes, pictureBytes, regionBytes; |
37 int bitmaps = record.bitmaps(&bitmapBytes); | 41 int bitmaps = record.bitmaps(&bitmapBytes); |
38 int matrices = record.matrices(&matricesBytes); | 42 int matrices = record.matrices(&matricesBytes); |
39 int paints = record.paints(&paintBytes); | 43 int paints = record.paints(&paintBytes); |
40 int paths = record.paths(&pathBytes); | 44 int paths = record.paths(&pathBytes); |
41 int pictures = record.pictures(&pictureBytes); | 45 int pictures = record.pictures(&pictureBytes); |
42 int regions = record.regions(®ionBytes); | 46 int regions = record.regions(®ionBytes); |
43 SkDebugf("picture record mem used %zd (stream %zd) ", record.size(), | 47 SkDebugf("picture record mem used %zd (stream %zd) ", record.size(), |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 fBoundingHierarchy->flushDeferredInserts(); | 92 fBoundingHierarchy->flushDeferredInserts(); |
89 } | 93 } |
90 | 94 |
91 // copy over the refcnt dictionary to our reader | 95 // copy over the refcnt dictionary to our reader |
92 record.fFlattenableHeap.setupPlaybacks(); | 96 record.fFlattenableHeap.setupPlaybacks(); |
93 | 97 |
94 fBitmaps = record.fBitmapHeap->extractBitmaps(); | 98 fBitmaps = record.fBitmapHeap->extractBitmaps(); |
95 fPaints = record.fPaints.unflattenToArray(); | 99 fPaints = record.fPaints.unflattenToArray(); |
96 | 100 |
97 fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap)); | 101 fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap)); |
98 fPathHeap.reset(SkSafeRef(record.fPathHeap)); | |
99 | 102 |
100 // ensure that the paths bounds are pre-computed | 103 picture->initForPlayback(); |
101 if (fPathHeap.get()) { | |
102 for (int i = 0; i < fPathHeap->count(); i++) { | |
103 (*fPathHeap)[i].updateBoundsCache(); | |
104 } | |
105 } | |
106 | 104 |
107 const SkTDArray<SkPicture* >& pictures = record.getPictureRefs(); | 105 const SkTDArray<SkPicture* >& pictures = record.getPictureRefs(); |
108 fPictureCount = pictures.count(); | 106 fPictureCount = pictures.count(); |
109 if (fPictureCount > 0) { | 107 if (fPictureCount > 0) { |
110 fPictureRefs = SkNEW_ARRAY(SkPicture*, fPictureCount); | 108 fPictureRefs = SkNEW_ARRAY(SkPicture*, fPictureCount); |
111 for (int i = 0; i < fPictureCount; i++) { | 109 for (int i = 0; i < fPictureCount; i++) { |
112 if (deepCopy) { | 110 if (deepCopy) { |
113 fPictureRefs[i] = pictures[i]->clone(); | 111 fPictureRefs[i] = pictures[i]->clone(); |
114 } else { | 112 } else { |
115 fPictureRefs[i] = pictures[i]; | 113 fPictureRefs[i] = pictures[i]; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 */ | 151 */ |
154 | 152 |
155 return paint.getShader() || | 153 return paint.getShader() || |
156 #ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API | 154 #ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API |
157 paint.getRasterizer() || | 155 paint.getRasterizer() || |
158 #endif | 156 #endif |
159 paint.getLooper() || // needs to hide its addLayer... | 157 paint.getLooper() || // needs to hide its addLayer... |
160 paint.getImageFilter(); | 158 paint.getImageFilter(); |
161 } | 159 } |
162 | 160 |
163 SkPicturePlayback::SkPicturePlayback(const SkPicturePlayback& src, SkPictCopyInf
o* deepCopyInfo) | 161 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPicturePl
ayback& src, |
164 : fInfo(src.fInfo) { | 162 SkPictCopyInfo* deepCopyInfo) |
| 163 : fPicture(picture) |
| 164 , fInfo(src.fInfo) { |
165 this->init(); | 165 this->init(); |
166 | 166 |
167 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); | 167 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); |
168 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); | |
169 | 168 |
170 fOpData = SkSafeRef(src.fOpData); | 169 fOpData = SkSafeRef(src.fOpData); |
171 | 170 |
172 fBoundingHierarchy = src.fBoundingHierarchy; | 171 fBoundingHierarchy = src.fBoundingHierarchy; |
173 fStateTree = src.fStateTree; | 172 fStateTree = src.fStateTree; |
174 | 173 |
175 SkSafeRef(fBoundingHierarchy); | 174 SkSafeRef(fBoundingHierarchy); |
176 SkSafeRef(fStateTree); | 175 SkSafeRef(fStateTree); |
177 | 176 |
178 if (deepCopyInfo) { | 177 if (deepCopyInfo) { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 | 278 |
280 for (int i = 0; i < fPictureCount; i++) { | 279 for (int i = 0; i < fPictureCount; i++) { |
281 fPictureRefs[i]->unref(); | 280 fPictureRefs[i]->unref(); |
282 } | 281 } |
283 SkDELETE_ARRAY(fPictureRefs); | 282 SkDELETE_ARRAY(fPictureRefs); |
284 | 283 |
285 SkDELETE(fFactoryPlayback); | 284 SkDELETE(fFactoryPlayback); |
286 } | 285 } |
287 | 286 |
288 void SkPicturePlayback::dumpSize() const { | 287 void SkPicturePlayback::dumpSize() const { |
289 SkDebugf("--- picture size: ops=%d bitmaps=%d [%d] paints=%d [%d] paths=%d\n
", | 288 SkDebugf("--- picture size: ops=%d bitmaps=%d [%d] paints=%d [%d]\n", |
290 fOpData->size(), | 289 fOpData->size(), |
291 SafeCount(fBitmaps), SafeCount(fBitmaps) * sizeof(SkBitmap), | 290 SafeCount(fBitmaps), SafeCount(fBitmaps) * sizeof(SkBitmap), |
292 SafeCount(fPaints), SafeCount(fPaints) * sizeof(SkPaint), | 291 SafeCount(fPaints), SafeCount(fPaints) * sizeof(SkPaint)); |
293 SafeCount(fPathHeap.get())); | 292 fPicture->dumpSize(); |
294 } | 293 } |
295 | 294 |
296 bool SkPicturePlayback::containsBitmaps() const { | 295 bool SkPicturePlayback::containsBitmaps() const { |
297 if (fBitmaps && fBitmaps->count() > 0) { | 296 if (fBitmaps && fBitmaps->count() > 0) { |
298 return true; | 297 return true; |
299 } | 298 } |
300 for (int i = 0; i < fPictureCount; ++i) { | 299 for (int i = 0; i < fPictureCount; ++i) { |
301 if (fPictureRefs[i]->willPlayBackBitmaps()) { | 300 if (fPictureRefs[i]->willPlayBackBitmaps()) { |
302 return true; | 301 return true; |
303 } | 302 } |
304 } | 303 } |
305 return false; | 304 return false; |
306 } | 305 } |
307 | 306 |
308 /////////////////////////////////////////////////////////////////////////////// | 307 /////////////////////////////////////////////////////////////////////////////// |
309 /////////////////////////////////////////////////////////////////////////////// | 308 /////////////////////////////////////////////////////////////////////////////// |
310 | 309 |
311 #include "SkStream.h" | 310 #include "SkStream.h" |
312 | 311 |
313 static void write_tag_size(SkWriteBuffer& buffer, uint32_t tag, size_t size) { | |
314 buffer.writeUInt(tag); | |
315 buffer.writeUInt(SkToU32(size)); | |
316 } | |
317 | |
318 static void write_tag_size(SkWStream* stream, uint32_t tag, size_t size) { | |
319 stream->write32(tag); | |
320 stream->write32(SkToU32(size)); | |
321 } | |
322 | |
323 static size_t compute_chunk_size(SkFlattenable::Factory* array, int count) { | 312 static size_t compute_chunk_size(SkFlattenable::Factory* array, int count) { |
324 size_t size = 4; // for 'count' | 313 size_t size = 4; // for 'count' |
325 | 314 |
326 for (int i = 0; i < count; i++) { | 315 for (int i = 0; i < count; i++) { |
327 const char* name = SkFlattenable::FactoryToName(array[i]); | 316 const char* name = SkFlattenable::FactoryToName(array[i]); |
328 if (NULL == name || 0 == *name) { | 317 if (NULL == name || 0 == *name) { |
329 size += SkWStream::SizeOfPackedUInt(0); | 318 size += SkWStream::SizeOfPackedUInt(0); |
330 } else { | 319 } else { |
331 size_t len = strlen(name); | 320 size_t len = strlen(name); |
332 size += SkWStream::SizeOfPackedUInt(len); | 321 size += SkWStream::SizeOfPackedUInt(len); |
333 size += len; | 322 size += len; |
334 } | 323 } |
335 } | 324 } |
336 | 325 |
337 return size; | 326 return size; |
338 } | 327 } |
339 | 328 |
340 static void write_factories(SkWStream* stream, const SkFactorySet& rec) { | 329 void SkPicturePlayback::WriteFactories(SkWStream* stream, const SkFactorySet& re
c) { |
341 int count = rec.count(); | 330 int count = rec.count(); |
342 | 331 |
343 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); | 332 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); |
344 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get(); | 333 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get(); |
345 rec.copyToArray(array); | 334 rec.copyToArray(array); |
346 | 335 |
347 size_t size = compute_chunk_size(array, count); | 336 size_t size = compute_chunk_size(array, count); |
348 | 337 |
349 // TODO: write_tag_size should really take a size_t | 338 // TODO: write_tag_size should really take a size_t |
350 write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); | 339 SkPicture::WriteTagSize(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); |
351 SkDEBUGCODE(size_t start = stream->bytesWritten()); | 340 SkDEBUGCODE(size_t start = stream->bytesWritten()); |
352 stream->write32(count); | 341 stream->write32(count); |
353 | 342 |
354 for (int i = 0; i < count; i++) { | 343 for (int i = 0; i < count; i++) { |
355 const char* name = SkFlattenable::FactoryToName(array[i]); | 344 const char* name = SkFlattenable::FactoryToName(array[i]); |
356 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); | 345 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); |
357 if (NULL == name || 0 == *name) { | 346 if (NULL == name || 0 == *name) { |
358 stream->writePackedUInt(0); | 347 stream->writePackedUInt(0); |
359 } else { | 348 } else { |
360 size_t len = strlen(name); | 349 size_t len = strlen(name); |
361 stream->writePackedUInt(len); | 350 stream->writePackedUInt(len); |
362 stream->write(name, len); | 351 stream->write(name, len); |
363 } | 352 } |
364 } | 353 } |
365 | 354 |
366 SkASSERT(size == (stream->bytesWritten() - start)); | 355 SkASSERT(size == (stream->bytesWritten() - start)); |
367 } | 356 } |
368 | 357 |
369 static void write_typefaces(SkWStream* stream, const SkRefCntSet& rec) { | 358 void SkPicturePlayback::WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec
) { |
370 int count = rec.count(); | 359 int count = rec.count(); |
371 | 360 |
372 write_tag_size(stream, SK_PICT_TYPEFACE_TAG, count); | 361 SkPicture::WriteTagSize(stream, SK_PICT_TYPEFACE_TAG, count); |
373 | 362 |
374 SkAutoSTMalloc<16, SkTypeface*> storage(count); | 363 SkAutoSTMalloc<16, SkTypeface*> storage(count); |
375 SkTypeface** array = (SkTypeface**)storage.get(); | 364 SkTypeface** array = (SkTypeface**)storage.get(); |
376 rec.copyToArray((SkRefCnt**)array); | 365 rec.copyToArray((SkRefCnt**)array); |
377 | 366 |
378 for (int i = 0; i < count; i++) { | 367 for (int i = 0; i < count; i++) { |
379 array[i]->serialize(stream); | 368 array[i]->serialize(stream); |
380 } | 369 } |
381 } | 370 } |
382 | 371 |
383 void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const { | 372 void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const { |
384 int i, n; | 373 int i, n; |
385 | 374 |
386 if ((n = SafeCount(fBitmaps)) > 0) { | 375 if ((n = SafeCount(fBitmaps)) > 0) { |
387 write_tag_size(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); | 376 SkPicture::WriteTagSize(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); |
388 for (i = 0; i < n; i++) { | 377 for (i = 0; i < n; i++) { |
389 buffer.writeBitmap((*fBitmaps)[i]); | 378 buffer.writeBitmap((*fBitmaps)[i]); |
390 } | 379 } |
391 } | 380 } |
392 | 381 |
393 if ((n = SafeCount(fPaints)) > 0) { | 382 if ((n = SafeCount(fPaints)) > 0) { |
394 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); | 383 SkPicture::WriteTagSize(buffer, SK_PICT_PAINT_BUFFER_TAG, n); |
395 for (i = 0; i < n; i++) { | 384 for (i = 0; i < n; i++) { |
396 buffer.writePaint((*fPaints)[i]); | 385 buffer.writePaint((*fPaints)[i]); |
397 } | 386 } |
398 } | 387 } |
399 | 388 |
400 if ((n = SafeCount(fPathHeap.get())) > 0) { | 389 fPicture->flattenToBuffer(buffer); |
401 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); | |
402 fPathHeap->flatten(buffer); | |
403 } | |
404 } | 390 } |
405 | 391 |
406 void SkPicturePlayback::serialize(SkWStream* stream, | 392 void SkPicturePlayback::serialize(SkWStream* stream, |
407 SkPicture::EncodeBitmap encoder) const { | 393 SkPicture::EncodeBitmap encoder) const { |
408 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size()); | 394 SkPicture::WriteTagSize(stream, SK_PICT_READER_TAG, fOpData->size()); |
409 stream->write(fOpData->bytes(), fOpData->size()); | 395 stream->write(fOpData->bytes(), fOpData->size()); |
410 | 396 |
411 if (fPictureCount > 0) { | 397 if (fPictureCount > 0) { |
412 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount); | 398 SkPicture::WriteTagSize(stream, SK_PICT_PICTURE_TAG, fPictureCount); |
413 for (int i = 0; i < fPictureCount; i++) { | 399 for (int i = 0; i < fPictureCount; i++) { |
414 fPictureRefs[i]->serialize(stream, encoder); | 400 fPictureRefs[i]->serialize(stream, encoder); |
415 } | 401 } |
416 } | 402 } |
417 | 403 |
418 // Write some of our data into a writebuffer, and then serialize that | 404 // Write some of our data into a writebuffer, and then serialize that |
419 // into our stream | 405 // into our stream |
420 { | 406 { |
421 SkRefCntSet typefaceSet; | 407 SkRefCntSet typefaceSet; |
422 SkFactorySet factSet; | 408 SkFactorySet factSet; |
423 | 409 |
424 SkWriteBuffer buffer(SkWriteBuffer::kCrossProcess_Flag); | 410 SkWriteBuffer buffer(SkWriteBuffer::kCrossProcess_Flag); |
425 buffer.setTypefaceRecorder(&typefaceSet); | 411 buffer.setTypefaceRecorder(&typefaceSet); |
426 buffer.setFactoryRecorder(&factSet); | 412 buffer.setFactoryRecorder(&factSet); |
427 buffer.setBitmapEncoder(encoder); | 413 buffer.setBitmapEncoder(encoder); |
428 | 414 |
429 this->flattenToBuffer(buffer); | 415 this->flattenToBuffer(buffer); |
430 | 416 |
431 // We have to write these two sets into the stream *before* we write | 417 // We have to write these two sets into the stream *before* we write |
432 // the buffer, since parsing that buffer will require that we already | 418 // the buffer, since parsing that buffer will require that we already |
433 // have these sets available to use. | 419 // have these sets available to use. |
434 write_factories(stream, factSet); | 420 WriteFactories(stream, factSet); |
435 write_typefaces(stream, typefaceSet); | 421 WriteTypefaces(stream, typefaceSet); |
436 | 422 |
437 write_tag_size(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); | 423 SkPicture::WriteTagSize(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWri
tten()); |
438 buffer.writeToStream(stream); | 424 buffer.writeToStream(stream); |
439 } | 425 } |
440 | 426 |
441 stream->write32(SK_PICT_EOF_TAG); | 427 stream->write32(SK_PICT_EOF_TAG); |
442 } | 428 } |
443 | 429 |
444 void SkPicturePlayback::flatten(SkWriteBuffer& buffer) const { | 430 void SkPicturePlayback::flatten(SkWriteBuffer& buffer) const { |
445 write_tag_size(buffer, SK_PICT_READER_TAG, fOpData->size()); | 431 SkPicture::WriteTagSize(buffer, SK_PICT_READER_TAG, fOpData->size()); |
446 buffer.writeByteArray(fOpData->bytes(), fOpData->size()); | 432 buffer.writeByteArray(fOpData->bytes(), fOpData->size()); |
447 | 433 |
448 if (fPictureCount > 0) { | 434 if (fPictureCount > 0) { |
449 write_tag_size(buffer, SK_PICT_PICTURE_TAG, fPictureCount); | 435 SkPicture::WriteTagSize(buffer, SK_PICT_PICTURE_TAG, fPictureCount); |
450 for (int i = 0; i < fPictureCount; i++) { | 436 for (int i = 0; i < fPictureCount; i++) { |
451 fPictureRefs[i]->flatten(buffer); | 437 fPictureRefs[i]->flatten(buffer); |
452 } | 438 } |
453 } | 439 } |
454 | 440 |
455 // Write this picture playback's data into a writebuffer | 441 // Write this picture playback's data into a writebuffer |
456 this->flattenToBuffer(buffer); | 442 this->flattenToBuffer(buffer); |
457 buffer.write32(SK_PICT_EOF_TAG); | 443 buffer.write32(SK_PICT_EOF_TAG); |
458 } | 444 } |
459 | 445 |
(...skipping 15 matching lines...) Expand all Loading... |
475 | 461 |
476 uint32_t rbMask = 0; | 462 uint32_t rbMask = 0; |
477 for (size_t i = 0; i < SK_ARRAY_COUNT(gSD); ++i) { | 463 for (size_t i = 0; i < SK_ARRAY_COUNT(gSD); ++i) { |
478 if (pictInfoFlags & gSD[i].fSrc) { | 464 if (pictInfoFlags & gSD[i].fSrc) { |
479 rbMask |= gSD[i].fDst; | 465 rbMask |= gSD[i].fDst; |
480 } | 466 } |
481 } | 467 } |
482 return rbMask; | 468 return rbMask; |
483 } | 469 } |
484 | 470 |
485 bool SkPicturePlayback::parseStreamTag(SkStream* stream, | 471 bool SkPicturePlayback::parseStreamTag(SkPicture* picture, |
| 472 SkStream* stream, |
486 uint32_t tag, | 473 uint32_t tag, |
487 uint32_t size, | 474 uint32_t size, |
488 SkPicture::InstallPixelRefProc proc) { | 475 SkPicture::InstallPixelRefProc proc) { |
489 /* | 476 /* |
490 * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen | 477 * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen |
491 * its dependents: FACTORY_TAG and TYPEFACE_TAG. These two are not required | 478 * its dependents: FACTORY_TAG and TYPEFACE_TAG. These two are not required |
492 * but if they are present, they need to have been seen before the buffer. | 479 * but if they are present, they need to have been seen before the buffer. |
493 * | 480 * |
494 * We assert that if/when we see either of these, that we have not yet seen | 481 * We assert that if/when we see either of these, that we have not yet seen |
495 * the buffer tag, because if we have, then its too-late to deal with the | 482 * the buffer tag, because if we have, then its too-late to deal with the |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); | 564 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); |
578 buffer.setPictureVersion(fInfo.fVersion); | 565 buffer.setPictureVersion(fInfo.fVersion); |
579 | 566 |
580 fFactoryPlayback->setupBuffer(buffer); | 567 fFactoryPlayback->setupBuffer(buffer); |
581 fTFPlayback.setupBuffer(buffer); | 568 fTFPlayback.setupBuffer(buffer); |
582 buffer.setBitmapDecoder(proc); | 569 buffer.setBitmapDecoder(proc); |
583 | 570 |
584 while (!buffer.eof()) { | 571 while (!buffer.eof()) { |
585 tag = buffer.readUInt(); | 572 tag = buffer.readUInt(); |
586 size = buffer.readUInt(); | 573 size = buffer.readUInt(); |
587 if (!this->parseBufferTag(buffer, tag, size)) { | 574 if (!this->parseBufferTag(picture, buffer, tag, size)) { |
588 return false; | 575 return false; |
589 } | 576 } |
590 } | 577 } |
591 SkDEBUGCODE(haveBuffer = true;) | 578 SkDEBUGCODE(haveBuffer = true;) |
592 } break; | 579 } break; |
593 } | 580 } |
594 return true; // success | 581 return true; // success |
595 } | 582 } |
596 | 583 |
597 bool SkPicturePlayback::parseBufferTag(SkReadBuffer& buffer, | 584 bool SkPicturePlayback::parseBufferTag(SkPicture* picture, |
| 585 SkReadBuffer& buffer, |
598 uint32_t tag, uint32_t size) { | 586 uint32_t tag, uint32_t size) { |
599 switch (tag) { | 587 switch (tag) { |
600 case SK_PICT_BITMAP_BUFFER_TAG: { | 588 case SK_PICT_BITMAP_BUFFER_TAG: { |
601 const int count = SkToInt(size); | 589 const int count = SkToInt(size); |
602 fBitmaps = SkTRefArray<SkBitmap>::Create(size); | 590 fBitmaps = SkTRefArray<SkBitmap>::Create(size); |
603 for (int i = 0; i < count; ++i) { | 591 for (int i = 0; i < count; ++i) { |
604 SkBitmap* bm = &fBitmaps->writableAt(i); | 592 SkBitmap* bm = &fBitmaps->writableAt(i); |
605 buffer.readBitmap(bm); | 593 buffer.readBitmap(bm); |
606 bm->setImmutable(); | 594 bm->setImmutable(); |
607 } | 595 } |
608 } break; | 596 } break; |
609 case SK_PICT_PAINT_BUFFER_TAG: { | 597 case SK_PICT_PAINT_BUFFER_TAG: { |
610 const int count = SkToInt(size); | 598 const int count = SkToInt(size); |
611 fPaints = SkTRefArray<SkPaint>::Create(size); | 599 fPaints = SkTRefArray<SkPaint>::Create(size); |
612 for (int i = 0; i < count; ++i) { | 600 for (int i = 0; i < count; ++i) { |
613 buffer.readPaint(&fPaints->writableAt(i)); | 601 buffer.readPaint(&fPaints->writableAt(i)); |
614 } | 602 } |
615 } break; | 603 } break; |
616 case SK_PICT_PATH_BUFFER_TAG: | 604 case SK_PICT_PATH_BUFFER_TAG: |
617 if (size > 0) { | 605 picture->parseBufferTag(buffer, tag, size); |
618 fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer))); | |
619 } | |
620 break; | 606 break; |
621 case SK_PICT_READER_TAG: { | 607 case SK_PICT_READER_TAG: { |
622 SkAutoMalloc storage(size); | 608 SkAutoMalloc storage(size); |
623 if (!buffer.readByteArray(storage.get(), size) || | 609 if (!buffer.readByteArray(storage.get(), size) || |
624 !buffer.validate(NULL == fOpData)) { | 610 !buffer.validate(NULL == fOpData)) { |
625 return false; | 611 return false; |
626 } | 612 } |
627 SkASSERT(NULL == fOpData); | 613 SkASSERT(NULL == fOpData); |
628 fOpData = SkData::NewFromMalloc(storage.detach(), size); | 614 fOpData = SkData::NewFromMalloc(storage.detach(), size); |
629 } break; | 615 } break; |
(...skipping 23 matching lines...) Expand all Loading... |
653 return false; | 639 return false; |
654 } | 640 } |
655 } break; | 641 } break; |
656 default: | 642 default: |
657 // The tag was invalid. | 643 // The tag was invalid. |
658 return false; | 644 return false; |
659 } | 645 } |
660 return true; // success | 646 return true; // success |
661 } | 647 } |
662 | 648 |
663 SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkStream* stream, | 649 SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkPicture* picture, |
| 650 SkStream* stream, |
664 const SkPictInfo& info, | 651 const SkPictInfo& info, |
665 SkPicture::InstallPixelRe
fProc proc) { | 652 SkPicture::InstallPixelRe
fProc proc) { |
666 SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (inf
o))); | 653 SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (pic
ture, info))); |
667 | 654 |
668 if (!playback->parseStream(stream, proc)) { | 655 if (!playback->parseStream(picture, stream, proc)) { |
669 return NULL; | 656 return NULL; |
670 } | 657 } |
671 return playback.detach(); | 658 return playback.detach(); |
672 } | 659 } |
673 | 660 |
674 SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkReadBuffer& buffer, | 661 SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkPicture* picture, |
| 662 SkReadBuffer& buffer, |
675 const SkPictInfo& info) { | 663 const SkPictInfo& info) { |
676 SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (inf
o))); | 664 SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (pic
ture, info))); |
677 buffer.setPictureVersion(info.fVersion); | 665 buffer.setPictureVersion(info.fVersion); |
678 | 666 |
679 if (!playback->parseBuffer(buffer)) { | 667 if (!playback->parseBuffer(picture, buffer)) { |
680 return NULL; | 668 return NULL; |
681 } | 669 } |
682 return playback.detach(); | 670 return playback.detach(); |
683 } | 671 } |
684 | 672 |
685 bool SkPicturePlayback::parseStream(SkStream* stream, | 673 bool SkPicturePlayback::parseStream(SkPicture* picture, |
| 674 SkStream* stream, |
686 SkPicture::InstallPixelRefProc proc) { | 675 SkPicture::InstallPixelRefProc proc) { |
687 for (;;) { | 676 for (;;) { |
688 uint32_t tag = stream->readU32(); | 677 uint32_t tag = stream->readU32(); |
689 if (SK_PICT_EOF_TAG == tag) { | 678 if (SK_PICT_EOF_TAG == tag) { |
690 break; | 679 break; |
691 } | 680 } |
692 | 681 |
693 uint32_t size = stream->readU32(); | 682 uint32_t size = stream->readU32(); |
694 if (!this->parseStreamTag(stream, tag, size, proc)) { | 683 if (!this->parseStreamTag(picture, stream, tag, size, proc)) { |
695 return false; // we're invalid | 684 return false; // we're invalid |
696 } | 685 } |
697 } | 686 } |
698 return true; | 687 return true; |
699 } | 688 } |
700 | 689 |
701 bool SkPicturePlayback::parseBuffer(SkReadBuffer& buffer) { | 690 bool SkPicturePlayback::parseBuffer(SkPicture* picture, SkReadBuffer& buffer) { |
702 for (;;) { | 691 for (;;) { |
703 uint32_t tag = buffer.readUInt(); | 692 uint32_t tag = buffer.readUInt(); |
704 if (SK_PICT_EOF_TAG == tag) { | 693 if (SK_PICT_EOF_TAG == tag) { |
705 break; | 694 break; |
706 } | 695 } |
707 | 696 |
708 uint32_t size = buffer.readUInt(); | 697 uint32_t size = buffer.readUInt(); |
709 if (!this->parseBufferTag(buffer, tag, size)) { | 698 if (!this->parseBufferTag(picture, buffer, tag, size)) { |
710 return false; // we're invalid | 699 return false; // we're invalid |
711 } | 700 } |
712 } | 701 } |
713 return true; | 702 return true; |
714 } | 703 } |
715 | 704 |
716 /////////////////////////////////////////////////////////////////////////////// | 705 /////////////////////////////////////////////////////////////////////////////// |
717 /////////////////////////////////////////////////////////////////////////////// | 706 /////////////////////////////////////////////////////////////////////////////// |
718 | 707 |
719 #ifdef SPEW_CLIP_SKIPPING | 708 #ifdef SPEW_CLIP_SKIPPING |
(...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1782 for (index = 0; index < fPictureCount; index++) | 1771 for (index = 0; index < fPictureCount; index++) |
1783 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | 1772 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), |
1784 "picture%p, ", fPictureRefs[index]); | 1773 "picture%p, ", fPictureRefs[index]); |
1785 if (fPictureCount > 0) | 1774 if (fPictureCount > 0) |
1786 SkDebugf("%s0};\n", pBuffer); | 1775 SkDebugf("%s0};\n", pBuffer); |
1787 | 1776 |
1788 const_cast<SkPicturePlayback*>(this)->dumpStream(); | 1777 const_cast<SkPicturePlayback*>(this)->dumpStream(); |
1789 } | 1778 } |
1790 | 1779 |
1791 #endif | 1780 #endif |
OLD | NEW |