diff options
Diffstat (limited to 'include/core')
-rw-r--r-- | include/core/SkColorFilter.h | 2 | ||||
-rw-r--r-- | include/core/SkDrawLooper.h | 1 | ||||
-rw-r--r-- | include/core/SkFlattenable.h | 38 | ||||
-rw-r--r-- | include/core/SkFlattenableBuffers.h | 86 | ||||
-rw-r--r-- | include/core/SkImageFilter.h | 2 | ||||
-rw-r--r-- | include/core/SkMaskFilter.h | 1 | ||||
-rw-r--r-- | include/core/SkPathEffect.h | 2 | ||||
-rw-r--r-- | include/core/SkPixelRef.h | 2 | ||||
-rw-r--r-- | include/core/SkRasterizer.h | 2 | ||||
-rw-r--r-- | include/core/SkShader.h | 2 | ||||
-rw-r--r-- | include/core/SkUnitMapper.h | 2 | ||||
-rw-r--r-- | include/core/SkXfermode.h | 2 |
12 files changed, 89 insertions, 53 deletions
diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h index 46ecedc6df..106e5bb86f 100644 --- a/include/core/SkColorFilter.h +++ b/include/core/SkColorFilter.h @@ -131,6 +131,8 @@ public: SkDEVCODE(virtual void toString(SkString* str) const = 0;) SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() + SK_DEFINE_FLATTENABLE_TYPE(SkColorFilter) + protected: SkColorFilter() {} SkColorFilter(SkFlattenableReadBuffer& rb) : INHERITED(rb) {} diff --git a/include/core/SkDrawLooper.h b/include/core/SkDrawLooper.h index 2faf28b399..d6028ff94c 100644 --- a/include/core/SkDrawLooper.h +++ b/include/core/SkDrawLooper.h @@ -64,6 +64,7 @@ public: const SkRect& src, SkRect* dst); SkDEVCODE(virtual void toString(SkString* str) const = 0;) + SK_DEFINE_FLATTENABLE_TYPE(SkDrawLooper) protected: SkDrawLooper() {} diff --git a/include/core/SkFlattenable.h b/include/core/SkFlattenable.h index 6cc76db46e..5a6e2ae889 100644 --- a/include/core/SkFlattenable.h +++ b/include/core/SkFlattenable.h @@ -16,7 +16,8 @@ class SkFlattenableReadBuffer; class SkFlattenableWriteBuffer; #define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \ - SkFlattenable::Registrar(#flattenable, flattenable::CreateProc); + SkFlattenable::Registrar(#flattenable, flattenable::CreateProc, \ + flattenable::GetFlattenableType()); #define SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() static void InitializeFlattenables(); @@ -35,6 +36,14 @@ class SkFlattenableWriteBuffer; return SkNEW_ARGS(flattenable, (buffer)); \ } +/** For SkFlattenable derived objects with a valid type + This macro should only be used in base class objects in core + */ +#define SK_DEFINE_FLATTENABLE_TYPE(flattenable) \ + static Type GetFlattenableType() { \ + return k##flattenable##_Type; \ + } + /** \class SkFlattenable SkFlattenable is the base class for objects that need to be flattened @@ -43,6 +52,19 @@ class SkFlattenableWriteBuffer; */ class SK_API SkFlattenable : public SkRefCnt { public: + enum Type { + kSkColorFilter_Type, + kSkDrawLooper_Type, + kSkImageFilter_Type, + kSkMaskFilter_Type, + kSkPathEffect_Type, + kSkPixelRef_Type, + kSkRasterizer_Type, + kSkShader_Type, + kSkUnitMapper_Type, + kSkXfermode_Type, + }; + SK_DECLARE_INST_COUNT(SkFlattenable) typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&); @@ -55,14 +77,20 @@ public: */ virtual Factory getFactory() const = 0; + /** Returns the name of the object's class + */ + const char* getTypeName() const { return FactoryToName(getFactory()); } + static Factory NameToFactory(const char name[]); static const char* FactoryToName(Factory); - static void Register(const char name[], Factory); + static bool NameToType(const char name[], Type* type); + + static void Register(const char name[], Factory, Type); class Registrar { public: - Registrar(const char name[], Factory factory) { - SkFlattenable::Register(name, factory); + Registrar(const char name[], Factory factory, Type type) { + SkFlattenable::Register(name, factory, type); } }; @@ -75,7 +103,7 @@ protected: virtual void flatten(SkFlattenableWriteBuffer&) const; private: - static void InitializeFlattenables(); + static void InitializeFlattenablesIfNeeded(); friend class SkGraphics; friend class SkFlattenableWriteBuffer; diff --git a/include/core/SkFlattenableBuffers.h b/include/core/SkFlattenableBuffers.h index d71f7c025b..6e44550be5 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; } diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index a0602e48f4..56ebc2b77b 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -143,6 +143,8 @@ public: */ bool cropRectIsSet() const { return fCropRect.flags() != 0x0; } + SK_DEFINE_FLATTENABLE_TYPE(SkImageFilter) + protected: SkImageFilter(int inputCount, SkImageFilter** inputs, const CropRect* cropRect = NULL); diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h index a2bc638039..93e2d4bc33 100644 --- a/include/core/SkMaskFilter.h +++ b/include/core/SkMaskFilter.h @@ -125,6 +125,7 @@ public: virtual void computeFastBounds(const SkRect& src, SkRect* dest) const; SkDEVCODE(virtual void toString(SkString* str) const = 0;) + SK_DEFINE_FLATTENABLE_TYPE(SkMaskFilter) protected: // empty for now, but lets get our subclass to remember to init us for the future diff --git a/include/core/SkPathEffect.h b/include/core/SkPathEffect.h index 3b4541de56..ed6d93b765 100644 --- a/include/core/SkPathEffect.h +++ b/include/core/SkPathEffect.h @@ -106,6 +106,8 @@ public: const SkStrokeRec&, const SkMatrix&, const SkRect* cullR) const; + SK_DEFINE_FLATTENABLE_TYPE(SkPathEffect) + protected: SkPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} diff --git a/include/core/SkPixelRef.h b/include/core/SkPixelRef.h index 64e08765be..958e82fee5 100644 --- a/include/core/SkPixelRef.h +++ b/include/core/SkPixelRef.h @@ -207,6 +207,8 @@ public: virtual void globalUnref(); #endif + SK_DEFINE_FLATTENABLE_TYPE(SkPixelRef) + protected: /** Called when the lockCount goes from 0 to 1. The caller will have already acquire a mutex for thread safety, so this method need not do that. diff --git a/include/core/SkRasterizer.h b/include/core/SkRasterizer.h index 3e662ab2c1..6e6224ef35 100644 --- a/include/core/SkRasterizer.h +++ b/include/core/SkRasterizer.h @@ -30,6 +30,8 @@ public: const SkIRect* clipBounds, SkMaskFilter* filter, SkMask* mask, SkMask::CreateMode mode) const; + SK_DEFINE_FLATTENABLE_TYPE(SkRasterizer) + protected: SkRasterizer(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} diff --git a/include/core/SkShader.h b/include/core/SkShader.h index 74f611d3e5..11956ce0d2 100644 --- a/include/core/SkShader.h +++ b/include/core/SkShader.h @@ -344,6 +344,8 @@ public: SkDEVCODE(virtual void toString(SkString* str) const;) + SK_DEFINE_FLATTENABLE_TYPE(SkShader) + protected: enum MatrixClass { kLinear_MatrixClass, // no perspective diff --git a/include/core/SkUnitMapper.h b/include/core/SkUnitMapper.h index 754be26841..57a8b8332e 100644 --- a/include/core/SkUnitMapper.h +++ b/include/core/SkUnitMapper.h @@ -25,6 +25,8 @@ public: */ virtual uint16_t mapUnit16(uint16_t x) = 0; + SK_DEFINE_FLATTENABLE_TYPE(SkUnitMapper) + protected: SkUnitMapper(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {} diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h index 0cc430e3e1..db9b0b05f2 100644 --- a/include/core/SkXfermode.h +++ b/include/core/SkXfermode.h @@ -220,6 +220,8 @@ public: SkDEVCODE(virtual void toString(SkString* str) const = 0;) SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() + SK_DEFINE_FLATTENABLE_TYPE(SkXfermode) + protected: SkXfermode(SkFlattenableReadBuffer& rb) : SkFlattenable(rb) {} |