// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Direct2D1.Media { using Perspex.Platform; using SharpDX.Direct2D1; using Splat; public abstract class GeometryImpl : IGeometryImpl { private TransformedGeometry transformed; public abstract Rect Bounds { get; } public abstract Geometry DefiningGeometry { get; } public Geometry Geometry { get { return this.transformed ?? this.DefiningGeometry; } } public Matrix Transform { get { return this.transformed != null ? this.transformed.Transform.ToPerspex() : Matrix.Identity; } set { if (value != this.Transform) { if (this.transformed != null) { this.transformed.Dispose(); this.transformed = null; } if (!value.IsIdentity) { Factory factory = Locator.Current.GetService(); this.transformed = new TransformedGeometry( factory, this.DefiningGeometry, value.ToDirect2D()); } } } } public Rect GetRenderBounds(double strokeThickness) { if (this.transformed != null) { return this.transformed.GetWidenedBounds((float)strokeThickness).ToPerspex(); } else { return this.DefiningGeometry.GetWidenedBounds((float)strokeThickness).ToPerspex(); } } } }