Index: skia/animator/SkAnimateMaker.cpp |
=================================================================== |
--- skia/animator/SkAnimateMaker.cpp (revision 16859) |
+++ skia/animator/SkAnimateMaker.cpp (working copy) |
@@ -1,376 +0,0 @@ |
-/* libs/graphics/animator/SkAnimateMaker.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** Licensed under the Apache License, Version 2.0 (the "License"); |
-** you may not use this file except in compliance with the License. |
-** You may obtain a copy of the License at |
-** |
-** http://www.apache.org/licenses/LICENSE-2.0 |
-** |
-** Unless required by applicable law or agreed to in writing, software |
-** distributed under the License is distributed on an "AS IS" BASIS, |
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-** See the License for the specific language governing permissions and |
-** limitations under the License. |
-*/ |
- |
-#include "SkAnimateMaker.h" |
-#include "SkAnimator.h" |
-#include "SkAnimatorScript.h" |
-#include "SkDisplayable.h" |
-#include "SkDisplayApply.h" |
-#include "SkDisplayList.h" |
-#include "SkDisplayMovie.h" |
-#include "SkDisplayType.h" |
-#include "SkExtras.h" |
-#include "SkMemberInfo.h" |
-#include "SkStream.h" |
-#include "SkSystemEventTypes.h" |
-#include "SkTime.h" |
- |
-class DefaultTimeline : public SkAnimator::Timeline { |
- virtual SkMSec getMSecs() const { |
- return SkTime::GetMSecs(); |
- } |
-} gDefaultTimeline; |
- |
-SkAnimateMaker::SkAnimateMaker(SkAnimator* animator, SkCanvas* canvas, SkPaint* paint) |
- : fActiveEvent(NULL), fAdjustedStart(0), fCanvas(canvas), fEnableTime(0), |
- fHostEventSinkID(0), fMinimumInterval((SkMSec) -1), fPaint(paint), fParentMaker(NULL), |
- fTimeline(&gDefaultTimeline), fInInclude(false), fInMovie(false), |
- fFirstScriptError(false), fLoaded(false), fIDs(256), fAnimator(animator) |
-{ |
- fScreenplay.time = 0; |
-#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING |
- fDebugTimeBase = (SkMSec) -1; |
-#endif |
-#ifdef SK_DUMP_ENABLED |
- fDumpEvents = fDumpGConditions = fDumpPosts = false; |
-#endif |
-} |
- |
-SkAnimateMaker::~SkAnimateMaker() { |
- deleteMembers(); |
-} |
- |
-#if 0 |
-SkMSec SkAnimateMaker::adjustDelay(SkMSec expectedBase, SkMSec delay) { |
- SkMSec appTime = (*fTimeCallBack)(); |
- if (appTime) |
- delay -= appTime - expectedBase; |
- if (delay < 0) |
- delay = 0; |
- return delay; |
-} |
-#endif |
- |
-void SkAnimateMaker::appendActive(SkActive* active) { |
- fDisplayList.append(active); |
-} |
- |
-void SkAnimateMaker::clearExtraPropertyCallBack(SkDisplayTypes type) { |
- SkExtras** end = fExtras.end(); |
- for (SkExtras** extraPtr = fExtras.begin(); extraPtr < end; extraPtr++) { |
- SkExtras* extra = *extraPtr; |
- if (extra->definesType(type)) { |
- extra->fExtraCallBack = NULL; |
- extra->fExtraStorage = NULL; |
- break; |
- } |
- } |
-} |
- |
-bool SkAnimateMaker::computeID(SkDisplayable* displayable, SkDisplayable* parent, SkString* newID) { |
- const char* script; |
- if (findKey(displayable, &script) == false) |
- return true; |
- return SkAnimatorScript::EvaluateString(*this, displayable, parent, script, newID); |
-} |
- |
-SkDisplayable* SkAnimateMaker::createInstance(const char name[], size_t len) { |
- SkDisplayTypes type = SkDisplayType::GetType(this, name, len ); |
- if ((int)type >= 0) |
- return SkDisplayType::CreateInstance(this, type); |
- return NULL; |
-} |
- |
-// differs from SkAnimator::decodeStream in that it does not reset error state |
-bool SkAnimateMaker::decodeStream(SkStream* stream) |
-{ |
- SkDisplayXMLParser parser(*this); |
- return parser.parse(*stream); |
-} |
- |
-// differs from SkAnimator::decodeURI in that it does not set URI base |
-bool SkAnimateMaker::decodeURI(const char uri[]) { |
-// SkDebugf("animator decode %s\n", uri); |
- |
-// SkStream* stream = SkStream::GetURIStream(fPrefix.c_str(), uri); |
- SkStream* stream = new SkFILEStream(uri); |
- |
- SkAutoTDelete<SkStream> autoDel(stream); |
- bool success = decodeStream(stream); |
- if (hasError() && fError.hasNoun() == false) |
- fError.setNoun(uri); |
- return success; |
-} |
- |
-#if defined SK_DEBUG && 0 |
-//used for the if'd out section of deleteMembers |
-#include "SkTSearch.h" |
- |
-extern "C" { |
- int compare_disp(const void* a, const void* b) { |
- return *(const SkDisplayable**)a - *(const SkDisplayable**)b; |
- } |
-} |
-#endif |
- |
-void SkAnimateMaker::delayEnable(SkApply* apply, SkMSec time) { |
- int index = fDelayed.find(apply); |
- if (index < 0) |
- *fDelayed.append() = apply; |
- (new SkEvent(SK_EventType_Delay))->postTime(fAnimator->getSinkID(), time); |
-} |
- |
-void SkAnimateMaker::deleteMembers() { |
- int index; |
-#if defined SK_DEBUG && 0 |
- //this code checks to see if helpers are among the children, but it is not complete - |
- //it should check the children of the children |
- int result; |
- SkTDArray<SkDisplayable*> children(fChildren.begin(), fChildren.count()); |
- SkQSort(children.begin(), children.count(), sizeof(SkDisplayable*),compare_disp); |
- for (index = 0; index < fHelpers.count(); index++) { |
- SkDisplayable* helper = fHelpers[index]; |
- result = SkTSearch(children.begin(), children.count(), helper, sizeof(SkDisplayable*)); |
- SkASSERT(result < 0); |
- } |
-#endif |
- for (index = 0; index < fChildren.count(); index++) { |
- SkDisplayable* child = fChildren[index]; |
- delete child; |
- } |
- for (index = 0; index < fHelpers.count(); index++) { |
- SkDisplayable* helper = fHelpers[index]; |
- delete helper; |
- } |
- for (index = 0; index < fExtras.count(); index++) { |
- SkExtras* extras = fExtras[index]; |
- delete extras; |
- } |
-} |
- |
-void SkAnimateMaker::doDelayedEvent() { |
- fEnableTime = getAppTime(); |
- for (int index = 0; index < fDelayed.count(); ) { |
- SkDisplayable* child = fDelayed[index]; |
- SkASSERT(child->isApply()); |
- SkApply* apply = (SkApply*) child; |
- apply->interpolate(*this, fEnableTime); |
- if (apply->hasDelayedAnimator()) |
- index++; |
- else |
- fDelayed.remove(index); |
- } |
-} |
- |
-bool SkAnimateMaker::doEvent(const SkEvent& event) { |
- return (!fInMovie || fLoaded) && fAnimator->doEvent(event); |
-} |
- |
-#ifdef SK_DUMP_ENABLED |
-void SkAnimateMaker::dump(const char* match) { |
- SkTDict<SkDisplayable*>::Iter iter(fIDs); |
- const char* name; |
- SkDisplayable* result; |
- while ((name = iter.next(&result)) != NULL) { |
- if (strcmp(match,name) == 0) |
- result->dump(this); |
- } |
-} |
-#endif |
- |
-int SkAnimateMaker::dynamicProperty(SkString& nameStr, SkDisplayable** displayablePtr ) { |
- const char* name = nameStr.c_str(); |
- const char* dot = strchr(name, '.'); |
- SkASSERT(dot); |
- SkDisplayable* displayable; |
- if (find(name, dot - name, &displayable) == false) { |
- SkASSERT(0); |
- return 0; |
- } |
- const char* fieldName = dot + 1; |
- const SkMemberInfo* memberInfo = displayable->getMember(fieldName); |
- *displayablePtr = displayable; |
- return (int) memberInfo->fOffset; |
-} |
- |
-SkMSec SkAnimateMaker::getAppTime() const { |
- return fTimeline->getMSecs(); |
-} |
- |
-#ifdef SK_DEBUG |
-SkAnimator* SkAnimateMaker::getRoot() |
-{ |
- SkAnimateMaker* maker = this; |
- while (maker->fParentMaker) |
- maker = maker->fParentMaker; |
- return maker == this ? NULL : maker->fAnimator; |
-} |
-#endif |
- |
-void SkAnimateMaker::helperAdd(SkDisplayable* trackMe) { |
- SkASSERT(fHelpers.find(trackMe) < 0); |
- *fHelpers.append() = trackMe; |
-} |
- |
-void SkAnimateMaker::helperRemove(SkDisplayable* alreadyTracked) { |
- int helperIndex = fHelpers.find(alreadyTracked); |
- if (helperIndex >= 0) |
- fHelpers.remove(helperIndex); |
-} |
- |
-#if 0 |
-void SkAnimateMaker::loadMovies() { |
- for (SkDisplayable** dispPtr = fMovies.begin(); dispPtr < fMovies.end(); dispPtr++) { |
- SkDisplayable* displayable = *dispPtr; |
- SkASSERT(displayable->getType() == SkType_Movie); |
- SkDisplayMovie* movie = (SkDisplayMovie*) displayable; |
- SkAnimateMaker* movieMaker = movie->fMovie.fMaker; |
- movieMaker->fEvents.doEvent(*movieMaker, SkDisplayEvent::kOnload, NULL); |
- movieMaker->fEvents.removeEvent(SkDisplayEvent::kOnload, NULL); |
- movieMaker->loadMovies(); |
- } |
-} |
-#endif |
- |
-void SkAnimateMaker::notifyInval() { |
- if (fHostEventSinkID) |
- fAnimator->onEventPost(new SkEvent(SK_EventType_Inval), fHostEventSinkID); |
-} |
- |
-void SkAnimateMaker::notifyInvalTime(SkMSec time) { |
- if (fHostEventSinkID) |
- fAnimator->onEventPostTime(new SkEvent(SK_EventType_Inval), fHostEventSinkID, time); |
-} |
- |
-void SkAnimateMaker::postOnEnd(SkAnimateBase* animate, SkMSec end) { |
- SkEvent evt; |
- evt.setS32("time", animate->getStart() + end); |
- evt.setPtr("anim", animate); |
- evt.setType(SK_EventType_OnEnd); |
- SkEventSinkID sinkID = fAnimator->getSinkID(); |
- fAnimator->onEventPost(new SkEvent(evt), sinkID); |
-} |
- |
-void SkAnimateMaker::reset() { |
- deleteMembers(); |
- fChildren.reset(); |
- fHelpers.reset(); |
- fIDs.reset(); |
- fEvents.reset(); |
- fDisplayList.hardReset(); |
-} |
- |
-void SkAnimateMaker::removeActive(SkActive* active) { |
- if (active == NULL) |
- return; |
- fDisplayList.remove(active); |
-} |
- |
-bool SkAnimateMaker::resolveID(SkDisplayable* displayable, SkDisplayable* original) { |
- SkString newID; |
- bool success = computeID(original, NULL, &newID); |
- if (success) |
- setID(displayable, newID); |
- return success; |
-} |
- |
-void SkAnimateMaker::setErrorString() { |
- fErrorString.reset(); |
- if (fError.hasError()) { |
- SkString err; |
- if (fFileName.size() > 0) |
- fErrorString.set(fFileName.c_str()); |
- else |
- fErrorString.set("screenplay error"); |
- int line = fError.getLineNumber(); |
- if (line >= 0) { |
- fErrorString.append(", "); |
- fErrorString.append("line "); |
- fErrorString.appendS32(line); |
- } |
- fErrorString.append(": "); |
- fError.getErrorString(&err); |
- fErrorString.append(err); |
-#if defined SK_DEBUG |
- SkDebugf("%s\n", fErrorString.c_str()); |
-#endif |
- } |
-} |
- |
-void SkAnimateMaker::setEnableTime(SkMSec appTime, SkMSec expectedTime) { |
-#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING |
- SkString debugOut; |
- SkMSec time = getAppTime(); |
- debugOut.appendS32(time - fDebugTimeBase); |
- debugOut.append(" set enable old enable="); |
- debugOut.appendS32(fEnableTime - fDebugTimeBase); |
- debugOut.append(" old adjust="); |
- debugOut.appendS32(fAdjustedStart); |
- debugOut.append(" new enable="); |
- debugOut.appendS32(expectedTime - fDebugTimeBase); |
- debugOut.append(" new adjust="); |
- debugOut.appendS32(appTime - expectedTime); |
- SkDebugf("%s\n", debugOut.c_str()); |
-#endif |
- fAdjustedStart = appTime - expectedTime; |
- fEnableTime = expectedTime; |
- SkDisplayable** firstMovie = fMovies.begin(); |
- SkDisplayable** endMovie = fMovies.end(); |
- for (SkDisplayable** ptr = firstMovie; ptr < endMovie; ptr++) { |
- SkDisplayMovie* movie = (SkDisplayMovie*) *ptr; |
- movie->fMovie.fMaker->setEnableTime(appTime, expectedTime); |
- } |
-} |
- |
-void SkAnimateMaker::setExtraPropertyCallBack(SkDisplayTypes type, |
- SkScriptEngine::_propertyCallBack callBack, void* userStorage) { |
- SkExtras** end = fExtras.end(); |
- for (SkExtras** extraPtr = fExtras.begin(); extraPtr < end; extraPtr++) { |
- SkExtras* extra = *extraPtr; |
- if (extra->definesType(type)) { |
- extra->fExtraCallBack = callBack; |
- extra->fExtraStorage = userStorage; |
- break; |
- } |
- } |
-} |
- |
-void SkAnimateMaker::setID(SkDisplayable* displayable, const SkString& newID) { |
- fIDs.set(newID.c_str(), displayable); |
-#ifdef SK_DEBUG |
- displayable->_id.set(newID); |
- displayable->id = displayable->_id.c_str(); |
-#endif |
-} |
- |
-void SkAnimateMaker::setScriptError(const SkScriptEngine& engine) { |
- SkString errorString; |
-#ifdef SK_DEBUG |
- engine.getErrorString(&errorString); |
-#endif |
- setErrorNoun(errorString); |
- setErrorCode(SkDisplayXMLParserError::kErrorInScript); |
-} |
- |
-bool SkAnimateMaker::GetStep(const char* token, size_t len, void* stepPtr, SkScriptValue* value) { |
- if (SK_LITERAL_STR_EQUAL("step", token, len)) { |
- value->fOperand.fS32 = *(int32_t*) stepPtr; |
- value->fType = SkType_Int; |
- return true; |
- } |
- return false; |
-} |