1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SkFlattenable_DEFINED 11 #define SkFlattenable_DEFINED 12 13 #include "SkRefCnt.h" 14 15 class SkFlattenableReadBuffer; 16 class SkFlattenableWriteBuffer; 17 18 #define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \ 19 SkFlattenable::Registrar(#flattenable, flattenable::CreateProc); 20 21 #define SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() static void InitializeFlattenables(); 22 23 #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(flattenable) \ 24 void flattenable::InitializeFlattenables() { 25 26 #define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END \ 27 } 28 29 #define SK_DECLARE_UNFLATTENABLE_OBJECT() \ 30 virtual Factory getFactory() SK_OVERRIDE { return NULL; }; \ 31 32 #define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(flattenable) \ 33 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; } \ 34 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { \ 35 return SkNEW_ARGS(flattenable, (buffer)); \ 36 } 37 38 /** \class SkFlattenable 39 40 SkFlattenable is the base class for objects that need to be flattened 41 into a data stream for either transport or as part of the key to the 42 font cache. 43 */ 44 class SK_API SkFlattenable : public SkRefCnt { 45 public: 46 SK_DECLARE_INST_COUNT(SkFlattenable) 47 48 typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&); 49 50 SkFlattenable() {} 51 52 /** Implement this to return a factory function pointer that can be called 53 to recreate your class given a buffer (previously written to by your 54 override of flatten(). 55 */ 56 virtual Factory getFactory() = 0; 57 58 static Factory NameToFactory(const char name[]); 59 static const char* FactoryToName(Factory); 60 static void Register(const char name[], Factory); 61 62 class Registrar { 63 public: 64 Registrar(const char name[], Factory factory) { 65 SkFlattenable::Register(name, factory); 66 } 67 }; 68 69 protected: 70 SkFlattenable(SkFlattenableReadBuffer&) {} 71 /** Override this to write data specific to your subclass into the buffer, 72 being sure to call your super-class' version first. This data will later 73 be passed to your Factory function, returned by getFactory(). 74 */ 75 virtual void flatten(SkFlattenableWriteBuffer&) const; 76 77 private: 78 static void InitializeFlattenables(); 79 80 friend class SkGraphics; 81 friend class SkFlattenableWriteBuffer; 82 83 typedef SkRefCnt INHERITED; 84 }; 85 86 #endif 87