Skip to main content

ferroui_base/rendering/composition/hit_testing/
point_composition_hit_tester.rs

1use super::ICompositionHitTester;
2use crate::media::IntersectionResult;
3use crate::platform::{IGeometryImpl, LtrbRect};
4use crate::rendering::composition::CompositionVisual;
5use crate::{Matrix, Point};
6
7/// Hit testing with a point.
8pub struct PointCompositionHitTester;
9
10impl ICompositionHitTester for PointCompositionHitTester {
11    type Input = Point;
12
13    fn transform(input: &Point, matrix: Matrix) -> Point {
14        input.transform(matrix)
15    }
16
17    fn hit_test(visual: &CompositionVisual, input: &Point) -> IntersectionResult {
18        if visual.hit_test(*input) {
19            IntersectionResult::FullyContains
20        } else {
21            IntersectionResult::Empty
22        }
23    }
24
25    fn transformed_sub_tree_bounds_match(bounds: LtrbRect, input: &Point) -> bool {
26        bounds.contains(input.x, input.y)
27    }
28
29    fn clipped_bounds_match(visual: &CompositionVisual, input: &Point) -> bool {
30        let size = visual.size();
31        input.x >= 0.0 && input.y >= 0.0 && input.x <= size.x && input.y <= size.y
32    }
33
34    fn clip_matches(clip: &dyn IGeometryImpl, input: &Point) -> bool {
35        clip.fill_contains(*input)
36    }
37}