| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "SkPicturePlayback.h" | 8 #include "SkPicturePlayback.h" |
| 9 #include "SkPictureRecord.h" | 9 #include "SkPictureRecord.h" |
| 10 #include "SkTypeface.h" | 10 #include "SkTypeface.h" |
| 11 #include "SkOrderedReadBuffer.h" | 11 #include "SkReadBuffer.h" |
| 12 #include "SkOrderedWriteBuffer.h" | 12 #include "SkWriteBuffer.h" |
| 13 #include <new> | 13 #include <new> |
| 14 #include "SkBBoxHierarchy.h" | 14 #include "SkBBoxHierarchy.h" |
| 15 #include "SkPictureStateTree.h" | 15 #include "SkPictureStateTree.h" |
| 16 #include "SkTSort.h" | 16 #include "SkTSort.h" |
| 17 | 17 |
| 18 template <typename T> int SafeCount(const T* obj) { | 18 template <typename T> int SafeCount(const T* obj) { |
| 19 return obj ? obj->count() : 0; | 19 return obj ? obj->count() : 0; |
| 20 } | 20 } |
| 21 | 21 |
| 22 /* Define this to spew out a debug statement whenever we skip the remainder of | 22 /* Define this to spew out a debug statement whenever we skip the remainder of |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 // these are all inside the ARRAYS tag | 315 // these are all inside the ARRAYS tag |
| 316 #define PICT_BITMAP_BUFFER_TAG SkSetFourByteTag('b', 't', 'm', 'p') | 316 #define PICT_BITMAP_BUFFER_TAG SkSetFourByteTag('b', 't', 'm', 'p') |
| 317 #define PICT_PAINT_BUFFER_TAG SkSetFourByteTag('p', 'n', 't', ' ') | 317 #define PICT_PAINT_BUFFER_TAG SkSetFourByteTag('p', 'n', 't', ' ') |
| 318 #define PICT_PATH_BUFFER_TAG SkSetFourByteTag('p', 't', 'h', ' ') | 318 #define PICT_PATH_BUFFER_TAG SkSetFourByteTag('p', 't', 'h', ' ') |
| 319 | 319 |
| 320 // Always write this guy last (with no length field afterwards) | 320 // Always write this guy last (with no length field afterwards) |
| 321 #define PICT_EOF_TAG SkSetFourByteTag('e', 'o', 'f', ' ') | 321 #define PICT_EOF_TAG SkSetFourByteTag('e', 'o', 'f', ' ') |
| 322 | 322 |
| 323 #include "SkStream.h" | 323 #include "SkStream.h" |
| 324 | 324 |
| 325 static void writeTagSize(SkOrderedWriteBuffer& buffer, uint32_t tag, | 325 static void writeTagSize(SkWriteBuffer& buffer, uint32_t tag, |
| 326 uint32_t size) { | 326 uint32_t size) { |
| 327 buffer.writeUInt(tag); | 327 buffer.writeUInt(tag); |
| 328 buffer.writeUInt(size); | 328 buffer.writeUInt(size); |
| 329 } | 329 } |
| 330 | 330 |
| 331 static void writeTagSize(SkWStream* stream, uint32_t tag, | 331 static void writeTagSize(SkWStream* stream, uint32_t tag, |
| 332 uint32_t size) { | 332 uint32_t size) { |
| 333 stream->write32(tag); | 333 stream->write32(tag); |
| 334 stream->write32(size); | 334 stream->write32(size); |
| 335 } | 335 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 363 | 363 |
| 364 SkAutoSTMalloc<16, SkTypeface*> storage(count); | 364 SkAutoSTMalloc<16, SkTypeface*> storage(count); |
| 365 SkTypeface** array = (SkTypeface**)storage.get(); | 365 SkTypeface** array = (SkTypeface**)storage.get(); |
| 366 rec.copyToArray((SkRefCnt**)array); | 366 rec.copyToArray((SkRefCnt**)array); |
| 367 | 367 |
| 368 for (int i = 0; i < count; i++) { | 368 for (int i = 0; i < count; i++) { |
| 369 array[i]->serialize(stream); | 369 array[i]->serialize(stream); |
| 370 } | 370 } |
| 371 } | 371 } |
| 372 | 372 |
| 373 void SkPicturePlayback::flattenToBuffer(SkOrderedWriteBuffer& buffer) const { | 373 void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const { |
| 374 int i, n; | 374 int i, n; |
| 375 | 375 |
| 376 if ((n = SafeCount(fBitmaps)) > 0) { | 376 if ((n = SafeCount(fBitmaps)) > 0) { |
| 377 writeTagSize(buffer, PICT_BITMAP_BUFFER_TAG, n); | 377 writeTagSize(buffer, PICT_BITMAP_BUFFER_TAG, n); |
| 378 for (i = 0; i < n; i++) { | 378 for (i = 0; i < n; i++) { |
| 379 buffer.writeBitmap((*fBitmaps)[i]); | 379 buffer.writeBitmap((*fBitmaps)[i]); |
| 380 } | 380 } |
| 381 } | 381 } |
| 382 | 382 |
| 383 if ((n = SafeCount(fPaints)) > 0) { | 383 if ((n = SafeCount(fPaints)) > 0) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 404 fPictureRefs[i]->serialize(stream, encoder); | 404 fPictureRefs[i]->serialize(stream, encoder); |
| 405 } | 405 } |
| 406 } | 406 } |
| 407 | 407 |
| 408 // Write some of our data into a writebuffer, and then serialize that | 408 // Write some of our data into a writebuffer, and then serialize that |
| 409 // into our stream | 409 // into our stream |
| 410 { | 410 { |
| 411 SkRefCntSet typefaceSet; | 411 SkRefCntSet typefaceSet; |
| 412 SkFactorySet factSet; | 412 SkFactorySet factSet; |
| 413 | 413 |
| 414 SkOrderedWriteBuffer buffer; | 414 SkWriteBuffer buffer; |
| 415 buffer.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag); | 415 buffer.setFlags(SkWriteBuffer::kCrossProcess_Flag); |
| 416 buffer.setTypefaceRecorder(&typefaceSet); | 416 buffer.setTypefaceRecorder(&typefaceSet); |
| 417 buffer.setFactoryRecorder(&factSet); | 417 buffer.setFactoryRecorder(&factSet); |
| 418 buffer.setBitmapEncoder(encoder); | 418 buffer.setBitmapEncoder(encoder); |
| 419 | 419 |
| 420 this->flattenToBuffer(buffer); | 420 this->flattenToBuffer(buffer); |
| 421 | 421 |
| 422 // We have to write these to sets into the stream *before* we write | 422 // We have to write these to sets into the stream *before* we write |
| 423 // the buffer, since parsing that buffer will require that we already | 423 // the buffer, since parsing that buffer will require that we already |
| 424 // have these sets available to use. | 424 // have these sets available to use. |
| 425 writeFactories(stream, factSet); | 425 writeFactories(stream, factSet); |
| 426 writeTypefaces(stream, typefaceSet); | 426 writeTypefaces(stream, typefaceSet); |
| 427 | 427 |
| 428 writeTagSize(stream, PICT_BUFFER_SIZE_TAG, buffer.size()); | 428 writeTagSize(stream, PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); |
| 429 buffer.writeToStream(stream); | 429 buffer.writeToStream(stream); |
| 430 } | 430 } |
| 431 | 431 |
| 432 stream->write32(PICT_EOF_TAG); | 432 stream->write32(PICT_EOF_TAG); |
| 433 } | 433 } |
| 434 | 434 |
| 435 /////////////////////////////////////////////////////////////////////////////// | 435 /////////////////////////////////////////////////////////////////////////////// |
| 436 | 436 |
| 437 /** | 437 /** |
| 438 * Return the corresponding SkFlattenableReadBuffer flags, given a set of | 438 * Return the corresponding SkReadBuffer flags, given a set of |
| 439 * SkPictInfo flags. | 439 * SkPictInfo flags. |
| 440 */ | 440 */ |
| 441 static uint32_t pictInfoFlagsToReadBufferFlags(uint32_t pictInfoFlags) { | 441 static uint32_t pictInfoFlagsToReadBufferFlags(uint32_t pictInfoFlags) { |
| 442 static const struct { | 442 static const struct { |
| 443 uint32_t fSrc; | 443 uint32_t fSrc; |
| 444 uint32_t fDst; | 444 uint32_t fDst; |
| 445 } gSD[] = { | 445 } gSD[] = { |
| 446 { SkPictInfo::kCrossProcess_Flag, SkFlattenableReadBuffer::kCrossProce
ss_Flag }, | 446 { SkPictInfo::kCrossProcess_Flag, SkReadBuffer::kCrossProcess_Flag }, |
| 447 { SkPictInfo::kScalarIsFloat_Flag, SkFlattenableReadBuffer::kScalarIsFl
oat_Flag }, | 447 { SkPictInfo::kScalarIsFloat_Flag, SkReadBuffer::kScalarIsFloat_Flag }, |
| 448 { SkPictInfo::kPtrIs64Bit_Flag, SkFlattenableReadBuffer::kPtrIs64Bit
_Flag }, | 448 { SkPictInfo::kPtrIs64Bit_Flag, SkReadBuffer::kPtrIs64Bit_Flag }, |
| 449 }; | 449 }; |
| 450 | 450 |
| 451 uint32_t rbMask = 0; | 451 uint32_t rbMask = 0; |
| 452 for (size_t i = 0; i < SK_ARRAY_COUNT(gSD); ++i) { | 452 for (size_t i = 0; i < SK_ARRAY_COUNT(gSD); ++i) { |
| 453 if (pictInfoFlags & gSD[i].fSrc) { | 453 if (pictInfoFlags & gSD[i].fSrc) { |
| 454 rbMask |= gSD[i].fDst; | 454 rbMask |= gSD[i].fDst; |
| 455 } | 455 } |
| 456 } | 456 } |
| 457 return rbMask; | 457 return rbMask; |
| 458 } | 458 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 fPictureCount = 0; | 527 fPictureCount = 0; |
| 528 return false; | 528 return false; |
| 529 } | 529 } |
| 530 } break; | 530 } break; |
| 531 case PICT_BUFFER_SIZE_TAG: { | 531 case PICT_BUFFER_SIZE_TAG: { |
| 532 SkAutoMalloc storage(size); | 532 SkAutoMalloc storage(size); |
| 533 if (stream->read(storage.get(), size) != size) { | 533 if (stream->read(storage.get(), size) != size) { |
| 534 return false; | 534 return false; |
| 535 } | 535 } |
| 536 | 536 |
| 537 SkOrderedReadBuffer buffer(storage.get(), size); | 537 SkReadBuffer buffer(storage.get(), size); |
| 538 buffer.setFlags(pictInfoFlagsToReadBufferFlags(info.fFlags)); | 538 buffer.setFlags(pictInfoFlagsToReadBufferFlags(info.fFlags)); |
| 539 | 539 |
| 540 fFactoryPlayback->setupBuffer(buffer); | 540 fFactoryPlayback->setupBuffer(buffer); |
| 541 fTFPlayback.setupBuffer(buffer); | 541 fTFPlayback.setupBuffer(buffer); |
| 542 buffer.setBitmapDecoder(proc); | 542 buffer.setBitmapDecoder(proc); |
| 543 | 543 |
| 544 while (!buffer.eof()) { | 544 while (!buffer.eof()) { |
| 545 tag = buffer.readUInt(); | 545 tag = buffer.readUInt(); |
| 546 size = buffer.readUInt(); | 546 size = buffer.readUInt(); |
| 547 if (!this->parseBufferTag(buffer, tag, size)) { | 547 if (!this->parseBufferTag(buffer, tag, size)) { |
| 548 return false; | 548 return false; |
| 549 } | 549 } |
| 550 } | 550 } |
| 551 SkDEBUGCODE(haveBuffer = true;) | 551 SkDEBUGCODE(haveBuffer = true;) |
| 552 } break; | 552 } break; |
| 553 } | 553 } |
| 554 return true; // success | 554 return true; // success |
| 555 } | 555 } |
| 556 | 556 |
| 557 bool SkPicturePlayback::parseBufferTag(SkOrderedReadBuffer& buffer, | 557 bool SkPicturePlayback::parseBufferTag(SkReadBuffer& buffer, |
| 558 uint32_t tag, size_t size) { | 558 uint32_t tag, size_t size) { |
| 559 switch (tag) { | 559 switch (tag) { |
| 560 case PICT_BITMAP_BUFFER_TAG: { | 560 case PICT_BITMAP_BUFFER_TAG: { |
| 561 fBitmaps = SkTRefArray<SkBitmap>::Create(size); | 561 fBitmaps = SkTRefArray<SkBitmap>::Create(size); |
| 562 for (size_t i = 0; i < size; ++i) { | 562 for (size_t i = 0; i < size; ++i) { |
| 563 SkBitmap* bm = &fBitmaps->writableAt(i); | 563 SkBitmap* bm = &fBitmaps->writableAt(i); |
| 564 buffer.readBitmap(bm); | 564 buffer.readBitmap(bm); |
| 565 bm->setImmutable(); | 565 bm->setImmutable(); |
| 566 } | 566 } |
| 567 } break; | 567 } break; |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 for (index = 0; index < fPictureCount; index++) | 1591 for (index = 0; index < fPictureCount; index++) |
| 1592 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | 1592 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), |
| 1593 "picture%p, ", fPictureRefs[index]); | 1593 "picture%p, ", fPictureRefs[index]); |
| 1594 if (fPictureCount > 0) | 1594 if (fPictureCount > 0) |
| 1595 SkDebugf("%s0};\n", pBuffer); | 1595 SkDebugf("%s0};\n", pBuffer); |
| 1596 | 1596 |
| 1597 const_cast<SkPicturePlayback*>(this)->dumpStream(); | 1597 const_cast<SkPicturePlayback*>(this)->dumpStream(); |
| 1598 } | 1598 } |
| 1599 | 1599 |
| 1600 #endif | 1600 #endif |
| OLD | NEW |