1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayPost.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimator.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayMovie.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPostParts.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScript.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDump.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comenum SkPost_Properties {
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_PROPERTY(target),
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_PROPERTY(type)
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkPost::fInfo[] = {
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(delay, MSec),
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  SK_MEMBER(initialized, Boolean),
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(mode, EventMode),
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER(sink, String),
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(target, String),
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SK_MEMBER_PROPERTY(type, String)
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkPost);
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPost::SkPost() : delay(0), /*initialized(SkBool(-1)), */ mode(kImmediate), fMaker(NULL),
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fSinkID(0), fTargetMaker(NULL), fChildHasID(false), fDirty(false) {
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPost::~SkPost() {
468d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com    for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++)
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete *part;
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
501d3c411f5e4d2ad31bc92b3a85957004329ac00dtfarina@chromium.orgbool SkPost::addChild(SkAnimateMaker& , SkDisplayable* child) {
518d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com    SkASSERT(child && child->isDataInput());
528d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com    SkDataInput* part = (SkDataInput*) child;
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *fParts.append() = part;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
57d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.combool SkPost::childrenNeedDisposing() const {
58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return false;
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
61d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkPost::dirty() {
62d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    fDirty = true;
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkPost::dump(SkAnimateMaker* maker) {
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dumpBase(maker);
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString* eventType = new SkString();
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fEvent.getType(eventType);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (eventType->equals("user")) {
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* target = fEvent.findString("id");
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("target=\"%s\" ", target);
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("type=\"%s\" ", eventType->c_str());
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete eventType;
77d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (delay > 0) {
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("delay=\"%g\" ", SkScalarToFloat(SkScalarDiv(delay, 1000)));
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  if (initialized == false)
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//      SkDebugf("(uninitialized) ");
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString string;
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDump::GetEnumString(SkType_EventMode, mode, &string);
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!string.equals("immediate"))
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("mode=\"%s\" ", string.c_str());
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // !!! could enhance this to search through make hierarchy to show name of sink
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (sink.size() > 0) {
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("sink=\"%s\" sinkID=\"%d\" ", sink.c_str(), fSinkID);
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else if (fSinkID != maker->getAnimator()->getSinkID() && fSinkID != 0) {
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("sinkID=\"%d\" ", fSinkID);
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMetaData& meta = fEvent.getMetaData();
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMetaData::Iter iter(meta);
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMetaData::Type    type;
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int number;
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* name;
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool closedYet = false;
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayList::fIndent += 4;
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //this seems to work, but kinda hacky
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //for some reason the last part is id, which i don't want
102d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    //and the parts seem to be in the reverse order from the one in which we find the
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //data itself
1048d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com    //SkDataInput** ptr = fParts.end();
1058d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com    //SkDataInput* data;
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //const char* ID;
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    while ((name = iter.next(&type, &number)) != NULL) {
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //ptr--;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (strcmp(name, "id") == 0)
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (closedYet == false) {
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf(">\n");
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            closedYet = true;
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //data = *ptr;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //if (data->id)
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //    ID = data->id;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //else
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //    ID = "";
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("%*s<data name=\"%s\" ", SkDisplayList::fIndent, "", name);
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        switch (type) {
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kS32_Type: {
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                int32_t s32;
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                meta.findS32(name, &s32);
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDebugf("int=\"%d\" ", s32);
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                } break;
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kScalar_Type: {
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkScalar scalar;
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                meta.findScalar(name, &scalar);
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDebugf("float=\"%g\" ", SkScalarToFloat(scalar));
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                } break;
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kString_Type:
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDebugf("string=\"%s\" ", meta.findString(name));
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kPtr_Type: {//when do we have a pointer
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    void* ptr;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    meta.findPtr(name, &ptr);
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    SkDebugf("0x%08x ", ptr);
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                } break;
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkMetaData::kBool_Type: {
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                bool boolean;
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                meta.findBool(name, &boolean);
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDebugf("boolean=\"%s\" ", boolean ? "true " : "false ");
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                } break;
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("/>\n");
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //ptr++;
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*      perhaps this should only be done in the case of a pointer?
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* displayable;
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (maker->find(name, &displayable))
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            displayable->dump(maker);
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("\n");*/
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayList::fIndent -= 4;
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (closedYet)
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dumpEnd(maker);
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("/>\n");
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkPost::enable(SkAnimateMaker& maker ) {
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (maker.hasError())
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fDirty) {
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (sink.size() > 0)
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            findSinkID();
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fChildHasID) {
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkString preserveID(fEvent.findString("id"));
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fEvent.getMetaData().reset();
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (preserveID.size() > 0)
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fEvent.setString("id", preserveID);
1778d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com            for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++) {
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                if ((*part)->add())
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                    maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingDataToPost);
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fDirty = false;
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (maker.fDumpPosts) {
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDebugf("post enable: ");
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dump(&maker);
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG_ANIMATION_TIMING
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString debugOut;
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec time = maker.getAppTime();
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(time - maker.fDebugTimeBase);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" post id=");
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(_id);
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" enable=");
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(maker.fEnableTime - maker.fDebugTimeBase);
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" delay=");
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(delay);
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  SkMSec adjustedDelay = maker.adjustDelay(maker.fEnableTime, delay);
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec futureTime = maker.fEnableTime + delay;
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fEvent.setFast32(futureTime);
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.append(" future=");
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    debugOut.appendS32(futureTime - maker.fDebugTimeBase);
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugf("%s\n", debugOut.c_str());
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkEventSinkID targetID = fSinkID;
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool isAnimatorEvent = true;
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimator* anim = maker.getAnimator();
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (targetID == 0) {
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        isAnimatorEvent = fEvent.findString("id") != NULL;
214d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        if (isAnimatorEvent)
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            targetID = anim->getSinkID();
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else if (maker.fHostEventSinkID)
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            targetID = maker.fHostEventSinkID;
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        anim = fTargetMaker->getAnimator();
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (delay == 0) {
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (isAnimatorEvent && mode == kImmediate)
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fTargetMaker->doEvent(fEvent);
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        else
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            anim->onEventPost(new SkEvent(fEvent), targetID);
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        anim->onEventPostTime(new SkEvent(fEvent), targetID, futureTime);
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkPost::findSinkID() {
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // get the next delimiter '.' if any
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTargetMaker = fMaker;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char* ch = sink.c_str();
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    do {
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char* end = strchr(ch, '.');
2380e51577a14f903ffeafa117a75954baeb173ffb9humper@google.com        size_t len = end ? (size_t) (end - ch) : strlen(ch);
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayable* displayable = NULL;
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SK_LITERAL_STR_EQUAL("parent", ch, len)) {
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (fTargetMaker->fParentMaker)
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fTargetMaker = fTargetMaker->fParentMaker;
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else {
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fTargetMaker->setErrorCode(SkDisplayXMLParserError::kNoParentAvailable);
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                return;
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        } else {
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fTargetMaker->find(ch, len, &displayable);
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (displayable == NULL || displayable->getType() != SkType_Movie) {
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                fTargetMaker->setErrorCode(SkDisplayXMLParserError::kExpectedMovie);
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                return;
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDisplayMovie* movie = (SkDisplayMovie*) displayable;
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fTargetMaker = movie->fMovie.fMaker;
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (end == NULL)
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        ch = ++end;
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } while (true);
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimator* anim = fTargetMaker->getAnimator();
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fSinkID = anim->getSinkID();
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
263d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkPost::hasEnable() const {
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkPost::onEndElement(SkAnimateMaker& maker) {
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTargetMaker = fMaker = &maker;
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fChildHasID == false) {
2718d0b5770f8fcfdeb8ad9808e58c49116f14b6190reed@google.com        for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++)
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            delete *part;
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fParts.reset();
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
277d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comvoid SkPost::setChildHasID() {
278d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    fChildHasID = true;
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkPost::setProperty(int index, SkScriptValue& value) {
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(value.fType == SkType_String);
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString* string = value.fOperand.fString;
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch(index) {
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(target): {
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fEvent.setType("user");
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fEvent.setString("id", *string);
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            mode = kImmediate;
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            } break;
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SK_PROPERTY(type):
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fEvent.setType(*string);
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(0);
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return false;
2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return true;
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
299