1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkScript.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,266 @@ 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 SkScript_DEFINED 1.14 +#define SkScript_DEFINED 1.15 + 1.16 +#include "SkOperand.h" 1.17 +#include "SkIntArray.h" 1.18 +#include "SkTDict.h" 1.19 +#include "SkTDStack.h" 1.20 + 1.21 +class SkAnimateMaker; 1.22 + 1.23 +class SkScriptEngine { 1.24 +public: 1.25 + enum Error { 1.26 + kNoError, 1.27 + kArrayIndexOutOfBounds, 1.28 + kCouldNotFindReferencedID, 1.29 + kDotOperatorExpectsObject, 1.30 + kErrorInArrrayIndex, 1.31 + kErrorInFunctionParameters, 1.32 + kExpectedArray, 1.33 + kExpectedBooleanExpression, 1.34 + kExpectedFieldName, 1.35 + kExpectedHex, 1.36 + kExpectedIntForConditionOperator, 1.37 + kExpectedNumber, 1.38 + kExpectedNumberForArrayIndex, 1.39 + kExpectedOperator, 1.40 + kExpectedToken, 1.41 + kExpectedTokenBeforeDotOperator, 1.42 + kExpectedValue, 1.43 + kHandleMemberFailed, 1.44 + kHandleMemberFunctionFailed, 1.45 + kHandleUnboxFailed, 1.46 + kIndexOutOfRange, 1.47 + kMismatchedArrayBrace, 1.48 + kMismatchedBrackets, 1.49 + kNoFunctionHandlerFound, 1.50 + kPrematureEnd, 1.51 + kTooManyParameters, 1.52 + kTypeConversionFailed, 1.53 + kUnterminatedString 1.54 + }; 1.55 + 1.56 + enum SkOpType { 1.57 + kNoType, 1.58 + kInt = 1, 1.59 + kScalar = 2, 1.60 + kString = 4, 1.61 + kArray = 8, 1.62 + kObject = 16 1.63 +// kStruct = 32 1.64 + }; 1.65 + 1.66 + typedef bool (*_boxCallBack)(void* userStorage, SkScriptValue* result); 1.67 + typedef bool (*_functionCallBack)(const char* func, size_t len, SkTDArray<SkScriptValue>& params, 1.68 + void* userStorage, SkScriptValue* result); 1.69 + typedef bool (*_memberCallBack)(const char* member, size_t len, void* object, 1.70 + void* userStorage, SkScriptValue* result); 1.71 + typedef bool (*_memberFunctionCallBack)(const char* member, size_t len, void* object, 1.72 + SkTDArray<SkScriptValue>& params, void* userStorage, SkScriptValue* result); 1.73 +// typedef bool (*_objectToStringCallBack)(void* object, void* userStorage, SkScriptValue* result); 1.74 + typedef bool (*_propertyCallBack)(const char* prop, size_t len, void* userStorage, SkScriptValue* result); 1.75 + typedef bool (*_unboxCallBack)(void* userStorage, SkScriptValue* result); 1.76 + SkScriptEngine(SkOpType returnType); 1.77 + ~SkScriptEngine(); 1.78 + void boxCallBack(_boxCallBack func, void* userStorage); 1.79 + bool convertTo(SkDisplayTypes , SkScriptValue* ); 1.80 + bool evaluateScript(const char** script, SkScriptValue* value); 1.81 + void forget(SkTypedArray* array); 1.82 + void functionCallBack(_functionCallBack func, void* userStorage); 1.83 + Error getError() const { return fError; } 1.84 +#ifdef SK_DEBUG 1.85 + bool getErrorString(SkString* err) const; 1.86 +#endif 1.87 + void memberCallBack(_memberCallBack , void* userStorage); 1.88 + void memberFunctionCallBack(_memberFunctionCallBack , void* userStorage); 1.89 +// void objectToStringCallBack(_objectToStringCallBack , void* userStorage); 1.90 + void propertyCallBack(_propertyCallBack prop, void* userStorage); 1.91 + void track(SkTypedArray* array); 1.92 + void track(SkString* string); 1.93 + void unboxCallBack(_unboxCallBack func, void* userStorage); 1.94 + static bool ConvertTo(SkScriptEngine* , SkDisplayTypes toType, SkScriptValue* value); 1.95 + static SkScalar IntToScalar(int32_t ); 1.96 + static SkDisplayTypes ToDisplayType(SkOpType type); 1.97 + static SkOpType ToOpType(SkDisplayTypes type); 1.98 + static bool ValueToString(SkScriptValue value, SkString* string); 1.99 + 1.100 + enum CallBackType { 1.101 + kBox, 1.102 + kFunction, 1.103 + kMember, 1.104 + kMemberFunction, 1.105 + // kObjectToString, 1.106 + kProperty, 1.107 + kUnbox 1.108 + }; 1.109 + 1.110 + struct UserCallBack { 1.111 + CallBackType fCallBackType; 1.112 + void* fUserStorage; 1.113 + union { 1.114 + _boxCallBack fBoxCallBack; 1.115 + _functionCallBack fFunctionCallBack; 1.116 + _memberCallBack fMemberCallBack; 1.117 + _memberFunctionCallBack fMemberFunctionCallBack; 1.118 + // _objectToStringCallBack fObjectToStringCallBack; 1.119 + _propertyCallBack fPropertyCallBack; 1.120 + _unboxCallBack fUnboxCallBack; 1.121 + }; 1.122 + }; 1.123 + 1.124 + enum SkOp { 1.125 + kUnassigned, 1.126 + kAdd, 1.127 + kAddInt = kAdd, 1.128 + kAddScalar, 1.129 + kAddString, // string concat 1.130 + kArrayOp, 1.131 + kBitAnd, 1.132 + kBitNot, 1.133 + kBitOr, 1.134 + kDivide, 1.135 + kDivideInt = kDivide, 1.136 + kDivideScalar, 1.137 + kElse, 1.138 + kEqual, 1.139 + kEqualInt = kEqual, 1.140 + kEqualScalar, 1.141 + kEqualString, 1.142 + kFlipOps, 1.143 + kGreaterEqual, 1.144 + kGreaterEqualInt = kGreaterEqual, 1.145 + kGreaterEqualScalar, 1.146 + kGreaterEqualString, 1.147 + kIf, 1.148 + kLogicalAnd, 1.149 + kLogicalNot, 1.150 + kLogicalOr, 1.151 + kMinus, 1.152 + kMinusInt = kMinus, 1.153 + kMinusScalar, 1.154 + kModulo, 1.155 + kModuloInt = kModulo, 1.156 + kModuloScalar, 1.157 + kMultiply, 1.158 + kMultiplyInt = kMultiply, 1.159 + kMultiplyScalar, 1.160 + kParen, 1.161 + kShiftLeft, 1.162 + kShiftRight, // signed 1.163 + kSubtract, 1.164 + kSubtractInt = kSubtract, 1.165 + kSubtractScalar, 1.166 + kXor, 1.167 + kArtificialOp = 0x40 1.168 + }; 1.169 + 1.170 + enum SkOpBias { 1.171 + kNoBias, 1.172 + kTowardsNumber = 0, 1.173 + kTowardsString 1.174 + }; 1.175 + 1.176 +protected: 1.177 + 1.178 + struct SkOperatorAttributes { 1.179 + unsigned int fLeftType : 3; // SkOpType, but only lower values 1.180 + unsigned int fRightType : 3; // SkOpType, but only lower values 1.181 + SkOpBias fBias : 1; 1.182 + }; 1.183 + 1.184 + struct SkSuppress { // !!! could be compressed to a long 1.185 + SkOp fOperator; // operand which enabled suppression 1.186 + int fOpStackDepth; // depth when suppression operator was found 1.187 + SkBool8 fSuppress; // set if suppression happens now, as opposed to later 1.188 + SkBool8 fElse; // set on the : half of ? : 1.189 + }; 1.190 + 1.191 + static const SkOperatorAttributes gOpAttributes[]; 1.192 + static const signed char gPrecedence[]; 1.193 + int arithmeticOp(char ch, char nextChar, bool lastPush); 1.194 + void commonCallBack(CallBackType type, UserCallBack& callBack, void* userStorage); 1.195 + bool convertParams(SkTDArray<SkScriptValue>&, const SkFunctionParamType* , 1.196 + int paramTypeCount); 1.197 + void convertToString(SkOperand& operand, SkDisplayTypes type) { 1.198 + SkScriptValue scriptValue; 1.199 + scriptValue.fOperand = operand; 1.200 + scriptValue.fType = type; 1.201 + convertTo(SkType_String, &scriptValue); 1.202 + operand = scriptValue.fOperand; 1.203 + } 1.204 + bool evaluateDot(const char*& script, bool suppressed); 1.205 + bool evaluateDotParam(const char*& script, bool suppressed, const char* field, size_t fieldLength); 1.206 + bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue>& params); 1.207 + bool handleArrayIndexer(const char** scriptPtr, bool suppressed); 1.208 + bool handleBox(SkScriptValue* value); 1.209 + bool handleFunction(const char** scriptPtr, bool suppressed); 1.210 + bool handleMember(const char* field, size_t len, void* object); 1.211 + bool handleMemberFunction(const char* field, size_t len, void* object, SkTDArray<SkScriptValue>& params); 1.212 +// bool handleObjectToString(void* object); 1.213 + bool handleProperty(bool suppressed); 1.214 + bool handleUnbox(SkScriptValue* scriptValue); 1.215 + bool innerScript(const char** scriptPtr, SkScriptValue* value); 1.216 + int logicalOp(char ch, char nextChar); 1.217 + Error opError(); 1.218 + bool processOp(); 1.219 + void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; } 1.220 + bool setError(Error , const char* pos); 1.221 + enum SkBraceStyle { 1.222 + // kStructBrace, 1.223 + kArrayBrace, 1.224 + kFunctionBrace 1.225 + }; 1.226 + 1.227 +#if 0 1.228 + SkIntArray(SkBraceStyle) fBraceStack; // curly, square, function paren 1.229 + SkIntArray(SkOp) fOpStack; 1.230 + SkIntArray(SkOpType) fTypeStack; 1.231 + SkTDOperandArray fOperandStack; 1.232 + SkTDArray<SkSuppress> fSuppressStack; 1.233 +#else 1.234 + SkTDStack<SkBraceStyle> fBraceStack; // curly, square, function paren 1.235 + SkTDStack<SkOp> fOpStack; 1.236 + SkTDStack<SkOpType> fTypeStack; 1.237 + SkTDStack<SkOperand> fOperandStack; 1.238 + SkTDStack<SkSuppress> fSuppressStack; 1.239 +#endif 1.240 + SkAnimateMaker* fMaker; 1.241 + SkTDTypedArrayArray fTrackArray; 1.242 + SkTDStringArray fTrackString; 1.243 + const char* fToken; // one-deep stack 1.244 + size_t fTokenLength; 1.245 + SkTDArray<UserCallBack> fUserCallBacks; 1.246 + SkOpType fReturnType; 1.247 + Error fError; 1.248 + int fErrorPosition; 1.249 +private: 1.250 + friend class SkTypedArray; 1.251 +#ifdef SK_SUPPORT_UNITTEST 1.252 +public: 1.253 + static void UnitTest(); 1.254 +#endif 1.255 +}; 1.256 + 1.257 +#ifdef SK_SUPPORT_UNITTEST 1.258 + 1.259 +struct SkScriptNAnswer { 1.260 + const char* fScript; 1.261 + SkDisplayTypes fType; 1.262 + int32_t fIntAnswer; 1.263 + SkScalar fScalarAnswer; 1.264 + const char* fStringAnswer; 1.265 +}; 1.266 + 1.267 +#endif 1.268 + 1.269 +#endif // SkScript_DEFINED