OLD | NEW |
| (Empty) |
1 /* libs/graphics/animator/SkScript.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 SkScript_DEFINED | |
19 #define SkScript_DEFINED | |
20 | |
21 #include "SkOperand.h" | |
22 #include "SkIntArray.h" | |
23 #include "SkTDict.h" | |
24 #include "SkTDStack.h" | |
25 | |
26 class SkAnimateMaker; | |
27 | |
28 class SkScriptEngine { | |
29 public: | |
30 enum Error { | |
31 kNoError, | |
32 kArrayIndexOutOfBounds, | |
33 kCouldNotFindReferencedID, | |
34 kDotOperatorExpectsObject, | |
35 kErrorInArrrayIndex, | |
36 kErrorInFunctionParameters, | |
37 kExpectedArray, | |
38 kExpectedBooleanExpression, | |
39 kExpectedFieldName, | |
40 kExpectedHex, | |
41 kExpectedIntForConditionOperator, | |
42 kExpectedNumber, | |
43 kExpectedNumberForArrayIndex, | |
44 kExpectedOperator, | |
45 kExpectedToken, | |
46 kExpectedTokenBeforeDotOperator, | |
47 kExpectedValue, | |
48 kHandleMemberFailed, | |
49 kHandleMemberFunctionFailed, | |
50 kHandleUnboxFailed, | |
51 kIndexOutOfRange, | |
52 kMismatchedArrayBrace, | |
53 kMismatchedBrackets, | |
54 kNoFunctionHandlerFound, | |
55 kPrematureEnd, | |
56 kTooManyParameters, | |
57 kTypeConversionFailed, | |
58 kUnterminatedString | |
59 }; | |
60 | |
61 enum SkOpType { | |
62 kNoType, | |
63 kInt = 1, | |
64 kScalar = 2, | |
65 kString = 4, | |
66 kArray = 8, | |
67 kObject = 16 | |
68 // kStruct = 32 | |
69 }; | |
70 | |
71 typedef bool (*_boxCallBack)(void* userStorage, SkScriptValue* result); | |
72 typedef bool (*_functionCallBack)(const char* func, size_t len, SkTDArray<Sk
ScriptValue>& params, | |
73 void* userStorage, SkScriptValue* result); | |
74 typedef bool (*_memberCallBack)(const char* member, size_t len, void* object
, | |
75 void* userStorage, SkScriptValue* result); | |
76 typedef bool (*_memberFunctionCallBack)(const char* member, size_t len, void
* object, | |
77 SkTDArray<SkScriptValue>& params, void* userStorage, SkScriptValue* resu
lt); | |
78 // typedef bool (*_objectToStringCallBack)(void* object, void* userStorage, SkS
criptValue* result); | |
79 typedef bool (*_propertyCallBack)(const char* prop, size_t len, void* userSt
orage, SkScriptValue* result); | |
80 typedef bool (*_unboxCallBack)(void* userStorage, SkScriptValue* result); | |
81 SkScriptEngine(SkOpType returnType); | |
82 ~SkScriptEngine(); | |
83 void boxCallBack(_boxCallBack func, void* userStorage); | |
84 bool convertTo(SkDisplayTypes , SkScriptValue* ); | |
85 bool evaluateScript(const char** script, SkScriptValue* value); | |
86 void forget(SkTypedArray* array); | |
87 void functionCallBack(_functionCallBack func, void* userStorage); | |
88 Error getError() const { return fError; } | |
89 #ifdef SK_DEBUG | |
90 bool getErrorString(SkString* err) const; | |
91 #endif | |
92 void memberCallBack(_memberCallBack , void* userStorage); | |
93 void memberFunctionCallBack(_memberFunctionCallBack , void* userStorage); | |
94 // void objectToStringCallBack(_objectToStringCallBack , void* userStorage); | |
95 void propertyCallBack(_propertyCallBack prop, void* userStorage); | |
96 void track(SkTypedArray* array); | |
97 void track(SkString* string); | |
98 void unboxCallBack(_unboxCallBack func, void* userStorage); | |
99 static bool ConvertTo(SkScriptEngine* , SkDisplayTypes toType, SkScriptValue
* value); | |
100 static SkScalar IntToScalar(int32_t ); | |
101 static SkDisplayTypes ToDisplayType(SkOpType type); | |
102 static SkOpType ToOpType(SkDisplayTypes type); | |
103 static bool ValueToString(SkScriptValue value, SkString* string); | |
104 | |
105 enum CallBackType { | |
106 kBox, | |
107 kFunction, | |
108 kMember, | |
109 kMemberFunction, | |
110 // kObjectToString, | |
111 kProperty, | |
112 kUnbox | |
113 }; | |
114 | |
115 struct UserCallBack { | |
116 CallBackType fCallBackType; | |
117 void* fUserStorage; | |
118 union { | |
119 _boxCallBack fBoxCallBack; | |
120 _functionCallBack fFunctionCallBack; | |
121 _memberCallBack fMemberCallBack; | |
122 _memberFunctionCallBack fMemberFunctionCallBack; | |
123 // _objectToStringCallBack fObjectToStringCallBack; | |
124 _propertyCallBack fPropertyCallBack; | |
125 _unboxCallBack fUnboxCallBack; | |
126 }; | |
127 }; | |
128 | |
129 enum SkOp { | |
130 kUnassigned, | |
131 kAdd, | |
132 kAddInt = kAdd, | |
133 kAddScalar, | |
134 kAddString, // string concat | |
135 kArrayOp, | |
136 kBitAnd, | |
137 kBitNot, | |
138 kBitOr, | |
139 kDivide, | |
140 kDivideInt = kDivide, | |
141 kDivideScalar, | |
142 kElse, | |
143 kEqual, | |
144 kEqualInt = kEqual, | |
145 kEqualScalar, | |
146 kEqualString, | |
147 kFlipOps, | |
148 kGreaterEqual, | |
149 kGreaterEqualInt = kGreaterEqual, | |
150 kGreaterEqualScalar, | |
151 kGreaterEqualString, | |
152 kIf, | |
153 kLogicalAnd, | |
154 kLogicalNot, | |
155 kLogicalOr, | |
156 kMinus, | |
157 kMinusInt = kMinus, | |
158 kMinusScalar, | |
159 kModulo, | |
160 kModuloInt = kModulo, | |
161 kModuloScalar, | |
162 kMultiply, | |
163 kMultiplyInt = kMultiply, | |
164 kMultiplyScalar, | |
165 kParen, | |
166 kShiftLeft, | |
167 kShiftRight, // signed | |
168 kSubtract, | |
169 kSubtractInt = kSubtract, | |
170 kSubtractScalar, | |
171 kXor, | |
172 kArtificialOp = 0x40 | |
173 }; | |
174 | |
175 enum SkOpBias { | |
176 kNoBias, | |
177 kTowardsNumber = 0, | |
178 kTowardsString | |
179 }; | |
180 | |
181 protected: | |
182 | |
183 struct SkOperatorAttributes { | |
184 unsigned int fLeftType : 3; // SkOpType, but only lower values | |
185 unsigned int fRightType : 3; // SkOpType, but only lower values | |
186 SkOpBias fBias : 1; | |
187 }; | |
188 | |
189 struct SkSuppress { // !!! could be compressed to a long | |
190 SkOp fOperator; // operand which enabled suppression | |
191 int fOpStackDepth; // depth when suppression operator was found | |
192 SkBool8 fSuppress; // set if suppression happens now, as opposed to late
r | |
193 SkBool8 fElse; // set on the : half of ? : | |
194 }; | |
195 | |
196 static const SkOperatorAttributes gOpAttributes[]; | |
197 static const signed char gPrecedence[]; | |
198 int arithmeticOp(char ch, char nextChar, bool lastPush); | |
199 void commonCallBack(CallBackType type, UserCallBack& callBack, void* userSto
rage); | |
200 bool convertParams(SkTDArray<SkScriptValue>&, const SkFunctionParamType* , | |
201 int paramTypeCount); | |
202 void convertToString(SkOperand& operand, SkDisplayTypes type) { | |
203 SkScriptValue scriptValue; | |
204 scriptValue.fOperand = operand; | |
205 scriptValue.fType = type; | |
206 convertTo(SkType_String, &scriptValue); | |
207 operand = scriptValue.fOperand; | |
208 } | |
209 bool evaluateDot(const char*& script, bool suppressed); | |
210 bool evaluateDotParam(const char*& script, bool suppressed, const char* fiel
d, size_t fieldLength); | |
211 bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue>& params
); | |
212 bool handleArrayIndexer(const char** scriptPtr, bool suppressed); | |
213 bool handleBox(SkScriptValue* value); | |
214 bool handleFunction(const char** scriptPtr, bool suppressed); | |
215 bool handleMember(const char* field, size_t len, void* object); | |
216 bool handleMemberFunction(const char* field, size_t len, void* object, SkTDA
rray<SkScriptValue>& params); | |
217 // bool handleObjectToString(void* object); | |
218 bool handleProperty(bool suppressed); | |
219 bool handleUnbox(SkScriptValue* scriptValue); | |
220 bool innerScript(const char** scriptPtr, SkScriptValue* value); | |
221 int logicalOp(char ch, char nextChar); | |
222 Error opError(); | |
223 bool processOp(); | |
224 void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; } | |
225 bool setError(Error , const char* pos); | |
226 enum SkBraceStyle { | |
227 // kStructBrace, | |
228 kArrayBrace, | |
229 kFunctionBrace | |
230 }; | |
231 | |
232 #if 0 | |
233 SkIntArray(SkBraceStyle) fBraceStack; // curly, square, function paren | |
234 SkIntArray(SkOp) fOpStack; | |
235 SkIntArray(SkOpType) fTypeStack; | |
236 SkTDOperandArray fOperandStack; | |
237 SkTDArray<SkSuppress> fSuppressStack; | |
238 #else | |
239 SkTDStack<SkBraceStyle> fBraceStack; // curly, square, function paren | |
240 SkTDStack<SkOp> fOpStack; | |
241 SkTDStack<SkOpType> fTypeStack; | |
242 SkTDStack<SkOperand> fOperandStack; | |
243 SkTDStack<SkSuppress> fSuppressStack; | |
244 #endif | |
245 SkAnimateMaker* fMaker; | |
246 SkTDTypedArrayArray fTrackArray; | |
247 SkTDStringArray fTrackString; | |
248 const char* fToken; // one-deep stack | |
249 size_t fTokenLength; | |
250 SkTDArray<UserCallBack> fUserCallBacks; | |
251 SkOpType fReturnType; | |
252 Error fError; | |
253 int fErrorPosition; | |
254 private: | |
255 friend class SkTypedArray; | |
256 #ifdef SK_SUPPORT_UNITTEST | |
257 public: | |
258 static void UnitTest(); | |
259 #endif | |
260 }; | |
261 | |
262 #ifdef SK_SUPPORT_UNITTEST | |
263 | |
264 struct SkScriptNAnswer { | |
265 const char* fScript; | |
266 SkDisplayTypes fType; | |
267 int32_t fIntAnswer; | |
268 SkScalar fScalarAnswer; | |
269 const char* fStringAnswer; | |
270 }; | |
271 | |
272 #endif | |
273 | |
274 #endif // SkScript_DEFINED | |
OLD | NEW |