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