/* libs/graphics/animator/SkAnimateMaker.h ** ** 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. */ #ifndef SkAnimateMaker_DEFINED #define SkAnimateMaker_DEFINED // #define SK_DEBUG_ANIMATION_TIMING #include "SkAnimator.h" #include "SkBitmap.h" #include "SkIntArray.h" #include "SkDisplayEvents.h" #include "SkDisplayList.h" #include "SkDisplayScreenplay.h" #include "SkDisplayXMLParser.h" #include "SkScript.h" #include "SkString.h" #include "SkTDict.h" // not sure where this little helper macro should go class SkActive; class SkAnimate; class SkCanvas; class SkDisplayable; class SkDrawable; class SkDump; class SkEvent; class SkEventSink; class SkExtras; class SkGroup; class SkPaint; class SkStream; class SkAnimateMaker { public: SkAnimateMaker(SkAnimator* animator, SkCanvas* canvas, SkPaint* paint); ~SkAnimateMaker(); void appendActive(SkActive* ); void childrenAdd(SkDisplayable* child) { *fChildren.append() = child; } void clearExtraPropertyCallBack(SkDisplayTypes type); bool computeID(SkDisplayable* displayable, SkDisplayable* parent, SkString* newID); SkDisplayable* createInstance(const char name[], size_t len); bool decodeStream(SkStream* stream); bool decodeURI(const char uri[]); void delayEnable(SkApply* apply, SkMSec time); void doDelayedEvent(); bool doEvent(const SkEvent& event); #ifdef SK_DUMP_ENABLED void dump(const char* match); #endif int dynamicProperty(SkString& nameStr, SkDisplayable** ); bool find(const char* str, SkDisplayable** displayablePtr) const { return fIDs.find(str, displayablePtr); } bool find(const char* str, size_t len, SkDisplayable** displayablePtr) const { return fIDs.find(str, len, displayablePtr); } bool findKey(SkDisplayable* displayable, const char** string) const { return fIDs.findKey(displayable, string); } // bool find(SkString& string, SkDisplayable** displayablePtr) { // return fIDs.find(string.c_str(), displayablePtr); // } SkAnimator* getAnimator() { return fAnimator; } SkMSec getAppTime() const; // call caller to get current time #ifdef SK_DEBUG SkAnimator* getRoot(); #endif SkXMLParserError::ErrorCode getErrorCode() const { return fError.getErrorCode(); } SkMSec getInTime() { return fDisplayList.getTime(); } int getNativeCode() const { return fError.getNativeCode(); } bool hasError() { return fError.hasError(); } void helperAdd(SkDisplayable* trackMe); void helperRemove(SkDisplayable* alreadyTracked); void idsSet(const char* attrValue, size_t len, SkDisplayable* displayable) { fIDs.set(attrValue, len, displayable); } // void loadMovies(); void notifyInval(); void notifyInvalTime(SkMSec time); void postOnEnd(SkAnimateBase* animate, SkMSec end); void removeActive(SkActive* ); void reset(); bool resolveID(SkDisplayable* displayable, SkDisplayable* original); void setEnableTime(SkMSec appTime, SkMSec expectedTime); void setErrorCode(SkXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.INHERITED::setCode(err); } void setErrorCode(SkDisplayXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.setCode(err); } void setErrorNoun(const SkString& str) { if (fError.hasError() == false) fError.setNoun(str); } void setErrorString(); void setExtraPropertyCallBack(SkDisplayTypes type, SkScriptEngine::_propertyCallBack , void* userStorage); void setID(SkDisplayable* displayable, const SkString& newID); void setInnerError(SkAnimateMaker* maker, const SkString& str) { fError.setInnerError(maker, str); } void setScriptError(const SkScriptEngine& ); #ifdef SK_DEBUG void validate() { fDisplayList.validate(); } #else void validate() {} #endif SkDisplayEvent* fActiveEvent; SkMSec fAdjustedStart; SkCanvas* fCanvas; SkMSec fEnableTime; int fEndDepth; // passed parameter to onEndElement SkEvents fEvents; SkDisplayList fDisplayList; SkEventSinkID fHostEventSinkID; SkMSec fMinimumInterval; SkPaint* fPaint; SkAnimateMaker* fParentMaker; SkString fPrefix; SkDisplayScreenplay fScreenplay; const SkAnimator::Timeline* fTimeline; SkBool8 fInInclude; SkBool8 fInMovie; SkBool8 fFirstScriptError; #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING SkMSec fDebugTimeBase; #endif #ifdef SK_DUMP_ENABLED SkString fDumpAnimated; SkBool8 fDumpEvents; SkBool8 fDumpGConditions; SkBool8 fDumpPosts; #endif private: void deleteMembers(); static bool GetStep(const char* token, size_t len, void* stepPtr, SkScriptValue* ); SkAnimateMaker& operator=(SkAnimateMaker& ); SkTDDisplayableArray fChildren; SkTDDisplayableArray fDelayed; // SkApply that contain delayed enable events SkDisplayXMLParserError fError; SkString fErrorString; SkTDArray<SkExtras*> fExtras; SkString fFileName; SkTDDisplayableArray fHelpers; // helper displayables SkBool8 fLoaded; SkTDDisplayableArray fMovies; SkTDict<SkDisplayable*> fIDs; SkAnimator* fAnimator; friend class SkAdd; friend class SkAnimateBase; friend class SkDisplayXMLParser; friend class SkAnimator; friend class SkAnimatorScript; friend class SkApply; friend class SkDisplayMovie; friend class SkDisplayType; friend class SkEvents; friend class SkGroup; friend struct SkMemberInfo; }; #endif // SkAnimateMaker_DEFINED