11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 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 */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimator.h" 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h" 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h" 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayApply.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayMovie.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayTypes.h" 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayXMLParser.h" 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkStream.h" 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript.h" 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript2.h" // compiled script experiment 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkSystemEventTypes.h" 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypedArray.h" 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawExtraPathEffect.h" 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTime.h" 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined SK_BUILD_FOR_WIN32 && defined SK_DEBUG 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define _static 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project extern const char gMathPrimerText[]; 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project extern const char gMathPrimerBinary[]; 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define _static static 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3787a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed_static const char gMathPrimerText[] = 3887a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed"<screenplay>" 3987a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed "<Math id=\"Math\"/>" 4087a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed "<Number id=\"Number\"/>" 4187a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed"</screenplay>"; 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4387a2a317c4e99c547ecbfa81f40f7bd7f2932433Mike Reed#define gMathPrimer gMathPrimerText 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkAnimator::SkAnimator() : fMaker(NULL) { 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project initialize(); 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkAnimator::~SkAnimator() { 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDELETE(fMaker); 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::addExtras(SkExtras* extras) { 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *fMaker->fExtras.append() = extras; 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::appendStream(SkStream* stream) { 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return decodeStream(stream); 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::decodeMemory(const void* buffer, size_t size) 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fFileName.reset(); 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayXMLParser parser(*fMaker); 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return parser.parse((const char*)buffer, size); 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::decodeStream(SkStream* stream) 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayXMLParser parser(*fMaker); 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = parser.parse(*stream); 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->setErrorString(); 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::decodeDOM(const SkDOM& dom, const SkDOMNode* node) 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fFileName.reset(); 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayXMLParser parser(*fMaker); 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return parser.parse(dom, node); 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::decodeURI(const char uri[]) { 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SkDebugf("animator decode %s\n", uri); 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SkStream* stream = SkStream::GetURIStream(fMaker->fPrefix.c_str(), uri); 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkStream* stream = new SkFILEStream(uri); 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkAutoTDelete<SkStream> autoDel(stream); 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project setURIBase(uri); 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return decodeStream(stream); 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::doCharEvent(SkUnichar code) { 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (code == 0) 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct SkEventState state; 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fCode = code; 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEnableTime = fMaker->getAppTime(); 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = fMaker->fEvents.doEvent(*fMaker, SkDisplayEvent::kKeyChar, &state); 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->notifyInval(); 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::doClickEvent(int clickState, SkScalar x, SkScalar y) { 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(clickState >= 0 && clickState <= 2); 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct SkEventState state; 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fX = x; 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fY = y; 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEnableTime = fMaker->getAppTime(); 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = fMaker->fEvents.doEvent(*fMaker, 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project clickState == 0 ? SkDisplayEvent::kMouseDown : 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project clickState == 1 ? SkDisplayEvent::kMouseDrag : 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayEvent::kMouseUp, &state); 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->notifyInval(); 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::doKeyEvent(SkKey code) { 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (code == 0) 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct SkEventState state; 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fCode = code; 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEnableTime = fMaker->getAppTime(); 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = fMaker->fEvents.doEvent(*fMaker, SkDisplayEvent::kKeyPress, &state); 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->notifyInval(); 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::doKeyUpEvent(SkKey code) { 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (code == 0) 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct SkEventState state; 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fCode = code; 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEnableTime = fMaker->getAppTime(); 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = fMaker->fEvents.doEvent(*fMaker, SkDisplayEvent::kKeyPressUp, &state); 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->notifyInval(); 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::doUserEvent(const SkEvent& evt) { 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEnableTime = fMaker->getAppTime(); 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return onEvent(evt); 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkAnimator::DifferenceType SkAnimator::draw(SkCanvas* canvas, SkPaint* paint, SkMSec time) { 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint == NULL) 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return draw(canvas, time); 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fScreenplay.time = time; 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fCanvas = canvas; 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fPaint = paint; 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fDisplayList.fHasUnion = false; 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int result = fMaker->fDisplayList.draw(*fMaker, time); 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (result) 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project result += fMaker->fDisplayList.fHasUnion; 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (DifferenceType) result; 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkAnimator::DifferenceType SkAnimator::draw(SkCanvas* canvas, SkMSec time) { 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPaint paint; 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return draw(canvas, &paint, time); 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::eventDone(const SkEvent& ) { 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::findClickEvent(SkScalar x, SkScalar y) { 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct SkEventState state; 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fDisable = true; 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fX = x; 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project state.fY = y; 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEnableTime = fMaker->getAppTime(); 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = fMaker->fEvents.doEvent(*fMaker, SkDisplayEvent::kMouseDown, &state); 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->notifyInval(); 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkAnimator* SkAnimator::getAnimator(const SkDisplayable* displayable) const { 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (displayable->getType() != SkType_Movie) 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayMovie* movie = (const SkDisplayMovie*) displayable; 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return movie->getAnimator(); 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkDisplayable* SkAnimator::getElement(const char* id) { 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element; 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fMaker->find(id, &element) == false) 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (const SkDisplayable*) element; 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkElementType SkAnimator::getElementType(const SkDisplayable* ae) { 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element = (SkDisplayable*) ae; 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* info = SkDisplayType::GetMembers(fMaker, element->getType(), NULL); 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (SkElementType) SkDisplayType::Find(fMaker, info); 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkElementType SkAnimator::getElementType(const char* id) { 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getElementType(element); 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo* SkAnimator::getField(const SkDisplayable* ae, const char* field) { 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element = (SkDisplayable*) ae; 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* info = element->getMember(field); 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (const SkMemberInfo*) info; 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo* SkAnimator::getField(const char* elementID, const char* field) { 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(elementID); 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getField(element, field); 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkFieldType SkAnimator::getFieldType(const SkMemberInfo* ai) { 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* info = (const SkMemberInfo*) ai; 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (SkFieldType) info->getType(); 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkFieldType SkAnimator::getFieldType(const char* id, const char* fieldID) { 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(id, fieldID); 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getFieldType(field); 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static bool getArrayCommon(const SkDisplayable* ae, const SkMemberInfo* ai, 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int index, SkOperand* operand, SkDisplayTypes type) { 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = (const SkDisplayable*) ae; 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* info = (const SkMemberInfo*) ai; 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(info->fType == SkType_Array); 2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return info->getArrayValue(element, index, operand); 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t SkAnimator::getArrayInt(const SkDisplayable* ae, 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* ai, int index) { 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = getArrayCommon(ae, ai, index, &operand, SkType_Int); 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result ? operand.fS32 : SK_NaN32; 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t SkAnimator::getArrayInt(const char* id, const char* fieldID, int index) { 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_NaN32; 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_NaN32; 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getArrayInt(element, field, index); 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar SkAnimator::getArrayScalar(const SkDisplayable* ae, 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* ai, int index) { 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = getArrayCommon(ae, ai, index, &operand, SkType_Float); 2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result ? operand.fScalar : SK_ScalarNaN; 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar SkAnimator::getArrayScalar(const char* id, const char* fieldID, int index) { 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_ScalarNaN; 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_ScalarNaN; 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getArrayScalar(element, field, index); 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkAnimator::getArrayString(const SkDisplayable* ae, 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* ai, int index) { 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = getArrayCommon(ae, ai, index, &operand, SkType_String); 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result ? operand.fString->c_str() : NULL; 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkAnimator::getArrayString(const char* id, const char* fieldID, int index) { 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getArrayString(element, field, index); 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkMSec SkAnimator::getInterval() { 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fMaker->fMinimumInterval == (SkMSec) -1 ? 0 : fMaker->fMinimumInterval; 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::getInvalBounds(SkRect* inval) { 2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fMaker->fDisplayList.fHasUnion) { 2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inval->fLeft = SkIntToScalar(fMaker->fDisplayList.fInvalBounds.fLeft); 2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inval->fTop = SkIntToScalar(fMaker->fDisplayList.fInvalBounds.fTop); 2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inval->fRight = SkIntToScalar(fMaker->fDisplayList.fInvalBounds.fRight); 2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inval->fBottom = SkIntToScalar(fMaker->fDisplayList.fInvalBounds.fBottom); 2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inval->fLeft = inval->fTop = -SK_ScalarMax; 2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project inval->fRight = inval->fBottom = SK_ScalarMax; 2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkXMLParserError* SkAnimator::getParserError() { 3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return &fMaker->fError; 3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkAnimator::getParserErrorString() { 3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fMaker->fErrorString.size() == 0 && fMaker->fError.hasError()) 3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->setErrorString(); 3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fMaker->fErrorString.c_str(); 3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t SkAnimator::getInt(const SkDisplayable* element, const SkMemberInfo* info) { 3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->fType != SkType_MemberProperty) { 3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->getType() == SkType_Int) { 3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project info->getValue(element, &operand, 1); 3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return operand.fS32; 3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_NaN32; 3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScriptValue scriptValue; 3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool success = element->getProperty(info->propertyIndex(), &scriptValue); 3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (success && scriptValue.fType == SkType_Int) 3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return scriptValue.fOperand.fS32; 3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_NaN32; 3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectint32_t SkAnimator::getInt(const char* id, const char* fieldID) { 3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_NaN32; 3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_NaN32; 3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getInt(element, field); 3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar SkAnimator::getScalar(const SkDisplayable* element, const SkMemberInfo* info) { 3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->fType != SkType_MemberProperty) { 3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->getType() == SkType_Float) { 3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project info->getValue(element, &operand, 1); 3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return operand.fScalar; 3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_ScalarNaN; 3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScriptValue scriptValue; 3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool success = element->getProperty(info->propertyIndex(), &scriptValue); 3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (success && scriptValue.fType == SkType_Float) 3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return scriptValue.fOperand.fScalar; 3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_ScalarNaN; 3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScalar SkAnimator::getScalar(const char* id, const char* fieldID) { 3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_ScalarNaN; 3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return SK_ScalarNaN; 3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getScalar(element, field); 3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkAnimator::getString(const SkDisplayable* ae, 3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* ai) { 3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = (const SkDisplayable*) ae; 3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* info = (const SkMemberInfo*) ai; 3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString* temp; 3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project info->getString(element, &temp); 3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return temp->c_str(); 3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkAnimator::getString(const char* id, const char* fieldID) { 3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkDisplayable* element = getElement(id); 3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return NULL; 3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return getString(element, field); 3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst char* SkAnimator::getURIBase() { 3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fMaker->fPrefix.c_str(); 3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::initialize() { 3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDELETE(fMaker); 3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker = SkNEW_ARGS(SkAnimateMaker, (this, NULL, NULL)); 3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project decodeMemory(gMathPrimer, sizeof(gMathPrimer)-1); 3901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID 3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project InitializeSkExtraPathEffects(this); 3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::isTrackingEvents() { 3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::onEvent(const SkEvent& evt) { 4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkAnimator* root = fMaker->getRoot(); 4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (root == NULL) 4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project root = this; 4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (root->isTrackingEvents()) 4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project root->eventDone(evt); 4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (evt.isType(SK_EventType_OnEnd)) { 4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkEventState eventState; 4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool success = evt.findPtr("anim", (void**) &eventState.fDisplayable); 4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(success); 4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project success = evt.findS32("time", (int32_t*) &fMaker->fEnableTime); 4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(success); 4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fAdjustedStart = fMaker->getAppTime() - fMaker->fEnableTime; 4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fEvents.doEvent(*fMaker, SkDisplayEvent::kOnEnd, &eventState); 4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fAdjustedStart = 0; 4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project goto inval; 4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (evt.isType(SK_EventType_Delay)) { 4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->doDelayedEvent(); 4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project goto inval; 4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* id = evt.findString("id"); 4270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (id == NULL) 4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable** firstMovie = fMaker->fMovies.begin(); 4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable** endMovie = fMaker->fMovies.end(); 4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (SkDisplayable** ptr = firstMovie; ptr < endMovie; ptr++) { 4320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayMovie* movie = (SkDisplayMovie*) *ptr; 4330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project movie->doEvent(evt); 4340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 4360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* event; 4370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (fMaker->find(id, &event) == false) 4380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 4390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING 4400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString debugOut; 4410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMSec realTime = fMaker->getAppTime(); 4420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.appendS32(realTime - fMaker->fDebugTimeBase); 4430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.append(" onEvent id="); 4440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.append(id); 4450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #endif 4460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMSec time = evt.getFast32(); 4470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (time != 0) { 4480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMSec app = fMaker->getAppTime(); 4490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->setEnableTime(app, time); 4500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING 4510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.append(" time="); 4520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.appendS32(time - fMaker->fDebugTimeBase); 4530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.append(" adjust="); 4540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project debugOut.appendS32(fMaker->fAdjustedStart); 4550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #endif 4560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING 4580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("%s\n", debugOut.c_str()); 4590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #endif 4600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(event->isEvent()); 4610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayEvent* displayEvent = (SkDisplayEvent*) event; 4620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project displayEvent->populateInput(*fMaker, evt); 4630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project displayEvent->enableEvent(*fMaker); 4640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectinval: 4670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->notifyInval(); 4680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 4690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::onEventPost(SkEvent* evt, SkEventSinkID sinkID) 4720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 4740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkAnimator* root = fMaker->getRoot(); 4750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (root) { 4760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project root->onEventPost(evt, sinkID); 4770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 4780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 4800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(sinkID == this->getSinkID() || this->getHostEventSinkID() == sinkID); 4810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger evt->setTargetID(sinkID)->post(); 4830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::onEventPostTime(SkEvent* evt, SkEventSinkID sinkID, SkMSec time) 4860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 4870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 4880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkAnimator* root = fMaker->getRoot(); 4890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (root) { 4900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project root->onEventPostTime(evt, sinkID, time); 4910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 4920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 4930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 4940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(sinkID == this->getSinkID() || this->getHostEventSinkID() == sinkID); 4950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger evt->setTargetID(sinkID)->postTime(time); 4970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 4980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 4990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::reset() { 5000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fDisplayList.reset(); 5010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkEventSinkID SkAnimator::getHostEventSinkID() const { 5040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return fMaker->fHostEventSinkID; 5050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::setHostEventSinkID(SkEventSinkID target) { 5080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fHostEventSinkID = target; 5090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::onSetHostHandler(Handler ) { 5120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::setJavaOwner(Handler ) { 5150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setArrayString(const char* id, const char* fieldID, const char** array, int num) 5180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTypedArray tArray(SkType_String); 5200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tArray.setCount(num); 5210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < num; i++) { 5220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand op; 5230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project op.fString = new SkString(array[i]); 5240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tArray[i] = op; 5250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return setArray(id, fieldID, tArray); 5270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setArrayInt(const char* id, const char* fieldID, const int* array, int num) 5290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 5300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkTypedArray tArray(SkType_Int); 5310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tArray.setCount(num); 5320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < num; i++) { 5330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand op; 5340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project op.fS32 = array[i]; 5350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project tArray[i] = op; 5360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return setArray(id, fieldID, tArray); 5380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setArray(SkDisplayable* element, const SkMemberInfo* info, SkTypedArray array) { 5410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->fType != SkType_Array) 5420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; //the field is not an array 5430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //i think we can handle the case where the displayable itself is an array differently from the 5440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //case where it has an array - for one thing, if it is an array, i think we can change its type 5450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //if it's not, we cannot 5460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayTypes type = element->getType(); 5470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (type == SkType_Array) { 5480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayArray* dispArray = (SkDisplayArray*) element; 5490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dispArray->values = array; 5500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 5510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 5530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; //currently i don't care about this case 5540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setArray(const char* id, const char* fieldID, SkTypedArray array) { 5570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element = (SkDisplayable*) getElement(id); 5580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //should I go ahead and change all 'NULL's to 'NULL'? 5590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 5600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 5620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 5630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return setArray(element, field, array); 5650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setInt(SkDisplayable* element, const SkMemberInfo* info, int32_t s32) { 5680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->fType != SkType_MemberProperty) { 5690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 5700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project operand.fS32 = s32; 5710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(info->getType() == SkType_Int); 5720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project info->setValue(element, &operand, 1); 5730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 5740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScriptValue scriptValue; 5750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project scriptValue.fType = SkType_Int; 5760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project scriptValue.fOperand.fS32 = s32; 5770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project element->setProperty(info->propertyIndex(), scriptValue); 5780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 5790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 5800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setInt(const char* id, const char* fieldID, int32_t s32) { 5830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element = (SkDisplayable*) getElement(id); 5840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 5850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 5870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 5880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 5890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return setInt(element, field, s32); 5900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 5910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 5920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setScalar(SkDisplayable* element, const SkMemberInfo* info, SkScalar scalar) { 5930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (info->fType != SkType_MemberProperty) { 5940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkOperand operand; 5950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project operand.fScalar = scalar; 5960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(info->getType() == SkType_Float); 5970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project info->setValue(element, &operand, 1); 5980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 5990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkScriptValue scriptValue; 6000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project scriptValue.fType = SkType_Float; 6010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project scriptValue.fOperand.fScalar = scalar; 6020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project element->setProperty(info->propertyIndex(), scriptValue); 6030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setScalar(const char* id, const char* fieldID, SkScalar scalar) { 6080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element = (SkDisplayable*) getElement(id); 6090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 6100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 6120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 6130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return setScalar(element, field, scalar); 6150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setString(SkDisplayable* element, 6180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* info, const char* str) { 6190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // !!! until this is fixed, can't call script with global references from here 6200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project info->setValue(*fMaker, NULL, 0, info->fCount, element, info->getType(), str, strlen(str)); 6210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::setString(const char* id, const char* fieldID, const char* str) { 6250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDisplayable* element = (SkDisplayable*) getElement(id); 6260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (element == NULL) 6270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMemberInfo* field = getField(element, fieldID); 6290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (field == NULL) 6300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return setString(element, field, str); 6320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::setTimeline(const Timeline& timeline) { 6350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fTimeline = &timeline; 6360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::setURIBase(const char* uri) { 6390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (uri) 6400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 6410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* tail = strrchr(uri, '/'); 6420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (tail) { 6430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString prefix(uri, tail - uri + 1); 6440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (uri[0] != '.' /*SkStream::IsAbsoluteURI(uri)*/) 6450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fPrefix.reset(); 6460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fPrefix.append(prefix); 6470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fFileName.set(tail + 1); 6480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else 6490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fMaker->fFileName.set(uri); 6500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 6540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkAnimator::NoLeaks() { 6550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_BUILD_FOR_MAC 6560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (SkDisplayable::fAllocations.count() == 0) 6570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 6580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// return SkDisplayable::fAllocationCount == 0; 6590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("!!! leaked %d displayables:\n", SkDisplayable::fAllocations.count()); 6600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (SkDisplayable** leak = SkDisplayable::fAllocations.begin(); leak < SkDisplayable::fAllocations.end(); leak++) 6610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("%08x %s\n", *leak, (*leak)->id); 6620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 6630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 6640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 6650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 6660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_SUPPORT_UNITTEST 6680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimatorScript.h" 6690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBase64.h" 6700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkParse.h" 6710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMemberInfo.h" 6720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define unittestline(type) { #type , type::UnitTest } 6740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 6750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 6770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::Init(bool runUnitTests) { 6780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_SUPPORT_UNITTEST 6790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (runUnitTests == false) 6800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 6810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static const struct { 6820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char* fTypeName; 6830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void (*fUnitTest)( ); 6840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } gUnitTests[] = { 6850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unittestline(SkBase64), 6860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unittestline(SkDisplayType), 6870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unittestline(SkParse), 6880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unittestline(SkScriptEngine), 6890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// unittestline(SkScriptEngine2), // compiled script experiment 6900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unittestline(SkAnimatorScript) 6910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 6920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = 0; i < (int)SK_ARRAY_COUNT(gUnitTests); i++) 6930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 6940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("SkAnimator: Running UnitTest for %s\n", gUnitTests[i].fTypeName); 6950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project gUnitTests[i].fUnitTest(); 6960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("SkAnimator: End UnitTest for %s\n", gUnitTests[i].fTypeName); 6970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 6980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 6990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 7000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkAnimator::Term() { 7020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 7030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 7050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 706