|
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 |