11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimatorScript2.h"
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateBase.h"
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayTypes.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkExtras.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMemberInfo.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkOpArray.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkParse.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript2.h"
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScriptCallBack.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic const SkDisplayEnumMap gEnumMaps[] = {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_AddMode, "indirect|immediate" },
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_Align, "left|center|right" },
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_ApplyMode, "immediate|once" },
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_ApplyTransition, "reverse" },
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_BitmapEncoding, "jpeg|png" },
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_BitmapFormat, "none|A1|A8|Index8|RGB16|RGB32" },
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_Boolean, "false|true" },
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_Cap, "butt|round|square" },
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ 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" },
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_EventKind, "none|keyChar|keyPress|mouseDown|mouseDrag|mouseMove|mouseUp|onEnd|onLoad|user" },
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_EventMode, "deferred|immediate" },
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_FillType, "winding|evenOdd" },
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_FilterType, "none|bilinear" },
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_FromPathMode, "normal|angle|position" },
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_Join, "miter|round|blunt" },
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_MaskFilterBlurStyle, "normal|solid|outer|inner" },
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_PathDirection, "cw|ccw" },
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_Style, "fill|stroke|strokeAndFill" },
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_TextBoxAlign, "start|center|end" },
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_TextBoxMode, "oneLine|lineBreak" },
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_TileMode, "clamp|repeat|mirror" },
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ SkType_Xfermode, "clear|src|dst|srcOver|dstOver|srcIn|dstIn|srcOut|dstOut|"
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"srcATop|dstATop|xor|darken|lighten" },
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic int gEnumMapCount = SK_ARRAY_COUNT(gEnumMaps);
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_Box : public SkScriptCallBackConvert {
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_Box() {}
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	~SkAnimatorScript_Box() {
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		for (SkDisplayable** dispPtr = fTrackDisplayable.begin(); dispPtr < fTrackDisplayable.end(); dispPtr++)
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			delete *dispPtr;
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool convert(SkOperand2::OpType type, SkOperand2* operand) {
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable;
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		switch (type) {
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kArray: {
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayArray* boxedValue = new SkDisplayArray(*operand->fArray);
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				displayable = boxedValue;
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kS32: {
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayInt* boxedValue = new SkDisplayInt;
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				displayable = boxedValue;
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				boxedValue->value = operand->fS32;
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kScalar: {
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayFloat* boxedValue = new SkDisplayFloat;
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				displayable = boxedValue;
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				boxedValue->value = operand->fScalar;
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kString: {
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayString* boxedValue = new SkDisplayString(*operand->fString);
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				displayable = boxedValue;
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kObject:
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return true;
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			default:
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkASSERT(0);
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return false;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		track(displayable);
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		operand->fObject = (void*) displayable;
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual SkOperand2::OpType getReturnType(int index) {
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return SkOperand2::kObject;
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual Type getType() const {
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return kBox;
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	void track(SkDisplayable* displayable) {
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkASSERT(fTrackDisplayable.find(displayable) < 0);
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*fTrackDisplayable.append() = displayable;
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkTDDisplayableArray fTrackDisplayable;
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_Enum : public SkScriptCallBackProperty {
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_Enum(const char* tokens) : fTokens(tokens) {}
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool getConstValue(const char* name, int len, SkOperand2* value) {
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return SkAnimatorScript2::MapEnums(fTokens, name, len, &value->fS32);
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	const char* fTokens;
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	// !!! if type is string, call invoke
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	// if any other type, return original value
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		// distinction is undone: could do this by returning index == 0 only if param is string
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		// still, caller of getParamTypes will attempt to convert param to string (I guess)
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_Eval : public SkScriptCallBackFunction {
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_Eval(SkAnimatorScript2* engine) : fEngine(engine) {}
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool getIndex(const char* name, int len, size_t* result) {
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (SK_LITERAL_STR_EQUAL("eval", name, len) != 0)
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return false;
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*result = 0;
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) {
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		types->setCount(1);
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkOperand2::OpType* type = types->begin();
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		type[0] = SkOperand2::kString;
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool invoke(size_t index, SkOpArray* params, SkOperand2* answer) {
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkAnimatorScript2 engine(fEngine->getMaker(), fEngine->getWorking(),
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkAnimatorScript2::ToDisplayType(fEngine->getReturnType()));
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkOperand2* op = params->begin();
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const char* script = op->fString->c_str();
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkScriptValue2 value;
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return engine.evaluateScript(&script, &value);
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkASSERT(value.fType == fEngine->getReturnType());
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*answer = value.fOperand;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		// !!! incomplete ?
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript2* fEngine;
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_ID : public SkScriptCallBackProperty {
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_ID(SkAnimatorScript2* engine) : fEngine(engine) {}
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool getIndex(const char* token, int len, size_t* result) {
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable;
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		bool success = fEngine->getMaker().find(token, len, &displayable);
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (success == false) {
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			*result = 0;
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		} else {
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			*result = (size_t) displayable;
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkDisplayable* working = fEngine->getWorking();
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (displayable->canContainDependents() && working && working->isAnimate()) {
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkAnimateBase* animator = (SkAnimateBase*) working;
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				if (animator->isDynamic()) {
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project					SkDisplayDepend* depend = (SkDisplayDepend* ) displayable;
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project					depend->addDependent(working);
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				}
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool getResult(size_t ref, SkOperand2* answer) {
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		answer->fObject = (void*) ref;
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual SkOperand2::OpType getReturnType(size_t index) {
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return index == 0 ? SkOperand2::kString : SkOperand2::kObject;
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript2* fEngine;
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_Member : public SkScriptCallBackMember {
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_Member(SkAnimatorScript2* engine) : fEngine(engine) {}
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	bool getMemberReference(const char* member, size_t len, void* object, SkScriptValue2* ref) {
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable = (SkDisplayable*) object;
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkString name(member, len);
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* named = displayable->contains(name);
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (named) {
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			ref->fType = SkOperand2::kObject;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			ref->fOperand.fObject = named;
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return true;
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const SkMemberInfo* info = displayable->getMember(name.c_str());
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (info == NULL)
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return false;	// !!! add additional error info?
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		ref->fType = SkAnimatorScript2::ToOpType(info->getType());
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		ref->fOperand.fObject = (void*) info;
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	bool invoke(size_t ref, void* object, SkOperand2* value) {
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const SkMemberInfo* info = (const SkMemberInfo* ) ref;
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable = (SkDisplayable*) object;
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (info->fType == SkType_MemberProperty) {
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (displayable->getProperty2(info->propertyIndex(), value) == false) {
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return false;
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return fEngine->evalMemberCommon(info, displayable, value);
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript2* fEngine;
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_MemberFunction : public SkScriptCallBackMemberFunction {
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_MemberFunction(SkAnimatorScript2* engine) : fEngine(engine) {}
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	bool getMemberReference(const char* member, size_t len, void* object, SkScriptValue2* ref) {
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable = (SkDisplayable*) object;
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkString name(member, len);
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const SkMemberInfo* info = displayable->getMember(name.c_str());
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (info == NULL || info->fType != SkType_MemberFunction)
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return false;	// !!! add additional error info?
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		ref->fType = SkAnimatorScript2::ToOpType(info->getType());
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		ref->fOperand.fObject = (void*) info;
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) {
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		types->setCount(3);
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkOperand2::OpType* type = types->begin();
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		type[0] = type[1] = type[2] = SkOperand2::kS32;
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	bool invoke(size_t ref, void* object, SkOpArray* params, SkOperand2* value)
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const SkMemberInfo* info = (const SkMemberInfo* ) ref;
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable = (SkDisplayable*) object;
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		displayable->executeFunction2(displayable, info->functionIndex(), params, info->getType(),
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			value);
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return fEngine->evalMemberCommon(info, displayable, value);
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript2* fEngine;
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_NamedColor : public SkScriptCallBackProperty {
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool getConstValue(const char* name, int len, SkOperand2* value) {
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return SkParse::FindNamedColor(name, len, (SkColor*) &value->fS32) != NULL;
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_RGB : public SkScriptCallBackFunction {
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool getIndex(const char* name, int len, size_t* result) {
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (SK_LITERAL_STR_EQUAL("rgb", name, len) != 0)
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return false;
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*result = 0;
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) {
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		types->setCount(3);
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkOperand2::OpType* type = types->begin();
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		type[0] = type[1] = type[2] = SkOperand2::kS32;
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool invoke(size_t index, SkOpArray* params, SkOperand2* answer) {
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkASSERT(index == 0);
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		unsigned result = 0xFF000000;
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		int shift = 16;
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		for (int index = 0; index < 3; index++) {
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			result |= SkClampMax(params->begin()[index].fS32, 255) << shift;
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			shift -= 8;
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		answer->fS32 = result;
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkAnimatorScript_Unbox : public SkScriptCallBackConvert {
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript_Unbox(SkAnimatorScript2* engine) : fEngine(engine) {}
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual bool convert(SkOperand2::OpType type, SkOperand2* operand) {
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkASSERT(type == SkOperand2::kObject);
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable = (SkDisplayable*) operand->fObject;
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		switch (displayable->getType()) {
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Array: {
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayArray* boxedValue = (SkDisplayArray*) displayable;
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fArray = new SkOpArray(SkAnimatorScript2::ToOpType(boxedValue->values.getType()));
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				int count = boxedValue->values.count();
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fArray->setCount(count);
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				memcpy(operand->fArray->begin(), boxedValue->values.begin(), count * sizeof(SkOperand2));
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				fEngine->track(operand->fArray);
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Boolean: {
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayBoolean* boxedValue = (SkDisplayBoolean*) displayable;
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fS32 = boxedValue->value;
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Int: {
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayInt* boxedValue = (SkDisplayInt*) displayable;
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fS32 = boxedValue->value;
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Float: {
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayFloat* boxedValue = (SkDisplayFloat*) displayable;
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fScalar = boxedValue->value;
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_String: {
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayString* boxedValue = (SkDisplayString*) displayable;
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fString = SkNEW_ARGS(SkString, (boxedValue->value));
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				} break;
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			default: {
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				const char* id;
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				bool success = fEngine->getMaker().findKey(displayable, &id);
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkASSERT(success);
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				operand->fString = SkNEW_ARGS(SkString, (id));
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return true;
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual SkOperand2::OpType getReturnType(int /*index*/, SkOperand2* operand) {
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable = (SkDisplayable*) operand->fObject;
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		switch (displayable->getType()) {
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Array:
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return SkOperand2::kArray;
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Int:
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return SkOperand2::kS32;
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_Float:
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return SkOperand2::kScalar;
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkType_String:
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			default:
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				return SkOperand2::kString;
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	virtual Type getType() const {
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return kUnbox;
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimatorScript2* fEngine;
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkAnimatorScript2::SkAnimatorScript2(SkAnimateMaker& maker, SkDisplayable* working, SkDisplayTypes type) :
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkScriptEngine2(ToOpType(type)), fMaker(maker), fWorking(working) {
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	*fCallBackArray.append() = new SkAnimatorScript_Member(this);
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	*fCallBackArray.append() = new SkAnimatorScript_MemberFunction(this);
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	*fCallBackArray.append() = new SkAnimatorScript_Box();
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	*fCallBackArray.append() = new SkAnimatorScript_Unbox(this);
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	*fCallBackArray.append() = new SkAnimatorScript_ID(this);
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	if (type == SkType_ARGB) {
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*fCallBackArray.append() = new SkAnimatorScript_RGB();
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*fCallBackArray.append() = new SkAnimatorScript_NamedColor();
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	if (SkDisplayType::IsEnum(&maker, type)) {
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		// !!! for SpiderMonkey, iterate through the enum values, and map them to globals
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const SkDisplayEnumMap& map = GetEnumValues(type);
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		*fCallBackArray.append() = new SkAnimatorScript_Enum(map.fValues);
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	*fCallBackArray.append() = new SkAnimatorScript_Eval(this);
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if 0		// !!! no extra support for now
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	for (SkExtras** extraPtr = maker.fExtras.begin(); extraPtr < maker.fExtras.end(); extraPtr++) {
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkExtras* extra = *extraPtr;
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (extra->fExtraCallBack)
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			*fCallBackArray.append() = new propertyCallBack(extra->fExtraCallBack, extra->fExtraStorage);
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkAnimatorScript2::~SkAnimatorScript2() {
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkScriptCallBack** end = fCallBackArray.end();
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	for (SkScriptCallBack** ptr = fCallBackArray.begin(); ptr < end; ptr++)
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		delete *ptr;
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimatorScript2::evalMemberCommon(const SkMemberInfo* info,
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkDisplayable* displayable, SkOperand2* value) {
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkDisplayTypes original;
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkDisplayTypes type = original = (SkDisplayTypes) info->getType();
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	if (info->fType == SkType_Array)
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		type = SkType_Array;
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	switch (type) {
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_ARGB:
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			type = SkType_Int;
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Boolean:
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Int:
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_MSec:
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Float:
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(info->getCount() == 1);
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (info->fType != SkType_MemberProperty && info->fType != SkType_MemberFunction)
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				value->fS32 = *(int32_t*) info->memberData(displayable);	// OK for SkScalar too
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (type == SkType_MSec) {
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				value->fScalar = SkScalarDiv((SkScalar) value->fS32, 1000); // dividing two ints is the same as dividing two scalars
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				type = SkType_Float;
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			break;
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_String: {
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkString* displayableString;
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (info->fType != SkType_MemberProperty && info->fType != SkType_MemberFunction) {
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				info->getString(displayable, &displayableString);
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				value->fString = new SkString(*displayableString);
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			} break;
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Array: {
4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(info->fType != SkType_MemberProperty); // !!! incomplete
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkTDOperandArray* displayableArray = (SkTDOperandArray*) info->memberData(displayable);
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (displayable->getType() == SkType_Array) {
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkDisplayArray* typedArray = (SkDisplayArray*) displayable;
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				original = typedArray->values.getType();
4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(original != SkType_Unknown);
4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkOpArray* array = value->fArray = new SkOpArray(ToOpType(original));
4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			track(array);
4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			int count = displayableArray->count();
4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			if (count > 0) {
4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				array->setCount(count);
4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				memcpy(array->begin(), displayableArray->begin(), count * sizeof(SkOperand2));
4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			}
4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			} break;
4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		default:
4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(0); // unimplemented
4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	return true;
4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkDisplayEnumMap& SkAnimatorScript2::GetEnumValues(SkDisplayTypes type) {
4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	int index = SkTSearch<SkDisplayTypes>(&gEnumMaps[0].fType, gEnumMapCount, type,
4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		sizeof(SkDisplayEnumMap));
4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkASSERT(index >= 0);
4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	return gEnumMaps[index];
4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkDisplayTypes SkAnimatorScript2::ToDisplayType(SkOperand2::OpType type) {
4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	int val = type;
4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	switch (val) {
4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkOperand2::kNoType:
4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_Unknown;
4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkOperand2::kS32:
4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_Int;
4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkOperand2::kScalar:
4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_Float;
4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkOperand2::kString:
4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_String;
4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkOperand2::kArray:
4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_Array;
4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkOperand2::kObject:
4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_Displayable;
4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		default:
4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(0);
4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkType_Unknown;
4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkOperand2::OpType SkAnimatorScript2::ToOpType(SkDisplayTypes type) {
4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	if (SkDisplayType::IsDisplayable(NULL /* fMaker */, type))
4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return SkOperand2::kObject;
4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	if (SkDisplayType::IsEnum(NULL /* fMaker */, type))
4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		return SkOperand2::kS32;
4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	switch (type) {
4820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_ARGB:
4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_MSec:
4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Int:
4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkOperand2::kS32;
4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Float:
4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Point:
4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_3D_Point:
4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkOperand2::kScalar;
4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Base64:
4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_DynamicString:
4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_String:
4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkOperand2::kString;
4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Array:
4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkOperand2::kArray;
4960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		case SkType_Unknown:
4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkOperand2::kNoType;
4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		default:
4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(0);
5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return SkOperand2::kNoType;
5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimatorScript2::MapEnums(const char* ptr, const char* match, size_t len, int* value) {
5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	int index = 0;
5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	bool more = true;
5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	do {
5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const char* last = strchr(ptr, '|');
5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (last == NULL) {
5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			last = &ptr[strlen(ptr)];
5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			more = false;
5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		size_t length = last - ptr;
5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (len == length && strncmp(ptr, match, length) == 0) {
5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			*value = index;
5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			return true;
5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		index++;
5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		ptr = last + 1;
5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	} while (more);
5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	return false;
5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined SK_DEBUG
5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimator.h"
5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic const char scriptTestSetup[]  =
5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project"<screenplay>"
5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<apply>"
5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"<paint>"
5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			"<emboss id='emboss' direction='[1,1,1]'  />"
5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"</paint>"
5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"<animateField id='animation' field='direction' target='emboss' from='[1,1,1]' to='[-1,1,1]' dur='1'/>"
5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"<set lval='direction[0]' target='emboss' to='-1' />"
5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"</apply>"
5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<color id='testColor' color='0 ? rgb(0,0,0) : rgb(255,255,255)' />"
5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<color id='xColor' color='rgb(12,34,56)' />"
5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<typedArray id='emptyArray' />"
5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<typedArray id='intArray' values='[1, 4, 6]' />"
5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<s32 id='idx' value='2' />"
5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<s32 id='idy' value='2' />"
5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<string id='alpha' value='abc' />"
5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<rectangle id='testRect' left='Math.cos(0)' top='2' right='12' bottom='5' />"
5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"<event id='evt'>"
5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"<input name='x' />"
5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"<apply scope='idy'>"
5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			"<set field='value' to='evt.x.s32' />"
5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		"</apply>"
5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	"</event>"
5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project"</screenplay>";
5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic const SkScriptNAnswer scriptTests[]  = {
5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha+alpha", SkType_String, 0, 0, "abcabc" },
5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? Math.sin(0) : 1", SkType_Int, 1 },
5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"intArray[4]", SkType_Unknown },
5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"emptyArray[4]", SkType_Unknown },
5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"idx", SkType_Int, 2 },
5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"intArray.length", SkType_Int, 3 },
5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"intArray.values[0]", SkType_Int, 1 },
5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"intArray[0]", SkType_Int, 1 },
5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"idx.value", SkType_Int, 2 },
5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha.value", SkType_String, 0, 0, "abc" },
5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha", SkType_String, 0, 0, "abc" },
5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha.value+alpha.value", SkType_String, 0, 0, "abcabc" },
5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha+idx", SkType_String, 0, 0, "abc2" },
5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"idx+alpha", SkType_String, 0, 0, "2abc" },
5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"intArray[idx]", SkType_Int, 6 },
5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha.slice(1,2)", SkType_String, 0, 0, "b" },
5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"alpha.value.slice(1,2)", SkType_String, 0, 0, "b" },
5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"Math.sin(0)", SkType_Float, 0, SkIntToScalar(0) },
5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"testRect.left+2", SkType_Float, 0, SkIntToScalar(3) },
5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? intArray[0] : 1", SkType_Int, 1 },
5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? intArray.values[0] : 1", SkType_Int, 1 },
5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? idx : 1", SkType_Int, 1 },
5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? idx.value : 1", SkType_Int, 1 },
5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? alpha.slice(1,2) : 1", SkType_Int, 1 },
5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{	"0 ? alpha.value.slice(1,2) : 1", SkType_Int, 1 },
5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	{ "idy", SkType_Int, 3 }
5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
5810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkScriptNAnswer_testCount	SK_ARRAY_COUNT(scriptTests)
5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimatorScript2::UnitTest() {
58587a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed#if defined(SK_SUPPORT_UNITTEST)
5860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkAnimator animator;
5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkASSERT(animator.decodeMemory(scriptTestSetup, sizeof(scriptTestSetup)-1));
5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	SkEvent evt;
5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	evt.setString("id", "evt");
5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	evt.setS32("x", 3);
5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	animator.doUserEvent(evt);
5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	// set up animator with memory script above, then run value tests
5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	for (int index = 0; index < SkScriptNAnswer_testCount; index++) {
5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkAnimatorScript2 engine(*animator.fMaker, NULL, scriptTests[index].fType);
5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkScriptValue2 value;
5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		const char* script = scriptTests[index].fScript;
5970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		bool success = engine.evaluateScript(&script, &value);
5980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		if (success == false) {
5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			SkASSERT(scriptTests[index].fType == SkType_Unknown);
6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			continue;
6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkASSERT(value.fType == ToOpType(scriptTests[index].fType));
6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		SkScalar error;
6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		switch (value.fType) {
6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kS32:
6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkASSERT(value.fOperand.fS32 == scriptTests[index].fIntAnswer);
6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				break;
6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kScalar:
6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				error = SkScalarAbs(value.fOperand.fScalar - scriptTests[index].fScalarAnswer);
6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkASSERT(error < SK_Scalar1 / 10000);
6110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				break;
6120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			case SkOperand2::kString:
6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkASSERT(value.fOperand.fString->equals(scriptTests[index].fStringAnswer));
6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				break;
6150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project			default:
6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project				SkASSERT(0);
6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project		}
6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project	}
6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
624