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