180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimatorScript.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateBase.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateMaker.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayTypes.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkExtras.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMemberInfo.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkParse.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkDisplayEnumMap gEnumMaps[] = { 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_AddMode, "indirect|immediate" }, 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_Align, "left|center|right" }, 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_ApplyMode, "create|immediate|once" }, 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_ApplyTransition, "normal|reverse" }, 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_BitmapEncoding, "jpeg|png" }, 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_BitmapFormat, "none|A1|A8|Index8|RGB16|RGB32" }, 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_Boolean, "false|true" }, 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_Cap, "butt|round|square" }, 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_EventCode, "none|leftSoftKey|rightSoftKey|home|back|send|end|key0|key1|key2|key3|key4|key5|key6|key7|key8|key9|star|hash|up|down|left|right|OK|volUp|volDown|camera" }, 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_EventKind, "none|keyChar|keyPress|keyPressUp|mouseDown|mouseDrag|mouseMove|mouseUp|onEnd|onLoad|user" }, 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_EventMode, "deferred|immediate" }, 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_FillType, "winding|evenOdd" }, 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_FilterType, "none|bilinear" }, 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_FontStyle, "normal|bold|italic|boldItalic" }, 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_FromPathMode, "normal|angle|position" }, 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_Join, "miter|round|blunt" }, 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_MaskFilterBlurStyle, "normal|solid|outer|inner" }, 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_PathDirection, "cw|ccw" }, 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_Style, "fill|stroke|strokeAndFill" }, 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_TextBoxAlign, "start|center|end" }, 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_TextBoxMode, "oneLine|lineBreak" }, 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_TileMode, "clamp|repeat|mirror" }, 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { SkType_Xfermode, "clear|src|dst|srcOver|dstOver|srcIn|dstIn|srcOut|dstOut|" 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "srcATop|dstATop|xor|darken|lighten" }, 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic int gEnumMapCount = SK_ARRAY_COUNT(gEnumMaps); 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAnimatorScript::SkAnimatorScript(SkAnimateMaker& maker, SkDisplayable* working, SkDisplayTypes type) 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : SkScriptEngine(SkScriptEngine::ToOpType(type)), fMaker(maker), fParent(NULL), fWorking(working) 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru memberCallBack(EvalMember, (void*) this); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru memberFunctionCallBack(EvalMemberFunction, (void*) this); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru boxCallBack(Box, (void*) this); 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru unboxCallBack(Unbox, (void*) &maker); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru propertyCallBack(EvalID, (void*) this); // must be first (entries are prepended, will be last), since it never fails 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru propertyCallBack(Infinity, (void*) this); 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru propertyCallBack(NaN, (void*) this); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru functionCallBack(Eval, (void*) this); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru functionCallBack(IsFinite, (void*) this); 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru functionCallBack(IsNaN, (void*) this); 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (type == SkType_ARGB) { 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru functionCallBack(EvalRGB, (void*) this); 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru propertyCallBack(EvalNamedColor, (void*) &maker.fIDs); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SkDisplayType::IsEnum(&maker, type)) { 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // !!! for SpiderMonkey, iterate through the enum values, and map them to globals 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkDisplayEnumMap& map = GetEnumValues(type); 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru propertyCallBack(EvalEnum, (void*) map.fValues); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (SkExtras** extraPtr = maker.fExtras.begin(); extraPtr < maker.fExtras.end(); extraPtr++) { 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkExtras* extra = *extraPtr; 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (extra->fExtraCallBack) 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru propertyCallBack(extra->fExtraCallBack, extra->fExtraStorage); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAnimatorScript::~SkAnimatorScript() { 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (SkDisplayable** dispPtr = fTrackDisplayable.begin(); dispPtr < fTrackDisplayable.end(); dispPtr++) 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru delete *dispPtr; 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::evaluate(const char* original, SkScriptValue* result, SkDisplayTypes type) { 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* script = original; 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = evaluateScript(&script, result); 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success == false || result->fType != type) { 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fMaker.setScriptError(*this); 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::Box(void* user, SkScriptValue* scriptValue) { 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript* engine = (SkAnimatorScript*) user; 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayTypes type = scriptValue->fType; 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable; 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (type) { 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Array: { 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayArray* boxedValue = new SkDisplayArray(*scriptValue->fOperand.fArray); 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable = boxedValue; 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Boolean: { 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayBoolean* boxedValue = new SkDisplayBoolean; 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable = boxedValue; 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru boxedValue->value = !! scriptValue->fOperand.fS32; 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Int: { 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayInt* boxedValue = new SkDisplayInt; 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable = boxedValue; 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru boxedValue->value = scriptValue->fOperand.fS32; 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Float: { 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayFloat* boxedValue = new SkDisplayFloat; 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable = boxedValue; 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru boxedValue->value = scriptValue->fOperand.fScalar; 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_String: { 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayString* boxedValue = new SkDisplayString(*scriptValue->fOperand.fString); 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable = boxedValue; 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Displayable: 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fObject = scriptValue->fOperand.fDisplayable; 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fType = SkType_Displayable; 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru default: 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru engine->track(displayable); 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fObject = displayable; 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fType = SkType_Displayable; 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::Eval(const char* function, size_t len, SkTDArray<SkScriptValue>& params, 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void* eng, SkScriptValue* value) { 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL("eval", function, len) == false) 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (params.count() != 1) 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript* host = (SkAnimatorScript*) eng; 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(host->fMaker, host->fWorking, SkScriptEngine::ToDisplayType(host->fReturnType)); 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue* scriptValue = params.begin(); 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = true; 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (scriptValue->fType == SkType_String) { 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* script = scriptValue->fOperand.fString->c_str(); 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru success = engine.evaluateScript(&script, value); 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *value = *scriptValue; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return success; 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalEnum(const char* token, size_t len, void* callBack, SkScriptValue* value) { 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* tokens = (const char*) callBack; 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Int; 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (MapEnums(tokens, token, len, (int*)&value->fOperand.fS32)) 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalID(const char* token, size_t len, void* user, SkScriptValue* value) { 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript* engine = (SkAnimatorScript*) user; 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTDict<SkDisplayable*>* ids = &engine->fMaker.fIDs; 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable; 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = ids->find(token, len, &displayable); 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success == false) { 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable = engine->fWorking; 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL("parent", token, len)) { 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* parent = displayable->getParent(); 16858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (parent == NULL) 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parent = engine->fParent; 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (parent) { 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fDisplayable = parent; 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Displayable; 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (displayable && EvalMember(token, len, displayable, engine, value)) 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fString = NULL; 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_String; 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* working = engine->fWorking; 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fDisplayable = displayable; 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Displayable; 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (displayable->canContainDependents() && working && working->isAnimate()) { 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimateBase* animator = (SkAnimateBase*) working; 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (animator->isDynamic()) { 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayDepend* depend = (SkDisplayDepend* ) displayable; 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru depend->addDependent(working); 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalNamedColor(const char* token, size_t len, void* callback, SkScriptValue* value) { 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Int; 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SkParse::FindNamedColor(token, len, (SkColor*) &value->fOperand.fS32) != NULL) 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalRGB(const char* function, size_t len, SkTDArray<SkScriptValue>& params, 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void* eng, SkScriptValue* value) { 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL("rgb", function, len) == false) 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (params.count() != 3) 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptEngine* engine = (SkScriptEngine*) eng; 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru unsigned result = 0xFF000000; 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int shift = 16; 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (SkScriptValue* valuePtr = params.begin(); valuePtr < params.end(); valuePtr++) { 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru engine->convertTo(SkType_Int, valuePtr); 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru result |= SkClampMax(valuePtr->fOperand.fS32, 255) << shift; 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shift -= 8; 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fS32 = result; 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Int; 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalMemberCommon(SkScriptEngine* engine, const SkMemberInfo* info, 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable, SkScriptValue* value) { 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayTypes original; 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayTypes type = original = (SkDisplayTypes) info->getType(); 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (info->fType == SkType_Array) 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru type = SkType_Array; 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (type) { 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_ARGB: 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru type = SkType_Int; 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Boolean: 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Int: 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_MSec: 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Float: 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(info->getCount() == 1); 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (info->fType != SkType_MemberProperty && info->fType != SkType_MemberFunction) 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fS32 = *(int32_t*) info->memberData(displayable); // OK for SkScalar too 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (type == SkType_MSec) { 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fScalar = SkScalarDiv((SkScalar) value->fOperand.fS32, 1000); // dividing two ints is the same as dividing two scalars 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru type = SkType_Float; 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_String: { 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString* displayableString; 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (info->fType != SkType_MemberProperty && info->fType != SkType_MemberFunction) { 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru info->getString(displayable, &displayableString); 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fString = new SkString(*displayableString); 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Array: { 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(info->fType != SkType_MemberProperty); // !!! incomplete 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTDOperandArray* displayableArray = (SkTDOperandArray*) info->memberData(displayable); 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (displayable->getType() == SkType_Array) { 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayArray* typedArray = (SkDisplayArray*) displayable; 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru original = typedArray->values.getType(); 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(original != SkType_Unknown); 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTypedArray* array = value->fOperand.fArray = new SkTypedArray(original); 25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru engine->track(array); 25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int count = displayableArray->count(); 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (count > 0) { 26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru array->setCount(count); 26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru memcpy(array->begin(), displayableArray->begin(), count * sizeof(SkOperand)); 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru default: 26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); // unimplemented 26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = type; 26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalMember(const char* member, size_t len, void* object, void* eng, 27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue* value) { 27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptEngine* engine = (SkScriptEngine*) eng; 27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable = (SkDisplayable*) object; 27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString name(member, len); 27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* named = displayable->contains(name); 27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (named) { 27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fDisplayable = named; 28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Displayable; 28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkMemberInfo* info = displayable->getMember(name.c_str()); 28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (info == NULL) 28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (info->fType == SkType_MemberProperty) { 28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (displayable->getProperty(info->propertyIndex(), value) == false) { 28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return EvalMemberCommon(engine, info, displayable, value); 29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvalMemberFunction(const char* member, size_t len, void* object, 29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTDArray<SkScriptValue>& params, void* eng, SkScriptValue* value) { 29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptEngine* engine = (SkScriptEngine*) eng; 29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable = (SkDisplayable*) object; 29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString name(member, len); 30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkMemberInfo* info = displayable->getMember(name.c_str()); 30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(info != NULL); /* !!! error handling unimplemented */ 30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (info->fType != SkType_MemberFunction) { 30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru displayable->executeFunction(displayable, info->functionIndex(), params, info->getType(), 30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value); 30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return EvalMemberCommon(engine, info, displayable, value); 30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvaluateDisplayable(SkAnimateMaker& maker, SkDisplayable* displayable, const char* script, SkDisplayable** result) { 31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(maker, displayable, SkType_Displayable); 31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue value; 31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = engine.evaluate(script, &value, SkType_Displayable); 31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success) 31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *result = value.fOperand.fDisplayable; 31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return success; 31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvaluateInt(SkAnimateMaker& maker, SkDisplayable* displayable, const char* script, int32_t* result) { 32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(maker, displayable, SkType_Int); 32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue value; 32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = engine.evaluate(script, &value, SkType_Int); 32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success) 32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *result = value.fOperand.fS32; 32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return success; 32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvaluateFloat(SkAnimateMaker& maker, SkDisplayable* displayable, const char* script, SkScalar* result) { 33080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(maker, displayable, SkType_Float); 33180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue value; 33280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = engine.evaluate(script, &value, SkType_Float); 33380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success) 33480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *result = value.fOperand.fScalar; 33580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return success; 33680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 33780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 33880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvaluateString(SkAnimateMaker& maker, SkDisplayable* displayable, const char* script, SkString* result) { 33980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(maker, displayable, SkType_String); 34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue value; 34180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = engine.evaluate(script, &value, SkType_String); 34280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success) 34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru result->set(*(value.fOperand.fString)); 34480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return success; 34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 34680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 34780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::EvaluateString(SkAnimateMaker& maker, SkDisplayable* displayable, SkDisplayable* parent, const char* script, SkString* result) { 34880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(maker, displayable, SkType_String); 34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru engine.fParent = parent; 35080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue value; 35180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = engine.evaluate(script, &value, SkType_String); 35280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success) 35380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru result->set(*(value.fOperand.fString)); 35480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return success; 35580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 35780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkDisplayEnumMap& SkAnimatorScript::GetEnumValues(SkDisplayTypes type) { 35880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int index = SkTSearch<SkDisplayTypes>(&gEnumMaps[0].fType, gEnumMapCount, type, 35980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sizeof(SkDisplayEnumMap)); 36080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(index >= 0); 36180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return gEnumMaps[index]; 36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 36380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 36480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::Infinity(const char* token, size_t len, void* user, SkScriptValue* value) { 36580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL("Infinity", token, len) == false) 36680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 36780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Float; 36880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fScalar = SK_ScalarInfinity; 36980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 37080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 37180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 37280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::IsFinite(const char* function, size_t len, SkTDArray<SkScriptValue>& params, 37380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void* eng, SkScriptValue* value) { 37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL(function, "isFinite", len) == false) 37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (params.count() != 1) 37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue* scriptValue = params.begin(); 37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayTypes type = scriptValue->fType; 38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar scalar = scriptValue->fOperand.fScalar; 38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Int; 38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fS32 = type == SkType_Float ? SkScalarIsNaN(scalar) == false && 38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalarAbs(scalar) != SK_ScalarInfinity : type == SkType_Int; 38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::IsNaN(const char* function, size_t len, SkTDArray<SkScriptValue>& params, 38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void* eng, SkScriptValue* value) { 38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL("isNaN", function, len) == false) 39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (params.count() != 1) 39280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 39380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue* scriptValue = params.begin(); 39480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Int; 39580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fS32 = scriptValue->fType == SkType_Float ? SkScalarIsNaN(scriptValue->fOperand.fScalar) : 0; 39680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 39780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 39880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 39980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::MapEnums(const char* ptr, const char* match, size_t len, int* value) { 40080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int index = 0; 40180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool more = true; 40280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru do { 40380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* last = strchr(ptr, '|'); 40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (last == NULL) { 40580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru last = &ptr[strlen(ptr)]; 40680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru more = false; 40780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 40880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru size_t length = last - ptr; 40980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (len == length && strncmp(ptr, match, length) == 0) { 41080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *value = index; 41180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 41280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 41380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru index++; 41480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ptr = last + 1; 41580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } while (more); 41680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 41780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 41880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 41980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::NaN(const char* token, size_t len, void* user, SkScriptValue* value) { 42080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (SK_LITERAL_STR_EQUAL("NaN", token, len) == false) 42180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 42280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_Float; 42380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fScalar = SK_ScalarNaN; 42480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 42580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 42680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 42780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if 0 42880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::ObjectToString(void* object, void* user, SkScriptValue* value) { 42980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTDict<SkDisplayable*>* ids = (SkTDict<SkDisplayable*>*) user; 43080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable = (SkDisplayable*) object; 43180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* key; 43280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = ids->findKey(displayable, &key); 43380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success == false) 43480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 43580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fOperand.fString = new SkString(key); 43680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru value->fType = SkType_String; 43780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 43880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 43980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 44080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 44180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkAnimatorScript::Unbox(void* m, SkScriptValue* scriptValue) { 44280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimateMaker* maker = (SkAnimateMaker*) m; 44380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT((unsigned) scriptValue->fType == (unsigned) SkType_Displayable); 44480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayable* displayable = (SkDisplayable*) scriptValue->fOperand.fObject; 44580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayTypes type = displayable->getType(); 44680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (displayable->getType()) { 44780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Array: { 44880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayArray* boxedValue = (SkDisplayArray*) displayable; 44980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fArray = &boxedValue->values; 45080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 45180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Boolean: { 45280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayBoolean* boxedValue = (SkDisplayBoolean*) displayable; 45380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fS32 = boxedValue->value; 45480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 45580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Int: { 45680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayInt* boxedValue = (SkDisplayInt*) displayable; 45780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fS32 = boxedValue->value; 45880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 45980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Float: { 46080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayFloat* boxedValue = (SkDisplayFloat*) displayable; 46180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fScalar = boxedValue->value; 46280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 46380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_String: { 46480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDisplayString* boxedValue = (SkDisplayString*) displayable; 46580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fString = SkNEW_ARGS(SkString, (boxedValue->value)); 46680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } break; 46780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru default: { 46880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* id = NULL; 469d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkDEBUGCODE(bool success = ) maker->findKey(displayable, &id); 47080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(success); 47180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fOperand.fString = SkNEW_ARGS(SkString, (id)); 47280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru type = SkType_String; 47380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 47480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 47580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru scriptValue->fType = type; 47680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 47780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 47880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 47980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined SK_SUPPORT_UNITTEST 48080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 48180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimator.h" 48280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 48380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char scriptTestSetup[] = 48480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru"<screenplay>\n" 48580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<text id='label' text='defg'/>\n" 48680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<add id='addLabel' use='label'/>\n" 48780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<text id='text1' text='test'/>\n" 48880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<apply scope='addLabel'>\n" 48980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<set target='label' field='text' to='#script:text1.text'/>\n" 49080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "</apply>\n" 49180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<apply>\n" 49280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<paint id='labelPaint'>\n" 49380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<emboss id='emboss' direction='[1,1,1]' />\n" 49480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "</paint>\n" 49580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<animate id='animation' field='direction' target='emboss' from='[1,1,1]' to='[-1,1,1]' dur='1'/>\n" 49680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<set lval='direction[0]' target='emboss' to='-1' />\n" 49780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "</apply>\n" 49880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<color id='testColor' color='0 ? rgb(0,0,0) : rgb(255,255,255)' />\n" 49980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<color id='xColor' color='rgb(12,34,56)' />\n" 50080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<array id='emptyArray' />\n" 50180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<array id='intArray' values='[1, 4, 6]' />\n" 50280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<int id='idx' value='2' />\n" 50380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<int id='idy' value='2' />\n" 50480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<string id='alpha' value='abc' />\n" 50580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<rect id='testRect' left='Math.cos(0)' top='2' right='12' bottom='5' />\n" 50680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<event id='evt'>\n" 50780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<input name='x' />\n" 50880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<apply scope='idy'>\n" 50980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "<set field='value' to='evt.x.int' />\n" 51080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "</apply>\n" 51180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "</event>\n" 51280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru"</screenplay>"; 51380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 51480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define DEFAULT_ANSWER , 0 51580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 51680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkScriptNAnswer scriptTests[] = { 51780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "label.text.length == 4", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 51880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// { "labelPaint.measureText(label.text) > 0 ? labelPaint.measureText(label.text)+10 : 40", SkType_Float, 0, SkIntToScalar(0x23) }, 51980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "Number.POSITIVE_INFINITY >= Number.MAX_VALUE ? 1 : 0", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 52080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "Infinity >= Number.MAX_VALUE ? 1 : 0", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 52180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "Number.NEGATIVE_INFINITY <= -Number.MAX_VALUE ? 1 : 0", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 52280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "Number.MIN_VALUE > 0 ? 1 : 0", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 52380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "isNaN(Number.NaN)", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 52480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "isNaN(NaN)", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 52580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "Math.sin(0)", SkType_Float, 0, SkIntToScalar(0) DEFAULT_ANSWER }, 52680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha+alpha", SkType_String, 0, 0, "abcabc" }, 52780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "intArray[4]", SkType_Unknown DEFAULT_ANSWER DEFAULT_ANSWER DEFAULT_ANSWER }, 52880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "emptyArray[4]", SkType_Unknown DEFAULT_ANSWER DEFAULT_ANSWER DEFAULT_ANSWER }, 52980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "idx", SkType_Int, 2 DEFAULT_ANSWER DEFAULT_ANSWER }, 53080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "intArray.length", SkType_Int, 3 DEFAULT_ANSWER DEFAULT_ANSWER }, 53180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "intArray.values[0]", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 53280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "intArray[0]", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 53380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "idx.value", SkType_Int, 2 DEFAULT_ANSWER DEFAULT_ANSWER }, 53480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha.value", SkType_String, 0, 0, "abc" }, 53580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha", SkType_String, 0, 0, "abc" }, 53680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha.value+alpha.value", SkType_String, 0, 0, "abcabc" }, 53780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha+idx", SkType_String, 0, 0, "abc2" }, 53880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "idx+alpha", SkType_String, 0, 0, "2abc" }, 53980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "intArray[idx]", SkType_Int, 6 DEFAULT_ANSWER DEFAULT_ANSWER }, 54080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha.slice(1,2)", SkType_String, 0, 0, "b" }, 54180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "alpha.value.slice(1,2)", SkType_String, 0, 0, "b" }, 54280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "testRect.left+2", SkType_Float, 0, SkIntToScalar(3) DEFAULT_ANSWER }, 54380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? Math.sin(0) : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 54480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? intArray[0] : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 54580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? intArray.values[0] : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 54680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? idx : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 54780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? idx.value : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 54880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? alpha.slice(1,2) : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 54980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "0 ? alpha.value.slice(1,2) : 1", SkType_Int, 1 DEFAULT_ANSWER DEFAULT_ANSWER }, 55080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru { "idy", SkType_Int, 3 DEFAULT_ANSWER DEFAULT_ANSWER } 55180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 55280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 55380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScriptNAnswer_testCount SK_ARRAY_COUNT(scriptTests) 55480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 55580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkAnimatorScript::UnitTest() { 55680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_SUPPORT_UNITTEST) 55780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimator animator; 55880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(animator.decodeMemory(scriptTestSetup, sizeof(scriptTestSetup)-1)); 55980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkEvent evt; 56080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru evt.setString("id", "evt"); 56180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru evt.setS32("x", 3); 56280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru animator.doUserEvent(evt); 56380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // set up animator with memory script above, then run value tests 56480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (unsigned index = 0; index < SkScriptNAnswer_testCount; index++) { 56580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAnimatorScript engine(*animator.fMaker, NULL, scriptTests[index].fType); 56680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScriptValue value; 56780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* script = scriptTests[index].fScript; 56880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool success = engine.evaluateScript(&script, &value); 56980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (success == false) { 57080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDebugf("script failed: %s\n", scriptTests[index].fScript); 57180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(scriptTests[index].fType == SkType_Unknown); 57280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru continue; 57380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 57480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(value.fType == scriptTests[index].fType); 57580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar error; 57680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (value.fType) { 57780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Int: 57880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(value.fOperand.fS32 == scriptTests[index].fIntAnswer); 57980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 58080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_Float: 58180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru error = SkScalarAbs(value.fOperand.fScalar - scriptTests[index].fScalarAnswer); 58280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(error < SK_Scalar1 / 10000); 58380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 58480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case SkType_String: 58580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(strcmp(value.fOperand.fString->c_str(), scriptTests[index].fStringAnswer) == 0); 58680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 58780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru default: 58880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 58980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 59080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 59180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 59280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 59380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 59480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 595