11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayPost.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimator.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDisplayMovie.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPostParts.h"
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript.h"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDump.h"
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTime.h"
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectenum SkPost_Properties {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(target),
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_PROPERTY(type)
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkPost::fInfo[] = {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(delay, MSec),
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  SK_MEMBER(initialized, Boolean),
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(mode, EventMode),
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER(sink, String),
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(target, String),
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SK_MEMBER_PROPERTY(type, String)
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkPost);
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPost::SkPost() : delay(0), /*initialized(SkBool(-1)), */ mode(kImmediate), fMaker(NULL),
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fSinkID(0), fTargetMaker(NULL), fChildHasID(false), fDirty(false) {
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkPost::~SkPost() {
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++)
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        delete *part;
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPost::add(SkAnimateMaker& , SkDisplayable* child) {
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(child && child->isDataInput());
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkDataInput* part = (SkDataInput*) child;
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    *fParts.append() = part;
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPost::childrenNeedDisposing() const {
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPost::dirty() {
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDirty = true;
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPost::dump(SkAnimateMaker* maker) {
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dumpBase(maker);
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString* eventType = new SkString();
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fEvent.getType(eventType);
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (eventType->equals("user")) {
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const char* target = fEvent.findString("id");
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("target=\"%s\" ", target);
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("type=\"%s\" ", eventType->c_str());
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    delete eventType;
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (delay > 0) {
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("delay=\"%g\" ", SkScalarToFloat(SkScalarDiv(delay, 1000)));
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("delay=\"%x\" ", SkScalarDiv(delay, 1000));
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  if (initialized == false)
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//      SkDebugf("(uninitialized) ");
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString string;
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDump::GetEnumString(SkType_EventMode, mode, &string);
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (!string.equals("immediate"))
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("mode=\"%s\" ", string.c_str());
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // !!! could enhance this to search through make hierarchy to show name of sink
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (sink.size() > 0) {
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("sink=\"%s\" sinkID=\"%d\" ", sink.c_str(), fSinkID);
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else if (fSinkID != maker->getAnimator()->getSinkID() && fSinkID != 0) {
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("sinkID=\"%d\" ", fSinkID);
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkMetaData& meta = fEvent.getMetaData();
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMetaData::Iter iter(meta);
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMetaData::Type    type;
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int number;
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* name;
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool closedYet = false;
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayList::fIndent += 4;
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //this seems to work, but kinda hacky
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //for some reason the last part is id, which i don't want
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //and the parts seem to be in the reverse order from the one in which we find the
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //data itself
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    //SkDataInput** ptr = fParts.end();
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    //SkDataInput* data;
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    //const char* ID;
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    while ((name = iter.next(&type, &number)) != NULL) {
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //ptr--;
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (strcmp(name, "id") == 0)
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            continue;
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (closedYet == false) {
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(">\n");
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            closedYet = true;
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //data = *ptr;
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //if (data->id)
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //    ID = data->id;
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //else
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //    ID = "";
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("%*s<data name=\"%s\" ", SkDisplayList::fIndent, "", name);
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (type) {
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kS32_Type: {
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                int32_t s32;
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                meta.findS32(name, &s32);
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("int=\"%d\" ", s32);
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                } break;
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kScalar_Type: {
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkScalar scalar;
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                meta.findScalar(name, &scalar);
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("float=\"%g\" ", SkScalarToFloat(scalar));
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("float=\"%x\" ", scalar);
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                } break;
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kString_Type:
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("string=\"%s\" ", meta.findString(name));
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kPtr_Type: {//when do we have a pointer
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    void* ptr;
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    meta.findPtr(name, &ptr);
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    SkDebugf("0x%08x ", ptr);
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                } break;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkMetaData::kBool_Type: {
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                bool boolean;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                meta.findBool(name, &boolean);
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf("boolean=\"%s\" ", boolean ? "true " : "false ");
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                } break;
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("/>\n");
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        //ptr++;
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*      perhaps this should only be done in the case of a pointer?
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* displayable;
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (maker->find(name, &displayable))
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            displayable->dump(maker);
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf("\n");*/
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDisplayList::fIndent -= 4;
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (closedYet)
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dumpEnd(maker);
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    else
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("/>\n");
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPost::enable(SkAnimateMaker& maker ) {
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (maker.hasError())
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return true;
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fDirty) {
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (sink.size() > 0)
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            findSinkID();
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (fChildHasID) {
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkString preserveID(fEvent.findString("id"));
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fEvent.getMetaData().reset();
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (preserveID.size() > 0)
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fEvent.setString("id", preserveID);
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++) {
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if ((*part)->add())
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingDataToPost);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fDirty = false;
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (maker.fDumpPosts) {
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("post enable: ");
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dump(&maker);
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined SK_DEBUG_ANIMATION_TIMING
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString debugOut;
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMSec time = maker.getAppTime();
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.appendS32(time - maker.fDebugTimeBase);
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.append(" post id=");
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.append(_id);
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.append(" enable=");
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.appendS32(maker.fEnableTime - maker.fDebugTimeBase);
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.append(" delay=");
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.appendS32(delay);
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  SkMSec adjustedDelay = maker.adjustDelay(maker.fEnableTime, delay);
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkMSec futureTime = maker.fEnableTime + delay;
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fEvent.setFast32(futureTime);
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.append(" future=");
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    debugOut.appendS32(futureTime - maker.fDebugTimeBase);
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("%s\n", debugOut.c_str());
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkEventSinkID targetID = fSinkID;
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool isAnimatorEvent = true;
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAnimator* anim = maker.getAnimator();
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (targetID == 0) {
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        isAnimatorEvent = fEvent.findString("id") != NULL;
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (isAnimatorEvent)
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            targetID = anim->getSinkID();
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else if (maker.fHostEventSinkID)
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            targetID = maker.fHostEventSinkID;
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return true;
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        anim = fTargetMaker->getAnimator();
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (delay == 0) {
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (isAnimatorEvent && mode == kImmediate)
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fTargetMaker->doEvent(fEvent);
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            anim->onEventPost(new SkEvent(fEvent), targetID);
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        anim->onEventPostTime(new SkEvent(fEvent), targetID, futureTime);
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPost::findSinkID() {
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // get the next delimiter '.' if any
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fTargetMaker = fMaker;
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* ch = sink.c_str();
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const char* end = strchr(ch, '.');
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        size_t len = end ? end - ch : strlen(ch);
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDisplayable* displayable = NULL;
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (SK_LITERAL_STR_EQUAL("parent", ch, len)) {
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (fTargetMaker->fParentMaker)
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fTargetMaker = fTargetMaker->fParentMaker;
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            else {
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fTargetMaker->setErrorCode(SkDisplayXMLParserError::kNoParentAvailable);
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                return;
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        } else {
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fTargetMaker->find(ch, len, &displayable);
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (displayable == NULL || displayable->getType() != SkType_Movie) {
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fTargetMaker->setErrorCode(SkDisplayXMLParserError::kExpectedMovie);
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                return;
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDisplayMovie* movie = (SkDisplayMovie*) displayable;
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fTargetMaker = movie->fMovie.fMaker;
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (end == NULL)
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        ch = ++end;
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (true);
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkAnimator* anim = fTargetMaker->getAnimator();
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fSinkID = anim->getSinkID();
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPost::hasEnable() const {
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPost::onEndElement(SkAnimateMaker& maker) {
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fTargetMaker = fMaker = &maker;
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (fChildHasID == false) {
2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (SkDataInput** part = fParts.begin(); part < fParts.end();  part++)
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            delete *part;
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fParts.reset();
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkPost::setChildHasID() {
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fChildHasID = true;
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkPost::setProperty(int index, SkScriptValue& value) {
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(value.fType == SkType_String);
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString* string = value.fOperand.fString;
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch(index) {
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(target): {
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fEvent.setType("user");
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fEvent.setString("id", *string);
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            mode = kImmediate;
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SK_PROPERTY(type):
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fEvent.setType(*string);
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(0);
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return true;
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
308