From 24adb13d2bd55ce3837cb653fa37eddcb829693a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 24 Jun 2014 16:59:01 +0200 Subject: [PATCH] Measure geometry including stroke. --- Perspex.Direct2D1/Media/GeometryImpl.cs | 4 ++++ Perspex.Direct2D1/Media/StreamGeometryImpl.cs | 5 +++++ Perspex/Media/Geometry.cs | 5 +++++ Perspex/Platform/IGeometryImpl.cs | 4 ++++ Perspex/Shapes/Rectangle.cs | 4 ++-- Perspex/Shapes/Shape.cs | 2 +- 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Perspex.Direct2D1/Media/GeometryImpl.cs b/Perspex.Direct2D1/Media/GeometryImpl.cs index e732afdc96..e80bcc88ac 100644 --- a/Perspex.Direct2D1/Media/GeometryImpl.cs +++ b/Perspex.Direct2D1/Media/GeometryImpl.cs @@ -6,6 +6,8 @@ namespace Perspex.Direct2D1.Media { + using System; + using Perspex.Media; using Perspex.Platform; public abstract class GeometryImpl : IGeometryImpl @@ -20,5 +22,7 @@ namespace Perspex.Direct2D1.Media get; protected set; } + + public abstract Rect GetRenderBounds(double strokeThickness); } } diff --git a/Perspex.Direct2D1/Media/StreamGeometryImpl.cs b/Perspex.Direct2D1/Media/StreamGeometryImpl.cs index 05d43b2fee..4460f8f4a7 100644 --- a/Perspex.Direct2D1/Media/StreamGeometryImpl.cs +++ b/Perspex.Direct2D1/Media/StreamGeometryImpl.cs @@ -28,6 +28,11 @@ namespace Perspex.Direct2D1.Media get { return geometry.GetBounds().ToPerspex(); } } + public override Rect GetRenderBounds(double strokeThickness) + { + return geometry.GetWidenedBounds((float)strokeThickness).ToPerspex(); + } + public IStreamGeometryContextImpl Open() { return new StreamGeometryContextImpl(geometry.Open()); diff --git a/Perspex/Media/Geometry.cs b/Perspex/Media/Geometry.cs index bd3798cc5b..192842aa28 100644 --- a/Perspex/Media/Geometry.cs +++ b/Perspex/Media/Geometry.cs @@ -20,5 +20,10 @@ namespace Perspex.Media get; protected set; } + + public Rect GetRenderBounds(double strokeThickness) + { + return this.PlatformImpl.GetRenderBounds(strokeThickness); + } } } diff --git a/Perspex/Platform/IGeometryImpl.cs b/Perspex/Platform/IGeometryImpl.cs index 764d3f6c4d..6b1755230b 100644 --- a/Perspex/Platform/IGeometryImpl.cs +++ b/Perspex/Platform/IGeometryImpl.cs @@ -6,8 +6,12 @@ namespace Perspex.Platform { + using Perspex.Media; + public interface IGeometryImpl { Rect Bounds { get; } + + Rect GetRenderBounds(double strokeThickness); } } diff --git a/Perspex/Shapes/Rectangle.cs b/Perspex/Shapes/Rectangle.cs index c386c14922..c758d8df0c 100644 --- a/Perspex/Shapes/Rectangle.cs +++ b/Perspex/Shapes/Rectangle.cs @@ -16,12 +16,12 @@ namespace Perspex.Shapes public override Geometry DefiningGeometry { - get { return new RectangleGeometry(new Rect(size)); } + get { return new RectangleGeometry(new Rect(0, 0, this.Width, this.Height)); } } protected override Size MeasureOverride(Size availableSize) { - return new Size(this.Width, this.Height); + return this.DefiningGeometry.GetRenderBounds(this.StrokeThickness).Size; } protected override Size ArrangeOverride(Size finalSize) diff --git a/Perspex/Shapes/Shape.cs b/Perspex/Shapes/Shape.cs index b5d0c8b140..bec869109e 100644 --- a/Perspex/Shapes/Shape.cs +++ b/Perspex/Shapes/Shape.cs @@ -60,7 +60,7 @@ namespace Perspex.Shapes protected override Size MeasureOverride(Size availableSize) { - Rect shapeBounds = this.RenderedGeometry.Bounds; + Rect shapeBounds = this.RenderedGeometry.GetRenderBounds(this.StrokeThickness); double width = this.Width; double height = this.Height; double desiredX = availableSize.Width;