From b6c66c67e0b79226ef505aa0f547350836fcecb6 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 19 Jan 2016 16:55:06 +0300 Subject: [PATCH 1/2] Added Line and LineGeometry for line drawing. --- samples/TestApplicationShared/MainWindow.cs | 9 ++++ src/Perspex.Controls/Perspex.Controls.csproj | 1 + src/Perspex.Controls/Shapes/Line.cs | 36 +++++++++++++++ src/Perspex.SceneGraph/Media/LineGeometry.cs | 42 +++++++++++++++++ .../Perspex.SceneGraph.csproj | 1 + .../Perspex.Direct2D1.RenderTests.csproj | 1 + tests/Perspex.RenderTests/Shapes/LineTests.cs | 43 ++++++++++++++++++ .../Line/Circle_1px_Stroke.expected.png | Bin 0 -> 624 bytes 8 files changed, 133 insertions(+) create mode 100644 src/Perspex.Controls/Shapes/Line.cs create mode 100644 src/Perspex.SceneGraph/Media/LineGeometry.cs create mode 100644 tests/Perspex.RenderTests/Shapes/LineTests.cs create mode 100644 tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png diff --git a/samples/TestApplicationShared/MainWindow.cs b/samples/TestApplicationShared/MainWindow.cs index 6a412a95b5..02edd23634 100644 --- a/samples/TestApplicationShared/MainWindow.cs +++ b/samples/TestApplicationShared/MainWindow.cs @@ -688,6 +688,15 @@ namespace TestApplication [Canvas.LeftProperty] = 130, [Canvas.TopProperty] = 79, }, + new Line + { + Width = 90, + Height = 70, + Stroke = Brushes.Red, + StrokeThickness = 2, + [Canvas.LeftProperty] = 30, + [Canvas.TopProperty] = 120 + } } }, } diff --git a/src/Perspex.Controls/Perspex.Controls.csproj b/src/Perspex.Controls/Perspex.Controls.csproj index a99b3fbbfd..394fdccd2d 100644 --- a/src/Perspex.Controls/Perspex.Controls.csproj +++ b/src/Perspex.Controls/Perspex.Controls.csproj @@ -47,6 +47,7 @@ + diff --git a/src/Perspex.Controls/Shapes/Line.cs b/src/Perspex.Controls/Shapes/Line.cs new file mode 100644 index 0000000000..785ea7bbd1 --- /dev/null +++ b/src/Perspex.Controls/Shapes/Line.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Perspex.Media; + +namespace Perspex.Controls.Shapes +{ + public class Line : Shape + { + private Geometry _geometry; + + private Size _geometrySize; + + public override Geometry DefiningGeometry + { + get + { + if (_geometry == null || _geometrySize != Bounds.Size) + { + var rect = new Rect(Bounds.Size).Deflate(StrokeThickness); + _geometry = new LineGeometry(rect.TopLeft, rect.BottomRight); + _geometrySize = Bounds.Size; + } + + return _geometry; + } + } + + protected override Size MeasureOverride(Size availableSize) + { + return new Size(StrokeThickness, StrokeThickness); + } + } +} diff --git a/src/Perspex.SceneGraph/Media/LineGeometry.cs b/src/Perspex.SceneGraph/Media/LineGeometry.cs new file mode 100644 index 0000000000..fb5219e82e --- /dev/null +++ b/src/Perspex.SceneGraph/Media/LineGeometry.cs @@ -0,0 +1,42 @@ +// Copyright (c) The Perspex Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using Perspex.Platform; + +namespace Perspex.Media +{ + /// + /// Represents the geometry of a line. + /// + public class LineGeometry : Geometry + { + /// + /// Initializes a new instance of the class. + /// + /// The start point. + /// The end point. + public LineGeometry(Point startPoint, Point endPoint) + { + IPlatformRenderInterface factory = PerspexLocator.Current.GetService(); + IStreamGeometryImpl impl = factory.CreateStreamGeometry(); + + using (IStreamGeometryContextImpl context = impl.Open()) + { + context.BeginFigure(startPoint, true); + context.LineTo(endPoint); + context.EndFigure(true); + } + + PlatformImpl = impl; + } + + /// + public override Rect Bounds => PlatformImpl.Bounds; + + /// + public override Geometry Clone() + { + return new LineGeometry(Bounds.TopLeft, Bounds.BottomRight); + } + } +} diff --git a/src/Perspex.SceneGraph/Perspex.SceneGraph.csproj b/src/Perspex.SceneGraph/Perspex.SceneGraph.csproj index 2121be7bfc..ac08406268 100644 --- a/src/Perspex.SceneGraph/Perspex.SceneGraph.csproj +++ b/src/Perspex.SceneGraph/Perspex.SceneGraph.csproj @@ -70,6 +70,7 @@ + diff --git a/tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj b/tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj index eb948aec81..2abf92fdb5 100644 --- a/tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj +++ b/tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj @@ -76,6 +76,7 @@ + diff --git a/tests/Perspex.RenderTests/Shapes/LineTests.cs b/tests/Perspex.RenderTests/Shapes/LineTests.cs new file mode 100644 index 0000000000..bc5eb36dbf --- /dev/null +++ b/tests/Perspex.RenderTests/Shapes/LineTests.cs @@ -0,0 +1,43 @@ +// Copyright (c) The Perspex Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using Perspex.Controls; +using Perspex.Controls.Shapes; +using Perspex.Media; +using Xunit; + +#if PERSPEX_CAIRO +namespace Perspex.Cairo.RenderTests.Shapes +#elif PERSPEX_SKIA +namespace Perspex.Skia.RenderTests +#else +namespace Perspex.Direct2D1.RenderTests.Shapes +#endif +{ + public class LineTests : TestBase + { + public LineTests() + : base(@"Shapes\Line") + { + } + + [Fact] + public void Circle_1px_Stroke() + { + Decorator target = new Decorator + { + Padding = new Thickness(8), + Width = 200, + Height = 200, + Child = new Line + { + Stroke = Brushes.Black, + StrokeThickness = 1, + } + }; + + RenderToFile(target); + CompareImages(); + } + } +} diff --git a/tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png b/tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..539d27fdd330f6231a123ae7a8a57036b7472c0c GIT binary patch literal 624 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggNy^j3F{C2y?d6l44FLkI2jzPbXVhygd)O2w@@BEzssxER23w%Ex&$lx zg3ZS_=9tTKSKN3kz_~|&lVzgAC^4MEphbJq%ZLNb77Ppx{kzopr0F5k&$p8QV literal 0 HcmV?d00001 From 2cfa6f842e7a6810c38a56f3585219f34cc22423 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 20 Jan 2016 14:30:17 +0300 Subject: [PATCH 2/2] Fixed @kekekeks notes. Fixed test name (Line instead of Circle). --- src/Perspex.SceneGraph/Media/LineGeometry.cs | 11 ++++++++--- .../Perspex.Cairo.RenderTests.csproj | 1 + .../Perspex.Skia.RenderTests.csproj | 1 + tests/Perspex.RenderTests/Shapes/LineTests.cs | 2 +- .../Shapes/Line/Line_1px_Stroke.expected.png} | Bin 624 -> 618 bytes .../Shapes/Line/Line_1px_Stroke.expected.png | Bin 0 -> 618 bytes .../Shapes/Line/Line_1px_Stroke.expected.png | Bin 0 -> 618 bytes 7 files changed, 11 insertions(+), 4 deletions(-) rename tests/TestFiles/{Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png => Cairo/Shapes/Line/Line_1px_Stroke.expected.png} (52%) create mode 100644 tests/TestFiles/Direct2D1/Shapes/Line/Line_1px_Stroke.expected.png create mode 100644 tests/TestFiles/Skia/Shapes/Line/Line_1px_Stroke.expected.png diff --git a/src/Perspex.SceneGraph/Media/LineGeometry.cs b/src/Perspex.SceneGraph/Media/LineGeometry.cs index fb5219e82e..196fdc40eb 100644 --- a/src/Perspex.SceneGraph/Media/LineGeometry.cs +++ b/src/Perspex.SceneGraph/Media/LineGeometry.cs @@ -10,6 +10,9 @@ namespace Perspex.Media /// public class LineGeometry : Geometry { + private Point _startPoint; + private Point _endPoint; + /// /// Initializes a new instance of the class. /// @@ -17,21 +20,23 @@ namespace Perspex.Media /// The end point. public LineGeometry(Point startPoint, Point endPoint) { + _startPoint = startPoint; + _endPoint = endPoint; IPlatformRenderInterface factory = PerspexLocator.Current.GetService(); IStreamGeometryImpl impl = factory.CreateStreamGeometry(); using (IStreamGeometryContextImpl context = impl.Open()) { - context.BeginFigure(startPoint, true); + context.BeginFigure(startPoint, false); context.LineTo(endPoint); - context.EndFigure(true); + context.EndFigure(false); } PlatformImpl = impl; } /// - public override Rect Bounds => PlatformImpl.Bounds; + public override Rect Bounds => new Rect(_startPoint, _endPoint); /// public override Geometry Clone() diff --git a/tests/Perspex.RenderTests/Perspex.Cairo.RenderTests.csproj b/tests/Perspex.RenderTests/Perspex.Cairo.RenderTests.csproj index 60b3b02b11..dd6953d355 100644 --- a/tests/Perspex.RenderTests/Perspex.Cairo.RenderTests.csproj +++ b/tests/Perspex.RenderTests/Perspex.Cairo.RenderTests.csproj @@ -71,6 +71,7 @@ + diff --git a/tests/Perspex.RenderTests/Perspex.Skia.RenderTests.csproj b/tests/Perspex.RenderTests/Perspex.Skia.RenderTests.csproj index 14dd170a8f..08bba41fce 100644 --- a/tests/Perspex.RenderTests/Perspex.Skia.RenderTests.csproj +++ b/tests/Perspex.RenderTests/Perspex.Skia.RenderTests.csproj @@ -68,6 +68,7 @@ + diff --git a/tests/Perspex.RenderTests/Shapes/LineTests.cs b/tests/Perspex.RenderTests/Shapes/LineTests.cs index bc5eb36dbf..80eb7c75ca 100644 --- a/tests/Perspex.RenderTests/Shapes/LineTests.cs +++ b/tests/Perspex.RenderTests/Shapes/LineTests.cs @@ -22,7 +22,7 @@ namespace Perspex.Direct2D1.RenderTests.Shapes } [Fact] - public void Circle_1px_Stroke() + public void Line_1px_Stroke() { Decorator target = new Decorator { diff --git a/tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png b/tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke.expected.png similarity index 52% rename from tests/TestFiles/Direct2D1/Shapes/Line/Circle_1px_Stroke.expected.png rename to tests/TestFiles/Cairo/Shapes/Line/Line_1px_Stroke.expected.png index 539d27fdd330f6231a123ae7a8a57036b7472c0c..18ade2da0f3d2f0e70679fdbcc139ddfc43265a6 100644 GIT binary patch delta 116 zcmeys@``1GqoatYi(^Pd+}q0=c@H^=upXQ|CtwQqBAzVOg}mpEaZWn=tirA8S2^n& z1~B*$e7dlH=lQ$O=KbdXvFY62KJGaiH_l<4I6*_DMYr$xb55|T0@LI@jNg)e&oR_| Q`5h$U>FVdQ&MBb@0Fp>CeElqK{*;pL_t(|UhUJ#34l-#1;HPTVVHj^rs0BK6zroOs$dvi06hQz z0DfRPKX9|hv1~UV3wYS$5DC1ok+lJlz#b!nE0XD0z=Jpd0DzB;u>xM=1gbGF?)Lxy N002ovPDHLkV1fyLDk}g0 diff --git a/tests/TestFiles/Direct2D1/Shapes/Line/Line_1px_Stroke.expected.png b/tests/TestFiles/Direct2D1/Shapes/Line/Line_1px_Stroke.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..18ade2da0f3d2f0e70679fdbcc139ddfc43265a6 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggNyO8|F{C2y?d6TUha5y$4^EyFFok;&PnPOJ-gCz|CmnrO;a2slob?S* zD-iq$K3!P9^Zeas^M3RH*mQ1hANL#qPL_!dqr{L7gBIPsVM%xNb!1@J z*w6hZk(GggNyO8|F{C2y?d6TUha5y$4^EyFFok;&PnPOJ-gCz|CmnrO;a2slob?S* zD-iq$K3!P9^Zeas^M3RH*mQ1hANL#qPL_!dqr{L7gBIPs