1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkScript2.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,291 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 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 +#ifndef SkScript2_DEFINED 1.12 +#define SkScript2_DEFINED 1.13 + 1.14 +#include "SkOperand2.h" 1.15 +#include "SkStream.h" 1.16 +#include "SkTDArray.h" 1.17 +#include "SkTDArray_Experimental.h" 1.18 +#include "SkTDict.h" 1.19 +#include "SkTDStack.h" 1.20 + 1.21 +typedef SkLongArray(SkString*) SkTDStringArray; 1.22 + 1.23 +class SkAnimateMaker; 1.24 +class SkScriptCallBack; 1.25 + 1.26 +class SkScriptEngine2 { 1.27 +public: 1.28 + enum Error { 1.29 + kNoError, 1.30 + kArrayIndexOutOfBounds, 1.31 + kCouldNotFindReferencedID, 1.32 + kFunctionCallFailed, 1.33 + kMemberOpFailed, 1.34 + kPropertyOpFailed 1.35 + }; 1.36 + 1.37 + enum Attrs { 1.38 + kConstant, 1.39 + kVariable 1.40 + }; 1.41 + 1.42 + SkScriptEngine2(SkOperand2::OpType returnType); 1.43 + ~SkScriptEngine2(); 1.44 + bool convertTo(SkOperand2::OpType , SkScriptValue2* ); 1.45 + bool evaluateScript(const char** script, SkScriptValue2* value); 1.46 + void forget(SkOpArray* array); 1.47 + Error getError() { return fError; } 1.48 + SkOperand2::OpType getReturnType() { return fReturnType; } 1.49 + void track(SkOpArray* array) { 1.50 + SkASSERT(fTrackArray.find(array) < 0); 1.51 + *fTrackArray.append() = array; } 1.52 + void track(SkString* string) { 1.53 + SkASSERT(fTrackString.find(string) < 0); 1.54 + *fTrackString.append() = string; 1.55 + } 1.56 + static bool ConvertTo(SkScriptEngine2* , SkOperand2::OpType toType, SkScriptValue2* value); 1.57 + static SkScalar IntToScalar(int32_t ); 1.58 + static bool ValueToString(const SkScriptValue2& value, SkString* string); 1.59 + 1.60 + enum Op { // used by tokenizer attribute table 1.61 + kUnassigned, 1.62 + kAdd, 1.63 + kBitAnd, 1.64 + kBitNot, 1.65 + kBitOr, 1.66 + kDivide, 1.67 + kEqual, 1.68 + kFlipOps, 1.69 + kGreaterEqual, 1.70 + kLogicalAnd, 1.71 + kLogicalNot, 1.72 + kLogicalOr, 1.73 + kMinus, 1.74 + kModulo, 1.75 + kMultiply, 1.76 + kShiftLeft, 1.77 + kShiftRight, // signed 1.78 + kSubtract, 1.79 + kXor, 1.80 +// following not in attribute table 1.81 + kArrayOp, 1.82 + kElse, 1.83 + kIf, 1.84 + kParen, 1.85 + kLastLogicalOp, 1.86 + kArtificialOp = 0x20 1.87 + }; 1.88 + 1.89 + enum TypeOp { // generated by tokenizer 1.90 + kNop, // should never get generated 1.91 + kAccumulatorPop, 1.92 + kAccumulatorPush, 1.93 + kAddInt, 1.94 + kAddScalar, 1.95 + kAddString, // string concat 1.96 + kArrayIndex, 1.97 + kArrayParam, 1.98 + kArrayToken, 1.99 + kBitAndInt, 1.100 + kBitNotInt, 1.101 + kBitOrInt, 1.102 + kBoxToken, 1.103 + kCallback, 1.104 + kDivideInt, 1.105 + kDivideScalar, 1.106 + kDotOperator, 1.107 + kElseOp, 1.108 + kEnd, 1.109 + kEqualInt, 1.110 + kEqualScalar, 1.111 + kEqualString, 1.112 + kFunctionCall, 1.113 + kFlipOpsOp, 1.114 + kFunctionToken, 1.115 + kGreaterEqualInt, 1.116 + kGreaterEqualScalar, 1.117 + kGreaterEqualString, 1.118 + kIfOp, 1.119 + kIntToScalar, 1.120 + kIntToScalar2, 1.121 + kIntToString, 1.122 + kIntToString2, 1.123 + kIntegerAccumulator, 1.124 + kIntegerOperand, 1.125 + kLogicalAndInt, 1.126 + kLogicalNotInt, 1.127 + kLogicalOrInt, 1.128 + kMemberOp, 1.129 + kMinusInt, 1.130 + kMinusScalar, 1.131 + kModuloInt, 1.132 + kModuloScalar, 1.133 + kMultiplyInt, 1.134 + kMultiplyScalar, 1.135 + kPropertyOp, 1.136 + kScalarAccumulator, 1.137 + kScalarOperand, 1.138 + kScalarToInt, 1.139 + kScalarToInt2, 1.140 + kScalarToString, 1.141 + kScalarToString2, 1.142 + kShiftLeftInt, 1.143 + kShiftRightInt, // signed 1.144 + kStringAccumulator, 1.145 + kStringOperand, 1.146 + kStringToInt, 1.147 + kStringToScalar, 1.148 + kStringToScalar2, 1.149 + kStringTrack, 1.150 + kSubtractInt, 1.151 + kSubtractScalar, 1.152 + kToBool, 1.153 + kUnboxToken, 1.154 + kUnboxToken2, 1.155 + kXorInt, 1.156 + kLastTypeOp 1.157 + }; 1.158 + 1.159 + enum OpBias { 1.160 + kNoBias, 1.161 + kTowardsNumber = 0, 1.162 + kTowardsString 1.163 + }; 1.164 + 1.165 +protected: 1.166 + 1.167 + enum BraceStyle { 1.168 + // kStructBrace, 1.169 + kArrayBrace, 1.170 + kFunctionBrace 1.171 + }; 1.172 + 1.173 + enum AddTokenRegister { 1.174 + kAccumulator, 1.175 + kOperand 1.176 + }; 1.177 + 1.178 + enum ResultIsBoolean { 1.179 + kResultIsNotBoolean, 1.180 + kResultIsBoolean 1.181 + }; 1.182 + 1.183 + struct OperatorAttributes { 1.184 + unsigned int fLeftType : 3; // SkOpType union, but only lower values 1.185 + unsigned int fRightType : 3; // SkOpType union, but only lower values 1.186 + OpBias fBias : 1; 1.187 + ResultIsBoolean fResultIsBoolean : 1; 1.188 + }; 1.189 + 1.190 + struct Branch { 1.191 + Branch() { 1.192 + } 1.193 + 1.194 + Branch(Op op, int depth, unsigned offset) : fOffset(offset), fOpStackDepth(depth), fOperator(op), 1.195 + fPrimed(kIsNotPrimed), fDone(kIsNotDone) { 1.196 + } 1.197 + 1.198 + enum Primed { 1.199 + kIsNotPrimed, 1.200 + kIsPrimed 1.201 + }; 1.202 + 1.203 + enum Done { 1.204 + kIsNotDone, 1.205 + kIsDone, 1.206 + }; 1.207 + 1.208 + unsigned fOffset : 16; // offset in generated stream where branch needs to go 1.209 + int fOpStackDepth : 7; // depth when operator was found 1.210 + Op fOperator : 6; // operand which generated branch 1.211 + mutable Primed fPrimed : 1; // mark when next instruction generates branch 1.212 + Done fDone : 1; // mark when branch is complete 1.213 + void prime() { fPrimed = kIsPrimed; } 1.214 + void resolve(SkDynamicMemoryWStream* , size_t offset); 1.215 + }; 1.216 + 1.217 + static const OperatorAttributes gOpAttributes[]; 1.218 + static const signed char gPrecedence[]; 1.219 + static const TypeOp gTokens[]; 1.220 + void addToken(TypeOp ); 1.221 + void addTokenConst(SkScriptValue2* , AddTokenRegister , SkOperand2::OpType , TypeOp ); 1.222 + void addTokenInt(int ); 1.223 + void addTokenScalar(SkScalar ); 1.224 + void addTokenString(const SkString& ); 1.225 + void addTokenValue(const SkScriptValue2& , AddTokenRegister ); 1.226 + int arithmeticOp(char ch, char nextChar, bool lastPush); 1.227 + bool convertParams(SkTDArray<SkScriptValue2>* , 1.228 + const SkOperand2::OpType* paramTypes, int paramTypeCount); 1.229 + void convertToString(SkOperand2* operand, SkOperand2::OpType type) { 1.230 + SkScriptValue2 scriptValue; 1.231 + scriptValue.fOperand = *operand; 1.232 + scriptValue.fType = type; 1.233 + convertTo(SkOperand2::kString, &scriptValue); 1.234 + *operand = scriptValue.fOperand; 1.235 + } 1.236 + bool evaluateDot(const char*& script); 1.237 + bool evaluateDotParam(const char*& script, const char* field, size_t fieldLength); 1.238 + bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue2>* params); 1.239 + size_t getTokenOffset(); 1.240 + SkOperand2::OpType getUnboxType(SkOperand2 scriptValue); 1.241 + bool handleArrayIndexer(const char** scriptPtr); 1.242 + bool handleFunction(const char** scriptPtr); 1.243 + bool handleMember(const char* field, size_t len, void* object); 1.244 + bool handleMemberFunction(const char* field, size_t len, void* object, 1.245 + SkTDArray<SkScriptValue2>* params); 1.246 + bool handleProperty(); 1.247 + bool handleUnbox(SkScriptValue2* scriptValue); 1.248 + bool innerScript(const char** scriptPtr, SkScriptValue2* value); 1.249 + int logicalOp(char ch, char nextChar); 1.250 + void processLogicalOp(Op op); 1.251 + bool processOp(); 1.252 + void resolveBranch(Branch& ); 1.253 +// void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; } 1.254 + SkDynamicMemoryWStream fStream; 1.255 + SkDynamicMemoryWStream* fActiveStream; 1.256 + SkTDStack<BraceStyle> fBraceStack; // curly, square, function paren 1.257 + SkTDStack<Branch> fBranchStack; // logical operators, slot to store forward branch 1.258 + SkLongArray(SkScriptCallBack*) fCallBackArray; 1.259 + SkTDStack<Op> fOpStack; 1.260 + SkTDStack<SkScriptValue2> fValueStack; 1.261 +// SkAnimateMaker* fMaker; 1.262 + SkLongArray(SkOpArray*) fTrackArray; 1.263 + SkTDStringArray fTrackString; 1.264 + const char* fToken; // one-deep stack 1.265 + size_t fTokenLength; 1.266 + SkOperand2::OpType fReturnType; 1.267 + Error fError; 1.268 + SkOperand2::OpType fAccumulatorType; // tracking for code generation 1.269 + SkBool fBranchPopAllowed; 1.270 + SkBool fConstExpression; 1.271 + SkBool fOperandInUse; 1.272 +private: 1.273 +#ifdef SK_DEBUG 1.274 +public: 1.275 + void decompile(const unsigned char* , size_t ); 1.276 + static void UnitTest(); 1.277 + static void ValidateDecompileTable(); 1.278 +#endif 1.279 +}; 1.280 + 1.281 +#ifdef SK_DEBUG 1.282 + 1.283 +struct SkScriptNAnswer2 { 1.284 + const char* fScript; 1.285 + SkOperand2::OpType fType; 1.286 + int32_t fIntAnswer; 1.287 + SkScalar fScalarAnswer; 1.288 + const char* fStringAnswer; 1.289 +}; 1.290 + 1.291 +#endif 1.292 + 1.293 + 1.294 +#endif // SkScript2_DEFINED