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