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