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 SkGroup::resolveIDs(SkAnimateMaker& maker, SkDisplayable* orig, SkApply* apply) { SkGroup* original = (SkGroup*) orig; SkTDDrawableArray& originalChildren = original->fChildren; SkDrawable** originalPtr = originalChildren.begin(); SkDrawable** ptr = fChildren.begin(); SkDrawable** end = fChildren.end(); SkDrawable** origChild = ((SkGroup*) orig)->fChildren.begin(); while (ptr < end) { SkDrawable* drawable = *ptr++; maker.resolveID(drawable, *origChild++); if (drawable->resolveIDs(maker, *originalPtr++, apply) == true) return true; // failed } return false; }