| 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 "SkImageGenerator.h" | 8 #include "SkImageGenerator.h" |
| 9 #include "SkPictureData.h" | 9 #include "SkPictureData.h" |
| 10 #include "SkPictureRecord.h" | 10 #include "SkPictureRecord.h" |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 if (pictInfoFlags & gSD[i].fSrc) { | 358 if (pictInfoFlags & gSD[i].fSrc) { |
| 359 rbMask |= gSD[i].fDst; | 359 rbMask |= gSD[i].fDst; |
| 360 } | 360 } |
| 361 } | 361 } |
| 362 return rbMask; | 362 return rbMask; |
| 363 } | 363 } |
| 364 | 364 |
| 365 bool SkPictureData::parseStreamTag(SkStream* stream, | 365 bool SkPictureData::parseStreamTag(SkStream* stream, |
| 366 uint32_t tag, | 366 uint32_t tag, |
| 367 uint32_t size, | 367 uint32_t size, |
| 368 SkPicture::InstallPixelRefProc proc, | 368 SkImageDeserializer* factory, |
| 369 SkTypefacePlayback* topLevelTFPlayback) { | 369 SkTypefacePlayback* topLevelTFPlayback) { |
| 370 /* | 370 /* |
| 371 * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen | 371 * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen |
| 372 * its dependents: FACTORY_TAG and TYPEFACE_TAG. These two are not required | 372 * its dependents: FACTORY_TAG and TYPEFACE_TAG. These two are not required |
| 373 * but if they are present, they need to have been seen before the buffer. | 373 * but if they are present, they need to have been seen before the buffer. |
| 374 * | 374 * |
| 375 * We assert that if/when we see either of these, that we have not yet seen | 375 * We assert that if/when we see either of these, that we have not yet seen |
| 376 * the buffer tag, because if we have, then its too-late to deal with the | 376 * the buffer tag, because if we have, then its too-late to deal with the |
| 377 * factories or typefaces. | 377 * factories or typefaces. |
| 378 */ | 378 */ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 // the default here. | 411 // the default here. |
| 412 tf = SkTypeface::MakeDefault(); | 412 tf = SkTypeface::MakeDefault(); |
| 413 } | 413 } |
| 414 fTFPlayback.set(i, tf.get()); | 414 fTFPlayback.set(i, tf.get()); |
| 415 } | 415 } |
| 416 } break; | 416 } break; |
| 417 case SK_PICT_PICTURE_TAG: { | 417 case SK_PICT_PICTURE_TAG: { |
| 418 fPictureCount = 0; | 418 fPictureCount = 0; |
| 419 fPictureRefs = new const SkPicture* [size]; | 419 fPictureRefs = new const SkPicture* [size]; |
| 420 for (uint32_t i = 0; i < size; i++) { | 420 for (uint32_t i = 0; i < size; i++) { |
| 421 fPictureRefs[i] = SkPicture::MakeFromStream(stream, proc, topLev
elTFPlayback).release(); | 421 fPictureRefs[i] = SkPicture::MakeFromStream(stream, factory, top
LevelTFPlayback).release(); |
| 422 if (!fPictureRefs[i]) { | 422 if (!fPictureRefs[i]) { |
| 423 return false; | 423 return false; |
| 424 } | 424 } |
| 425 fPictureCount++; | 425 fPictureCount++; |
| 426 } | 426 } |
| 427 } break; | 427 } break; |
| 428 case SK_PICT_BUFFER_SIZE_TAG: { | 428 case SK_PICT_BUFFER_SIZE_TAG: { |
| 429 SkAutoMalloc storage(size); | 429 SkAutoMalloc storage(size); |
| 430 if (stream->read(storage.get(), size) != size) { | 430 if (stream->read(storage.get(), size) != size) { |
| 431 return false; | 431 return false; |
| 432 } | 432 } |
| 433 | 433 |
| 434 /* Should we use SkValidatingReadBuffer instead? */ | 434 /* Should we use SkValidatingReadBuffer instead? */ |
| 435 SkReadBuffer buffer(storage.get(), size); | 435 SkReadBuffer buffer(storage.get(), size); |
| 436 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); | 436 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); |
| 437 buffer.setVersion(fInfo.fVersion); | 437 buffer.setVersion(fInfo.fVersion); |
| 438 | 438 |
| 439 if (!fFactoryPlayback) { | 439 if (!fFactoryPlayback) { |
| 440 return false; | 440 return false; |
| 441 } | 441 } |
| 442 fFactoryPlayback->setupBuffer(buffer); | 442 fFactoryPlayback->setupBuffer(buffer); |
| 443 buffer.setBitmapDecoder(proc); | 443 buffer.setImageDeserializer(factory); |
| 444 | 444 |
| 445 if (fTFPlayback.count() > 0) { | 445 if (fTFPlayback.count() > 0) { |
| 446 // .skp files <= v43 have typefaces serialized with each sub pic
ture. | 446 // .skp files <= v43 have typefaces serialized with each sub pic
ture. |
| 447 fTFPlayback.setupBuffer(buffer); | 447 fTFPlayback.setupBuffer(buffer); |
| 448 } else { | 448 } else { |
| 449 // Newer .skp files serialize all typefaces with the top picture
. | 449 // Newer .skp files serialize all typefaces with the top picture
. |
| 450 topLevelTFPlayback->setupBuffer(buffer); | 450 topLevelTFPlayback->setupBuffer(buffer); |
| 451 } | 451 } |
| 452 | 452 |
| 453 while (!buffer.eof() && buffer.isValid()) { | 453 while (!buffer.eof() && buffer.isValid()) { |
| 454 tag = buffer.readUInt(); | 454 tag = buffer.readUInt(); |
| 455 size = buffer.readUInt(); | 455 size = buffer.readUInt(); |
| 456 if (!this->parseBufferTag(buffer, tag, size)) { | 456 if (!this->parseBufferTag(buffer, tag, size)) { |
| 457 return false; | 457 return false; |
| 458 } | 458 } |
| 459 } | 459 } |
| 460 if (!buffer.isValid()) { | 460 if (!buffer.isValid()) { |
| 461 return false; | 461 return false; |
| 462 } | 462 } |
| 463 SkDEBUGCODE(haveBuffer = true;) | 463 SkDEBUGCODE(haveBuffer = true;) |
| 464 } break; | 464 } break; |
| 465 } | 465 } |
| 466 return true; // success | 466 return true; // success |
| 467 } | 467 } |
| 468 | 468 |
| 469 static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { | 469 static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { |
| 470 return buffer.readImage(); | 470 return buffer.readImage().release(); |
| 471 } |
| 472 |
| 473 static const SkImage* create_bitmap_image_from_buffer(SkReadBuffer& buffer) { |
| 474 return buffer.readBitmapAsImage().release(); |
| 471 } | 475 } |
| 472 | 476 |
| 473 // Need a shallow wrapper to return const SkPicture* to match the other factorie
s, | 477 // Need a shallow wrapper to return const SkPicture* to match the other factorie
s, |
| 474 // as SkPicture::CreateFromBuffer() returns SkPicture* | 478 // as SkPicture::CreateFromBuffer() returns SkPicture* |
| 475 static const SkPicture* create_picture_from_buffer(SkReadBuffer& buffer) { | 479 static const SkPicture* create_picture_from_buffer(SkReadBuffer& buffer) { |
| 476 return SkPicture::MakeFromBuffer(buffer).release(); | 480 return SkPicture::MakeFromBuffer(buffer).release(); |
| 477 } | 481 } |
| 478 | 482 |
| 479 static const SkDrawable* create_drawable_from_buffer(SkReadBuffer& buffer) { | 483 static const SkDrawable* create_drawable_from_buffer(SkReadBuffer& buffer) { |
| 480 return (SkDrawable*) buffer.readFlattenable(SkFlattenable::kSkDrawable_Type)
; | 484 return (SkDrawable*) buffer.readFlattenable(SkFlattenable::kSkDrawable_Type)
; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 510 *array = nullptr; | 514 *array = nullptr; |
| 511 *outCount = 0; | 515 *outCount = 0; |
| 512 return false; | 516 return false; |
| 513 } | 517 } |
| 514 return true; | 518 return true; |
| 515 } | 519 } |
| 516 | 520 |
| 517 bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t
size) { | 521 bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t
size) { |
| 518 switch (tag) { | 522 switch (tag) { |
| 519 case SK_PICT_BITMAP_BUFFER_TAG: { | 523 case SK_PICT_BITMAP_BUFFER_TAG: { |
| 524 #if 0 |
| 520 const int count = SkToInt(size); | 525 const int count = SkToInt(size); |
| 521 fBitmaps.reset(count); | 526 fBitmaps.reset(count); |
| 522 for (int i = 0; i < count; ++i) { | 527 for (int i = 0; i < count; ++i) { |
| 523 SkBitmap* bm = &fBitmaps[i]; | 528 SkBitmap* bm = &fBitmaps[i]; |
| 524 if (buffer.readBitmap(bm)) { | 529 if (buffer.legacy_readBitmap(bm)) { |
| 525 bm->setImmutable(); | 530 bm->setImmutable(); |
| 526 } else { | 531 } else { |
| 527 return false; | 532 return false; |
| 528 } | 533 } |
| 529 } | 534 } |
| 535 #else |
| 536 if (!new_array_from_buffer(buffer, size, &fBitmapImageRefs, &fBitmap
ImageCount, |
| 537 create_bitmap_image_from_buffer)) { |
| 538 return false; |
| 539 } |
| 540 #endif |
| 530 } break; | 541 } break; |
| 531 case SK_PICT_PAINT_BUFFER_TAG: { | 542 case SK_PICT_PAINT_BUFFER_TAG: { |
| 532 const int count = SkToInt(size); | 543 const int count = SkToInt(size); |
| 533 fPaints.reset(count); | 544 fPaints.reset(count); |
| 534 for (int i = 0; i < count; ++i) { | 545 for (int i = 0; i < count; ++i) { |
| 535 buffer.readPaint(&fPaints[i]); | 546 buffer.readPaint(&fPaints[i]); |
| 536 } | 547 } |
| 537 } break; | 548 } break; |
| 538 case SK_PICT_PATH_BUFFER_TAG: | 549 case SK_PICT_PATH_BUFFER_TAG: |
| 539 if (size > 0) { | 550 if (size > 0) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 break; | 589 break; |
| 579 default: | 590 default: |
| 580 // The tag was invalid. | 591 // The tag was invalid. |
| 581 return false; | 592 return false; |
| 582 } | 593 } |
| 583 return true; // success | 594 return true; // success |
| 584 } | 595 } |
| 585 | 596 |
| 586 SkPictureData* SkPictureData::CreateFromStream(SkStream* stream, | 597 SkPictureData* SkPictureData::CreateFromStream(SkStream* stream, |
| 587 const SkPictInfo& info, | 598 const SkPictInfo& info, |
| 588 SkPicture::InstallPixelRefProc pr
oc, | 599 SkImageDeserializer* factory, |
| 589 SkTypefacePlayback* topLevelTFPla
yback) { | 600 SkTypefacePlayback* topLevelTFPla
yback) { |
| 590 SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); | 601 SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); |
| 591 if (!topLevelTFPlayback) { | 602 if (!topLevelTFPlayback) { |
| 592 topLevelTFPlayback = &data->fTFPlayback; | 603 topLevelTFPlayback = &data->fTFPlayback; |
| 593 } | 604 } |
| 594 | 605 |
| 595 if (!data->parseStream(stream, proc, topLevelTFPlayback)) { | 606 if (!data->parseStream(stream, factory, topLevelTFPlayback)) { |
| 596 return nullptr; | 607 return nullptr; |
| 597 } | 608 } |
| 598 return data.release(); | 609 return data.release(); |
| 599 } | 610 } |
| 600 | 611 |
| 601 SkPictureData* SkPictureData::CreateFromBuffer(SkReadBuffer& buffer, | 612 SkPictureData* SkPictureData::CreateFromBuffer(SkReadBuffer& buffer, |
| 602 const SkPictInfo& info) { | 613 const SkPictInfo& info) { |
| 603 SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); | 614 SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); |
| 604 buffer.setVersion(info.fVersion); | 615 buffer.setVersion(info.fVersion); |
| 605 | 616 |
| 606 if (!data->parseBuffer(buffer)) { | 617 if (!data->parseBuffer(buffer)) { |
| 607 return nullptr; | 618 return nullptr; |
| 608 } | 619 } |
| 609 return data.release(); | 620 return data.release(); |
| 610 } | 621 } |
| 611 | 622 |
| 612 bool SkPictureData::parseStream(SkStream* stream, | 623 bool SkPictureData::parseStream(SkStream* stream, |
| 613 SkPicture::InstallPixelRefProc proc, | 624 SkImageDeserializer* factory, |
| 614 SkTypefacePlayback* topLevelTFPlayback) { | 625 SkTypefacePlayback* topLevelTFPlayback) { |
| 615 for (;;) { | 626 for (;;) { |
| 616 uint32_t tag = stream->readU32(); | 627 uint32_t tag = stream->readU32(); |
| 617 if (SK_PICT_EOF_TAG == tag) { | 628 if (SK_PICT_EOF_TAG == tag) { |
| 618 break; | 629 break; |
| 619 } | 630 } |
| 620 | 631 |
| 621 uint32_t size = stream->readU32(); | 632 uint32_t size = stream->readU32(); |
| 622 if (!this->parseStreamTag(stream, tag, size, proc, topLevelTFPlayback))
{ | 633 if (!this->parseStreamTag(stream, tag, size, factory, topLevelTFPlayback
)) { |
| 623 return false; // we're invalid | 634 return false; // we're invalid |
| 624 } | 635 } |
| 625 } | 636 } |
| 626 return true; | 637 return true; |
| 627 } | 638 } |
| 628 | 639 |
| 629 bool SkPictureData::parseBuffer(SkReadBuffer& buffer) { | 640 bool SkPictureData::parseBuffer(SkReadBuffer& buffer) { |
| 630 for (;;) { | 641 for (;;) { |
| 631 uint32_t tag = buffer.readUInt(); | 642 uint32_t tag = buffer.readUInt(); |
| 632 if (SK_PICT_EOF_TAG == tag) { | 643 if (SK_PICT_EOF_TAG == tag) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 659 } else { | 670 } else { |
| 660 return this->suitableForGpuRasterization(nullptr, reason); | 671 return this->suitableForGpuRasterization(nullptr, reason); |
| 661 } | 672 } |
| 662 } | 673 } |
| 663 | 674 |
| 664 bool SkPictureData::suitableForLayerOptimization() const { | 675 bool SkPictureData::suitableForLayerOptimization() const { |
| 665 return fContentInfo.numLayers() > 0; | 676 return fContentInfo.numLayers() > 0; |
| 666 } | 677 } |
| 667 #endif | 678 #endif |
| 668 /////////////////////////////////////////////////////////////////////////////// | 679 /////////////////////////////////////////////////////////////////////////////// |
| OLD | NEW |