1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimator.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimatorScript.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayable.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayApply.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayList.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayMovie.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayType.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkExtras.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMemberInfo.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkSystemEventTypes.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h"
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass DefaultTimeline : public SkAnimator::Timeline {
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual SkMSec getMSecs() const {
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return SkTime::GetMSecs();
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} gDefaultTimeline;
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkAnimateMaker::SkAnimateMaker(SkAnimator* animator, SkCanvas* canvas, SkPaint* paint)
31d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    : fActiveEvent(NULL), fAdjustedStart(0), fCanvas(canvas), fEnableTime(0),
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fHostEventSinkID(0), fMinimumInterval((SkMSec) -1), fPaint(paint), fParentMaker(NULL),
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fTimeline(&gDefaultTimeline), fInInclude(false), fInMovie(false),
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fFirstScriptError(false), fLoaded(false), fIDs(256), fAnimator(animator)
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fScreenplay.time = 0;
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fDebugTimeBase = (SkMSec) -1;
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fDumpEvents = fDumpGConditions = fDumpPosts = false;
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkAnimateMaker::~SkAnimateMaker() {
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    deleteMembers();
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMSec SkAnimateMaker::adjustDelay(SkMSec expectedBase, SkMSec delay) {
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec appTime = (*fTimeCallBack)();
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (appTime)
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delay -= appTime - expectedBase;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (delay < 0)
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delay = 0;
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return delay;
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::appendActive(SkActive* active) {
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fDisplayList.append(active);
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::clearExtraPropertyCallBack(SkDisplayTypes type) {
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkExtras** end = fExtras.end();
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (SkExtras** extraPtr = fExtras.begin(); extraPtr < end; extraPtr++) {
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkExtras* extra = *extraPtr;
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (extra->definesType(type)) {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            extra->fExtraCallBack = NULL;
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            extra->fExtraStorage = NULL;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateMaker::computeID(SkDisplayable* displayable, SkDisplayable* parent, SkString* newID) {
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* script;
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  if (findKey(displayable, &script) == false)
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return SkAnimatorScript::EvaluateString(*this, displayable, parent, script, newID);
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkDisplayable* SkAnimateMaker::createInstance(const char name[], size_t len) {
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes type = SkDisplayType::GetType(this, name, len );
85d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if ((int)type >= 0)
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return SkDisplayType::CreateInstance(this, type);
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return NULL;
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// differs from SkAnimator::decodeStream in that it does not reset error state
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateMaker::decodeStream(SkStream* stream)
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayXMLParser parser(*this);
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return parser.parse(*stream);
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// differs from SkAnimator::decodeURI in that it does not set URI base
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateMaker::decodeURI(const char uri[]) {
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  SkDebugf("animator decode %s\n", uri);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    SkStream* stream = SkStream::GetURIStream(fPrefix.c_str(), uri);
102f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org    SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(uri));
103f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org    if (stream.get()) {
104f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org        bool success = decodeStream(stream);
105f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org        if (hasError() && fError.hasNoun() == false)
106f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org            fError.setNoun(uri);
107f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org        return success;
108f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org    } else {
109f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org        return false;
110f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org    }
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && 0
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//used for the if'd out section of deleteMembers
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTSearch.h"
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comextern "C" {
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int compare_disp(const void* a, const void* b) {
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return *(const SkDisplayable**)a - *(const SkDisplayable**)b;
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::delayEnable(SkApply* apply, SkMSec time) {
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int index = fDelayed.find(apply);
12687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    if (index < 0) {
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        *fDelayed.append() = apply;
12887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    }
129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
13087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com    (new SkEvent(SK_EventType_Delay, fAnimator->getSinkID()))->postTime(time);
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::deleteMembers() {
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int index;
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && 0
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //this code checks to see if helpers are among the children, but it is not complete -
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //it should check the children of the children
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int result;
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkTDArray<SkDisplayable*> children(fChildren.begin(), fChildren.count());
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkQSort(children.begin(), children.count(), sizeof(SkDisplayable*),compare_disp);
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (index = 0; index < fHelpers.count(); index++) {
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* helper = fHelpers[index];
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        result = SkTSearch(children.begin(), children.count(), helper, sizeof(SkDisplayable*));
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(result < 0);
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (index = 0; index < fChildren.count(); index++) {
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* child = fChildren[index];
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete child;
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (index = 0; index < fHelpers.count(); index++) {
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* helper = fHelpers[index];
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete helper;
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (index = 0; index < fExtras.count(); index++) {
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkExtras* extras = fExtras[index];
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete extras;
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::doDelayedEvent() {
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fEnableTime = getAppTime();
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < fDelayed.count(); ) {
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* child = fDelayed[index];
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(child->isApply());
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkApply* apply = (SkApply*) child;
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        apply->interpolate(*this, fEnableTime);
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (apply->hasDelayedAnimator())
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            index++;
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fDelayed.remove(index);
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateMaker::doEvent(const SkEvent& event) {
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return (!fInMovie || fLoaded) && fAnimator->doEvent(event);
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::dump(const char* match) {
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkTDict<SkDisplayable*>::Iter iter(fIDs);
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* name;
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* result;
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        while ((name = iter.next(&result)) != NULL) {
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (strcmp(match,name) == 0)
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                result->dump(this);
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkAnimateMaker::dynamicProperty(SkString& nameStr, SkDisplayable** displayablePtr ) {
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* name = nameStr.c_str();
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* dot = strchr(name, '.');
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(dot);
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayable* displayable;
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (find(name, dot - name, &displayable) == false) {
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(0);
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return 0;
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* fieldName = dot + 1;
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMemberInfo* memberInfo = displayable->getMember(fieldName);
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *displayablePtr = displayable;
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return (int) memberInfo->fOffset;
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMSec SkAnimateMaker::getAppTime() const {
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fTimeline->getMSecs();
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkAnimator* SkAnimateMaker::getRoot()
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimateMaker* maker = this;
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while (maker->fParentMaker)
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        maker = maker->fParentMaker;
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return maker == this ? NULL : maker->fAnimator;
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::helperAdd(SkDisplayable* trackMe) {
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(fHelpers.find(trackMe) < 0);
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *fHelpers.append() = trackMe;
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::helperRemove(SkDisplayable* alreadyTracked) {
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int helperIndex = fHelpers.find(alreadyTracked);
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (helperIndex >= 0)
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fHelpers.remove(helperIndex);
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::loadMovies() {
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (SkDisplayable** dispPtr = fMovies.begin(); dispPtr < fMovies.end(); dispPtr++) {
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* displayable = *dispPtr;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(displayable->getType() == SkType_Movie);
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayMovie* movie = (SkDisplayMovie*) displayable;
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkAnimateMaker* movieMaker = movie->fMovie.fMaker;
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL);
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL);
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        movieMaker->loadMovies();
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::notifyInval() {
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fHostEventSinkID)
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fAnimator->onEventPost(new SkEvent(SK_EventType_Inval), fHostEventSinkID);
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::notifyInvalTime(SkMSec time) {
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fHostEventSinkID)
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fAnimator->onEventPostTime(new SkEvent(SK_EventType_Inval), fHostEventSinkID, time);
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::postOnEnd(SkAnimateBase* animate, SkMSec end) {
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEvent evt;
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        evt.setS32("time", animate->getStart() + end);
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        evt.setPtr("anim", animate);
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        evt.setType(SK_EventType_OnEnd);
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkEventSinkID sinkID = fAnimator->getSinkID();
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fAnimator->onEventPost(new SkEvent(evt), sinkID);
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::reset() {
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    deleteMembers();
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fChildren.reset();
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fHelpers.reset();
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fIDs.reset();
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fEvents.reset();
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fDisplayList.hardReset();
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::removeActive(SkActive* active) {
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (active == NULL)
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return;
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fDisplayList.remove(active);
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateMaker::resolveID(SkDisplayable* displayable, SkDisplayable* original) {
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString newID;
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool success = computeID(original, NULL, &newID);
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (success)
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        setID(displayable, newID);
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return success;
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::setErrorString() {
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fErrorString.reset();
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fError.hasError()) {
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkString err;
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fFileName.size() > 0)
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fErrorString.set(fFileName.c_str());
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fErrorString.set("screenplay error");
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int line = fError.getLineNumber();
2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (line >= 0) {
2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fErrorString.append(", ");
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fErrorString.append("line ");
2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fErrorString.appendS32(line);
3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fErrorString.append(": ");
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fError.getErrorString(&err);
3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fErrorString.append(err);
3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG
3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("%s\n", fErrorString.c_str());
3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
307d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    }
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::setEnableTime(SkMSec appTime, SkMSec expectedTime) {
3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString debugOut;
3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec time = getAppTime();
3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(time - fDebugTimeBase);
3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" set enable old enable=");
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(fEnableTime - fDebugTimeBase);
3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" old adjust=");
3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(fAdjustedStart);
3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" new enable=");
3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(expectedTime - fDebugTimeBase);
3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" new adjust=");
3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(appTime - expectedTime);
3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugf("%s\n", debugOut.c_str());
3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fAdjustedStart = appTime - expectedTime;
3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fEnableTime = expectedTime;
3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayable** firstMovie = fMovies.begin();
3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayable** endMovie = fMovies.end();
3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (SkDisplayable** ptr = firstMovie; ptr < endMovie; ptr++) {
3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayMovie* movie = (SkDisplayMovie*) *ptr;
3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        movie->fMovie.fMaker->setEnableTime(appTime, expectedTime);
3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
335d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkAnimateMaker::setExtraPropertyCallBack(SkDisplayTypes type,
3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScriptEngine::_propertyCallBack callBack, void* userStorage) {
3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkExtras** end = fExtras.end();
3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (SkExtras** extraPtr = fExtras.begin(); extraPtr < end; extraPtr++) {
3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkExtras* extra = *extraPtr;
3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (extra->definesType(type)) {
3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            extra->fExtraCallBack = callBack;
3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            extra->fExtraStorage = userStorage;
3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::setID(SkDisplayable* displayable, const SkString& newID) {
3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fIDs.set(newID.c_str(), displayable);
3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    displayable->_id.set(newID);
3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    displayable->id = displayable->_id.c_str();
3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkAnimateMaker::setScriptError(const SkScriptEngine& engine) {
3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString errorString;
3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    engine.getErrorString(&errorString);
3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setErrorNoun(errorString);
3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    setErrorCode(SkDisplayXMLParserError::kErrorInScript);
3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkAnimateMaker::GetStep(const char* token, size_t len, void* stepPtr, SkScriptValue* value) {
3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (SK_LITERAL_STR_EQUAL("step", token, len)) {
3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        value->fOperand.fS32 = *(int32_t*) stepPtr;
3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        value->fType = SkType_Int;
3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
373