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 SkApply::enableCreate(SkAnimateMaker& maker) { SkString newID; for (int step = 0; step <= steps; step++) { fLastTime = step * SK_MSec1; bool success = maker.computeID(scope, this, &newID); if (success == false) return; if (maker.find(newID.c_str(), NULL)) continue; SkApply* copy = (SkApply*) deepCopy(&maker); // work on copy of animator state if (mode == kMode_create) copy->mode = (Mode) -1; SkDrawable* copyScope = copy->scope = (SkDrawable*) scope->deepCopy(&maker); *fScopes.append() = copyScope; if (copyScope->resolveIDs(maker, scope, this)) { step = steps; // quit goto next; // resolveIDs failed } if (newID.size() > 0) maker.setID(copyScope, newID); if (copy->resolveIDs(maker, this, this)) { // fix up all fields, including target step = steps; // quit goto next; // resolveIDs failed } copy->activate(maker); copy->interpolate(maker, step * SK_MSec1); maker.removeActive(copy->fActive); next: delete copy; } }
bool SkApply::inactivate(SkAnimateMaker& maker) { if (fActive == NULL) return false; maker.removeActive(fActive); delete fActive; fActive = NULL; return true; }