@@ -54,7 +54,8 @@ LayerHierarchy::LayerHierarchy(const LayerHierarchy& hierarchy, bool childrenOnl
5454 mChildren = hierarchy.mChildren ;
5555}
5656
57- void LayerHierarchy::traverse (const Visitor& visitor, LayerHierarchy::TraversalPath& traversalPath,
57+ void LayerHierarchy::traverse (const Visitor& visitor,
58+ const LayerHierarchy::TraversalPath& traversalPath,
5859 uint32_t depth) const {
5960 LLOG_ALWAYS_FATAL_WITH_TRACE_IF (depth > 50 ,
6061 " Cycle detected in LayerHierarchy::traverse. See "
@@ -70,14 +71,13 @@ void LayerHierarchy::traverse(const Visitor& visitor, LayerHierarchy::TraversalP
7071 LLOG_ALWAYS_FATAL_WITH_TRACE_IF (traversalPath.hasRelZLoop (), " Found relative z loop layerId:%d" ,
7172 traversalPath.invalidRelativeRootId );
7273 for (auto & [child, childVariant] : mChildren ) {
73- ScopedAddToTraversalPath addChildToTraversalPath (traversalPath, child->mLayer ->id ,
74- childVariant);
75- child->traverse (visitor, traversalPath, depth + 1 );
74+ child->traverse (visitor, traversalPath.makeChild (child->mLayer ->id , childVariant),
75+ depth + 1 );
7676 }
7777}
7878
7979void LayerHierarchy::traverseInZOrder (const Visitor& visitor,
80- LayerHierarchy::TraversalPath& traversalPath) const {
80+ const LayerHierarchy::TraversalPath& traversalPath) const {
8181 bool traverseThisLayer = (mLayer != nullptr );
8282 for (auto it = mChildren .begin (); it < mChildren .end (); it++) {
8383 auto & [child, childVariant] = *it;
@@ -91,9 +91,7 @@ void LayerHierarchy::traverseInZOrder(const Visitor& visitor,
9191 if (childVariant == LayerHierarchy::Variant::Detached) {
9292 continue ;
9393 }
94- ScopedAddToTraversalPath addChildToTraversalPath (traversalPath, child->mLayer ->id ,
95- childVariant);
96- child->traverseInZOrder (visitor, traversalPath);
94+ child->traverseInZOrder (visitor, traversalPath.makeChild (child->mLayer ->id , childVariant));
9795 }
9896
9997 if (traverseThisLayer) {
@@ -568,42 +566,23 @@ std::string LayerHierarchy::TraversalPath::toString() const {
568566 return ss.str ();
569567}
570568
571- // Helper class to update a passed in TraversalPath when visiting a child. When the object goes out
572- // of scope the TraversalPath is reset to its original state.
573- LayerHierarchy::ScopedAddToTraversalPath::ScopedAddToTraversalPath (TraversalPath& traversalPath,
574- uint32_t layerId,
575- LayerHierarchy::Variant variant)
576- : mTraversalPath (traversalPath), mParentPath (traversalPath) {
577- // Update the traversal id with the child layer id and variant. Parent id and variant are
578- // stored to reset the id upon destruction.
579- traversalPath.id = layerId;
580- traversalPath.variant = variant;
569+ LayerHierarchy::TraversalPath LayerHierarchy::TraversalPath::makeChild (
570+ uint32_t layerId, LayerHierarchy::Variant variant) const {
571+ TraversalPath child{*this };
572+ child.id = layerId;
573+ child.variant = variant;
581574 if (LayerHierarchy::isMirror (variant)) {
582- traversalPath .mirrorRootIds .emplace_back (mParentPath . id );
575+ child .mirrorRootIds .emplace_back (id);
583576 } else if (variant == LayerHierarchy::Variant::Relative) {
584- if (std::find (traversalPath. relativeRootIds .begin (), traversalPath. relativeRootIds .end (),
585- layerId) != traversalPath. relativeRootIds .end ()) {
586- traversalPath .invalidRelativeRootId = layerId;
577+ if (std::find (relativeRootIds.begin (), relativeRootIds.end (), layerId) !=
578+ relativeRootIds.end ()) {
579+ child .invalidRelativeRootId = layerId;
587580 }
588- traversalPath .relativeRootIds .emplace_back (layerId);
581+ child .relativeRootIds .emplace_back (layerId);
589582 } else if (variant == LayerHierarchy::Variant::Detached) {
590- traversalPath .detached = true ;
583+ child .detached = true ;
591584 }
592- }
593- LayerHierarchy::ScopedAddToTraversalPath::~ScopedAddToTraversalPath () {
594- // Reset the traversal id to its original parent state using the state that was saved in
595- // the constructor.
596- if (LayerHierarchy::isMirror (mTraversalPath .variant )) {
597- mTraversalPath .mirrorRootIds .pop_back ();
598- } else if (mTraversalPath .variant == LayerHierarchy::Variant::Relative) {
599- mTraversalPath .relativeRootIds .pop_back ();
600- }
601- if (mTraversalPath .invalidRelativeRootId == mTraversalPath .id ) {
602- mTraversalPath .invalidRelativeRootId = UNASSIGNED_LAYER_ID;
603- }
604- mTraversalPath .id = mParentPath .id ;
605- mTraversalPath .variant = mParentPath .variant ;
606- mTraversalPath .detached = mParentPath .detached ;
585+ return child;
607586}
608587
609588} // namespace android::surfaceflinger::frontend
0 commit comments