1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkMemberInfo.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,270 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#ifndef SkMemberInfo_DEFINED 1.14 +#define SkMemberInfo_DEFINED 1.15 + 1.16 +#if defined SK_BUILD_CONDENSED 1.17 + #define SK_USE_CONDENSED_INFO 0 1.18 +#endif 1.19 + 1.20 +#include "SkDisplayType.h" 1.21 +#include "SkScript.h" 1.22 +#include "SkString.h" 1.23 +#include "SkIntArray.h" 1.24 + 1.25 +class SkAnimateMaker; 1.26 +class SkDisplayable; 1.27 +class SkScriptEngine; 1.28 + 1.29 +// temporary hacks until name change is more complete 1.30 +#define SkFloat SkScalar 1.31 +#define SkInt SkS32 1.32 + 1.33 +struct SkMemberInfo { 1.34 + //!!! alternative: 1.35 + // if fCount == 0, record is member property 1.36 + // then fType can be type, so caller doesn't have to check 1.37 +#if SK_USE_CONDENSED_INFO == 0 1.38 + const char* fName; // may be NULL for anonymous functions 1.39 + size_t fOffset; // if negative, is index into member pointer table (for properties and functions) 1.40 + SkDisplayTypes fType; 1.41 + int fCount; // for properties, actual type (count is always assumed to be 1) 1.42 +#else 1.43 + unsigned char fName; 1.44 + signed char fOffset; 1.45 + unsigned char fType; 1.46 + signed char fCount; 1.47 +#endif 1.48 + SkDisplayTypes arrayType() const { 1.49 + SkASSERT(fType == SkType_Array); 1.50 + return (SkDisplayTypes) fCount; // hack, but worth it? 1.51 + } 1.52 + int functionIndex() const { 1.53 + SkASSERT(fType == SkType_MemberFunction); 1.54 + return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset; 1.55 + } 1.56 + bool getArrayValue(const SkDisplayable* displayable, int index, SkOperand* value) const; 1.57 + int getCount() const { 1.58 + return fType == SkType_MemberProperty || fType == SkType_Array || 1.59 + fType == SkType_MemberFunction ? 1 : fCount; 1.60 + } 1.61 + const SkMemberInfo* getInherited() const; 1.62 + size_t getSize(const SkDisplayable* ) const; 1.63 + void getString(const SkDisplayable* , SkString** string) const; 1.64 + SkDisplayTypes getType() const { 1.65 + return fType == SkType_MemberProperty || fType == SkType_Array || 1.66 + fType == SkType_MemberFunction ? (SkDisplayTypes) fCount : (SkDisplayTypes) fType; 1.67 + } 1.68 + void getValue(const SkDisplayable* , SkOperand values[], int count) const; 1.69 + bool isEnum() const; 1.70 + const char* mapEnums(const char* match, int* value) const; 1.71 + void* memberData(const SkDisplayable* displayable) const { 1.72 + SkASSERT(fType != SkType_MemberProperty && fType != SkType_MemberFunction); 1.73 + return (void*) ((const char*) displayable + fOffset); 1.74 + } 1.75 + int propertyIndex() const { 1.76 + SkASSERT(fType == SkType_MemberProperty); 1.77 + return (signed) fOffset > 0 ? -1 + (int) fOffset : -1 - (int) fOffset; 1.78 + } 1.79 + SkDisplayTypes propertyType() const { 1.80 + SkASSERT(fType == SkType_MemberProperty || fType == SkType_Array); 1.81 + return (SkDisplayTypes) fCount; // hack, but worth it? 1.82 + } 1.83 + void setMemberData(SkDisplayable* displayable, const void* child, size_t size) const { 1.84 + SkASSERT(fType != SkType_MemberProperty && fType != SkType_MemberFunction); 1.85 + memcpy((char*) displayable + fOffset, child, size); 1.86 + } 1.87 + void setString(SkDisplayable* , SkString* ) const; 1.88 + void setValue(SkDisplayable* , const SkOperand values[], int count) const; 1.89 + bool setValue(SkAnimateMaker& , SkTDOperandArray* storage, 1.90 + int storageOffset, int maxStorage, SkDisplayable* , 1.91 + SkDisplayTypes outType, const char value[], size_t len) const; 1.92 + bool setValue(SkAnimateMaker& , SkTDOperandArray* storage, 1.93 + int storageOffset, int maxStorage, SkDisplayable* , 1.94 + SkDisplayTypes outType, SkString& str) const; 1.95 +// void setValue(SkDisplayable* , const char value[], const char name[]) const; 1.96 + bool writeValue(SkDisplayable* displayable, SkTDOperandArray* arrayStorage, 1.97 + int storageOffset, int maxStorage, void* untypedStorage, SkDisplayTypes outType, 1.98 + SkScriptValue& scriptValue) const; 1.99 +#if SK_USE_CONDENSED_INFO == 0 1.100 + static const SkMemberInfo* Find(const SkMemberInfo [], int count, int* index); 1.101 + static const SkMemberInfo* Find(const SkMemberInfo [], int count, const char** name); 1.102 +#else 1.103 + static const SkMemberInfo* Find(SkDisplayTypes type, int* index); 1.104 + static const SkMemberInfo* Find(SkDisplayTypes type, const char** name); 1.105 +#endif 1.106 + static size_t GetSize(SkDisplayTypes type); // size of simple types only 1.107 +// static bool SetValue(void* value, const char* name, SkDisplayTypes , int count); 1.108 +}; 1.109 + 1.110 +#define SK_MEMBER(_member, _type) \ 1.111 + { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_##_type, \ 1.112 + sizeof(((BASE_CLASS*) 1)->_member) / sizeof(SkScalar) } 1.113 + 1.114 +#define SK_MEMBER_ALIAS(_member, _alias, _type) \ 1.115 + { #_member, SK_OFFSETOF(BASE_CLASS, _alias), SkType_##_type, \ 1.116 + sizeof(((BASE_CLASS*) 1)->_alias) / sizeof(SkScalar) } 1.117 + 1.118 +#define SK_MEMBER_ARRAY(_member, _type) \ 1.119 + { #_member, SK_OFFSETOF(BASE_CLASS, _member), SkType_Array, \ 1.120 + (int) SkType_##_type } 1.121 + 1.122 +#define SK_MEMBER_INHERITED \ 1.123 + { (const char*) INHERITED::fInfo, 0, SkType_BaseClassInfo, INHERITED::fInfoCount } 1.124 + 1.125 +// #define SK_MEMBER_KEY_TYPE(_member, _type) 1.126 +// {#_member, (size_t) -1, SkType_##_type, 0} 1.127 + 1.128 +#define SK_FUNCTION(_member) \ 1.129 + k_##_member##Function 1.130 + 1.131 +#define SK_PROPERTY(_member) \ 1.132 + k_##_member##Property 1.133 + 1.134 +#define SK_MEMBER_DYNAMIC_FUNCTION(_member, _type) \ 1.135 + {#_member, (size_t) (+1 + SK_FUNCTION(_member)), SkType_MemberFunction, \ 1.136 + (int) SkType_##_type } 1.137 + 1.138 +#define SK_MEMBER_DYNAMIC_PROPERTY(_member, _type) \ 1.139 + {#_member, (size_t) (1 + SK_PROPERTY(_member)), SkType_MemberProperty, \ 1.140 + (int) SkType_##_type } 1.141 + 1.142 +#define SK_MEMBER_FUNCTION(_member, _type) \ 1.143 + {#_member, (size_t) (-1 - SK_FUNCTION(_member)), SkType_MemberFunction, \ 1.144 + (int) SkType_##_type } 1.145 + 1.146 +#define SK_MEMBER_PROPERTY(_member, _type) \ 1.147 + {#_member, (size_t) (-1 - SK_PROPERTY(_member)), SkType_MemberProperty, \ 1.148 + (int) SkType_##_type } 1.149 + 1.150 +#if SK_USE_CONDENSED_INFO == 0 1.151 + 1.152 +#define DECLARE_PRIVATE_MEMBER_INFO(_type) \ 1.153 +public: \ 1.154 + static const SkMemberInfo fInfo[]; \ 1.155 + static const int fInfoCount; \ 1.156 + virtual const SkMemberInfo* getMember(int index); \ 1.157 + virtual const SkMemberInfo* getMember(const char name[]); \ 1.158 + typedef Sk##_type BASE_CLASS 1.159 + 1.160 +#define DECLARE_MEMBER_INFO(_type) \ 1.161 +public: \ 1.162 + static const SkMemberInfo fInfo[]; \ 1.163 + static const int fInfoCount; \ 1.164 + virtual const SkMemberInfo* getMember(int index); \ 1.165 + virtual const SkMemberInfo* getMember(const char name[]); \ 1.166 + virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 1.167 + typedef Sk##_type BASE_CLASS 1.168 + 1.169 +#define DECLARE_DRAW_MEMBER_INFO(_type) \ 1.170 +public: \ 1.171 + static const SkMemberInfo fInfo[]; \ 1.172 + static const int fInfoCount; \ 1.173 + virtual const SkMemberInfo* getMember(int index); \ 1.174 + virtual const SkMemberInfo* getMember(const char name[]); \ 1.175 + virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 1.176 + typedef SkDraw##_type BASE_CLASS 1.177 + 1.178 +#define DECLARE_DISPLAY_MEMBER_INFO(_type) \ 1.179 +public: \ 1.180 + static const SkMemberInfo fInfo[]; \ 1.181 + static const int fInfoCount; \ 1.182 + virtual const SkMemberInfo* getMember(int index); \ 1.183 + virtual const SkMemberInfo* getMember(const char name[]); \ 1.184 + virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 1.185 + typedef SkDisplay##_type BASE_CLASS 1.186 + 1.187 +#define DECLARE_EMPTY_MEMBER_INFO(_type) \ 1.188 +public: \ 1.189 + virtual SkDisplayTypes getType() const { return SkType_##_type; } 1.190 + 1.191 +#define DECLARE_EXTRAS_MEMBER_INFO(_type) \ 1.192 +public: \ 1.193 + static const SkMemberInfo fInfo[]; \ 1.194 + static const int fInfoCount; \ 1.195 + virtual const SkMemberInfo* getMember(int index); \ 1.196 + virtual const SkMemberInfo* getMember(const char name[]); \ 1.197 + SkDisplayTypes fType; \ 1.198 + virtual SkDisplayTypes getType() const { return fType; } \ 1.199 + typedef _type BASE_CLASS 1.200 + 1.201 +#define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \ 1.202 +public: \ 1.203 + static const SkMemberInfo fInfo[]; \ 1.204 + static const int fInfoCount; \ 1.205 + typedef Sk##_type BASE_CLASS 1.206 + 1.207 +#define DEFINE_GET_MEMBER(_class) \ 1.208 + const SkMemberInfo* _class::getMember(int index) { \ 1.209 + const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &index); \ 1.210 + return result; \ 1.211 + } \ 1.212 + const SkMemberInfo* _class::getMember(const char name[]) { \ 1.213 + const SkMemberInfo* result = SkMemberInfo::Find(fInfo, SK_ARRAY_COUNT(fInfo), &name); \ 1.214 + return result; \ 1.215 + } \ 1.216 + const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo) 1.217 + 1.218 +#define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) \ 1.219 + const int _class::fInfoCount = SK_ARRAY_COUNT(fInfo) 1.220 + 1.221 +#else 1.222 + 1.223 +#define DECLARE_PRIVATE_MEMBER_INFO(_type) \ 1.224 +public: \ 1.225 + typedef Sk##_type BASE_CLASS 1.226 + 1.227 +#define DECLARE_MEMBER_INFO(_type) \ 1.228 +public: \ 1.229 + virtual const SkMemberInfo* getMember(int index) { \ 1.230 + return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 1.231 + virtual const SkMemberInfo* getMember(const char name[]) { \ 1.232 + return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ 1.233 + virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 1.234 + typedef Sk##_type BASE_CLASS 1.235 + 1.236 +#define DECLARE_DRAW_MEMBER_INFO(_type) \ 1.237 +public: \ 1.238 + virtual const SkMemberInfo* getMember(int index) { \ 1.239 + return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 1.240 + virtual const SkMemberInfo* getMember(const char name[]) { \ 1.241 + return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ 1.242 + virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 1.243 + typedef SkDraw##_type BASE_CLASS 1.244 + 1.245 +#define DECLARE_DISPLAY_MEMBER_INFO(_type) \ 1.246 +public: \ 1.247 + virtual const SkMemberInfo* getMember(int index) { \ 1.248 + return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 1.249 + virtual const SkMemberInfo* getMember(const char name[]) { \ 1.250 + return SkDisplayType::GetMember(NULL, SkType_##_type, &name); } \ 1.251 + virtual SkDisplayTypes getType() const { return SkType_##_type; } \ 1.252 + typedef SkDisplay##_type BASE_CLASS 1.253 + 1.254 +#define DECLARE_EXTRAS_MEMBER_INFO(_type) \ 1.255 +public: \ 1.256 + virtual const SkMemberInfo* getMember(int index) { \ 1.257 + return SkDisplayType::GetMember(NULL, SkType_##_type, &index); } \ 1.258 + virtual const SkMemberInfo* getMember(const char name[]) { \ 1.259 + return SkDisplayType::GetMember(NULL, fType, &name); } \ 1.260 + SkDisplayTypes fType; \ 1.261 + virtual SkDisplayTypes getType() const { return fType; } \ 1.262 + typedef _type BASE_CLASS 1.263 + 1.264 +#define DECLARE_NO_VIRTUALS_MEMBER_INFO(_type) \ 1.265 +public: \ 1.266 + typedef Sk##_type BASE_CLASS 1.267 + 1.268 +#define DEFINE_GET_MEMBER(_class) 1.269 +#define DEFINE_NO_VIRTUALS_GET_MEMBER(_class) 1.270 + 1.271 +#endif 1.272 + 1.273 +#endif // SkMemberInfo_DEFINED