void SkApply::enableDynamic(SkAnimateMaker& maker) { SkASSERT(mode != kMode_create); // create + dynamic are not currently compatible SkDisplayable* newScope; bool success = SkAnimatorScript::EvaluateDisplayable(maker, this, dynamicScope.c_str(), &newScope); if (success && scope != newScope) { SkTDDrawableArray* pList, * gList; SkGroup* pGroup = NULL, * found = NULL; int old = maker.fDisplayList.findGroup(scope, &pList, &pGroup, &found, &gList); if (pList && old >= 0 && (*pList)[old]->isApply() && (*pList)[old] != this) { if (fAppended == false) { if (found != NULL) { SkDisplayable* oldChild = (*pList)[old]; if (oldChild->isApply() && found->copySet(old)) { found->markCopyClear(old); // delete oldChild; } } (*pList)[old] = scope; } else pList->remove(old); } scope = (SkDrawable*) newScope; onEndElement(maker); } maker.removeActive(fActive); delete fActive; fActive = NULL; }
void SkAnimateMaker::doDelayedEvent() { fEnableTime = getAppTime(); for (int index = 0; index < fDelayed.count(); ) { SkDisplayable* child = fDelayed[index]; SkASSERT(child->isApply()); SkApply* apply = (SkApply*) child; apply->interpolate(*this, fEnableTime); if (apply->hasDelayedAnimator()) index++; else fDelayed.remove(index); } }
void SkDisplayEvent::populateInput(SkAnimateMaker& maker, const SkEvent& fEvent) { const SkMetaData& meta = fEvent.getMetaData(); SkMetaData::Iter iter(meta); SkMetaData::Type type; int number; const char* name; while ((name = iter.next(&type, &number)) != NULL) { if (name[0] == '\0') continue; SkDisplayable* displayable; SkInput* input; for (int index = 0; index < fChildren.count(); index++) { displayable = fChildren[index]; if (displayable->getType() != SkType_Input) continue; input = (SkInput*) displayable; if (input->name.equals(name)) goto found; } if (!maker.find(name, &displayable) || displayable->getType() != SkType_Input) continue; input = (SkInput*) displayable; found: switch (type) { case SkMetaData::kS32_Type: meta.findS32(name, &input->fInt); break; case SkMetaData::kScalar_Type: meta.findScalar(name, &input->fFloat); break; case SkMetaData::kPtr_Type: SkASSERT(0); break; // !!! not handled for now case SkMetaData::kString_Type: input->string.set(meta.findString(name)); break; default: SkASSERT(0); } } // re-evaluate all animators that may have built their values from input strings for (SkDisplayable** childPtr = fChildren.begin(); childPtr < fChildren.end(); childPtr++) { SkDisplayable* displayable = *childPtr; if (displayable->isApply() == false) continue; SkApply* apply = (SkApply*) displayable; apply->refresh(maker); } }