From fe88eae319e34e541043ded57b0b053ac7991e18 Mon Sep 17 00:00:00 2001 From: susloparov Date: Tue, 8 Dec 2015 03:10:57 +0600 Subject: [PATCH 1/6] Somehow PathTests.cs was treated as a binary file by git. Fixed that. --- tests/Perspex.RenderTests/Shapes/PathTests.cs | Bin 10128 -> 4930 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/Perspex.RenderTests/Shapes/PathTests.cs b/tests/Perspex.RenderTests/Shapes/PathTests.cs index 54cdf7e1cf79334d3f45afc531ab3223239b8aed..6a2c96feb533b42d197f3b6d71bbbcb273097e8a 100644 GIT binary patch literal 4930 zcmeHK-EW&n5P#>dSh+8@6m7s51Fb4u;v}urL}$gmYjk%N+QQiE1p`{vy`-o7?>7tB zhJssL=ZD-WJn%95o6nsYc1};pC`lg$Uxbo${T`WxKqerv6duS#B!7Z0DLIQGl0z~g zAOrCQ0;-*!l56fmoIyZVaR7oycsNK}w1nF16aKG0=A<~#zz;~bY3vWZ9%N#=>9dtSkSqhEiYxbC|D^e>DmdaEi9_+0y2BY35&&lo-8M=Z<8gvl_sio7Q3dCpL}LKWBw zeuM1xa)4S=*K6__dAdJ!ifI0!aGfn=E9Xhu@cn+peEDhfSz7cZ;X!VYXXtwR;LQYQ z@gf3m1hE7GK}GXctg_(({6sK`$sw6ofFy5841aCO8%+vaXH}GsJdh#s^mYBD233pi zAy4@otD}%dL8(r8-e7NPQ$nve=I~o`E>>9x8GR?%V^gyNPBDY;p#r^y;Cskf$o=~m zaA(orcHsL&@UK`JEINz$B3@!}5!^zhMcmt^{0c&Hzb>Oe`>uowCK)P54}mS;L9zrX z9_fS$%%;u_(N8c7$Th)x{$}YXI{B^BYnt;^3;Gk*rHb78Dl0F+kVCgfkKUUaVw5aX zCSbf|3&^^aMaoqk}luqFELj?ie~btO=-#f=U5SjF|g=Rw+-92&4FoKCj(O_qjoY< z4LTUOu4Ndu;pAY8>bBjtbxXG$qi>PpVN93y&3@G|lj^SP+Lq;5E}DwEj)rm2?*X+e z(=knbA6`xe2enS8y%)Z;&Lg(PeOmC*+TuPf_@ExSqocmG&hGDT%4nwzSol$eUt>NGQIuoD zmhajhV%8V*b^)Kq$dVl5@;2VIKfOGPDgo`rop&e>_f|-;h zz)TrDVC?%)J!xW22Q&JYf z*i%qD0oALiZ31fx+&5!j->GFf7kDV^J;3g%oNKZT&bDMt-bn*;F2Q2k@=E3F17A=1 z9pH`jiPKCIxTu#r=FuOV5A5i?5oC=@?x?rbI&mD-+N=&~lU6p$h^?)9|fW0JA zt*T6JeLR#^DWsH+TA+qW?}t7;=#JL_*7)rErU#uKLbJ!Xs9AdD0oDsWgqri@5pL@* zE2NXbutjm(Xq3ifyg5V%a%S-3EvbI?spaIU%td_n;{~U46Y#`yb*?ny=zfrApvGAA zDVDFOJYV5!9gPwuSp)W2z%@X0Yd~L&g-u<_j3M-D`sE1EA?_C9W4!$Fe4BPwF?ScV zhrm73mT{?x{yx4i20g*u$NM+5m!ab%H{8=H8`N8sn?B-bJyfah$Lh@HSi26sf($`U z)68B0O-5wK=CG7zfoZZC2gzhK=x0igah&v)p=Cx}W)()1=W2yhNhZ7Dtiwu-R9#?+ z$IA%Tx&~HeTxPni`hi>5PS@!;U046=$QfFCZWFp^j;00s8k0HdWJm_f92TsCblkkb z%pvGevT2-L4R;+bR(0JqeW{%-+ZgM?8`{tlGZpQ73jd&Avf^oDtbrz9BD(F@8Dq^&Vw=yimH|CZVd`%ARVEOM+ z!d1gn*7>AS4Php2Qm&w;tKf~ftOAGv`en^^q{1tIe(pXXDqTDseQ^r-r zUGufd9A3ctZNpRb?Og)*UfQgWwmPDzRlm;1xb@}vRc(@=i66f&Z_3Ux#}}r zWt-Ki{6oxYRm&{aW;>{VZwGY^H7IwK?L@aBJb&WpQv>HQ+O F>fZ{lwf_JB From eef1704fda2e15a6baca6cdc0846e807466bcde2 Mon Sep 17 00:00:00 2001 From: susloparov Date: Tue, 8 Dec 2015 03:13:26 +0600 Subject: [PATCH 2/6] Added DashLineCap, StartLineCap, EndLineCap to the Shape. Fixed properties assignment order in Pen constructor. --- src/Perspex.Controls/Shapes/Shape.cs | 9 ++++++++- src/Perspex.SceneGraph/Media/Pen.cs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Perspex.Controls/Shapes/Shape.cs b/src/Perspex.Controls/Shapes/Shape.cs index 58dc24a738..fcd1fc20fe 100644 --- a/src/Perspex.Controls/Shapes/Shape.cs +++ b/src/Perspex.Controls/Shapes/Shape.cs @@ -90,13 +90,20 @@ namespace Perspex.Controls.Shapes set { SetValue(StrokeThicknessProperty, value); } } + public PenLineCap DashCap { get; set; } = PenLineCap.Flat; + + public PenLineCap StartLineCap { get; set; } = PenLineCap.Flat; + + public PenLineCap EndLineCap { get; set; } = PenLineCap.Flat; + public override void Render(DrawingContext context) { var geometry = RenderedGeometry; if (geometry != null) { - var pen = new Pen(Stroke, StrokeThickness, new DashStyle(StrokeDashArray)); + var pen = new Pen(Stroke, StrokeThickness, new DashStyle(StrokeDashArray), + DashCap, StartLineCap, EndLineCap); context.DrawGeometry(Fill, pen, geometry); } } diff --git a/src/Perspex.SceneGraph/Media/Pen.cs b/src/Perspex.SceneGraph/Media/Pen.cs index cc14ae29d6..489860a87a 100644 --- a/src/Perspex.SceneGraph/Media/Pen.cs +++ b/src/Perspex.SceneGraph/Media/Pen.cs @@ -31,12 +31,12 @@ namespace Perspex.Media { Brush = brush; Thickness = thickness; + DashCap = dashCap; StartLineCap = startLineCap; EndLineCap = endLineCap; LineJoin = lineJoin; MiterLimit = miterLimit; DashStyle = dashStyle; - DashCap = dashCap; } /// From 42bddea9f2c90af3e59fc081523bcafe7f5bd896 Mon Sep 17 00:00:00 2001 From: susloparov Date: Tue, 8 Dec 2015 03:14:02 +0600 Subject: [PATCH 3/6] Direct2D render test for the Path using DashLineCap, StartLineCap, EndLineCap. --- tests/Perspex.RenderTests/Shapes/PathTests.cs | 31 ++++++++++++++++++ .../Path/Path_With_PenLineCap.expected.png | Bin 0 -> 1155 bytes 2 files changed, 31 insertions(+) create mode 100644 tests/TestFiles/Direct2D1/Shapes/Path/Path_With_PenLineCap.expected.png diff --git a/tests/Perspex.RenderTests/Shapes/PathTests.cs b/tests/Perspex.RenderTests/Shapes/PathTests.cs index 6a2c96feb5..bc70aa1088 100644 --- a/tests/Perspex.RenderTests/Shapes/PathTests.cs +++ b/tests/Perspex.RenderTests/Shapes/PathTests.cs @@ -15,6 +15,8 @@ namespace Perspex.Skia.RenderTests namespace Perspex.Direct2D1.RenderTests.Shapes #endif { + using Perspex.Collections; + public class PathTests : TestBase { public PathTests() @@ -126,6 +128,35 @@ namespace Perspex.Direct2D1.RenderTests.Shapes } }; + RenderToFile(target); + CompareImages(); + } + +#if PERSPEX_SKIA + [Fact(Skip = "FIXME")] +#else + [Fact] +#endif + public void Path_With_PenLineCap() + { + Decorator target = new Decorator + { + Width = 200, + Height = 200, + Child = new Path + { + Stroke = Brushes.Black, + StrokeThickness = 10, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + DashCap = PenLineCap.Triangle, + StrokeDashArray = new PerspexList(3, 1), + StartLineCap = PenLineCap.Round, + EndLineCap = PenLineCap.Square, + Data = StreamGeometry.Parse("M 20,20 L 180,180"), + } + }; + RenderToFile(target); CompareImages(); } diff --git a/tests/TestFiles/Direct2D1/Shapes/Path/Path_With_PenLineCap.expected.png b/tests/TestFiles/Direct2D1/Shapes/Path/Path_With_PenLineCap.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..d33068d62c9deb097896fc29422ed4f765f2daf4 GIT binary patch literal 1155 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl|*^>lFzsfc@fcVS*?s6^XCKHq>2FBQJ-H3}`=2Odm_kdbq4YOq#d;WQ6u zeaIKUa*%^XsIi&l+Wq2LCU3L$Z#AF0F(MRJMfd&p*>N!&ha? z=hHWI+IFi6Mg7dn5j#{X%$a+|edo*RUv9b_T5M$-7r*uXu{ina_n)rr;(DF)=Fuln zo8nTXGk#qr>YTY9EKCy}6ofcjm>NA41UOlg8XZ&w5P}EqdDw6?nSFElbXa1`MpL22 z3+JYJusC_Ip2*R%Elf#}W9?E8mP7U59##C^zpB6JzU`fRpNihhKKxd>bhT%4r8rp;nX#c1#@*LIshHz5UoAYAzM@Ef!yYdbzy~$*_#d4`KxR(>wfeM zX!mA?G+|ENvq?L$l@`v82*=qvRM@vPM5M&m=>;`3Jffudm8s7>Gy@t zTlY)jdoM6-^85Ez?%4bE`Ns47+b>+cp1gVT)2vb^$7sz7vph1gRY7E?DTqw>Rxq6i z^q@nQ(!yT<<7t9RI$O+MowWnGdW#~?Sc5pRT6yJuTOQpvolE}x<-`?vw^$$D+;b;H z{^>R2`t&;a)#?Av{jvP^_n}zTs^uro`%PPYm6IiRDaih{Q$gg?s~~c&E+_)EqnUvb zX!dG<^K5XGtuX(s(_}L7LL0V}gcNLVdY^O~W+eKn?C*1wj#d`rc$?D+47M#&oen_X z1H&$=>&Zptk2!I2(X~^e`I~2~OlPdG*fF=Na*vaDe(zbLT=k75sCt8kUw?Q-*FOns zY3uzpTi5N|x9>et^0&{sNXV%+9xCf)*MGQEWAyFnL$MvFr%gW6AF*YNP^U%4+kGBK v7!T_R6&^6Xt}Mvz6C&}5fuVv&UHw1P$(b*Hr Date: Tue, 8 Dec 2015 03:14:11 +0600 Subject: [PATCH 4/6] Fixes #313 --- .../Perspex.Direct2D1/PrimitiveExtensions.cs | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/Windows/Perspex.Direct2D1/PrimitiveExtensions.cs b/src/Windows/Perspex.Direct2D1/PrimitiveExtensions.cs index fac270dd7c..65d3ce2dad 100644 --- a/src/Windows/Perspex.Direct2D1/PrimitiveExtensions.cs +++ b/src/Windows/Perspex.Direct2D1/PrimitiveExtensions.cs @@ -71,26 +71,23 @@ namespace Perspex.Direct2D1 /// The Direct2D brush. public static StrokeStyle ToDirect2DStrokeStyle(this Perspex.Media.Pen pen, SharpDX.Direct2D1.RenderTarget target) { - if (pen.DashStyle != null) + var properties = new StrokeStyleProperties { - if (pen.DashStyle.Dashes != null && pen.DashStyle.Dashes.Count > 0) - { - var properties = new StrokeStyleProperties - { - DashStyle = DashStyle.Custom, - DashOffset = (float)pen.DashStyle.Offset, - MiterLimit = (float)pen.MiterLimit, - LineJoin = pen.LineJoin.ToDirect2D(), - StartCap = pen.StartLineCap.ToDirect2D(), - EndCap = pen.EndLineCap.ToDirect2D(), - DashCap = pen.DashCap.ToDirect2D() - }; - - return new StrokeStyle(target.Factory, properties, pen.DashStyle?.Dashes.Select(x => (float)x).ToArray()); - } + DashStyle = DashStyle.Solid, + MiterLimit = (float)pen.MiterLimit, + LineJoin = pen.LineJoin.ToDirect2D(), + StartCap = pen.StartLineCap.ToDirect2D(), + EndCap = pen.EndLineCap.ToDirect2D(), + DashCap = pen.DashCap.ToDirect2D() + }; + var dashes = new float[0]; + if (pen.DashStyle?.Dashes != null && pen.DashStyle.Dashes.Count > 0) + { + properties.DashStyle = DashStyle.Custom; + properties.DashOffset = (float)pen.DashStyle.Offset; + dashes = pen.DashStyle?.Dashes.Select(x => (float)x).ToArray(); } - - return null; + return new StrokeStyle(target.Factory, properties, dashes); } /// From 40c01b73fbb001021a5f97671199ac45a55e47e3 Mon Sep 17 00:00:00 2001 From: susloparov Date: Tue, 8 Dec 2015 23:43:13 +0600 Subject: [PATCH 5/6] Renamed stroke Shape properties according to WPF naming --- src/Perspex.Controls/Shapes/Shape.cs | 8 ++++---- tests/Perspex.RenderTests/Shapes/PathTests.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Perspex.Controls/Shapes/Shape.cs b/src/Perspex.Controls/Shapes/Shape.cs index fcd1fc20fe..6e7934b0e7 100644 --- a/src/Perspex.Controls/Shapes/Shape.cs +++ b/src/Perspex.Controls/Shapes/Shape.cs @@ -90,11 +90,11 @@ namespace Perspex.Controls.Shapes set { SetValue(StrokeThicknessProperty, value); } } - public PenLineCap DashCap { get; set; } = PenLineCap.Flat; + public PenLineCap StrokeDashCap { get; set; } = PenLineCap.Flat; - public PenLineCap StartLineCap { get; set; } = PenLineCap.Flat; + public PenLineCap StrokeStartLineCap { get; set; } = PenLineCap.Flat; - public PenLineCap EndLineCap { get; set; } = PenLineCap.Flat; + public PenLineCap StrokeEndLineCap { get; set; } = PenLineCap.Flat; public override void Render(DrawingContext context) { @@ -103,7 +103,7 @@ namespace Perspex.Controls.Shapes if (geometry != null) { var pen = new Pen(Stroke, StrokeThickness, new DashStyle(StrokeDashArray), - DashCap, StartLineCap, EndLineCap); + StrokeDashCap, StrokeStartLineCap, StrokeEndLineCap); context.DrawGeometry(Fill, pen, geometry); } } diff --git a/tests/Perspex.RenderTests/Shapes/PathTests.cs b/tests/Perspex.RenderTests/Shapes/PathTests.cs index bc70aa1088..9736f86d1c 100644 --- a/tests/Perspex.RenderTests/Shapes/PathTests.cs +++ b/tests/Perspex.RenderTests/Shapes/PathTests.cs @@ -149,10 +149,10 @@ namespace Perspex.Direct2D1.RenderTests.Shapes StrokeThickness = 10, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, - DashCap = PenLineCap.Triangle, + StrokeDashCap = PenLineCap.Triangle, StrokeDashArray = new PerspexList(3, 1), - StartLineCap = PenLineCap.Round, - EndLineCap = PenLineCap.Square, + StrokeStartLineCap = PenLineCap.Round, + StrokeEndLineCap = PenLineCap.Square, Data = StreamGeometry.Parse("M 20,20 L 180,180"), } }; From ef7dc640c5dc3363f9a146becb310865166dff37 Mon Sep 17 00:00:00 2001 From: susloparov Date: Wed, 9 Dec 2015 00:36:55 +0600 Subject: [PATCH 6/6] Skipped Path_With_PenLineCap render test for Cairo --- tests/Perspex.RenderTests/Shapes/PathTests.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Perspex.RenderTests/Shapes/PathTests.cs b/tests/Perspex.RenderTests/Shapes/PathTests.cs index 9736f86d1c..68b5956234 100644 --- a/tests/Perspex.RenderTests/Shapes/PathTests.cs +++ b/tests/Perspex.RenderTests/Shapes/PathTests.cs @@ -132,7 +132,9 @@ namespace Perspex.Direct2D1.RenderTests.Shapes CompareImages(); } -#if PERSPEX_SKIA +#if PERSPEX_CAIRO + [Fact(Skip = "Path with StrokeDashCap, StrokeStartLineCap, StrokeEndLineCap rendering is not implemented in Cairo yet")] +#elif PERSPEX_SKIA [Fact(Skip = "FIXME")] #else [Fact]