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