| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkErrorInternals.h" | 10 #include "SkErrorInternals.h" |
| 11 #include "SkReadBuffer.h" | 11 #include "SkReadBuffer.h" |
| 12 #include "SkStream.h" | 12 #include "SkStream.h" |
| 13 #include "SkTypeface.h" | 13 #include "SkTypeface.h" |
| 14 | 14 |
| 15 static uint32_t default_flags() { | 15 static uint32_t default_flags() { |
| 16 uint32_t flags = 0; | 16 uint32_t flags = 0; |
| 17 flags |= SkReadBuffer::kScalarIsFloat_Flag; | 17 flags |= SkReadBuffer::kScalarIsFloat_Flag; |
| 18 if (8 == sizeof(void*)) { | 18 if (8 == sizeof(void*)) { |
| 19 flags |= SkReadBuffer::kPtrIs64Bit_Flag; | 19 flags |= SkReadBuffer::kPtrIs64Bit_Flag; |
| 20 } | 20 } |
| 21 return flags; | 21 return flags; |
| 22 } | 22 } |
| 23 | 23 |
| 24 SkReadBuffer::SkReadBuffer() { | 24 SkReadBuffer::SkReadBuffer() { |
| 25 fFlags = default_flags(); | 25 fFlags = default_flags(); |
| 26 fVersion = 0; | 26 fVersion = 0; |
| 27 fMemoryPtr = NULL; | 27 fMemoryPtr = nullptr; |
| 28 | 28 |
| 29 fBitmapStorage = NULL; | 29 fBitmapStorage = nullptr; |
| 30 fTFArray = NULL; | 30 fTFArray = nullptr; |
| 31 fTFCount = 0; | 31 fTFCount = 0; |
| 32 | 32 |
| 33 fFactoryTDArray = NULL; | 33 fFactoryTDArray = nullptr; |
| 34 fFactoryArray = NULL; | 34 fFactoryArray = nullptr; |
| 35 fFactoryCount = 0; | 35 fFactoryCount = 0; |
| 36 fBitmapDecoder = NULL; | 36 fBitmapDecoder = nullptr; |
| 37 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 37 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 38 fDecodedBitmapIndex = -1; | 38 fDecodedBitmapIndex = -1; |
| 39 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 39 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 40 } | 40 } |
| 41 | 41 |
| 42 SkReadBuffer::SkReadBuffer(const void* data, size_t size) { | 42 SkReadBuffer::SkReadBuffer(const void* data, size_t size) { |
| 43 fFlags = default_flags(); | 43 fFlags = default_flags(); |
| 44 fVersion = 0; | 44 fVersion = 0; |
| 45 fReader.setMemory(data, size); | 45 fReader.setMemory(data, size); |
| 46 fMemoryPtr = NULL; | 46 fMemoryPtr = nullptr; |
| 47 | 47 |
| 48 fBitmapStorage = NULL; | 48 fBitmapStorage = nullptr; |
| 49 fTFArray = NULL; | 49 fTFArray = nullptr; |
| 50 fTFCount = 0; | 50 fTFCount = 0; |
| 51 | 51 |
| 52 fFactoryTDArray = NULL; | 52 fFactoryTDArray = nullptr; |
| 53 fFactoryArray = NULL; | 53 fFactoryArray = nullptr; |
| 54 fFactoryCount = 0; | 54 fFactoryCount = 0; |
| 55 fBitmapDecoder = NULL; | 55 fBitmapDecoder = nullptr; |
| 56 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 56 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 57 fDecodedBitmapIndex = -1; | 57 fDecodedBitmapIndex = -1; |
| 58 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 58 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 59 } | 59 } |
| 60 | 60 |
| 61 SkReadBuffer::SkReadBuffer(SkStream* stream) { | 61 SkReadBuffer::SkReadBuffer(SkStream* stream) { |
| 62 fFlags = default_flags(); | 62 fFlags = default_flags(); |
| 63 fVersion = 0; | 63 fVersion = 0; |
| 64 const size_t length = stream->getLength(); | 64 const size_t length = stream->getLength(); |
| 65 fMemoryPtr = sk_malloc_throw(length); | 65 fMemoryPtr = sk_malloc_throw(length); |
| 66 stream->read(fMemoryPtr, length); | 66 stream->read(fMemoryPtr, length); |
| 67 fReader.setMemory(fMemoryPtr, length); | 67 fReader.setMemory(fMemoryPtr, length); |
| 68 | 68 |
| 69 fBitmapStorage = NULL; | 69 fBitmapStorage = nullptr; |
| 70 fTFArray = NULL; | 70 fTFArray = nullptr; |
| 71 fTFCount = 0; | 71 fTFCount = 0; |
| 72 | 72 |
| 73 fFactoryTDArray = NULL; | 73 fFactoryTDArray = nullptr; |
| 74 fFactoryArray = NULL; | 74 fFactoryArray = nullptr; |
| 75 fFactoryCount = 0; | 75 fFactoryCount = 0; |
| 76 fBitmapDecoder = NULL; | 76 fBitmapDecoder = nullptr; |
| 77 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 77 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 78 fDecodedBitmapIndex = -1; | 78 fDecodedBitmapIndex = -1; |
| 79 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 79 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 80 } | 80 } |
| 81 | 81 |
| 82 SkReadBuffer::~SkReadBuffer() { | 82 SkReadBuffer::~SkReadBuffer() { |
| 83 sk_free(fMemoryPtr); | 83 sk_free(fMemoryPtr); |
| 84 SkSafeUnref(fBitmapStorage); | 84 SkSafeUnref(fBitmapStorage); |
| 85 } | 85 } |
| 86 | 86 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 const size_t length = this->readUInt(); | 216 const size_t length = this->readUInt(); |
| 217 if (length > 0) { | 217 if (length > 0) { |
| 218 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 218 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 219 fDecodedBitmapIndex++; | 219 fDecodedBitmapIndex++; |
| 220 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 220 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
| 221 // A non-zero size means the SkBitmap was encoded. Read the data and
pixel | 221 // A non-zero size means the SkBitmap was encoded. Read the data and
pixel |
| 222 // offset. | 222 // offset. |
| 223 const void* data = this->skip(length); | 223 const void* data = this->skip(length); |
| 224 const int32_t xOffset = this->readInt(); | 224 const int32_t xOffset = this->readInt(); |
| 225 const int32_t yOffset = this->readInt(); | 225 const int32_t yOffset = this->readInt(); |
| 226 if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap))
{ | 226 if (fBitmapDecoder != nullptr && fBitmapDecoder(data, length, bitmap
)) { |
| 227 if (bitmap->width() == width && bitmap->height() == height) { | 227 if (bitmap->width() == width && bitmap->height() == height) { |
| 228 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 228 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
| 229 if (0 != xOffset || 0 != yOffset) { | 229 if (0 != xOffset || 0 != yOffset) { |
| 230 SkDebugf("SkReadBuffer::readBitmap: heights match," | 230 SkDebugf("SkReadBuffer::readBitmap: heights match," |
| 231 " but offset is not zero. \nInfo about the bitm
ap:" | 231 " but offset is not zero. \nInfo about the bitm
ap:" |
| 232 "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncode
d" | 232 "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncode
d" |
| 233 " data size: %d\n\tOffset: (%d, %d)\n", | 233 " data size: %d\n\tOffset: (%d, %d)\n", |
| 234 fDecodedBitmapIndex, width, height, length, xOf
fset, | 234 fDecodedBitmapIndex, width, height, length, xOf
fset, |
| 235 yOffset); | 235 yOffset); |
| 236 } | 236 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 return false; | 274 return false; |
| 275 } | 275 } |
| 276 | 276 |
| 277 SkTypeface* SkReadBuffer::readTypeface() { | 277 SkTypeface* SkReadBuffer::readTypeface() { |
| 278 | 278 |
| 279 uint32_t index = fReader.readU32(); | 279 uint32_t index = fReader.readU32(); |
| 280 if (0 == index || index > (unsigned)fTFCount) { | 280 if (0 == index || index > (unsigned)fTFCount) { |
| 281 if (index) { | 281 if (index) { |
| 282 SkDebugf("====== typeface index %d\n", index); | 282 SkDebugf("====== typeface index %d\n", index); |
| 283 } | 283 } |
| 284 return NULL; | 284 return nullptr; |
| 285 } else { | 285 } else { |
| 286 SkASSERT(fTFArray); | 286 SkASSERT(fTFArray); |
| 287 return fTFArray[index - 1]; | 287 return fTFArray[index - 1]; |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 | 290 |
| 291 SkFlattenable* SkReadBuffer::readFlattenable(SkFlattenable::Type ft) { | 291 SkFlattenable* SkReadBuffer::readFlattenable(SkFlattenable::Type ft) { |
| 292 // | 292 // |
| 293 // TODO: confirm that ft matches the factory we decide to use | 293 // TODO: confirm that ft matches the factory we decide to use |
| 294 // | 294 // |
| 295 | 295 |
| 296 SkFlattenable::Factory factory = NULL; | 296 SkFlattenable::Factory factory = nullptr; |
| 297 | 297 |
| 298 if (fFactoryCount > 0) { | 298 if (fFactoryCount > 0) { |
| 299 int32_t index = fReader.readU32(); | 299 int32_t index = fReader.readU32(); |
| 300 if (0 == index) { | 300 if (0 == index) { |
| 301 return NULL; // writer failed to give us the flattenable | 301 return nullptr; // writer failed to give us the flattenable |
| 302 } | 302 } |
| 303 index -= 1; // we stored the index-base-1 | 303 index -= 1; // we stored the index-base-1 |
| 304 SkASSERT(index < fFactoryCount); | 304 SkASSERT(index < fFactoryCount); |
| 305 factory = fFactoryArray[index]; | 305 factory = fFactoryArray[index]; |
| 306 } else if (fFactoryTDArray) { | 306 } else if (fFactoryTDArray) { |
| 307 int32_t index = fReader.readU32(); | 307 int32_t index = fReader.readU32(); |
| 308 if (0 == index) { | 308 if (0 == index) { |
| 309 return NULL; // writer failed to give us the flattenable | 309 return nullptr; // writer failed to give us the flattenable |
| 310 } | 310 } |
| 311 index -= 1; // we stored the index-base-1 | 311 index -= 1; // we stored the index-base-1 |
| 312 factory = (*fFactoryTDArray)[index]; | 312 factory = (*fFactoryTDArray)[index]; |
| 313 } else { | 313 } else { |
| 314 factory = (SkFlattenable::Factory)readFunctionPtr(); | 314 factory = (SkFlattenable::Factory)readFunctionPtr(); |
| 315 if (NULL == factory) { | 315 if (nullptr == factory) { |
| 316 return NULL; // writer failed to give us the flattenable | 316 return nullptr; // writer failed to give us the flattenable |
| 317 } | 317 } |
| 318 } | 318 } |
| 319 | 319 |
| 320 // if we get here, factory may still be null, but if that is the case, the | 320 // if we get here, factory may still be null, but if that is the case, the |
| 321 // failure was ours, not the writer. | 321 // failure was ours, not the writer. |
| 322 SkFlattenable* obj = NULL; | 322 SkFlattenable* obj = nullptr; |
| 323 uint32_t sizeRecorded = fReader.readU32(); | 323 uint32_t sizeRecorded = fReader.readU32(); |
| 324 if (factory) { | 324 if (factory) { |
| 325 size_t offset = fReader.offset(); | 325 size_t offset = fReader.offset(); |
| 326 obj = (*factory)(*this); | 326 obj = (*factory)(*this); |
| 327 // check that we read the amount we expected | 327 // check that we read the amount we expected |
| 328 size_t sizeRead = fReader.offset() - offset; | 328 size_t sizeRead = fReader.offset() - offset; |
| 329 if (sizeRecorded != sizeRead) { | 329 if (sizeRecorded != sizeRead) { |
| 330 // we could try to fix up the offset... | 330 // we could try to fix up the offset... |
| 331 sk_throw(); | 331 sk_throw(); |
| 332 } | 332 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 344 void SkReadBuffer::skipFlattenable() { | 344 void SkReadBuffer::skipFlattenable() { |
| 345 if (fFactoryCount > 0) { | 345 if (fFactoryCount > 0) { |
| 346 if (0 == fReader.readU32()) { | 346 if (0 == fReader.readU32()) { |
| 347 return; | 347 return; |
| 348 } | 348 } |
| 349 } else if (fFactoryTDArray) { | 349 } else if (fFactoryTDArray) { |
| 350 if (0 == fReader.readU32()) { | 350 if (0 == fReader.readU32()) { |
| 351 return; | 351 return; |
| 352 } | 352 } |
| 353 } else { | 353 } else { |
| 354 if (NULL == this->readFunctionPtr()) { | 354 if (nullptr == this->readFunctionPtr()) { |
| 355 return; | 355 return; |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 uint32_t sizeRecorded = fReader.readU32(); | 358 uint32_t sizeRecorded = fReader.readU32(); |
| 359 fReader.skip(sizeRecorded); | 359 fReader.skip(sizeRecorded); |
| 360 } | 360 } |
| OLD | NEW |