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