Index: include/core/SkFlattenableBuffers.h |
diff --git a/include/core/SkFlattenableBuffers.h b/include/core/SkFlattenableBuffers.h |
index d71f7c025b6fbafc6631652440a67e3ef3247ee6..6e44550be561c6f267ade5f6655557a03d2edb3f 100644 |
--- a/include/core/SkFlattenableBuffers.h |
+++ b/include/core/SkFlattenableBuffers.h |
@@ -24,7 +24,6 @@ class SkOrderedWriteBuffer; |
class SkPath; |
class SkPixelRef; |
struct SkRect; |
-class SkRefCnt; |
class SkRegion; |
class SkStream; |
class SkString; |
@@ -32,19 +31,6 @@ class SkTypeface; |
class SkUnitMapper; |
class SkWStream; |
-enum SkEffectType { |
- kColorFilter_SkEffectType, |
- kDrawLooper_SkEffectType, |
- kImageFilter_SkEffectType, |
- kMaskFilter_SkEffectType, |
- kPathEffect_SkEffectType, |
- kPixelRef_SkEffectType, |
- kRasterizer_SkEffectType, |
- kShader_SkEffectType, |
- kUnitMapper_SkEffectType, |
- kXfermode_SkEffectType, |
-}; |
- |
class SkFlattenableReadBuffer { |
public: |
SkFlattenableReadBuffer(); |
@@ -57,14 +43,20 @@ public: |
kCrossProcess_Flag = 1 << 0, |
kScalarIsFloat_Flag = 1 << 1, |
kPtrIs64Bit_Flag = 1 << 2, |
+ /** The kValidation_Flag is used to force stream validations (by making |
+ * sure that no operation reads past the end of the stream, for example) |
+ * and error handling if any reading operation yields an invalid value. |
+ */ |
+ kValidation_Flag = 1 << 3, |
}; |
void setFlags(uint32_t flags) { fFlags = flags; } |
uint32_t getFlags() const { return fFlags; } |
- bool isCrossProcess() const { return SkToBool(fFlags & kCrossProcess_Flag); } |
+ bool isCrossProcess() const { return SkToBool(fFlags & (kCrossProcess_Flag | kValidation_Flag)); } |
bool isScalarFloat() const { return SkToBool(fFlags & kScalarIsFloat_Flag); } |
bool isPtr64Bit() const { return SkToBool(fFlags & kPtrIs64Bit_Flag); } |
+ bool isValidating() const { return SkToBool(fFlags & kValidation_Flag); } |
// primitives |
virtual bool readBool() = 0; |
@@ -79,38 +71,24 @@ public: |
virtual void readString(SkString* string) = 0; |
virtual void* readEncodedString(size_t* length, SkPaint::TextEncoding encoding) = 0; |
- virtual SkFlattenable* readFlattenable(SkEffectType) = 0; |
- |
- SkColorFilter* readColorFilter() { |
- return (SkColorFilter*)this->readFlattenable(kColorFilter_SkEffectType); |
- } |
- SkDrawLooper* readDrawLooper() { |
- return (SkDrawLooper*)this->readFlattenable(kDrawLooper_SkEffectType); |
- } |
- SkImageFilter* readImageFilter() { |
- return (SkImageFilter*)this->readFlattenable(kImageFilter_SkEffectType); |
- } |
- SkMaskFilter* readMaskFilter() { |
- return (SkMaskFilter*)this->readFlattenable(kMaskFilter_SkEffectType); |
- } |
- SkPathEffect* readPathEffect() { |
- return (SkPathEffect*)this->readFlattenable(kPathEffect_SkEffectType); |
- } |
- SkPixelRef* readPixelRef() { |
- return (SkPixelRef*)this->readFlattenable(kPixelRef_SkEffectType); |
- } |
- SkRasterizer* readRasterizer() { |
- return (SkRasterizer*)this->readFlattenable(kRasterizer_SkEffectType); |
- } |
- SkShader* readShader() { |
- return (SkShader*)this->readFlattenable(kShader_SkEffectType); |
- } |
- SkUnitMapper* readUnitMapper() { |
- return (SkUnitMapper*)this->readFlattenable(kUnitMapper_SkEffectType); |
- } |
- SkXfermode* readXfermode() { |
- return (SkXfermode*)this->readFlattenable(kXfermode_SkEffectType); |
- } |
+ /** |
+ @param type This parameter is only used when using SkValidatingReadBuffer. It will verify |
+ that the object about to be deserialized is of the given type or early return |
+ NULL otherwise. The type provided here is the type of the base class of the |
+ object to deserialize. |
+ */ |
+ virtual SkFlattenable* readFlattenable(SkFlattenable::Type type) = 0; |
+ |
+ SkColorFilter* readColorFilter(); |
+ SkDrawLooper* readDrawLooper(); |
+ SkImageFilter* readImageFilter(); |
+ SkMaskFilter* readMaskFilter(); |
+ SkPathEffect* readPathEffect(); |
+ SkPixelRef* readPixelRef(); |
+ SkRasterizer* readRasterizer(); |
+ SkShader* readShader(); |
+ SkUnitMapper* readUnitMapper(); |
+ SkXfermode* readXfermode(); |
// common data structures |
virtual void readPoint(SkPoint* point) = 0; |
@@ -153,7 +131,10 @@ public: |
return SkData::NewFromMalloc(buffer, len); |
} |
+ virtual void validate(bool isValid) {} |
+ |
private: |
+ template <typename T> T* readFlattenableT(); |
uint32_t fFlags; |
}; |
@@ -205,13 +186,22 @@ public: |
enum Flags { |
kCrossProcess_Flag = 0x01, |
+ /** The kValidation_Flag is used here to make sure the write operation |
+ * is symmetric with the read operation using the equivalent flag |
+ * SkFlattenableReadBuffer::kValidation_Flag. |
+ */ |
+ kValidation_Flag = 0x02, |
}; |
uint32_t getFlags() const { return fFlags; } |
void setFlags(uint32_t flags) { fFlags = flags; } |
bool isCrossProcess() const { |
- return SkToBool(fFlags & kCrossProcess_Flag); |
+ return SkToBool(fFlags & (kCrossProcess_Flag | kValidation_Flag)); |
+ } |
+ |
+ bool isValidating() const { |
+ return SkToBool(fFlags & kValidation_Flag); |
} |
bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; } |