1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkScript_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkScript_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkOperand.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkIntArray.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDict.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDStack.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkAnimateMaker;
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkScriptEngine {
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum Error {
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kNoError,
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kArrayIndexOutOfBounds,
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kCouldNotFindReferencedID,
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDotOperatorExpectsObject,
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kErrorInArrrayIndex,
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kErrorInFunctionParameters,
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedArray,
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedBooleanExpression,
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedFieldName,
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedHex,
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedIntForConditionOperator,
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedNumber,
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedNumberForArrayIndex,
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedOperator,
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedToken,
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedTokenBeforeDotOperator,
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kExpectedValue,
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kHandleMemberFailed,
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kHandleMemberFunctionFailed,
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kHandleUnboxFailed,
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kIndexOutOfRange,
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMismatchedArrayBrace,
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMismatchedBrackets,
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kNoFunctionHandlerFound,
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kPrematureEnd,
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kTooManyParameters,
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kTypeConversionFailed,
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kUnterminatedString
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum SkOpType {
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kNoType,
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kInt = 1,
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kScalar = 2,
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kString = 4,
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kArray = 8,
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kObject = 16
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//      kStruct = 32
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef bool (*_boxCallBack)(void* userStorage, SkScriptValue* result);
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef bool (*_functionCallBack)(const char* func, size_t len, SkTDArray<SkScriptValue>& params,
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void* userStorage, SkScriptValue* result);
66d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    typedef bool (*_memberCallBack)(const char* member, size_t len, void* object,
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void* userStorage, SkScriptValue* result);
68d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    typedef bool (*_memberFunctionCallBack)(const char* member, size_t len, void* object,
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkTDArray<SkScriptValue>& params, void* userStorage, SkScriptValue* result);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  typedef bool (*_objectToStringCallBack)(void* object, void* userStorage, SkScriptValue* result);
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef bool (*_propertyCallBack)(const char* prop, size_t len, void* userStorage, SkScriptValue* result);
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef bool (*_unboxCallBack)(void* userStorage, SkScriptValue* result);
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScriptEngine(SkOpType returnType);
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ~SkScriptEngine();
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void boxCallBack(_boxCallBack func, void* userStorage);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool convertTo(SkDisplayTypes , SkScriptValue* );
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool evaluateScript(const char** script, SkScriptValue* value);
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void forget(SkTypedArray* array);
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void functionCallBack(_functionCallBack func, void* userStorage);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Error getError() const { return fError; }
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool getErrorString(SkString* err) const;
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void memberCallBack(_memberCallBack , void* userStorage);
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void memberFunctionCallBack(_memberFunctionCallBack , void* userStorage);
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  void objectToStringCallBack(_objectToStringCallBack , void* userStorage);
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void propertyCallBack(_propertyCallBack prop, void* userStorage);
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void track(SkTypedArray* array);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void track(SkString* string);
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void unboxCallBack(_unboxCallBack func, void* userStorage);
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool ConvertTo(SkScriptEngine* , SkDisplayTypes toType, SkScriptValue* value);
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkScalar IntToScalar(int32_t );
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkDisplayTypes ToDisplayType(SkOpType type);
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkOpType ToOpType(SkDisplayTypes type);
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool ValueToString(SkScriptValue value, SkString* string);
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum CallBackType {
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kBox,
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kFunction,
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMember,
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMemberFunction,
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //  kObjectToString,
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kProperty,
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kUnbox
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    struct UserCallBack {
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        CallBackType fCallBackType;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void* fUserStorage;
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        union {
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            _boxCallBack fBoxCallBack;
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            _functionCallBack fFunctionCallBack;
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            _memberCallBack fMemberCallBack;
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            _memberFunctionCallBack fMemberFunctionCallBack;
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //      _objectToStringCallBack fObjectToStringCallBack;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            _propertyCallBack fPropertyCallBack;
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            _unboxCallBack fUnboxCallBack;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        };
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum SkOp {
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kUnassigned,
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kAdd,
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kAddInt = kAdd,
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kAddScalar,
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kAddString, // string concat
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kArrayOp,
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kBitAnd,
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kBitNot,
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kBitOr,
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDivide,
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDivideInt = kDivide,
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDivideScalar,
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kElse,
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kEqual,
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kEqualInt = kEqual,
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kEqualScalar,
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kEqualString,
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kFlipOps,
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kGreaterEqual,
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kGreaterEqualInt = kGreaterEqual,
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kGreaterEqualScalar,
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kGreaterEqualString,
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kIf,
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kLogicalAnd,
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kLogicalNot,
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kLogicalOr,
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMinus,
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMinusInt = kMinus,
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMinusScalar,
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kModulo,
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kModuloInt = kModulo,
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kModuloScalar,
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMultiply,
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMultiplyInt = kMultiply,
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMultiplyScalar,
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kParen,
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kShiftLeft,
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kShiftRight,    // signed
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSubtract,
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSubtractInt = kSubtract,
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSubtractScalar,
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kXor,
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kArtificialOp = 0x40
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum SkOpBias {
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kNoBias,
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kTowardsNumber = 0,
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kTowardsString
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
172d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    struct SkOperatorAttributes {
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        unsigned int fLeftType : 3; // SkOpType, but only lower values
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        unsigned int fRightType : 3;     // SkOpType, but only lower values
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkOpBias fBias : 1;
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    struct SkSuppress { // !!! could be compressed to a long
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkOp fOperator; // operand which enabled suppression
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int fOpStackDepth; // depth when suppression operator was found
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkBool8 fSuppress; // set if suppression happens now, as opposed to later
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkBool8 fElse; // set on the : half of ? :
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const SkOperatorAttributes gOpAttributes[];
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const signed char gPrecedence[];
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int arithmeticOp(char ch, char nextChar, bool lastPush);
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void commonCallBack(CallBackType type, UserCallBack& callBack, void* userStorage);
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool convertParams(SkTDArray<SkScriptValue>&, const SkFunctionParamType* ,
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                    int paramTypeCount);
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void convertToString(SkOperand& operand, SkDisplayTypes type) {
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScriptValue scriptValue;
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        scriptValue.fOperand = operand;
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        scriptValue.fType = type;
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        convertTo(SkType_String, &scriptValue);
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        operand = scriptValue.fOperand;
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool evaluateDot(const char*& script, bool suppressed);
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool evaluateDotParam(const char*& script, bool suppressed, const char* field, size_t fieldLength);
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue>& params);
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleArrayIndexer(const char** scriptPtr, bool suppressed);
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleBox(SkScriptValue* value);
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleFunction(const char** scriptPtr, bool suppressed);
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleMember(const char* field, size_t len, void* object);
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleMemberFunction(const char* field, size_t len, void* object, SkTDArray<SkScriptValue>& params);
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  bool handleObjectToString(void* object);
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleProperty(bool suppressed);
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool handleUnbox(SkScriptValue* scriptValue);
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool innerScript(const char** scriptPtr, SkScriptValue* value);
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int logicalOp(char ch, char nextChar);
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Error opError();
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool processOp();
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; }
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool setError(Error , const char* pos);
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum SkBraceStyle {
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //  kStructBrace,
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kArrayBrace,
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kFunctionBrace
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkIntArray(SkBraceStyle) fBraceStack;       // curly, square, function paren
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkIntArray(SkOp) fOpStack;
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkIntArray(SkOpType) fTypeStack;
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDOperandArray fOperandStack;
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDArray<SkSuppress> fSuppressStack;
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDStack<SkBraceStyle> fBraceStack;        // curly, square, function paren
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDStack<SkOp> fOpStack;
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDStack<SkOpType> fTypeStack;
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDStack<SkOperand> fOperandStack;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDStack<SkSuppress> fSuppressStack;
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimateMaker* fMaker;
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDTypedArrayArray fTrackArray;
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDStringArray fTrackString;
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* fToken; // one-deep stack
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    size_t fTokenLength;
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDArray<UserCallBack> fUserCallBacks;
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkOpType fReturnType;
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Error fError;
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int fErrorPosition;
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    friend class SkTypedArray;
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SUPPORT_UNITTEST
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void UnitTest();
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SUPPORT_UNITTEST
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkScriptNAnswer {
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* fScript;
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes fType;
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int32_t fIntAnswer;
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar fScalarAnswer;
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* fStringAnswer;
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif // SkScript_DEFINED
267