int SkDisplayList::SearchForMatch(SkDrawable* match, SkTDDrawableArray** list, SkGroup** parent, SkGroup** found, SkTDDrawableArray**grandList) { *found = NULL; for (int index = 0; index < (*list)->count(); index++) { SkDrawable* draw = (**list)[index]; if (draw == match) return index; if (draw->isApply()) { SkApply* apply = (SkApply*) draw; if (apply->scope == match) return index; if (apply->scope->isGroup() && SearchGroupForMatch(apply->scope, match, list, parent, found, grandList, index)) return index; if (apply->mode == SkApply::kMode_create) { for (SkDrawable** ptr = apply->fScopes.begin(); ptr < apply->fScopes.end(); ptr++) { SkDrawable* scope = *ptr; if (scope == match) return index; //perhaps should call SearchGroupForMatch here as well (on scope) } } } if (draw->isGroup() && SearchGroupForMatch(draw, match, list, parent, found, grandList, index)) return index; } return -1; }
void SkApply::onEndElement(SkAnimateMaker& maker) { SkDrawable* scopePtr = scope; while (scopePtr && scopePtr->isApply()) { SkApply* scopedApply = (SkApply*) scopePtr; if (scopedApply->scope == this) { maker.setErrorCode(SkDisplayXMLParserError::kApplyScopesItself); return; } scopePtr = scopedApply->scope; } if (mode == kMode_create) return; if (scope != NULL && steps >= 0 && scope->isApply() == false && scope->isDrawable()) scope->setSteps(steps); for (SkAnimateBase** animPtr = fAnimators.begin(); animPtr < fAnimators.end(); animPtr++) { SkAnimateBase* anim = *animPtr; //for reusing apply statements with dynamic scope if (anim->fTarget == NULL || anim->fTargetIsScope) { anim->fTargetIsScope = true; if (scope) anim->fTarget = scope; else anim->setTarget(maker); anim->onEndElement(maker); // allows animate->fFieldInfo to be set } if (scope != NULL && steps >= 0 && anim->fTarget != scope && anim->fTarget->isDrawable()) anim->fTarget->setSteps(steps); } }
void SkDisplayList::reset() { for (int index = 0; index < fDrawList.count(); index++) { SkDrawable* draw = fDrawList[index]; if (draw->isApply() == false) continue; SkApply* apply = (SkApply*) draw; apply->reset(); } }
bool SkGroup::draw(SkAnimateMaker& maker) { bool conditionTrue = ifCondition(maker, this, condition); bool result = false; for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) { SkDrawable* drawable = *ptr; if (drawable->isDrawable() == false) continue; if (conditionTrue == false) { if (drawable->isApply()) ((SkApply*) drawable)->disable(); continue; } maker.validate(); result |= drawable->draw(maker); maker.validate(); } return result; }