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