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)