aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/core
diff options
context:
space:
mode:
Diffstat (limited to 'include/core')
-rw-r--r--include/core/SkColorFilter.h2
-rw-r--r--include/core/SkDrawLooper.h1
-rw-r--r--include/core/SkFlattenable.h38
-rw-r--r--include/core/SkFlattenableBuffers.h86
-rw-r--r--include/core/SkImageFilter.h2
-rw-r--r--include/core/SkMaskFilter.h1
-rw-r--r--include/core/SkPathEffect.h2
-rw-r--r--include/core/SkPixelRef.h2
-rw-r--r--include/core/SkRasterizer.h2
-rw-r--r--include/core/SkShader.h2
-rw-r--r--include/core/SkUnitMapper.h2
-rw-r--r--include/core/SkXfermode.h2
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) {}