Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 | 7 |
| 8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
| 9 #include "SkErrorInternals.h" | 9 #include "SkErrorInternals.h" |
| 10 #include "SkImage.h" | 10 #include "SkImage.h" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 | 24 |
| 25 SkReadBuffer::SkReadBuffer() { | 25 SkReadBuffer::SkReadBuffer() { |
| 26 fFlags = default_flags(); | 26 fFlags = default_flags(); |
| 27 fVersion = 0; | 27 fVersion = 0; |
| 28 fMemoryPtr = nullptr; | 28 fMemoryPtr = nullptr; |
| 29 | 29 |
| 30 fBitmapStorage = nullptr; | 30 fBitmapStorage = nullptr; |
| 31 fTFArray = nullptr; | 31 fTFArray = nullptr; |
| 32 fTFCount = 0; | 32 fTFCount = 0; |
| 33 | 33 |
| 34 fFactoryTDArray = nullptr; | |
| 35 fFactoryArray = nullptr; | 34 fFactoryArray = nullptr; |
| 36 fFactoryCount = 0; | 35 fFactoryCount = 0; |
| 37 fBitmapDecoder = nullptr; | 36 fBitmapDecoder = nullptr; |
| 38 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 37 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 39 fDecodedBitmapIndex = -1; | 38 fDecodedBitmapIndex = -1; |
| 40 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 39 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 41 } | 40 } |
| 42 | 41 |
| 43 SkReadBuffer::SkReadBuffer(const void* data, size_t size) { | 42 SkReadBuffer::SkReadBuffer(const void* data, size_t size) { |
| 44 fFlags = default_flags(); | 43 fFlags = default_flags(); |
| 45 fVersion = 0; | 44 fVersion = 0; |
| 46 fReader.setMemory(data, size); | 45 fReader.setMemory(data, size); |
| 47 fMemoryPtr = nullptr; | 46 fMemoryPtr = nullptr; |
| 48 | 47 |
| 49 fBitmapStorage = nullptr; | 48 fBitmapStorage = nullptr; |
| 50 fTFArray = nullptr; | 49 fTFArray = nullptr; |
| 51 fTFCount = 0; | 50 fTFCount = 0; |
| 52 | 51 |
| 53 fFactoryTDArray = nullptr; | |
| 54 fFactoryArray = nullptr; | 52 fFactoryArray = nullptr; |
| 55 fFactoryCount = 0; | 53 fFactoryCount = 0; |
| 56 fBitmapDecoder = nullptr; | 54 fBitmapDecoder = nullptr; |
| 57 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 55 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 58 fDecodedBitmapIndex = -1; | 56 fDecodedBitmapIndex = -1; |
| 59 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 57 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 60 } | 58 } |
| 61 | 59 |
| 62 SkReadBuffer::SkReadBuffer(SkStream* stream) { | 60 SkReadBuffer::SkReadBuffer(SkStream* stream) { |
| 63 fFlags = default_flags(); | 61 fFlags = default_flags(); |
| 64 fVersion = 0; | 62 fVersion = 0; |
| 65 const size_t length = stream->getLength(); | 63 const size_t length = stream->getLength(); |
| 66 fMemoryPtr = sk_malloc_throw(length); | 64 fMemoryPtr = sk_malloc_throw(length); |
| 67 stream->read(fMemoryPtr, length); | 65 stream->read(fMemoryPtr, length); |
| 68 fReader.setMemory(fMemoryPtr, length); | 66 fReader.setMemory(fMemoryPtr, length); |
| 69 | 67 |
| 70 fBitmapStorage = nullptr; | 68 fBitmapStorage = nullptr; |
| 71 fTFArray = nullptr; | 69 fTFArray = nullptr; |
| 72 fTFCount = 0; | 70 fTFCount = 0; |
| 73 | 71 |
| 74 fFactoryTDArray = nullptr; | |
| 75 fFactoryArray = nullptr; | 72 fFactoryArray = nullptr; |
| 76 fFactoryCount = 0; | 73 fFactoryCount = 0; |
| 77 fBitmapDecoder = nullptr; | 74 fBitmapDecoder = nullptr; |
| 78 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 75 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 79 fDecodedBitmapIndex = -1; | 76 fDecodedBitmapIndex = -1; |
| 80 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 77 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 81 } | 78 } |
| 82 | 79 |
| 83 SkReadBuffer::~SkReadBuffer() { | 80 SkReadBuffer::~SkReadBuffer() { |
| 84 sk_free(fMemoryPtr); | 81 sk_free(fMemoryPtr); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 343 int32_t index = fReader.readU32(); | 340 int32_t index = fReader.readU32(); |
| 344 if (0 == index) { | 341 if (0 == index) { |
| 345 return nullptr; // writer failed to give us the flattenable | 342 return nullptr; // writer failed to give us the flattenable |
| 346 } | 343 } |
| 347 index -= 1; // we stored the index-base-1 | 344 index -= 1; // we stored the index-base-1 |
| 348 if ((unsigned)index >= (unsigned)fFactoryCount) { | 345 if ((unsigned)index >= (unsigned)fFactoryCount) { |
| 349 this->validate(false); | 346 this->validate(false); |
| 350 return nullptr; | 347 return nullptr; |
| 351 } | 348 } |
| 352 factory = fFactoryArray[index]; | 349 factory = fFactoryArray[index]; |
| 353 } else if (fFactoryTDArray) { | |
| 354 int32_t index = fReader.readU32(); | |
| 355 if (0 == index) { | |
| 356 return nullptr; // writer failed to give us the flattenable | |
| 357 } | |
| 358 index -= 1; // we stored the index-base-1 | |
| 359 if ((unsigned)index >= (unsigned)fFactoryCount) { | |
|
msarett
2016/03/31 15:05:35
AFAICT, fFactoryCount is always zero when fFactory
| |
| 360 this->validate(false); | |
| 361 return nullptr; | |
| 362 } | |
| 363 factory = (*fFactoryTDArray)[index]; | |
| 364 } else { | 350 } else { |
| 365 factory = (SkFlattenable::Factory)readFunctionPtr(); | 351 factory = (SkFlattenable::Factory)readFunctionPtr(); |
| 366 if (nullptr == factory) { | 352 if (nullptr == factory) { |
| 367 return nullptr; // writer failed to give us the flattenable | 353 return nullptr; // writer failed to give us the flattenable |
| 368 } | 354 } |
| 369 } | 355 } |
| 370 | 356 |
| 371 // if we get here, factory may still be null, but if that is the case, the | 357 // if we get here, factory may still be null, but if that is the case, the |
| 372 // failure was ours, not the writer. | 358 // failure was ours, not the writer. |
| 373 SkFlattenable* obj = nullptr; | 359 SkFlattenable* obj = nullptr; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 390 | 376 |
| 391 /** | 377 /** |
| 392 * Needs to follow the same pattern as readFlattenable(), but explicitly skip w hatever data | 378 * Needs to follow the same pattern as readFlattenable(), but explicitly skip w hatever data |
| 393 * has been written. | 379 * has been written. |
| 394 */ | 380 */ |
| 395 void SkReadBuffer::skipFlattenable() { | 381 void SkReadBuffer::skipFlattenable() { |
| 396 if (fFactoryCount > 0) { | 382 if (fFactoryCount > 0) { |
| 397 if (0 == fReader.readU32()) { | 383 if (0 == fReader.readU32()) { |
| 398 return; | 384 return; |
| 399 } | 385 } |
| 400 } else if (fFactoryTDArray) { | |
| 401 if (0 == fReader.readU32()) { | |
| 402 return; | |
| 403 } | |
| 404 } else { | 386 } else { |
| 405 if (nullptr == this->readFunctionPtr()) { | 387 if (nullptr == this->readFunctionPtr()) { |
| 406 return; | 388 return; |
| 407 } | 389 } |
| 408 } | 390 } |
| 409 uint32_t sizeRecorded = fReader.readU32(); | 391 uint32_t sizeRecorded = fReader.readU32(); |
| 410 fReader.skip(sizeRecorded); | 392 fReader.skip(sizeRecorded); |
| 411 } | 393 } |
| OLD | NEW |