Chromium Code Reviews| Index: include/core/SkFlattenable.h |
| diff --git a/include/core/SkFlattenable.h b/include/core/SkFlattenable.h |
| index 6cc76db46ed872379ef4ae07e8ec1819af29111c..5a6e2ae889ef6f19234a886766ab57bea4eaaaa3 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, |
|
reed1
2013/10/21 20:54:48
If these are going to be inside an SkClass of some
mtklein
2013/10/21 21:12:33
Ah, this one's on me. I think we want a slight st
|
| + 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; |