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