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

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

Issue 2187613002: Deserialize pictures with custom image-deserializer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 4 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 * 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
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
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
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
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
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 ///////////////////////////////////////////////////////////////////////////////
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698