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 |