blob: a5abff7355881f35008bb0a66a36638e532f964d [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
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** );
rmistry@google.comd6176b02012-08-23 18:14:13 +000060 bool find(const char* str, SkDisplayable** displayablePtr) const {
reed@android.com8a1c16f2008-12-17 15:59:43 +000061 return fIDs.find(str, displayablePtr);
62 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000063 bool find(const char* str, size_t len, SkDisplayable** displayablePtr) const {
reed@android.com8a1c16f2008-12-17 15:59:43 +000064 return fIDs.find(str, len, displayablePtr);
65 }
66 bool findKey(SkDisplayable* displayable, const char** string) const {
67 return fIDs.findKey(displayable, string);
68 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000069// bool find(SkString& string, SkDisplayable** displayablePtr) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000070// 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);
rmistry@google.comd6176b02012-08-23 18:14:13 +000083 void idsSet(const char* attrValue, size_t len, SkDisplayable* displayable) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000084 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