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

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: fix build 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 25 matching lines...) Expand all
36 SkPictureData::SkPictureData(const SkPictureRecord& record, 36 SkPictureData::SkPictureData(const SkPictureRecord& record,
37 const SkPictInfo& info) 37 const SkPictInfo& info)
38 : fInfo(info) { 38 : fInfo(info) {
39 39
40 this->init(); 40 this->init();
41 41
42 fOpData = record.opData(); 42 fOpData = record.opData();
43 43
44 fContentInfo.set(record.fContentInfo); 44 fContentInfo.set(record.fContentInfo);
45 45
46 fBitmaps.reset(); // we never make bitmaps (anymore) during recording
47 fPaints = record.fPaints; 46 fPaints = record.fPaints;
48 47
49 fPaths.reset(record.fPaths.count()); 48 fPaths.reset(record.fPaths.count());
50 record.fPaths.foreach([this](const SkPath& path, int n) { 49 record.fPaths.foreach([this](const SkPath& path, int n) {
51 // These indices are logically 1-based, but we need to serialize them 50 // These indices are logically 1-based, but we need to serialize them
52 // 0-based to keep the deserializing SkPictureData::getPath() working. 51 // 0-based to keep the deserializing SkPictureData::getPath() working.
53 fPaths[n-1] = path; 52 fPaths[n-1] = path;
54 }); 53 });
55 54
56 this->initForPlayback(); 55 this->initForPlayback();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 127
129 for (int i = 0; i < fImageCount; i++) { 128 for (int i = 0; i < fImageCount; i++) {
130 fImageRefs[i]->unref(); 129 fImageRefs[i]->unref();
131 } 130 }
132 delete[] fImageRefs; 131 delete[] fImageRefs;
133 132
134 delete fFactoryPlayback; 133 delete fFactoryPlayback;
135 } 134 }
136 135
137 bool SkPictureData::containsBitmaps() const { 136 bool SkPictureData::containsBitmaps() const {
138 if (fBitmaps.count() > 0 || fImageCount > 0) { 137 if (fBitmapImageCount > 0 || fImageCount > 0) {
139 return true; 138 return true;
140 } 139 }
141 for (int i = 0; i < fPictureCount; ++i) { 140 for (int i = 0; i < fPictureCount; ++i) {
142 if (fPictureRefs[i]->willPlayBackBitmaps()) { 141 if (fPictureRefs[i]->willPlayBackBitmaps()) {
143 return true; 142 return true;
144 } 143 }
145 } 144 }
146 return false; 145 return false;
147 } 146 }
148 147
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 rec.copyToArray((SkRefCnt**)array); 215 rec.copyToArray((SkRefCnt**)array);
217 216
218 for (int i = 0; i < count; i++) { 217 for (int i = 0; i < count; i++) {
219 array[i]->serialize(stream); 218 array[i]->serialize(stream);
220 } 219 }
221 } 220 }
222 221
223 void SkPictureData::flattenToBuffer(SkWriteBuffer& buffer) const { 222 void SkPictureData::flattenToBuffer(SkWriteBuffer& buffer) const {
224 int i, n; 223 int i, n;
225 224
226 // we never record bitmaps anymore, only images
227 SkASSERT(fBitmaps.count() == 0);
228
229 if ((n = fPaints.count()) > 0) { 225 if ((n = fPaints.count()) > 0) {
230 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); 226 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n);
231 for (i = 0; i < n; i++) { 227 for (i = 0; i < n; i++) {
232 buffer.writePaint(fPaints[i]); 228 buffer.writePaint(fPaints[i]);
233 } 229 }
234 } 230 }
235 231
236 if ((n = fPaths.count()) > 0) { 232 if ((n = fPaths.count()) > 0) {
237 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); 233 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n);
238 buffer.writeInt(n); 234 buffer.writeInt(n);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 if (pictInfoFlags & gSD[i].fSrc) { 350 if (pictInfoFlags & gSD[i].fSrc) {
355 rbMask |= gSD[i].fDst; 351 rbMask |= gSD[i].fDst;
356 } 352 }
357 } 353 }
358 return rbMask; 354 return rbMask;
359 } 355 }
360 356
361 bool SkPictureData::parseStreamTag(SkStream* stream, 357 bool SkPictureData::parseStreamTag(SkStream* stream,
362 uint32_t tag, 358 uint32_t tag,
363 uint32_t size, 359 uint32_t size,
364 SkPicture::InstallPixelRefProc proc, 360 SkImageDeserializer* factory,
365 SkTypefacePlayback* topLevelTFPlayback) { 361 SkTypefacePlayback* topLevelTFPlayback) {
366 /* 362 /*
367 * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen 363 * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen
368 * its dependents: FACTORY_TAG and TYPEFACE_TAG. These two are not required 364 * its dependents: FACTORY_TAG and TYPEFACE_TAG. These two are not required
369 * but if they are present, they need to have been seen before the buffer. 365 * but if they are present, they need to have been seen before the buffer.
370 * 366 *
371 * We assert that if/when we see either of these, that we have not yet seen 367 * We assert that if/when we see either of these, that we have not yet seen
372 * the buffer tag, because if we have, then its too-late to deal with the 368 * the buffer tag, because if we have, then its too-late to deal with the
373 * factories or typefaces. 369 * factories or typefaces.
374 */ 370 */
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 // the default here. 403 // the default here.
408 tf = SkTypeface::MakeDefault(); 404 tf = SkTypeface::MakeDefault();
409 } 405 }
410 fTFPlayback.set(i, tf.get()); 406 fTFPlayback.set(i, tf.get());
411 } 407 }
412 } break; 408 } break;
413 case SK_PICT_PICTURE_TAG: { 409 case SK_PICT_PICTURE_TAG: {
414 fPictureCount = 0; 410 fPictureCount = 0;
415 fPictureRefs = new const SkPicture* [size]; 411 fPictureRefs = new const SkPicture* [size];
416 for (uint32_t i = 0; i < size; i++) { 412 for (uint32_t i = 0; i < size; i++) {
417 fPictureRefs[i] = SkPicture::MakeFromStream(stream, proc, topLev elTFPlayback).release(); 413 fPictureRefs[i] = SkPicture::MakeFromStream(stream, factory, top LevelTFPlayback).release();
418 if (!fPictureRefs[i]) { 414 if (!fPictureRefs[i]) {
419 return false; 415 return false;
420 } 416 }
421 fPictureCount++; 417 fPictureCount++;
422 } 418 }
423 } break; 419 } break;
424 case SK_PICT_BUFFER_SIZE_TAG: { 420 case SK_PICT_BUFFER_SIZE_TAG: {
425 SkAutoMalloc storage(size); 421 SkAutoMalloc storage(size);
426 if (stream->read(storage.get(), size) != size) { 422 if (stream->read(storage.get(), size) != size) {
427 return false; 423 return false;
428 } 424 }
429 425
430 /* Should we use SkValidatingReadBuffer instead? */ 426 /* Should we use SkValidatingReadBuffer instead? */
431 SkReadBuffer buffer(storage.get(), size); 427 SkReadBuffer buffer(storage.get(), size);
432 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); 428 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags));
433 buffer.setVersion(fInfo.fVersion); 429 buffer.setVersion(fInfo.fVersion);
434 430
435 if (!fFactoryPlayback) { 431 if (!fFactoryPlayback) {
436 return false; 432 return false;
437 } 433 }
438 fFactoryPlayback->setupBuffer(buffer); 434 fFactoryPlayback->setupBuffer(buffer);
439 buffer.setBitmapDecoder(proc); 435 buffer.setImageDeserializer(factory);
440 436
441 if (fTFPlayback.count() > 0) { 437 if (fTFPlayback.count() > 0) {
442 // .skp files <= v43 have typefaces serialized with each sub pic ture. 438 // .skp files <= v43 have typefaces serialized with each sub pic ture.
443 fTFPlayback.setupBuffer(buffer); 439 fTFPlayback.setupBuffer(buffer);
444 } else { 440 } else {
445 // Newer .skp files serialize all typefaces with the top picture . 441 // Newer .skp files serialize all typefaces with the top picture .
446 topLevelTFPlayback->setupBuffer(buffer); 442 topLevelTFPlayback->setupBuffer(buffer);
447 } 443 }
448 444
449 while (!buffer.eof() && buffer.isValid()) { 445 while (!buffer.eof() && buffer.isValid()) {
450 tag = buffer.readUInt(); 446 tag = buffer.readUInt();
451 size = buffer.readUInt(); 447 size = buffer.readUInt();
452 if (!this->parseBufferTag(buffer, tag, size)) { 448 if (!this->parseBufferTag(buffer, tag, size)) {
453 return false; 449 return false;
454 } 450 }
455 } 451 }
456 if (!buffer.isValid()) { 452 if (!buffer.isValid()) {
457 return false; 453 return false;
458 } 454 }
459 SkDEBUGCODE(haveBuffer = true;) 455 SkDEBUGCODE(haveBuffer = true;)
460 } break; 456 } break;
461 } 457 }
462 return true; // success 458 return true; // success
463 } 459 }
464 460
465 static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { 461 static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) {
466 return buffer.readImage(); 462 return buffer.readImage().release();
463 }
464
465 static const SkImage* create_bitmap_image_from_buffer(SkReadBuffer& buffer) {
466 return buffer.readBitmapAsImage().release();
467 } 467 }
468 468
469 // Need a shallow wrapper to return const SkPicture* to match the other factorie s, 469 // Need a shallow wrapper to return const SkPicture* to match the other factorie s,
470 // as SkPicture::CreateFromBuffer() returns SkPicture* 470 // as SkPicture::CreateFromBuffer() returns SkPicture*
471 static const SkPicture* create_picture_from_buffer(SkReadBuffer& buffer) { 471 static const SkPicture* create_picture_from_buffer(SkReadBuffer& buffer) {
472 return SkPicture::MakeFromBuffer(buffer).release(); 472 return SkPicture::MakeFromBuffer(buffer).release();
473 } 473 }
474 474
475 static const SkDrawable* create_drawable_from_buffer(SkReadBuffer& buffer) { 475 static const SkDrawable* create_drawable_from_buffer(SkReadBuffer& buffer) {
476 return (SkDrawable*) buffer.readFlattenable(SkFlattenable::kSkDrawable_Type) ; 476 return (SkDrawable*) buffer.readFlattenable(SkFlattenable::kSkDrawable_Type) ;
(...skipping 28 matching lines...) Expand all
505 delete[] * array; 505 delete[] * array;
506 *array = nullptr; 506 *array = nullptr;
507 *outCount = 0; 507 *outCount = 0;
508 return false; 508 return false;
509 } 509 }
510 return true; 510 return true;
511 } 511 }
512 512
513 bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t size) { 513 bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t size) {
514 switch (tag) { 514 switch (tag) {
515 case SK_PICT_BITMAP_BUFFER_TAG: { 515 case SK_PICT_BITMAP_BUFFER_TAG:
516 const int count = SkToInt(size); 516 if (!new_array_from_buffer(buffer, size, &fBitmapImageRefs, &fBitmap ImageCount,
517 fBitmaps.reset(count); 517 create_bitmap_image_from_buffer)) {
518 for (int i = 0; i < count; ++i) { 518 return false;
519 SkBitmap* bm = &fBitmaps[i];
520 if (buffer.readBitmap(bm)) {
521 bm->setImmutable();
522 } else {
523 return false;
524 }
525 } 519 }
526 } break; 520 break;
527 case SK_PICT_PAINT_BUFFER_TAG: { 521 case SK_PICT_PAINT_BUFFER_TAG: {
528 const int count = SkToInt(size); 522 const int count = SkToInt(size);
529 fPaints.reset(count); 523 fPaints.reset(count);
530 for (int i = 0; i < count; ++i) { 524 for (int i = 0; i < count; ++i) {
531 buffer.readPaint(&fPaints[i]); 525 buffer.readPaint(&fPaints[i]);
532 } 526 }
533 } break; 527 } break;
534 case SK_PICT_PATH_BUFFER_TAG: 528 case SK_PICT_PATH_BUFFER_TAG:
535 if (size > 0) { 529 if (size > 0) {
536 const int count = buffer.readInt(); 530 const int count = buffer.readInt();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 break; 568 break;
575 default: 569 default:
576 // The tag was invalid. 570 // The tag was invalid.
577 return false; 571 return false;
578 } 572 }
579 return true; // success 573 return true; // success
580 } 574 }
581 575
582 SkPictureData* SkPictureData::CreateFromStream(SkStream* stream, 576 SkPictureData* SkPictureData::CreateFromStream(SkStream* stream,
583 const SkPictInfo& info, 577 const SkPictInfo& info,
584 SkPicture::InstallPixelRefProc pr oc, 578 SkImageDeserializer* factory,
585 SkTypefacePlayback* topLevelTFPla yback) { 579 SkTypefacePlayback* topLevelTFPla yback) {
586 SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); 580 SkAutoTDelete<SkPictureData> data(new SkPictureData(info));
587 if (!topLevelTFPlayback) { 581 if (!topLevelTFPlayback) {
588 topLevelTFPlayback = &data->fTFPlayback; 582 topLevelTFPlayback = &data->fTFPlayback;
589 } 583 }
590 584
591 if (!data->parseStream(stream, proc, topLevelTFPlayback)) { 585 if (!data->parseStream(stream, factory, topLevelTFPlayback)) {
592 return nullptr; 586 return nullptr;
593 } 587 }
594 return data.release(); 588 return data.release();
595 } 589 }
596 590
597 SkPictureData* SkPictureData::CreateFromBuffer(SkReadBuffer& buffer, 591 SkPictureData* SkPictureData::CreateFromBuffer(SkReadBuffer& buffer,
598 const SkPictInfo& info) { 592 const SkPictInfo& info) {
599 SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); 593 SkAutoTDelete<SkPictureData> data(new SkPictureData(info));
600 buffer.setVersion(info.fVersion); 594 buffer.setVersion(info.fVersion);
601 595
602 if (!data->parseBuffer(buffer)) { 596 if (!data->parseBuffer(buffer)) {
603 return nullptr; 597 return nullptr;
604 } 598 }
605 return data.release(); 599 return data.release();
606 } 600 }
607 601
608 bool SkPictureData::parseStream(SkStream* stream, 602 bool SkPictureData::parseStream(SkStream* stream,
609 SkPicture::InstallPixelRefProc proc, 603 SkImageDeserializer* factory,
610 SkTypefacePlayback* topLevelTFPlayback) { 604 SkTypefacePlayback* topLevelTFPlayback) {
611 for (;;) { 605 for (;;) {
612 uint32_t tag = stream->readU32(); 606 uint32_t tag = stream->readU32();
613 if (SK_PICT_EOF_TAG == tag) { 607 if (SK_PICT_EOF_TAG == tag) {
614 break; 608 break;
615 } 609 }
616 610
617 uint32_t size = stream->readU32(); 611 uint32_t size = stream->readU32();
618 if (!this->parseStreamTag(stream, tag, size, proc, topLevelTFPlayback)) { 612 if (!this->parseStreamTag(stream, tag, size, factory, topLevelTFPlayback )) {
619 return false; // we're invalid 613 return false; // we're invalid
620 } 614 }
621 } 615 }
622 return true; 616 return true;
623 } 617 }
624 618
625 bool SkPictureData::parseBuffer(SkReadBuffer& buffer) { 619 bool SkPictureData::parseBuffer(SkReadBuffer& buffer) {
626 for (;;) { 620 for (;;) {
627 uint32_t tag = buffer.readUInt(); 621 uint32_t tag = buffer.readUInt();
628 if (SK_PICT_EOF_TAG == tag) { 622 if (SK_PICT_EOF_TAG == tag) {
(...skipping 26 matching lines...) Expand all
655 } else { 649 } else {
656 return this->suitableForGpuRasterization(nullptr, reason); 650 return this->suitableForGpuRasterization(nullptr, reason);
657 } 651 }
658 } 652 }
659 653
660 bool SkPictureData::suitableForLayerOptimization() const { 654 bool SkPictureData::suitableForLayerOptimization() const {
661 return fContentInfo.numLayers() > 0; 655 return fContentInfo.numLayers() > 0;
662 } 656 }
663 #endif 657 #endif
664 /////////////////////////////////////////////////////////////////////////////// 658 ///////////////////////////////////////////////////////////////////////////////
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698