180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkAnimateMaker_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkAnimateMaker_DEFINED
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// #define SK_DEBUG_ANIMATION_TIMING
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimator.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkIntArray.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayEvents.h"
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayList.h"
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayScreenplay.h"
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayXMLParser.h"
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScript.h"
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTDict.h"
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// not sure where this little helper macro should go
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkActive;
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAnimate;
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkCanvas;
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDisplayable;
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDrawable;
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDump;
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkEvent;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkEventSink;
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkExtras;
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkGroup;
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPaint;
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkStream;
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAnimateMaker {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimateMaker(SkAnimator* animator, SkCanvas* canvas, SkPaint* paint);
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ~SkAnimateMaker();
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void appendActive(SkActive* );
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void childrenAdd(SkDisplayable* child) { *fChildren.append() = child; }
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void clearExtraPropertyCallBack(SkDisplayTypes type);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool computeID(SkDisplayable* displayable, SkDisplayable* parent, SkString* newID);
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayable* createInstance(const char name[], size_t len);
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool decodeStream(SkStream* stream);
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool decodeURI(const char uri[]);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void delayEnable(SkApply* apply, SkMSec time);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void doDelayedEvent();
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool doEvent(const SkEvent& event);
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void dump(const char* match);
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int dynamicProperty(SkString& nameStr, SkDisplayable**  );
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool find(const char* str, SkDisplayable** displayablePtr) const {
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fIDs.find(str, displayablePtr);
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool find(const char* str, size_t len, SkDisplayable** displayablePtr) const {
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fIDs.find(str, len, displayablePtr);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool findKey(SkDisplayable* displayable, const char** string) const {
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fIDs.findKey(displayable, string);
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  bool find(SkString& string, SkDisplayable** displayablePtr) {
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//      return fIDs.find(string.c_str(), displayablePtr);
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  }
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator* getAnimator() { return fAnimator; }
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec getAppTime() const; // call caller to get current time
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator* getRoot();
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkXMLParserError::ErrorCode getErrorCode() const { return fError.getErrorCode(); }
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec getInTime() { return fDisplayList.getTime(); }
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int getNativeCode() const { return fError.getNativeCode(); }
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool hasError() { return fError.hasError(); }
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void helperAdd(SkDisplayable* trackMe);
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void helperRemove(SkDisplayable* alreadyTracked);
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void idsSet(const char* attrValue, size_t len, SkDisplayable* displayable) {
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIDs.set(attrValue, len, displayable); }
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  void loadMovies();
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void notifyInval();
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void notifyInvalTime(SkMSec time);
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void postOnEnd(SkAnimateBase* animate, SkMSec end);
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void removeActive(SkActive* );
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void reset();
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool resolveID(SkDisplayable* displayable, SkDisplayable* original);
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setEnableTime(SkMSec appTime, SkMSec expectedTime);
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setErrorCode(SkXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.INHERITED::setCode(err); }
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setErrorCode(SkDisplayXMLParserError::ErrorCode err) { if (fError.hasError() == false) fError.setCode(err); }
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setErrorNoun(const SkString& str) { if (fError.hasError() == false) fError.setNoun(str); }
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setErrorString();
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setExtraPropertyCallBack(SkDisplayTypes type, SkScriptEngine::_propertyCallBack , void* userStorage);
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setID(SkDisplayable* displayable, const SkString& newID);
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setInnerError(SkAnimateMaker* maker, const SkString& str) { fError.setInnerError(maker, str); }
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setScriptError(const SkScriptEngine& );
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validate() { fDisplayList.validate(); }
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validate() {}
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayEvent* fActiveEvent;
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec fAdjustedStart;
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkCanvas* fCanvas;
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec fEnableTime;
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int fEndDepth;  // passed parameter to onEndElement
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkEvents fEvents;
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayList fDisplayList;
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkEventSinkID fHostEventSinkID;
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec fMinimumInterval;
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaint* fPaint;
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimateMaker* fParentMaker;
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fPrefix;
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayScreenplay fScreenplay;
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkAnimator::Timeline* fTimeline;
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fInInclude;
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fInMovie;
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fFirstScriptError;
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec fDebugTimeBase;
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fDumpAnimated;
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fDumpEvents;
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fDumpGConditions;
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fDumpPosts;
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void deleteMembers();
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static bool GetStep(const char* token, size_t len, void* stepPtr, SkScriptValue* );
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimateMaker& operator=(SkAnimateMaker& );
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDDisplayableArray fChildren;
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDDisplayableArray fDelayed; // SkApply that contain delayed enable events
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayXMLParserError fError;
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fErrorString;
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDArray<SkExtras*> fExtras;
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fFileName;
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDDisplayableArray fHelpers;  // helper displayables
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBool8 fLoaded;
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDDisplayableArray fMovies;
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDict<SkDisplayable*> fIDs;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator* fAnimator;
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkAdd;
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkAnimateBase;
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkDisplayXMLParser;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkAnimator;
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkAnimatorScript;
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkApply;
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkDisplayMovie;
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkDisplayType;
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkEvents;
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkGroup;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend struct SkMemberInfo;
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif // SkAnimateMaker_DEFINED
161