From 32c1eb41e44a097898355893ce53aa6f23e2319d Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 3 Jun 2022 15:58:21 +0300 Subject: [PATCH] Hit-testing clip --- .../Composition/CompositionTarget.cs | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs index 3243934932..31431a4e36 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionTarget.cs @@ -79,30 +79,33 @@ namespace Avalonia.Rendering.Composition return false; if (!TryTransformTo(visual, ref point)) return false; - if (point.X >= 0 && point.Y >= 0 && point.X <= visual.Size.X && point.Y <= visual.Size.Y) + + if (visual.ClipToBounds + && (point.X < 0 || point.Y < 0 || point.X > visual.Size.X || point.Y > visual.Size.Y)) + return false; + if (visual.Clip?.FillContains(point) == false) + return false; + + bool success = false; + // Hit-test the current node + if (visual.HitTest(point, filter)) { - bool success = false; - // Hit-test the current node - if (visual.HitTest(point, filter)) + result.Add(visual); + success = true; + } + + // Inspect children too + if (visual is CompositionContainerVisual cv) + for (var c = cv.Children.Count - 1; c >= 0; c--) { - result.Add(visual); - success = true; + var ch = cv.Children[c]; + var hit = HitTestCore(ch, point, result, filter); + if (hit) + return true; } - - // Inspect children too - if(visual is CompositionContainerVisual cv) - for (var c = cv.Children.Count - 1; c >= 0; c--) - { - var ch = cv.Children[c]; - var hit = HitTestCore(ch, point, result, filter); - if (hit) - return true; - } - return success; - } + return success; - return false; } public void RequestRedraw() => RegisterForSerialization();