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 "SkBBoxHierarchy.h" | 8 #include "SkBBoxHierarchy.h" |
9 #include "SkDrawPictureCallback.h" | 9 #include "SkDrawPictureCallback.h" |
10 #include "SkPictureData.h" | 10 #include "SkPictureData.h" |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
388 fPictureCount = 0; | 388 fPictureCount = 0; |
389 return false; | 389 return false; |
390 } | 390 } |
391 } break; | 391 } break; |
392 case SK_PICT_BUFFER_SIZE_TAG: { | 392 case SK_PICT_BUFFER_SIZE_TAG: { |
393 SkAutoMalloc storage(size); | 393 SkAutoMalloc storage(size); |
394 if (stream->read(storage.get(), size) != size) { | 394 if (stream->read(storage.get(), size) != size) { |
395 return false; | 395 return false; |
396 } | 396 } |
397 | 397 |
398 /* Should we use SkValidatingReadBuffer instead? */ | |
scroggo
2014/11/12 18:24:47
If we're going to check isValid, absolutely! Other
| |
398 SkReadBuffer buffer(storage.get(), size); | 399 SkReadBuffer buffer(storage.get(), size); |
399 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); | 400 buffer.setFlags(pictInfoFlagsToReadBufferFlags(fInfo.fFlags)); |
400 buffer.setVersion(fInfo.fVersion); | 401 buffer.setVersion(fInfo.fVersion); |
401 | 402 |
402 fFactoryPlayback->setupBuffer(buffer); | 403 fFactoryPlayback->setupBuffer(buffer); |
403 fTFPlayback.setupBuffer(buffer); | 404 fTFPlayback.setupBuffer(buffer); |
404 buffer.setBitmapDecoder(proc); | 405 buffer.setBitmapDecoder(proc); |
405 | 406 |
406 while (!buffer.eof()) { | 407 while (!buffer.eof() && buffer.isValid()) { |
407 tag = buffer.readUInt(); | 408 tag = buffer.readUInt(); |
408 size = buffer.readUInt(); | 409 size = buffer.readUInt(); |
409 if (!this->parseBufferTag(buffer, tag, size)) { | 410 if (!this->parseBufferTag(buffer, tag, size)) { |
410 return false; | 411 return false; |
411 } | 412 } |
412 } | 413 } |
414 if (!buffer.isValid()) { | |
scroggo
2014/11/12 18:24:47
Do we need both checks?
Is it possible for isVali
| |
415 return false; | |
416 } | |
413 SkDEBUGCODE(haveBuffer = true;) | 417 SkDEBUGCODE(haveBuffer = true;) |
414 } break; | 418 } break; |
415 } | 419 } |
416 return true; // success | 420 return true; // success |
417 } | 421 } |
418 | 422 |
419 bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, | 423 bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, |
420 uint32_t tag, uint32_t size) { | 424 uint32_t tag, uint32_t size) { |
421 switch (tag) { | 425 switch (tag) { |
422 case SK_PICT_BITMAP_BUFFER_TAG: { | 426 case SK_PICT_BITMAP_BUFFER_TAG: { |
423 const int count = SkToInt(size); | 427 const int count = SkToInt(size); |
424 fBitmaps = SkTRefArray<SkBitmap>::Create(size); | 428 fBitmaps = SkTRefArray<SkBitmap>::Create(size); |
425 for (int i = 0; i < count; ++i) { | 429 for (int i = 0; i < count; ++i) { |
426 SkBitmap* bm = &fBitmaps->writableAt(i); | 430 SkBitmap* bm = &fBitmaps->writableAt(i); |
427 buffer.readBitmap(bm); | 431 if (buffer.readBitmap(bm)) { |
428 bm->setImmutable(); | 432 bm->setImmutable(); |
433 } else { | |
434 return false; | |
435 } | |
429 } | 436 } |
430 } break; | 437 } break; |
431 case SK_PICT_PAINT_BUFFER_TAG: { | 438 case SK_PICT_PAINT_BUFFER_TAG: { |
432 const int count = SkToInt(size); | 439 const int count = SkToInt(size); |
433 fPaints = SkTRefArray<SkPaint>::Create(size); | 440 fPaints = SkTRefArray<SkPaint>::Create(size); |
434 for (int i = 0; i < count; ++i) { | 441 for (int i = 0; i < count; ++i) { |
435 buffer.readPaint(&fPaints->writableAt(i)); | 442 buffer.readPaint(&fPaints->writableAt(i)); |
436 } | 443 } |
437 } break; | 444 } break; |
438 case SK_PICT_PATH_BUFFER_TAG: | 445 case SK_PICT_PATH_BUFFER_TAG: |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
582 } | 589 } |
583 } | 590 } |
584 | 591 |
585 bool SkPictureData::suitableForLayerOptimization() const { | 592 bool SkPictureData::suitableForLayerOptimization() const { |
586 return fContentInfo.numLayers() > 0; | 593 return fContentInfo.numLayers() > 0; |
587 } | 594 } |
588 #endif | 595 #endif |
589 /////////////////////////////////////////////////////////////////////////////// | 596 /////////////////////////////////////////////////////////////////////////////// |
590 | 597 |
591 | 598 |
OLD | NEW |