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