Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: src/core/SkPicturePlayback.cpp

Issue 134163010: Refactor read and write buffers. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: original write flags were fine Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698