// Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. using Avalonia.Platform; using SharpDX.Direct2D1; namespace Avalonia.Direct2D1.Media { /// /// The platform-specific interface for . /// public abstract class GeometryImpl : IGeometryImpl { public GeometryImpl(Geometry geometry) { Geometry = geometry; } /// public Rect Bounds => Geometry.GetWidenedBounds(0).ToAvalonia(); public Geometry Geometry { get; } /// public Rect GetRenderBounds(Avalonia.Media.Pen pen) { return Geometry.GetWidenedBounds((float)(pen?.Thickness ?? 0)).ToAvalonia(); } /// public bool FillContains(Point point) { return Geometry.FillContainsPoint(point.ToSharpDX()); } /// public IGeometryImpl Intersect(IGeometryImpl geometry) { var result = new PathGeometry(Geometry.Factory); using (var sink = result.Open()) { Geometry.Combine(((GeometryImpl)geometry).Geometry, CombineMode.Intersect, sink); return new StreamGeometryImpl(result); } } /// public bool StrokeContains(Avalonia.Media.Pen pen, Point point) { return Geometry.StrokeContainsPoint(point.ToSharpDX(), (float)(pen?.Thickness ?? 0)); } public ITransformedGeometryImpl WithTransform(Matrix transform) { var factory = AvaloniaLocator.Current.GetService(); return new TransformedGeometryImpl( new TransformedGeometry( factory, GetSourceGeometry(), transform.ToDirect2D()), this); } protected virtual Geometry GetSourceGeometry() => Geometry; } }