* Implement visual geometry hit testing
* fix xml comment
* fix xml comment
* update api diff
* Introduced ICompositionHitTester to avoid duplicated hit test code between point and geometry
* Add geometry hit testing page to RenderDemo
* fix geometry hit testing not including stroke
* fix test
* update api and tests
* update api diff
* Update GeometryHitTestingPage with new API
* addressed reviews.
* remove nullability in GeometryHitTestResult Visual hit
---------
Co-authored-by: Julien Lebosquain <julien@lebosquain.net>
/// Returns the topmost active input element intersecting a geometry on an <see cref="IInputElement"/>.
/// </summary>
/// <param name="element">The element to test.</param>
/// <param name="geometry">The geometry on <paramref name="element"/>.</param>
/// <param name="enabledElementsOnly">Whether to only return elements for which <see cref="IInputElement.IsEffectivelyEnabled"/> is true.</param>
/// <returns>A <see cref="GeometryHitTestResult"/> containing the topmost <see cref="IInputElement"/> intersecting the specified geometry and intersection details, or null if no element intersects.</returns>
/// Returns the topmost active input element intersecting a geometry on an <see cref="IInputElement"/>.
/// </summary>
/// <param name="element">The element to test.</param>
/// <param name="geometry">The geometry on <paramref name="element"/>.</param>
/// <param name="filter">
/// A filter predicate. If the predicate returns false then the visual and all its
/// children will be excluded from the results.
/// </param>
/// <param name="enabledElementsOnly">Whether to only return elements for which <see cref="IInputElement.IsEffectivelyEnabled"/> is true.</param>
/// <returns>A <see cref="GeometryHitTestResult"/> containing the topmost <see cref="IInputElement"/> intersecting the specified geometry and intersection details, or null if no element intersects.</returns>
/// Provides information about the intersection between a hit geometry and a target geometry or visual.
/// </summary>
publicenumIntersectionResult
{
/// <summary>
/// The IntersectionDetail value is not calculated.
/// </summary>
NotCalculated=0,
/// <summary>
/// The <see cref="Geometry"/> hit test parameter and the target visual, or geometry, do not intersect.
/// </summary>
Empty=1,
/// <summary>
/// The target geometry or visual is fully inside the hit test <see cref="Geometry"/>.
/// </summary>
FullyInside=2,
/// <summary>
/// The <see cref="Geometry"/> hit test parameter is fully contained within the boundary of the target visual or geometry.
/// </summary>
FullyContains=3,
/// <summary>
/// The <see cref="Geometry"/> hit test parameter and the target visual, or geometry, intersect. This means that the two elements overlap, but neither element contains the other.
/// Gets the first visual in the visual tree whose bounds intersects a geometry.
/// </summary>
/// <param name="visual">The root visual to test.</param>
/// <param name="geometry">The geometry.</param>
/// <returns>A <see cref="GeometryHitTestResult"/> containing the visual intersecting the requested geometry and intersection details, or null if no intersection.</returns>
/// Gets the first visual in the visual tree whose bounds intersects a geometry.
/// </summary>
/// <param name="visual">The root visual to test.</param>
/// <param name="geometry">The geometry.</param>
/// <param name="filter">
/// A filter predicate. If the predicate returns false then the visual and all its
/// children will be excluded from the results.
/// </param>
/// <returns>A <see cref="GeometryHitTestResult"/> containing the visual intersecting the requested geometry and intersection details, or null if no intersection.</returns>