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

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

mercurial