bool SkDisplayXMLParser::onEndElement(const char elem[]) { int parentIndex = fParents.count() - 1; if (parentIndex >= 0) { Parent& container = fParents[parentIndex]; SkDisplayable* displayable = container.fDisplayable; fMaker.fEndDepth = parentIndex; displayable->onEndElement(fMaker); if (fMaker.fError.hasError()) return true; if (parentIndex > 0) { SkDisplayable* parent = fParents[parentIndex - 1].fDisplayable; bool result = parent->add(fMaker, displayable); if (fMaker.hasError()) return true; if (result == false) { int infoCount; const SkMemberInfo* info = SkDisplayType::GetMembers(&fMaker, fParents[parentIndex - 1].fType, &infoCount); const SkMemberInfo* foundInfo; if ((foundInfo = searchContainer(info, infoCount)) != NULL) { parent->setReference(foundInfo, displayable); // if (displayable->isHelper() == false) fMaker.helperAdd(displayable); } else { fMaker.setErrorCode(SkDisplayXMLParserError::kElementTypeNotAllowedInParent); return true; } } if (parent->childrenNeedDisposing()) delete displayable; } fParents.remove(parentIndex); } fCurrDisplayable = NULL; if (fInInclude == false && strcasecmp(elem, "screenplay") == 0) { if (fMaker.fInMovie == false) { fMaker.fEnableTime = fMaker.getAppTime(); #if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING if (fMaker.fDebugTimeBase == (SkMSec) -1) fMaker.fDebugTimeBase = fMaker.fEnableTime; SkString debugOut; SkMSec time = fMaker.getAppTime(); debugOut.appendS32(time - fMaker.fDebugTimeBase); debugOut.append(" onLoad enable="); debugOut.appendS32(fMaker.fEnableTime - fMaker.fDebugTimeBase); SkDebugf("%s\n", debugOut.c_str()); #endif fMaker.fEvents.doEvent(fMaker, SkDisplayEvent::kOnload, NULL); if (fMaker.fError.hasError()) return true; fMaker.fEvents.removeEvent(SkDisplayEvent::kOnload, NULL); } fInSkia = false; } return false; }