1 2/* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#ifndef SkAnimateMaker_DEFINED 11#define SkAnimateMaker_DEFINED 12 13// #define SK_DEBUG_ANIMATION_TIMING 14 15#include "SkAnimator.h" 16#include "SkBitmap.h" 17#include "SkIntArray.h" 18#include "SkDisplayEvents.h" 19#include "SkDisplayList.h" 20#include "SkDisplayScreenplay.h" 21#include "SkDisplayXMLParser.h" 22#include "SkScript.h" 23#include "SkString.h" 24#include "SkTDict.h" 25 26// not sure where this little helper macro should go 27 28 29class SkActive; 30class SkAnimate; 31class SkCanvas; 32class SkDisplayable; 33class SkDrawable; 34class SkDump; 35class SkEvent; 36class SkEventSink; 37class SkExtras; 38class SkGroup; 39class SkPaint; 40class SkStream; 41 42class SkAnimateMaker { 43public: 44 SkAnimateMaker(SkAnimator* animator, SkCanvas* canvas, SkPaint* paint); 45 ~SkAnimateMaker(); 46 void appendActive(SkActive* ); 47 void childrenAdd(SkDisplayable* child) { *fChildren.append() = child; } 48 void clearExtraPropertyCallBack(SkDisplayTypes type); 49 bool computeID(SkDisplayable* displayable, SkDisplayable* parent, SkString* newID); 50 SkDisplayable* createInstance(const char name[], size_t len); 51 bool decodeStream(SkStream* stream); 52 bool decodeURI(const char uri[]); 53 void delayEnable(SkApply* apply, SkMSec time); 54 void doDelayedEvent(); 55 bool doEvent(const SkEvent& event); 56#ifdef SK_DUMP_ENABLED 57 void dump(const char* match); 58#endif 59 int dynamicProperty(SkString& nameStr, SkDisplayable** ); 60 bool find(const char* str, SkDisplayable** displayablePtr) const { 61 return fIDs.find(str, displayablePtr); 62 } 63 bool find(const char* str, size_t len, SkDisplayable** displayablePtr) const { 64 return fIDs.find(str, len, displayablePtr); 65 } 66 bool findKey(SkDisplayable* displayable, const char** string) const { 67 return fIDs.findKey(displayable, string); 68 } 69// bool find(SkString& string, SkDisplayable** displayablePtr) { 70// return fIDs.find(string.c_str(), displayablePtr); 71// } 72 SkAnimator* getAnimator() { return fAnimator; } 73 SkMSec getAppTime() const; // call caller to get current time 74#ifdef SK_DEBUG 75 SkAnimator* getRoot(); 76#endif 77 SkXMLParserError::ErrorCode getErrorCode() const { return fError.getErrorCode(); } 78 SkMSec getInTime() { return fDisplayList.getTime(); } 79 int getNativeCode() const { return fError.getNativeCode(); } 80 bool hasError() { return fError.hasError(); } 81 void helperAdd(SkDisplayable* trackMe); 82 void helperRemove(SkDisplayable* alreadyTracked); 83 void idsSet(const char* attrValue, size_t len, SkDisplayable* displayable) { 84 fIDs.set(attrValue, len, displayable); } 85// void loadMovies(); 86 void notifyInval(); 87 void notifyInvalTime(SkMSec time); 88 void postOnEnd(SkAnimateBase* animate, SkMSec end); 89 void removeActive(SkActive* ); 90 void reset(); 91 bool resolveID(SkDisplayable* displayable, SkDisplayable* original); 92 void setEnableTime(SkMSec appTime, SkMSec expectedTime); 93 void setErrorCode(SkXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.INHERITED::setCode(err); } 94 void setErrorCode(SkDisplayXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.setCode(err); } 95 void setErrorNoun(const SkString& str) { if (fError.hasError() == false) fError.setNoun(str); } 96 void setErrorString(); 97 void setExtraPropertyCallBack(SkDisplayTypes type, SkScriptEngine::_propertyCallBack , void* userStorage); 98 void setID(SkDisplayable* displayable, const SkString& newID); 99 void setInnerError(SkAnimateMaker* maker, const SkString& str) { fError.setInnerError(maker, str); } 100 void setScriptError(const SkScriptEngine& ); 101#ifdef SK_DEBUG 102 void validate() { fDisplayList.validate(); } 103#else 104 void validate() {} 105#endif 106 SkDisplayEvent* fActiveEvent; 107 SkMSec fAdjustedStart; 108 SkCanvas* fCanvas; 109 SkMSec fEnableTime; 110 int fEndDepth; // passed parameter to onEndElement 111 SkEvents fEvents; 112 SkDisplayList fDisplayList; 113 SkEventSinkID fHostEventSinkID; 114 SkMSec fMinimumInterval; 115 SkPaint* fPaint; 116 SkAnimateMaker* fParentMaker; 117 SkString fPrefix; 118 SkDisplayScreenplay fScreenplay; 119 const SkAnimator::Timeline* fTimeline; 120 SkBool8 fInInclude; 121 SkBool8 fInMovie; 122 SkBool8 fFirstScriptError; 123#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING 124 SkMSec fDebugTimeBase; 125#endif 126#ifdef SK_DUMP_ENABLED 127 SkString fDumpAnimated; 128 SkBool8 fDumpEvents; 129 SkBool8 fDumpGConditions; 130 SkBool8 fDumpPosts; 131#endif 132private: 133 void deleteMembers(); 134 static bool GetStep(const char* token, size_t len, void* stepPtr, SkScriptValue* ); 135 SkAnimateMaker& operator=(SkAnimateMaker& ); 136 SkTDDisplayableArray fChildren; 137 SkTDDisplayableArray fDelayed; // SkApply that contain delayed enable events 138 SkDisplayXMLParserError fError; 139 SkString fErrorString; 140 SkTDArray<SkExtras*> fExtras; 141 SkString fFileName; 142 SkTDDisplayableArray fHelpers; // helper displayables 143 SkBool8 fLoaded; 144 SkTDDisplayableArray fMovies; 145 SkTDict<SkDisplayable*> fIDs; 146 SkAnimator* fAnimator; 147 friend class SkAdd; 148 friend class SkAnimateBase; 149 friend class SkDisplayXMLParser; 150 friend class SkAnimator; 151 friend class SkAnimatorScript; 152 friend class SkApply; 153 friend class SkDisplayMovie; 154 friend class SkDisplayType; 155 friend class SkEvents; 156 friend class SkGroup; 157 friend struct SkMemberInfo; 158}; 159 160#endif // SkAnimateMaker_DEFINED 161