gfx/skia/trunk/src/animator/SkScript2.h

changeset 0
6474c204b198
     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

mercurial