// 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;
}
}