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; }
void SkApply::applyValues(int animatorIndex, SkOperand* values, int count, SkDisplayTypes valuesType, SkMSec time) { SkAnimateBase* animator = fActive->fAnimators[animatorIndex]; const SkMemberInfo * info = animator->fFieldInfo; SkASSERT(animator); SkASSERT(info != NULL); SkDisplayTypes type = (SkDisplayTypes) info->fType; SkDisplayable* target = getTarget(animator); if (animator->hasExecute() || type == SkType_MemberFunction || type == SkType_MemberProperty) { SkDisplayable* executor = animator->hasExecute() ? animator : target; if (type != SkType_MemberProperty) { SkTDArray<SkScriptValue> typedValues; for (int index = 0; index < count; index++) { SkScriptValue temp; temp.fType = valuesType; temp.fOperand = values[index]; *typedValues.append() = temp; } executor->executeFunction(target, info->functionIndex(), typedValues, info->getType(), NULL); } else { SkScriptValue scriptValue; scriptValue.fOperand = values[0]; scriptValue.fType = info->getType(); target->setProperty(info->propertyIndex(), scriptValue); } } else { SkTypedArray converted; if (type == SkType_ARGB) { if (count == 4) { // !!! assert that it is SkType_Float ? animator->packARGB(&values->fScalar, count, &converted); values = converted.begin(); count = converted.count(); } else { SkASSERT(count == 1); } } // SkASSERT(type == SkType_ARGB || type == SkType_String ||info->isSettable()); if (type == SkType_String || type == SkType_DynamicString) info->setString(target, values->fString); else if (type == SkType_Drawable || type == SkType_Displayable) target->setReference(info, values->fDisplayable); else info->setValue(target, values, count); } }