mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-26 10:47:11 -06:00
objects_at() found Select Behind targets by running hit_test_skipping() in a loop, skipping everything found so far. Each round is a full tree traversal, so a stack of n overlapping paths costs O(n^2) hit tests before the loop finds no further object. The fast path walks each editable top-level layer once. Every selectable object's subtree is visited only until its first hit, and a HashSet records found ids so subtrees already covered by an earlier hit are not searched again. Sublayers recurse the same way, so a stack of n paths costs one traversal total. The original traversal stays in charge where Select Behind semantics differ from the plain front-to-back order: isolation (scope), and Edit Contents, which exposes objects nested inside a top-level group. Non- layer roots in malformed files also fall back. objects_at_repeated() keeps the old loop for those cases. Three tests: a 256-path stack asserts front-to-back order and completeness; a mixed document (sublayer, groups, clipping group, outline and path-only options) asserts the one-pass result equals the repeated-traversal result; an envelope in Edit Contents asserts the fallback preserves the original order.