Only use zparenting for drawing rects.

Fixes: 345672276
Test: npm run test:unit:ci
Change-Id: If3036ce40b35df980dd1a8d7565016992f0a8778
diff --git a/tools/winscope/src/parsers/hierarchy_tree_builder.ts b/tools/winscope/src/parsers/hierarchy_tree_builder.ts
index 1c1c139..53f755c 100644
--- a/tools/winscope/src/parsers/hierarchy_tree_builder.ts
+++ b/tools/winscope/src/parsers/hierarchy_tree_builder.ts
@@ -83,7 +83,7 @@
     child: HierarchyTreeNode,
   ) {
     parent.addOrReplaceChild(child);
-    child.setZParent(parent);
+    child.setParent(parent);
   }
 
   protected abstract buildIdentifierToChildrenMap(
diff --git a/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation.ts b/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation.ts
index eff955d..07d13b9 100644
--- a/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation.ts
+++ b/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation.ts
@@ -389,7 +389,7 @@
   }
 
   private isHiddenByParent(layer: HierarchyTreeNode): boolean {
-    const parentLayer = assertDefined(layer.getZParent());
+    const parentLayer = assertDefined(layer.getParent());
     return (
       !parentLayer.isRoot() &&
       (this.isHiddenByPolicy(parentLayer) || this.isHiddenByParent(parentLayer))
diff --git a/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation_test.ts b/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation_test.ts
index 540533c..ca92d01 100644
--- a/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation_test.ts
+++ b/tools/winscope/src/parsers/surface_flinger/computations/visibility_properties_computation_test.ts
@@ -20,6 +20,7 @@
 import {HierarchyTreeBuilder} from 'test/unit/hierarchy_tree_builder';
 import {HierarchyTreeNode} from 'trace/tree_node/hierarchy_tree_node';
 import {VisibilityPropertiesComputation} from './visibility_properties_computation';
+import {ZOrderPathsComputation} from './z_order_paths_computation';
 
 describe('VisibilityPropertiesComputation', () => {
   let computation: VisibilityPropertiesComputation;
@@ -126,7 +127,7 @@
     expect(getVisibilityReasons(invisibleLayer)).toEqual(['flag is hidden']);
   });
 
-  it('detects non-visible layer that is hidden by parent', () => {
+  it('detects non-visible layer that is hidden by parent, even if rel-z parent is not hidden', () => {
     const hierarchyRoot = new HierarchyTreeBuilder()
       .setId('LayerTraceEntry')
       .setName('root')
@@ -176,6 +177,7 @@
                 backgroundBlurRadius: 0,
                 layerStack: 0,
                 z: 0,
+                zOrderRelativeOf: 3,
                 transform: {
                   type: 0,
                   dsdx: 1,
@@ -189,8 +191,37 @@
             },
           ],
         },
+        {
+          id: 3,
+          name: 'relZParent',
+          properties: {
+            id: 3,
+            name: 'relZParent',
+            parent: -1,
+            children: [],
+            visibleRegion: {rect: [{left: 0, right: 1, top: 0, bottom: 1}]},
+            activeBuffer: {width: 1, height: 1, stride: 1, format: 1},
+            flags: 0,
+            color: {r: 0, g: 0, b: 0, a: 1},
+            cornerRadius: 0,
+            shadowRadius: 0,
+            backgroundBlurRadius: 0,
+            layerStack: 0,
+            z: 0,
+            transform: {
+              type: 0,
+              dsdx: 1,
+              dtdx: 0,
+              dsdy: 0,
+              dtdy: 1,
+            },
+            screenBounds: null,
+            isOpaque: false,
+          } as android.surfaceflinger.ILayerProto,
+        },
       ])
       .build();
+    new ZOrderPathsComputation().setRoot(hierarchyRoot).executeInPlace();
 
     computation.setRoot(hierarchyRoot).executeInPlace();
     const visibleLayer = assertDefined(hierarchyRoot.getChildByName('parent'));
diff --git a/tools/winscope/src/test/unit/hierarchy_tree_builder.ts b/tools/winscope/src/test/unit/hierarchy_tree_builder.ts
index bbe1635..493503f 100644
--- a/tools/winscope/src/test/unit/hierarchy_tree_builder.ts
+++ b/tools/winscope/src/test/unit/hierarchy_tree_builder.ts
@@ -85,7 +85,7 @@
       .setChildren(child.children ?? [])
       .build();
     rootNode.addOrReplaceChild(childNode);
-    childNode.setZParent(rootNode);
+    childNode.setParent(rootNode);
   }
 
   private makeHierarchyNodeId() {
diff --git a/tools/winscope/src/trace/tree_node/hierarchy_tree_node.ts b/tools/winscope/src/trace/tree_node/hierarchy_tree_node.ts
index ba32fad..95ba8b5 100644
--- a/tools/winscope/src/trace/tree_node/hierarchy_tree_node.ts
+++ b/tools/winscope/src/trace/tree_node/hierarchy_tree_node.ts
@@ -21,7 +21,8 @@
 
 export class HierarchyTreeNode extends TreeNode {
   private rects: TraceRect[] | undefined;
-  private zParent: this | undefined;
+  private zParent: HierarchyTreeNode | undefined;
+  private parent: this | undefined;
 
   constructor(
     id: string,
@@ -51,23 +52,31 @@
     return this.rects;
   }
 
-  setZParent(parent: this): void {
+  setZParent(parent: HierarchyTreeNode): void {
     this.zParent = parent;
   }
 
-  getZParent(): this | undefined {
-    return this.zParent;
+  getZParent(): HierarchyTreeNode | undefined {
+    return this.zParent ?? this.parent;
+  }
+
+  setParent(parent: this): void {
+    this.parent = parent;
+  }
+
+  getParent(): this | undefined {
+    return this.parent;
   }
 
   override isRoot(): boolean {
-    return !this.zParent;
+    return !this.parent;
   }
 
   findAncestor(targetNodeFilter: (node: this) => boolean): this | undefined {
-    let ancestor = this.getZParent();
+    let ancestor = this.getParent();
 
     while (ancestor && !targetNodeFilter(ancestor)) {
-      ancestor = ancestor.getZParent();
+      ancestor = ancestor.getParent();
     }
 
     return ancestor;
diff --git a/tools/winscope/src/viewers/common/add_diffs_hierarchy_tree_test.ts b/tools/winscope/src/viewers/common/add_diffs_hierarchy_tree_test.ts
index 0978fba..942cf6b 100644
--- a/tools/winscope/src/viewers/common/add_diffs_hierarchy_tree_test.ts
+++ b/tools/winscope/src/viewers/common/add_diffs_hierarchy_tree_test.ts
@@ -119,7 +119,7 @@
       exampleProperty: value,
     });
     rootNode.addOrReplaceChild(child);
-    child.setZParent(rootNode);
+    child.setParent(rootNode);
     return child;
   }
 
@@ -132,7 +132,7 @@
       exampleProperty: 'value',
     });
     rootNode.addOrReplaceChild(parent);
-    parent.setZParent(rootNode);
+    parent.setParent(rootNode);
     return parent;
   }
 });
