Chromium Code Reviews| Index: include/core/SkReader32.h |
| diff --git a/include/core/SkReader32.h b/include/core/SkReader32.h |
| index 7a8d22a80c166c82539f05fe9d83186269416762..40ae12ce23638c05755f5742e0ecaf63f8b22401 100644 |
| --- a/include/core/SkReader32.h |
| +++ b/include/core/SkReader32.h |
| @@ -106,27 +106,20 @@ public: |
| int32_t readS32() { return this->readInt(); } |
| uint32_t readU32() { return this->readInt(); } |
| - void readPath(SkPath* path) { |
| - size_t size = path->readFromMemory(this->peek()); |
| - SkASSERT(SkAlign4(size) == size); |
| - (void)this->skip(size); |
| + bool readPath(SkPath* path) { |
| + return readObjectFromMemory(path); |
| } |
| - void readMatrix(SkMatrix* matrix) { |
| - size_t size = matrix->readFromMemory(this->peek()); |
| - SkASSERT(SkAlign4(size) == size); |
| - (void)this->skip(size); |
| + bool readMatrix(SkMatrix* matrix) { |
| + return readObjectFromMemory(matrix); |
| } |
| - SkRRect* readRRect(SkRRect* rrect) { |
| - rrect->readFromMemory(this->skip(SkRRect::kSizeInMemory)); |
| - return rrect; |
| + bool readRRect(SkRRect* rrect) { |
| + return readObjectFromMemory(rrect); |
| } |
| - void readRegion(SkRegion* rgn) { |
| - size_t size = rgn->readFromMemory(this->peek()); |
| - SkASSERT(SkAlign4(size) == size); |
| - (void)this->skip(size); |
| + bool readRegion(SkRegion* rgn) { |
| + return readObjectFromMemory(rgn); |
| } |
| /** |
| @@ -143,6 +136,15 @@ public: |
| size_t readIntoString(SkString* copy); |
| private: |
| + template <typename T> bool readObjectFromMemory(T* obj) { |
| + size_t size = obj->readFromMemory(this->peek(), this->available()); |
| + // If readFromMemory() fails (which means that available() was too small), it returns 0 |
| + bool success = (size > 0) && (size <= this->available()) && (SkAlign4(size) == size); |
|
sugoi1
2013/10/31 15:47:48
I added a check here that size <= this->available(
|
| + // In case of failure, we want to skip to the end |
| + (void)this->skip(success ? size : this->available()); |
| + return success; |
| + } |
| + |
| // these are always 4-byte aligned |
| const char* fCurr; // current position within buffer |
| const char* fStop; // end of buffer |