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 SkMemberInfo_DEFINED 11 #define SkMemberInfo_DEFINED 12 13 #if defined SK_BUILD_CONDENSED 14 #define SK_USE_CONDENSED_INFO 0 15 #endif 16 17 #include "SkDisplayType.h" 18 #include "SkScript.h" 19 #include "SkString.h" 20 #include "SkIntArray.h" 21 22 class SkAnimateMaker; 23 class SkDisplayable; 24 class SkScriptEngine; 25 26 // temporary hacks until name change is more complete 27 #define SkFloat SkScalar 28 #define SkInt SkS32 29 30 struct SkMemberInfo { 31 //!!! alternative: 32 // if fCount == 0, record is member property 33 // then fType can be type, so caller doesn't have to check 34 #if SK_USE_CONDENSED_INFO == 0 35 const char* fName; // may be NULL for anonymous functions 36 size_t fOffset; // if negative, is index into member pointer table (for properties and functions) 37 SkDisplayTypes fType; 38 int fCount; // for properties, actual type (count is always assumed to be 1) 39 #else 40 unsigned char fName; 41 signed char fOffset; 42 unsigned char fType; 43 signed char fCount; 44 #endif 45 SkDisplayTypes arrayType() const { 46 SkASSERT(fType == SkType_Array); 47 return (SkDisplayTypes) fCount; // hack, but worth it? 48 } 49 int functionIndex() const { 50 SkASSERT(fType == SkType_MemberFunction); 51 return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset; 52 } 53 bool getArrayValue(const SkDisplayable* displayable, int index, SkOperand* value) const; 54 int getCount() const { 55 return fType == SkType_MemberProperty || fType == SkType_Array || 56 fType == SkType_MemberFunction ? 1 : fCount; 57 } 58 const SkMemberInfo* getInherited() const; 59 size_t getSize(const SkDisplayable* ) const; 60 void getString(const SkDisplayable* , SkString** string) const; 61 SkDisplayTypes getType() const { 62 return fType == SkType_MemberProperty || fType == SkType_Array || 63 fType == SkType_MemberFunction ? (SkDisplayTypes) fCount : (SkDisplayTypes) fType; 64 } 65 void getValue(const SkDisplayable* , SkOperand values[], int count) const; 66 bool isEnum() const; 67 const char* mapEnums(const char* match, int* value) const; 68 void* memberData(const SkDisplayable* displayable) const { 69 SkASSERT(fType != SkType_MemberProperty && fType != SkType_MemberFunction); 70 return (void*) ((const char*) displayable + fOffset); 71 } 72 int propertyIndex() const { 73 SkASSERT(fType == SkType_MemberProperty); 74 return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset; 75 } 76 SkDisplayTypes propertyType() const { 77 SkASSERT(fType == SkType_MemberProperty || fType == SkType_Array); 78 return (SkDisplayTypes) fCount; // hack, but worth it? 79 } 80 void setMemberData(SkDisplayable* displayable, const void* child, size_t size) const { 81 SkASSERT(fType != SkType_MemberProperty && fType != SkType_MemberFunction); 82 memcpy((char*) displayable + fOffset, child, size); 83 } 84 void setString(SkDisplayable* , SkString* ) const; 85 void setValue(SkDisplayable* , const SkOperand values[], int count) const; 86 bool setValue(SkAnimateMaker& , SkTDOperandArray* storage, 87 int storageOffset, int maxStorage, SkDisplayable* , 88 SkDisplayTypes outType, const char value[], size_t len) const; 89 bool setValue(SkAnimateMaker& , SkTDOperandArray* storage, 90 int storageOffset, int maxStorage, SkDisplayable* , 91 SkDisplayTypes outType, SkString& str) const; 92 // void setValue(SkDisplayable* , const char value[], const char name[]) const; 93 bool writeValue(SkDisplayable* displayable, SkTDOperandArray* arrayStorage, 94 int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outType, 95 SkScriptValue& scriptValue) const; 96 #if SK_USE_CONDENSED_INFO == 0 97 static const SkMemberInfo* Find(const SkMemberInfo [], int count, int* index); 98 static const SkMemberInfo* Find(const SkMemberInfo [], int count, const char** name); 99 #else 100 static const SkMemberInfo* Find(SkDisplayTypes type, int* index); 101 static const SkMemberInfo* Find(SkDisplayTypes type, const char** name); 102 #endif 103 static size_t GetSize(SkDisplayTypes type); // size of simple types only 104 // static bool SetValue(void* value, const char* name, SkDisplayTypes , int count); 105 }; 106 107 #define SK_MEMBER(_member, _type) \ 108 { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_##_type, \ 109 sizeof(((BASE_CLASS*) 1)->_member) / sizeof(SkScalar) } 110 111 #define SK_MEMBER_ALIAS(_member, _alias, _type) \ 112 { #_member, SK_OFFSETOF(BASE_CLASS, _alias), SkType_##_type, \ 113 sizeof(((BASE_CLASS*) 1)->_alias) / sizeof(SkScalar) } 114 115 #define SK_MEMBER_ARRAY(_member, _type) \ 116 { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_Array, \ 117 (int) SkType_##_type } 118 119 #define SK_MEMBER_INHERITED \ 120 { (const char*) INHERITED::fInfo, 0, SkType_BaseClassInfo, INHERITED::fInfoCount } 121 122 // #define SK_MEMBER_KEY_TYPE(_member, _type) 123 // {#_member, (size_t) -1, SkType_##_type, 0} 124 125 #define SK_FUNCTION(_member) \ 126 k_##_member##Function 127 128 #define SK_PROPERTY(_member) \ 129 k_##_member##Property 130 131 #define SK_MEMBER_DYNAMIC_FUNCTION(_member, _type) \ 132 {#_member, (size_t) (+1 + SK_FUNCTION(_member)), SkType_MemberFunction, \ 133 (int) SkType_##_type } 134 135 #define SK_MEMBER_DYNAMIC_PROPERTY(_member, _type) \ 136 {#_member, (size_t) (1 + SK_PROPERTY(_member)), SkType_MemberProperty, \ 137 (int) SkType_##_type } 138 139 #define SK_MEMBER_FUNCTION(_member, _type) \ 140 {#_member, (size_t) (-1 - SK_FUNCTION(_member)), SkType_MemberFunction, \ 141 (int) SkType_##_type } 142 143 #define SK_MEMBER_PROPERTY(_member, _type) \ 144 {#_member, (size_t) (-1 - SK_PROPERTY(_member)), SkType_MemberProperty, \ 145 (int) SkType_##_type } 146 147 #if SK_USE_CONDENSED_INFO == 0 148 149 #define DECLARE_PRIVATE_MEMBER_INFO(_type) \ 150 public: \ 151 static const SkMemberInfo fInfo[]; \ 152 static const int fInfoCount; \ 153 virtual const SkMemberInfo* getMember(int index); \ 154 virtual const SkMemberInfo* getMember(const char name[]); \ 155 typedef Sk##_type BASE_CLASS 156 157 #define DECLARE_MEMBER_INFO(_type) \ 158 public: \ 159 static const SkMemberInfo fInfo[]; \ 160 static const int fInfoCount; \ 161 virtual const SkMemberInfo* getMember(int index); \ 162 virtual const SkMemberInfo* getMember(const char name[]); \ 163 virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 164 typedef Sk##_type BASE_CLASS 165 166 #define DECLARE_DRAW_MEMBER_INFO(_type) \ 167 public: \ 168 static const SkMemberInfo fInfo[]; \ 169 static const int fInfoCount; \ 170 virtual const SkMemberInfo* getMember(int index); \ 171 virtual const SkMemberInfo* getMember(const char name[]); \ 172 virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 173 typedef SkDraw##_type BASE_CLASS 174 175 #define DECLARE_DISPLAY_MEMBER_INFO(_type) \ 176 public: \ 177 static const SkMemberInfo fInfo[]; \ 178 static const int fInfoCount; \ 179 virtual const SkMemberInfo* getMember(int index); \ 180 virtual const SkMemberInfo* getMember(const char name[]); \ 181 virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 182 typedef SkDisplay##_type BASE_CLASS 183 184 #define DECLARE_EMPTY_MEMBER_INFO(_type) \ 185 public: \ 186 virtual SkDisplayTypes getType() const { return SkType_##_type; } 187 188 #define DECLARE_EXTRAS_MEMBER_INFO(_type) \ 189 public: \ 190 static const SkMemberInfo fInfo[]; \ 191 static const int fInfoCount; \ 192 virtual const SkMemberInfo* getMember(int index); \ 193 virtual const SkMemberInfo* getMember(const char name[]); \ 194 SkDisplayTypes fType; \ 195 virtual SkDisplayTypes getType() const { return fType; } \ 196 typedef _type BASE_CLASS 197 198 #define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \ 199 public: \ 200 static const SkMemberInfo fInfo[]; \ 201 static const int fInfoCount; \ 202 typedef Sk##_type BASE_CLASS 203 204 #define DEFINE_GET_MEMBER(_class) \ 205 const SkMemberInfo* _class::getMember(int index) { \ 206 const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &index); \ 207 return result; \ 208 } \ 209 const SkMemberInfo* _class::getMember(const char name[]) { \ 210 const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &name); \ 211 return result; \ 212 } \ 213 const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo) 214 215 #define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) \ 216 const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo) 217 218 #else 219 220 #define DECLARE_PRIVATE_MEMBER_INFO(_type) \ 221 public: \ 222 typedef Sk##_type BASE_CLASS 223 224 #define DECLARE_MEMBER_INFO(_type) \ 225 public: \ 226 virtual const SkMemberInfo* getMember(int index) { \ 227 return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 228 virtual const SkMemberInfo* getMember(const char name[]) { \ 229 return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ 230 virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 231 typedef Sk##_type BASE_CLASS 232 233 #define DECLARE_DRAW_MEMBER_INFO(_type) \ 234 public: \ 235 virtual const SkMemberInfo* getMember(int index) { \ 236 return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 237 virtual const SkMemberInfo* getMember(const char name[]) { \ 238 return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ 239 virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 240 typedef SkDraw##_type BASE_CLASS 241 242 #define DECLARE_DISPLAY_MEMBER_INFO(_type) \ 243 public: \ 244 virtual const SkMemberInfo* getMember(int index) { \ 245 return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 246 virtual const SkMemberInfo* getMember(const char name[]) { \ 247 return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ 248 virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 249 typedef SkDisplay##_type BASE_CLASS 250 251 #define DECLARE_EXTRAS_MEMBER_INFO(_type) \ 252 public: \ 253 virtual const SkMemberInfo* getMember(int index) { \ 254 return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 255 virtual const SkMemberInfo* getMember(const char name[]) { \ 256 return SkDisplayType::GetMember(NULL, fType, &name); } \ 257 SkDisplayTypes fType; \ 258 virtual SkDisplayTypes getType() const { return fType; } \ 259 typedef _type BASE_CLASS 260 261 #define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \ 262 public: \ 263 typedef Sk##_type BASE_CLASS 264 265 #define DEFINE_GET_MEMBER(_class) 266 #define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) 267 268 #endif 269 270 #endif // SkMemberInfo_DEFINED 271