diff --git a/tools/winscope/src/viewers/common/ui_hierarchy_tree_node.ts b/tools/winscope/src/viewers/common/ui_hierarchy_tree_node.ts
index 134a132..6a311e9 100644
--- a/tools/winscope/src/viewers/common/ui_hierarchy_tree_node.ts
+++ b/tools/winscope/src/viewers/common/ui_hierarchy_tree_node.ts
@@ -38,7 +38,10 @@
     const rects = node.getRects();
     if (rects) displayNode.setRects(rects);
 
-    if (parent) displayNode.setZParent(parent);
+    if (parent) displayNode.setParent(parent);
+
+    const zParent = node.getZParent();
+    if (zParent) displayNode.setZParent(zParent);
 
     node.getAllChildren().forEach((child) => {
       displayNode.addOrReplaceChild(
diff --git a/tools/winscope/src/viewers/viewer_surface_flinger/presenter_test.ts b/tools/winscope/src/viewers/viewer_surface_flinger/presenter_test.ts
index b75d02b..7418030 100644
--- a/tools/winscope/src/viewers/viewer_surface_flinger/presenter_test.ts
+++ b/tools/winscope/src/viewers/viewer_surface_flinger/presenter_test.ts
@@ -71,7 +71,7 @@
       ),
     );
     const selectedTreeParent = UiHierarchyTreeNode.from(
-      assertDefined(layer.getZParent()),
+      assertDefined(layer.getParent()),
     );
     selectedTree = assertDefined(
       selectedTreeParent.getChildByName('Dim layer#53'),