15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2011 Google Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkAnimatorScript2.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkAnimateBase.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkAnimateMaker.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkDisplayTypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkExtras.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkMemberInfo.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkOpArray.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkParse.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkScript2.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkScriptCallBack.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SkDisplayEnumMap gEnumMaps[] = {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_AddMode, "indirect|immediate" },
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_Align, "left|center|right" },
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_ApplyMode, "immediate|once" },
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_ApplyTransition, "reverse" },
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_BitmapEncoding, "jpeg|png" },
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_BitmapFormat, "none|A1|A8|Index8|RGB16|RGB32" },
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_Boolean, "false|true" },
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_Cap, "butt|round|square" },
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_EventCode, "none|up|down|left|right|back|end|OK|send|leftSoftKey|rightSoftKey|key0|key1|key2|key3|key4|key5|key6|key7|key8|key9|star|hash" },
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_EventKind, "none|keyChar|keyPress|mouseDown|mouseDrag|mouseMove|mouseUp|onEnd|onLoad|user" },
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_EventMode, "deferred|immediate" },
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_FillType, "winding|evenOdd" },
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_FilterType, "none|bilinear" },
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_FromPathMode, "normal|angle|position" },
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_Join, "miter|round|blunt" },
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_MaskFilterBlurStyle, "normal|solid|outer|inner" },
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_PathDirection, "cw|ccw" },
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_Style, "fill|stroke|strokeAndFill" },
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_TextBoxAlign, "start|center|end" },
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_TextBoxMode, "oneLine|lineBreak" },
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_TileMode, "clamp|repeat|mirror" },
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { SkType_Xfermode, "clear|src|dst|srcOver|dstOver|srcIn|dstIn|srcOut|dstOut|"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "srcATop|dstATop|xor|darken|lighten" },
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int gEnumMapCount = SK_ARRAY_COUNT(gEnumMaps);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_Box : public SkScriptCallBackConvert {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript_Box() {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SkAnimatorScript_Box() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (SkDisplayable** dispPtr = fTrackDisplayable.begin(); dispPtr < fTrackDisplayable.end(); dispPtr++)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            delete *dispPtr;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool convert(SkOperand2::OpType type, SkOperand2* operand) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (type) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kArray: {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayArray* boxedValue = new SkDisplayArray(*operand->fArray);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                displayable = boxedValue;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kS32: {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayInt* boxedValue = new SkDisplayInt;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                displayable = boxedValue;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                boxedValue->value = operand->fS32;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kScalar: {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayFloat* boxedValue = new SkDisplayFloat;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                displayable = boxedValue;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                boxedValue->value = operand->fScalar;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kString: {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayString* boxedValue = new SkDisplayString(*operand->fString);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                displayable = boxedValue;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kObject:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkASSERT(0);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return false;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        track(displayable);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        operand->fObject = (void*) displayable;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual SkOperand2::OpType getReturnType(int index) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkOperand2::kObject;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual Type getType() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return kBox;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void track(SkDisplayable* displayable) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkASSERT(fTrackDisplayable.find(displayable) < 0);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *fTrackDisplayable.append() = displayable;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkTDDisplayableArray fTrackDisplayable;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_Enum : public SkScriptCallBackProperty {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript_Enum(const char* tokens) : fTokens(tokens) {}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getConstValue(const char* name, int len, SkOperand2* value) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkAnimatorScript2::MapEnums(fTokens, name, len, &value->fS32);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* fTokens;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // !!! if type is string, call invoke
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if any other type, return original value
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // distinction is undone: could do this by returning index == 0 only if param is string
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // still, caller of getParamTypes will attempt to convert param to string (I guess)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_Eval : public SkScriptCallBackFunction {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript_Eval(SkAnimatorScript2* engine) : fEngine(engine) {}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getIndex(const char* name, int len, size_t* result) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (SK_LITERAL_STR_EQUAL("eval", name, len) != 0)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *result = 0;
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        return true;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        types->setCount(1);
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        SkOperand2::OpType* type = types->begin();
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        type[0] = SkOperand2::kString;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool invoke(size_t index, SkOpArray* params, SkOperand2* answer) {
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SkAnimatorScript2 engine(fEngine->getMaker(), fEngine->getWorking(),
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            SkAnimatorScript2::ToDisplayType(fEngine->getReturnType()));
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SkOperand2* op = params->begin();
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        const char* script = op->fString->c_str();
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SkScriptValue2 value;
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return engine.evaluateScript(&script, &value);
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SkASSERT(value.fType == fEngine->getReturnType());
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        *answer = value.fOperand;
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // !!! incomplete ?
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return true;
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochprivate:
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SkAnimatorScript2* fEngine;
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SkAnimatorScript_ID : public SkScriptCallBackProperty {
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic:
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SkAnimatorScript_ID(SkAnimatorScript2* engine) : fEngine(engine) {}
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool getIndex(const char* token, int len, size_t* result) {
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        SkDisplayable* displayable;
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        bool success = fEngine->getMaker().find(token, len, &displayable);
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (success == false) {
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            *result = 0;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *result = (size_t) displayable;
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            SkDisplayable* working = fEngine->getWorking();
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            if (displayable->canContainDependents() && working && working->isAnimate()) {
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                SkAnimateBase* animator = (SkAnimateBase*) working;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (animator->isDynamic()) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SkDisplayDepend* depend = (SkDisplayDepend* ) displayable;
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    depend->addDependent(working);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual bool getResult(size_t ref, SkOperand2* answer) {
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        answer->fObject = (void*) ref;
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return true;
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual SkOperand2::OpType getReturnType(size_t index) {
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return index == 0 ? SkOperand2::kString : SkOperand2::kObject;
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochprivate:
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SkAnimatorScript2* fEngine;
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SkAnimatorScript_Member : public SkScriptCallBackMember {
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic:
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript_Member(SkAnimatorScript2* engine) : fEngine(engine) {}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool getMemberReference(const char* member, size_t len, void* object, SkScriptValue2* ref) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable = (SkDisplayable*) object;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkString name(member, len);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* named = displayable->contains(name);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (named) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ref->fType = SkOperand2::kObject;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ref->fOperand.fObject = named;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return true;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SkMemberInfo* info = displayable->getMember(name.c_str());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (info == NULL)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;    // !!! add additional error info?
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        ref->fType = SkAnimatorScript2::ToOpType(info->getType());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ref->fOperand.fObject = (void*) info;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool invoke(size_t ref, void* object, SkOperand2* value) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SkMemberInfo* info = (const SkMemberInfo* ) ref;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable = (SkDisplayable*) object;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (info->fType == SkType_MemberProperty) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (displayable->getProperty2(info->propertyIndex(), value) == false) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return false;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return fEngine->evalMemberCommon(info, displayable, value);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SkAnimatorScript2* fEngine;
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_MemberFunction : public SkScriptCallBackMemberFunction {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript_MemberFunction(SkAnimatorScript2* engine) : fEngine(engine) {}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool getMemberReference(const char* member, size_t len, void* object, SkScriptValue2* ref) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable = (SkDisplayable*) object;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkString name(member, len);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SkMemberInfo* info = displayable->getMember(name.c_str());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (info == NULL || info->fType != SkType_MemberFunction)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;    // !!! add additional error info?
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ref->fType = SkAnimatorScript2::ToOpType(info->getType());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ref->fOperand.fObject = (void*) info;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        types->setCount(3);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkOperand2::OpType* type = types->begin();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type[0] = type[1] = type[2] = SkOperand2::kS32;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool invoke(size_t ref, void* object, SkOpArray* params, SkOperand2* value)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SkMemberInfo* info = (const SkMemberInfo* ) ref;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable = (SkDisplayable*) object;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        displayable->executeFunction2(displayable, info->functionIndex(), params, info->getType(),
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            value);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return fEngine->evalMemberCommon(info, displayable, value);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript2* fEngine;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_NamedColor : public SkScriptCallBackProperty {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getConstValue(const char* name, int len, SkOperand2* value) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkParse::FindNamedColor(name, len, (SkColor*) &value->fS32) != NULL;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_RGB : public SkScriptCallBackFunction {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool getIndex(const char* name, int len, size_t* result) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (SK_LITERAL_STR_EQUAL("rgb", name, len) != 0)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *result = 0;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        types->setCount(3);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkOperand2::OpType* type = types->begin();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type[0] = type[1] = type[2] = SkOperand2::kS32;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool invoke(size_t index, SkOpArray* params, SkOperand2* answer) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkASSERT(index == 0);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned result = 0xFF000000;
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        int shift = 16;
291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        for (int index = 0; index < 3; index++) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            result |= SkClampMax(params->begin()[index].fS32, 255) << shift;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            shift -= 8;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        answer->fS32 = result;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkAnimatorScript_Unbox : public SkScriptCallBackConvert {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript_Unbox(SkAnimatorScript2* engine) : fEngine(engine) {}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool convert(SkOperand2::OpType type, SkOperand2* operand) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkASSERT(type == SkOperand2::kObject);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable = (SkDisplayable*) operand->fObject;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (displayable->getType()) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Array: {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayArray* boxedValue = (SkDisplayArray*) displayable;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fArray = new SkOpArray(SkAnimatorScript2::ToOpType(boxedValue->values.getType()));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int count = boxedValue->values.count();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fArray->setCount(count);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                memcpy(operand->fArray->begin(), boxedValue->values.begin(), count * sizeof(SkOperand2));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                fEngine->track(operand->fArray);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Boolean: {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayBoolean* boxedValue = (SkDisplayBoolean*) displayable;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fS32 = boxedValue->value;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Int: {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayInt* boxedValue = (SkDisplayInt*) displayable;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fS32 = boxedValue->value;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                } break;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Float: {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayFloat* boxedValue = (SkDisplayFloat*) displayable;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fScalar = boxedValue->value;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_String: {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayString* boxedValue = (SkDisplayString*) displayable;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fString = SkNEW_ARGS(SkString, (boxedValue->value));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                } break;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default: {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const char* id;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                bool success = fEngine->getMaker().findKey(displayable, &id);
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                SkASSERT(success);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                operand->fString = SkNEW_ARGS(SkString, (id));
339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            }
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        }
341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        return true;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual SkOperand2::OpType getReturnType(int /*index*/, SkOperand2* operand) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable = (SkDisplayable*) operand->fObject;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (displayable->getType()) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Array:
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return SkOperand2::kArray;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Int:
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return SkOperand2::kS32;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_Float:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return SkOperand2::kScalar;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkType_String:
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                return SkOperand2::kString;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual Type getType() const {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return kUnbox;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimatorScript2* fEngine;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkAnimatorScript2::SkAnimatorScript2(SkAnimateMaker& maker, SkDisplayable* working, SkDisplayTypes type) :
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkScriptEngine2(ToOpType(type)), fMaker(maker), fWorking(working) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fCallBackArray.append() = new SkAnimatorScript_Member(this);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fCallBackArray.append() = new SkAnimatorScript_MemberFunction(this);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fCallBackArray.append() = new SkAnimatorScript_Box();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fCallBackArray.append() = new SkAnimatorScript_Unbox(this);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fCallBackArray.append() = new SkAnimatorScript_ID(this);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == SkType_ARGB) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *fCallBackArray.append() = new SkAnimatorScript_RGB();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *fCallBackArray.append() = new SkAnimatorScript_NamedColor();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SkDisplayType::IsEnum(&maker, type)) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // !!! for SpiderMonkey, iterate through the enum values, and map them to globals
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const SkDisplayEnumMap& map = GetEnumValues(type);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *fCallBackArray.append() = new SkAnimatorScript_Enum(map.fValues);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *fCallBackArray.append() = new SkAnimatorScript_Eval(this);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0        // !!! no extra support for now
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (SkExtras** extraPtr = maker.fExtras.begin(); extraPtr < maker.fExtras.end(); extraPtr++) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkExtras* extra = *extraPtr;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (extra->fExtraCallBack)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *fCallBackArray.append() = new propertyCallBack(extra->fExtraCallBack, extra->fExtraStorage);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkAnimatorScript2::~SkAnimatorScript2() {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkScriptCallBack** end = fCallBackArray.end();
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (SkScriptCallBack** ptr = fCallBackArray.begin(); ptr < end; ptr++)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete *ptr;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SkAnimatorScript2::evalMemberCommon(const SkMemberInfo* info,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkDisplayable* displayable, SkOperand2* value) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkDisplayTypes original;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkDisplayTypes type = original = (SkDisplayTypes) info->getType();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (info->fType == SkType_Array)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type = SkType_Array;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_ARGB:
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            type = SkType_Int;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Boolean:
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Int:
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_MSec:
4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        case SkType_Float:
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT(info->getCount() == 1);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (info->fType != SkType_MemberProperty && info->fType != SkType_MemberFunction)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value->fS32 = *(int32_t*) info->memberData(displayable);    // OK for SkScalar too
4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            if (type == SkType_MSec) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value->fScalar = SkScalarDiv((SkScalar) value->fS32, 1000); // dividing two ints is the same as dividing two scalars
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                type = SkType_Float;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_String: {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkString* displayableString;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (info->fType != SkType_MemberProperty && info->fType != SkType_MemberFunction) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                info->getString(displayable, &displayableString);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                value->fString = new SkString(*displayableString);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } break;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Array: {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT(info->fType != SkType_MemberProperty); // !!! incomplete
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkTDOperandArray* displayableArray = (SkTDOperandArray*) info->memberData(displayable);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (displayable->getType() == SkType_Array) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkDisplayArray* typedArray = (SkDisplayArray*) displayable;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                original = typedArray->values.getType();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT(original != SkType_Unknown);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkOpArray* array = value->fArray = new SkOpArray(ToOpType(original));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            track(array);
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            int count = displayableArray->count();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (count > 0) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                array->setCount(count);
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                memcpy(array->begin(), displayableArray->begin(), count * sizeof(SkOperand2));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            } break;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT(0); // unimplemented
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkDisplayEnumMap& SkAnimatorScript2::GetEnumValues(SkDisplayTypes type) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index = SkTSearch<SkDisplayTypes>(&gEnumMaps[0].fType, gEnumMapCount, type,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sizeof(SkDisplayEnumMap));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkASSERT(index >= 0);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gEnumMaps[index];
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkDisplayTypes SkAnimatorScript2::ToDisplayType(SkOperand2::OpType type) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val = type;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (val) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkOperand2::kNoType:
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_Unknown;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkOperand2::kS32:
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_Int;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkOperand2::kScalar:
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_Float;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkOperand2::kString:
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_String;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkOperand2::kArray:
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_Array;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkOperand2::kObject:
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_Displayable;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT(0);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkType_Unknown;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkOperand2::OpType SkAnimatorScript2::ToOpType(SkDisplayTypes type) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SkDisplayType::IsDisplayable(NULL /* fMaker */, type))
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkOperand2::kObject;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (SkDisplayType::IsEnum(NULL /* fMaker */, type))
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return SkOperand2::kS32;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_ARGB:
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_MSec:
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Int:
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkOperand2::kS32;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Float:
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Point:
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_3D_Point:
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkOperand2::kScalar;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Base64:
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_DynamicString:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_String:
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkOperand2::kString;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Array:
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkOperand2::kArray;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case SkType_Unknown:
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkOperand2::kNoType;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT(0);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return SkOperand2::kNoType;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SkAnimatorScript2::MapEnums(const char* ptr, const char* match, size_t len, int* value) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int index = 0;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool more = true;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char* last = strchr(ptr, '|');
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (last == NULL) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            last = &ptr[strlen(ptr)];
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            more = false;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        size_t length = last - ptr;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (len == length && strncmp(ptr, match, length) == 0) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *value = index;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return true;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        index++;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ptr = last + 1;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while (more);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined SK_DEBUG
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkAnimator.h"
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char scriptTestSetup[]  =
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"<screenplay>"
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<apply>"
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<paint>"
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<emboss id='emboss' direction='[1,1,1]'  />"
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "</paint>"
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<animateField id='animation' field='direction' target='emboss' from='[1,1,1]' to='[-1,1,1]' dur='1'/>"
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<set lval='direction[0]' target='emboss' to='-1' />"
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "</apply>"
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<color id='testColor' color='0 ? rgb(0,0,0) : rgb(255,255,255)' />"
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<color id='xColor' color='rgb(12,34,56)' />"
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<typedArray id='emptyArray' />"
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "<typedArray id='intArray' values='[1, 4, 6]' />"
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "<s32 id='idx' value='2' />"
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "<s32 id='idy' value='2' />"
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "<string id='alpha' value='abc' />"
544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "<rectangle id='testRect' left='Math.cos(0)' top='2' right='12' bottom='5' />"
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "<event id='evt'>"
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<input name='x' />"
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "<apply scope='idy'>"
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "<set field='value' to='evt.x.s32' />"
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "</apply>"
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</event>"
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"</screenplay>";
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SkScriptNAnswer scriptTests[]  = {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha+alpha", SkType_String, 0, 0, "abcabc" },
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? Math.sin(0) : 1", SkType_Int, 1 },
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "intArray[4]", SkType_Unknown },
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "emptyArray[4]", SkType_Unknown },
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "idx", SkType_Int, 2 },
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "intArray.length", SkType_Int, 3 },
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "intArray.values[0]", SkType_Int, 1 },
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "intArray[0]", SkType_Int, 1 },
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "idx.value", SkType_Int, 2 },
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha.value", SkType_String, 0, 0, "abc" },
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha", SkType_String, 0, 0, "abc" },
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha.value+alpha.value", SkType_String, 0, 0, "abcabc" },
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha+idx", SkType_String, 0, 0, "abc2" },
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "idx+alpha", SkType_String, 0, 0, "2abc" },
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "intArray[idx]", SkType_Int, 6 },
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha.slice(1,2)", SkType_String, 0, 0, "b" },
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "alpha.value.slice(1,2)", SkType_String, 0, 0, "b" },
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "Math.sin(0)", SkType_Float, 0, SkIntToScalar(0) },
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "testRect.left+2", SkType_Float, 0, SkIntToScalar(3) },
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? intArray[0] : 1", SkType_Int, 1 },
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? intArray.values[0] : 1", SkType_Int, 1 },
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? idx : 1", SkType_Int, 1 },
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? idx.value : 1", SkType_Int, 1 },
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? alpha.slice(1,2) : 1", SkType_Int, 1 },
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {    "0 ? alpha.value.slice(1,2) : 1", SkType_Int, 1 },
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "idy", SkType_Int, 3 }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SkScriptNAnswer_testCount    SK_ARRAY_COUNT(scriptTests)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SkAnimatorScript2::UnitTest() {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SK_SUPPORT_UNITTEST)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAnimator animator;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkASSERT(animator.decodeMemory(scriptTestSetup, sizeof(scriptTestSetup)-1));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkEvent evt;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    evt.setString("id", "evt");
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    evt.setS32("x", 3);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    animator.doUserEvent(evt);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // set up animator with memory script above, then run value tests
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int index = 0; index < SkScriptNAnswer_testCount; index++) {
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkAnimatorScript2 engine(*animator.fMaker, NULL, scriptTests[index].fType);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkScriptValue2 value;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char* script = scriptTests[index].fScript;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool success = engine.evaluateScript(&script, &value);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (success == false) {
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            SkASSERT(scriptTests[index].fType == SkType_Unknown);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            continue;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkASSERT(value.fType == ToOpType(scriptTests[index].fType));
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkScalar error;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switch (value.fType) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kS32:
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                SkASSERT(value.fOperand.fS32 == scriptTests[index].fIntAnswer);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            case SkOperand2::kScalar:
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                error = SkScalarAbs(value.fOperand.fScalar - scriptTests[index].fScalarAnswer);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkASSERT(error < SK_Scalar1 / 10000);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                break;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            case SkOperand2::kString:
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkASSERT(value.fOperand.fString->equals(scriptTests[index].fStringAnswer));
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                break;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            default:
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                SkASSERT(0);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)