1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com
2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/*
3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2006 The Android Open Source Project
4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com *
5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file.
7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */
8685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com
9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifndef SkScript_DEFINED
11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#define SkScript_DEFINED
12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
13bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkOperand.h"
14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkIntArray.h"
15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTDict.h"
16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTDStack.h"
17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comclass SkAnimateMaker;
19bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
20bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comclass SkScriptEngine {
21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
22bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    enum Error {
23bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kNoError,
24bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kArrayIndexOutOfBounds,
25bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kCouldNotFindReferencedID,
26bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kDotOperatorExpectsObject,
27bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kErrorInArrrayIndex,
28bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kErrorInFunctionParameters,
29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedArray,
30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedBooleanExpression,
31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedFieldName,
32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedHex,
33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedIntForConditionOperator,
34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedNumber,
35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedNumberForArrayIndex,
36bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedOperator,
37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedToken,
38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedTokenBeforeDotOperator,
39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kExpectedValue,
40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kHandleMemberFailed,
41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kHandleMemberFunctionFailed,
42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kHandleUnboxFailed,
43bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kIndexOutOfRange,
44bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMismatchedArrayBrace,
45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMismatchedBrackets,
46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kNoFunctionHandlerFound,
47bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kPrematureEnd,
48bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kTooManyParameters,
49bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kTypeConversionFailed,
50bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kUnterminatedString
51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    enum SkOpType {
54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kNoType,
55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kInt = 1,
56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kScalar = 2,
57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kString = 4,
58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kArray = 8,
59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kObject = 16
60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//      kStruct = 32
61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    typedef bool (*_boxCallBack)(void* userStorage, SkScriptValue* result);
64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    typedef bool (*_functionCallBack)(const char* func, size_t len, SkTDArray<SkScriptValue>& params,
65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        void* userStorage, SkScriptValue* result);
66dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    typedef bool (*_memberCallBack)(const char* member, size_t len, void* object,
67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        void* userStorage, SkScriptValue* result);
68dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    typedef bool (*_memberFunctionCallBack)(const char* member, size_t len, void* object,
69bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkTDArray<SkScriptValue>& params, void* userStorage, SkScriptValue* result);
70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  typedef bool (*_objectToStringCallBack)(void* object, void* userStorage, SkScriptValue* result);
71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    typedef bool (*_propertyCallBack)(const char* prop, size_t len, void* userStorage, SkScriptValue* result);
72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    typedef bool (*_unboxCallBack)(void* userStorage, SkScriptValue* result);
73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkScriptEngine(SkOpType returnType);
74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ~SkScriptEngine();
75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void boxCallBack(_boxCallBack func, void* userStorage);
76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool convertTo(SkDisplayTypes , SkScriptValue* );
77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool evaluateScript(const char** script, SkScriptValue* value);
78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void forget(SkTypedArray* array);
79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void functionCallBack(_functionCallBack func, void* userStorage);
80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Error getError() const { return fError; }
81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DEBUG
82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool getErrorString(SkString* err) const;
83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void memberCallBack(_memberCallBack , void* userStorage);
85bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void memberFunctionCallBack(_memberFunctionCallBack , void* userStorage);
86bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  void objectToStringCallBack(_objectToStringCallBack , void* userStorage);
87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void propertyCallBack(_propertyCallBack prop, void* userStorage);
88bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void track(SkTypedArray* array);
89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void track(SkString* string);
90bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void unboxCallBack(_unboxCallBack func, void* userStorage);
91bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static bool ConvertTo(SkScriptEngine* , SkDisplayTypes toType, SkScriptValue* value);
92bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static SkScalar IntToScalar(int32_t );
93bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static SkDisplayTypes ToDisplayType(SkOpType type);
94bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static SkOpType ToOpType(SkDisplayTypes type);
95bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static bool ValueToString(SkScriptValue value, SkString* string);
96bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
97bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    enum CallBackType {
98bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kBox,
99bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kFunction,
100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMember,
101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMemberFunction,
102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    //  kObjectToString,
103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kProperty,
104bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kUnbox
105bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
106bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
107bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    struct UserCallBack {
108bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        CallBackType fCallBackType;
109bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        void* fUserStorage;
110bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        union {
111bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            _boxCallBack fBoxCallBack;
112bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            _functionCallBack fFunctionCallBack;
113bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            _memberCallBack fMemberCallBack;
114bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            _memberFunctionCallBack fMemberFunctionCallBack;
115bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    //      _objectToStringCallBack fObjectToStringCallBack;
116bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            _propertyCallBack fPropertyCallBack;
117bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            _unboxCallBack fUnboxCallBack;
118bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        };
119bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
120bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
121bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    enum SkOp {
122bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kUnassigned,
123bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kAdd,
124bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kAddInt = kAdd,
125bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kAddScalar,
126bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kAddString, // string concat
127bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kArrayOp,
128bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kBitAnd,
129bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kBitNot,
130bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kBitOr,
131bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kDivide,
132bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kDivideInt = kDivide,
133bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kDivideScalar,
134bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kElse,
135bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kEqual,
136bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kEqualInt = kEqual,
137bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kEqualScalar,
138bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kEqualString,
139bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kFlipOps,
140bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kGreaterEqual,
141bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kGreaterEqualInt = kGreaterEqual,
142bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kGreaterEqualScalar,
143bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kGreaterEqualString,
144bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kIf,
145bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kLogicalAnd,
146bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kLogicalNot,
147bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kLogicalOr,
148bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMinus,
149bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMinusInt = kMinus,
150bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMinusScalar,
151bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kModulo,
152bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kModuloInt = kModulo,
153bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kModuloScalar,
154bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMultiply,
155bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMultiplyInt = kMultiply,
156bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kMultiplyScalar,
157bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kParen,
158bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kShiftLeft,
159bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kShiftRight,    // signed
160bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kSubtract,
161bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kSubtractInt = kSubtract,
162bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kSubtractScalar,
163bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kXor,
164bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kArtificialOp = 0x40
165bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
166bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
167bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    enum SkOpBias {
168bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kNoBias,
169bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kTowardsNumber = 0,
170bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kTowardsString
171bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
172dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
173bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comprotected:
174bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
175bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    struct SkOperatorAttributes {
176bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        unsigned int fLeftType : 3; // SkOpType, but only lower values
177bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        unsigned int fRightType : 3;     // SkOpType, but only lower values
178bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkOpBias fBias : 1;
179bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
180bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
181bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    struct SkSuppress { // !!! could be compressed to a long
182bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkOp fOperator; // operand which enabled suppression
183bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        int fOpStackDepth; // depth when suppression operator was found
184bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkBool8 fSuppress; // set if suppression happens now, as opposed to later
185bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkBool8 fElse; // set on the : half of ? :
186bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
187bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
188bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static const SkOperatorAttributes gOpAttributes[];
189bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static const signed char gPrecedence[];
190bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int arithmeticOp(char ch, char nextChar, bool lastPush);
191bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void commonCallBack(CallBackType type, UserCallBack& callBack, void* userStorage);
192bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool convertParams(SkTDArray<SkScriptValue>&, const SkFunctionParamType* ,
193bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                                    int paramTypeCount);
194bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void convertToString(SkOperand& operand, SkDisplayTypes type) {
195bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkScriptValue scriptValue;
196bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        scriptValue.fOperand = operand;
197bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        scriptValue.fType = type;
198bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        convertTo(SkType_String, &scriptValue);
199bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        operand = scriptValue.fOperand;
200bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
201bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool evaluateDot(const char*& script, bool suppressed);
202bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool evaluateDotParam(const char*& script, bool suppressed, const char* field, size_t fieldLength);
203bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue>& params);
204bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleArrayIndexer(const char** scriptPtr, bool suppressed);
205bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleBox(SkScriptValue* value);
206bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleFunction(const char** scriptPtr, bool suppressed);
207bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleMember(const char* field, size_t len, void* object);
208bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleMemberFunction(const char* field, size_t len, void* object, SkTDArray<SkScriptValue>& params);
209bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  bool handleObjectToString(void* object);
210bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleProperty(bool suppressed);
211bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool handleUnbox(SkScriptValue* scriptValue);
212bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool innerScript(const char** scriptPtr, SkScriptValue* value);
213bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int logicalOp(char ch, char nextChar);
214bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Error opError();
215bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool processOp();
216bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; }
217bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    bool setError(Error , const char* pos);
218bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    enum SkBraceStyle {
219bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    //  kStructBrace,
220bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kArrayBrace,
221bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        kFunctionBrace
222bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    };
223bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
224bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#if 0
225bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkIntArray(SkBraceStyle) fBraceStack;       // curly, square, function paren
226bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkIntArray(SkOp) fOpStack;
227bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkIntArray(SkOpType) fTypeStack;
228bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDOperandArray fOperandStack;
229bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDArray<SkSuppress> fSuppressStack;
230bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else
231bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDStack<SkBraceStyle> fBraceStack;        // curly, square, function paren
232bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDStack<SkOp> fOpStack;
233bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDStack<SkOpType> fTypeStack;
234bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDStack<SkOperand> fOperandStack;
235bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDStack<SkSuppress> fSuppressStack;
236bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
237bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkAnimateMaker* fMaker;
238bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDTypedArrayArray fTrackArray;
239bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDStringArray fTrackString;
240bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const char* fToken; // one-deep stack
241bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    size_t fTokenLength;
242bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDArray<UserCallBack> fUserCallBacks;
243bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkOpType fReturnType;
244bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    Error fError;
245bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int fErrorPosition;
246bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comprivate:
247bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    friend class SkTypedArray;
248bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_SUPPORT_UNITTEST
249bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
250bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static void UnitTest();
251bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
252bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com};
253bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
254bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_SUPPORT_UNITTEST
255bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
256bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstruct SkScriptNAnswer {
257bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const char* fScript;
258bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayTypes fType;
259bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int32_t fIntAnswer;
260bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkScalar fScalarAnswer;
261bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const char* fStringAnswer;
262bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com};
263bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
264bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
265bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
266bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif // SkScript_DEFINED
267