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; }
int SkGroup::findGroup(SkDrawable* match, SkTDDrawableArray** list, SkGroup** parent, SkGroup** found, SkTDDrawableArray** grandList) { *list = &fChildren; for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) { SkDrawable* drawable = *ptr; if (drawable->isGroup()) { SkGroup* childGroup = (SkGroup*) drawable; if (childGroup->fOriginal == match) goto foundMatch; } if (drawable == match) { foundMatch: *parent = this; return (int) (ptr - fChildren.begin()); } } *grandList = &fChildren; return SkDisplayList::SearchForMatch(match, list, parent, found, grandList); }