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#include "SkDisplayPost.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateMaker.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimator.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayMovie.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPostParts.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScript.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDump.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTime.h"
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum SkPost_Properties {
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(target),
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(type)
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_USE_CONDENSED_INFO == 0
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo SkPost::fInfo[] = {
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(delay, MSec),
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  SK_MEMBER(initialized, Boolean),
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(mode, EventMode),
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER(sink, String),
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(target, String),
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(type, String)
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_GET_MEMBER(SkPost);
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkPost::SkPost() : delay(0), /*initialized(SkBool(-1)), */ mode(kImmediate), fMaker(NULL),
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fSinkID(0), fTargetMaker(NULL), fChildHasID(false), fDirty(false) {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkPost::~SkPost() {
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++)
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        delete *part;
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool SkPost::addChild(SkAnimateMaker& , SkDisplayable* child) {
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(child && child->isDataInput());
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDataInput* part = (SkDataInput*) child;
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *fParts.append() = part;
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkPost::childrenNeedDisposing() const {
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkPost::dirty() {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fDirty = true;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkPost::dump(SkAnimateMaker* maker) {
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dumpBase(maker);
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString* eventType = new SkString();
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fEvent.getType(eventType);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (eventType->equals("user")) {
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const char* target = fEvent.findString("id");
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("target=\"%s\" ", target);
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    else
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("type=\"%s\" ", eventType->c_str());
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    delete eventType;
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (delay > 0) {
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("delay=\"%g\" ", SkScalarToFloat(SkScalarDiv(delay, 1000)));
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  if (initialized == false)
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//      SkDebugf("(uninitialized) ");
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString string;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDump::GetEnumString(SkType_EventMode, mode, &string);
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!string.equals("immediate"))
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("mode=\"%s\" ", string.c_str());
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // !!! could enhance this to search through make hierarchy to show name of sink
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (sink.size() > 0) {
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("sink=\"%s\" sinkID=\"%d\" ", sink.c_str(), fSinkID);
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else if (fSinkID != maker->getAnimator()->getSinkID() && fSinkID != 0) {
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("sinkID=\"%d\" ", fSinkID);
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMetaData& meta = fEvent.getMetaData();
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMetaData::Iter iter(meta);
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMetaData::Type    type;
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int number;
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* name;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool closedYet = false;
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayList::fIndent += 4;
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //this seems to work, but kinda hacky
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //for some reason the last part is id, which i don't want
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //and the parts seem to be in the reverse order from the one in which we find the
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //data itself
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //SkDataInput** ptr = fParts.end();
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //SkDataInput* data;
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //const char* ID;
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    while ((name = iter.next(&type, &number)) != NULL) {
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //ptr--;
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (strcmp(name, "id") == 0)
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (closedYet == false) {
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf(">\n");
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            closedYet = true;
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //data = *ptr;
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //if (data->id)
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //    ID = data->id;
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //else
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //    ID = "";
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("%*s<data name=\"%s\" ", SkDisplayList::fIndent, "", name);
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        switch (type) {
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkMetaData::kS32_Type: {
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                int32_t s32;
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                meta.findS32(name, &s32);
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("int=\"%d\" ", s32);
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                } break;
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkMetaData::kScalar_Type: {
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkScalar scalar;
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                meta.findScalar(name, &scalar);
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("float=\"%g\" ", SkScalarToFloat(scalar));
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                } break;
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkMetaData::kString_Type:
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("string=\"%s\" ", meta.findString(name));
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkMetaData::kPtr_Type: {//when do we have a pointer
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    void* ptr;
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    meta.findPtr(name, &ptr);
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    SkDebugf("0x%08x ", ptr);
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                } break;
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkMetaData::kBool_Type: {
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                bool boolean;
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                meta.findBool(name, &boolean);
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkDebugf("boolean=\"%s\" ", boolean ? "true " : "false ");
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                } break;
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            default:
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("/>\n");
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        //ptr++;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*      perhaps this should only be done in the case of a pointer?
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDisplayable* displayable;
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (maker->find(name, &displayable))
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            displayable->dump(maker);
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        else
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDebugf("\n");*/
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDisplayList::fIndent -= 4;
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (closedYet)
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dumpEnd(maker);
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    else
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("/>\n");
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkPost::enable(SkAnimateMaker& maker ) {
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (maker.hasError())
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return true;
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fDirty) {
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (sink.size() > 0)
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            findSinkID();
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (fChildHasID) {
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkString preserveID(fEvent.findString("id"));
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fEvent.getMetaData().reset();
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (preserveID.size() > 0)
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                fEvent.setString("id", preserveID);
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++) {
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                if ((*part)->add())
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingDataToPost);
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDirty = false;
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (maker.fDumpPosts) {
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("post enable: ");
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dump(&maker);
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined SK_DEBUG_ANIMATION_TIMING
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString debugOut;
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec time = maker.getAppTime();
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.appendS32(time - maker.fDebugTimeBase);
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.append(" post id=");
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.append(_id);
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.append(" enable=");
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.appendS32(maker.fEnableTime - maker.fDebugTimeBase);
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.append(" delay=");
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.appendS32(delay);
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//  SkMSec adjustedDelay = maker.adjustDelay(maker.fEnableTime, delay);
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec futureTime = maker.fEnableTime + delay;
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fEvent.setFast32(futureTime);
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.append(" future=");
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    debugOut.appendS32(futureTime - maker.fDebugTimeBase);
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("%s\n", debugOut.c_str());
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkEventSinkID targetID = fSinkID;
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool isAnimatorEvent = true;
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator* anim = maker.getAnimator();
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (targetID == 0) {
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        isAnimatorEvent = fEvent.findString("id") != NULL;
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (isAnimatorEvent)
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            targetID = anim->getSinkID();
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        else if (maker.fHostEventSinkID)
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            targetID = maker.fHostEventSinkID;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        else
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return true;
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        anim = fTargetMaker->getAnimator();
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (delay == 0) {
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (isAnimatorEvent && mode == kImmediate)
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fTargetMaker->doEvent(fEvent);
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        else
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            anim->onEventPost(new SkEvent(fEvent), targetID);
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        anim->onEventPostTime(new SkEvent(fEvent), targetID, futureTime);
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkPost::findSinkID() {
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // get the next delimiter '.' if any
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fTargetMaker = fMaker;
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const char* ch = sink.c_str();
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    do {
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const char* end = strchr(ch, '.');
238d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        size_t len = end ? (size_t) (end - ch) : strlen(ch);
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDisplayable* displayable = NULL;
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SK_LITERAL_STR_EQUAL("parent", ch, len)) {
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (fTargetMaker->fParentMaker)
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                fTargetMaker = fTargetMaker->fParentMaker;
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            else {
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                fTargetMaker->setErrorCode(SkDisplayXMLParserError::kNoParentAvailable);
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return;
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } else {
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fTargetMaker->find(ch, len, &displayable);
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (displayable == NULL || displayable->getType() != SkType_Movie) {
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                fTargetMaker->setErrorCode(SkDisplayXMLParserError::kExpectedMovie);
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return;
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDisplayMovie* movie = (SkDisplayMovie*) displayable;
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fTargetMaker = movie->fMovie.fMaker;
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (end == NULL)
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        ch = ++end;
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } while (true);
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAnimator* anim = fTargetMaker->getAnimator();
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fSinkID = anim->getSinkID();
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkPost::hasEnable() const {
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkPost::onEndElement(SkAnimateMaker& maker) {
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fTargetMaker = fMaker = &maker;
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fChildHasID == false) {
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++)
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            delete *part;
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fParts.reset();
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkPost::setChildHasID() {
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fChildHasID = true;
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkPost::setProperty(int index, SkScriptValue& value) {
28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(value.fType == SkType_String);
28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString* string = value.fOperand.fString;
28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch(index) {
28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(target): {
28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fEvent.setType("user");
28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fEvent.setString("id", *string);
28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            mode = kImmediate;
28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } break;
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(type):
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fEvent.setType(*string);
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(0);
29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;
29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
299