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 
29 class SkActive;
30 class SkAnimate;
31 class SkCanvas;
32 class SkDisplayable;
33 class SkADrawable;
34 class SkDump;
35 class SkEvent;
36 class SkEventSink;
37 class SkExtras;
38 class SkGroup;
39 class SkPaint;
40 class SkStream;
41 
42 class SkAnimateMaker {
43 public:
44     SkAnimateMaker(SkAnimator* animator, SkCanvas* canvas, SkPaint* paint);
45     ~SkAnimateMaker();
46     void appendActive(SkActive* );
childrenAdd(SkDisplayable * child)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**  );
find(const char * str,SkDisplayable ** displayablePtr)60     bool find(const char* str, SkDisplayable** displayablePtr) const {
61         return fIDs.find(str, displayablePtr);
62     }
find(const char * str,size_t len,SkDisplayable ** displayablePtr)63     bool find(const char* str, size_t len, SkDisplayable** displayablePtr) const {
64         return fIDs.find(str, len, displayablePtr);
65     }
findKey(SkDisplayable * displayable,const char ** string)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 //  }
getAnimator()72     SkAnimator* getAnimator() { return fAnimator; }
73     SkMSec getAppTime() const; // call caller to get current time
74 #ifdef SK_DEBUG
75     SkAnimator* getRoot();
76 #endif
getErrorCode()77     SkXMLParserError::ErrorCode getErrorCode() const { return fError.getErrorCode(); }
getInTime()78     SkMSec getInTime() { return fDisplayList.getTime(); }
getNativeCode()79     int getNativeCode() const { return fError.getNativeCode(); }
hasError()80     bool hasError() { return fError.hasError(); }
81     void helperAdd(SkDisplayable* trackMe);
82     void helperRemove(SkDisplayable* alreadyTracked);
idsSet(const char * attrValue,size_t len,SkDisplayable * displayable)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);
setErrorCode(SkXMLParserError::ErrorCode err)93     void setErrorCode(SkXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.INHERITED::setCode(err); }
setErrorCode(SkDisplayXMLParserError::ErrorCode err)94     void setErrorCode(SkDisplayXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.setCode(err); }
setErrorNoun(const SkString & str)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);
setInnerError(SkAnimateMaker * maker,const SkString & str)99     void setInnerError(SkAnimateMaker* maker, const SkString& str) { fError.setInnerError(maker, str); }
100     void setScriptError(const SkScriptEngine& );
101 #ifdef SK_DEBUG
validate()102     void validate() { fDisplayList.validate(); }
103 #else
validate()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
132 private:
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