From b0a2ae99e44151f58ef6e77ca731f78bd5b3d660 Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Thu, 2 Feb 2023 10:37:20 +0100 Subject: [PATCH] Fix default GlyphRun.BaselineOrigin Add a unit test --- src/Avalonia.Base/Media/GlyphRun.cs | 2 +- .../Avalonia.Skia/PlatformRenderInterface.cs | 2 +- .../Avalonia.Direct2D1/Direct2D1Platform.cs | 2 +- .../Controls/TextBlockTests.cs | 51 ++++++++++++++++++ .../Should_Draw_TextDecorations.expected.png | Bin 0 -> 1279 bytes .../Should_Draw_TextDecorations.expected.png | Bin 0 -> 1516 bytes 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 tests/TestFiles/Direct2D1/Controls/TextBlock/Should_Draw_TextDecorations.expected.png create mode 100644 tests/TestFiles/Skia/Controls/TextBlock/Should_Draw_TextDecorations.expected.png diff --git a/src/Avalonia.Base/Media/GlyphRun.cs b/src/Avalonia.Base/Media/GlyphRun.cs index 0ec7152359..2966ceee8d 100644 --- a/src/Avalonia.Base/Media/GlyphRun.cs +++ b/src/Avalonia.Base/Media/GlyphRun.cs @@ -166,7 +166,7 @@ namespace Avalonia.Media /// public Point BaselineOrigin { - get => _baselineOrigin ?? default; + get => PlatformImpl.Item.BaselineOrigin; set => Set(ref _baselineOrigin, value); } diff --git a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs index d12db39ad6..e795f3d304 100644 --- a/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs +++ b/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs @@ -86,7 +86,7 @@ namespace Avalonia.Skia SKPath path = new SKPath(); - var (currentX, currentY) = glyphRun.PlatformImpl.Item.BaselineOrigin; + var (currentX, currentY) = glyphRun.BaselineOrigin; for (var i = 0; i < glyphRun.GlyphInfos.Count; i++) { diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index eb3f9911df..99c01dd111 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -257,7 +257,7 @@ namespace Avalonia.Direct2D1 sink.Close(); } - var (baselineOriginX, baselineOriginY) = glyphRun.PlatformImpl.Item.BaselineOrigin; + var (baselineOriginX, baselineOriginY) = glyphRun.BaselineOrigin; var transformedGeometry = new SharpDX.Direct2D1.TransformedGeometry( Direct2D1Factory, diff --git a/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs b/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs index c11bd2b816..4210ee8238 100644 --- a/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs +++ b/tests/Avalonia.RenderTests/Controls/TextBlockTests.cs @@ -1,3 +1,4 @@ +using System.Net; using System.Threading.Tasks; using Avalonia.Controls; using Avalonia.Layout; @@ -17,6 +18,56 @@ namespace Avalonia.Direct2D1.RenderTests.Controls { } + [Win32Fact("Has text")] + public async Task Should_Draw_TextDecorations() + { + Border target = new Border + { + Padding = new Thickness(8), + Width = 200, + Height = 30, + Background = Brushes.White, + Child = new TextBlock + { + FontFamily = TestFontFamily, + FontSize = 12, + Foreground = Brushes.Black, + Text = "Neque porro quisquam est qui dolorem", + VerticalAlignment = VerticalAlignment.Top, + TextWrapping = TextWrapping.NoWrap, + TextDecorations = new TextDecorationCollection + { + new TextDecoration + { + Location = TextDecorationLocation.Overline, + StrokeThickness= 1.5, + StrokeThicknessUnit = TextDecorationUnit.Pixel, + Stroke = new SolidColorBrush(Colors.Red) + }, + new TextDecoration + { + Location = TextDecorationLocation.Baseline, + StrokeThickness= 1.5, + StrokeThicknessUnit = TextDecorationUnit.Pixel, + Stroke = new SolidColorBrush(Colors.Green) + }, + new TextDecoration + { + Location = TextDecorationLocation.Underline, + StrokeThickness= 1.5, + StrokeThicknessUnit = TextDecorationUnit.Pixel, + Stroke = new SolidColorBrush(Colors.Blue), + StrokeOffset = 2, + StrokeOffsetUnit = TextDecorationUnit.Pixel + } + } + } + }; + + await RenderToFile(target); + CompareImages(); + } + [Win32Fact("Has text")] public async Task Wrapping_NoWrap() { diff --git a/tests/TestFiles/Direct2D1/Controls/TextBlock/Should_Draw_TextDecorations.expected.png b/tests/TestFiles/Direct2D1/Controls/TextBlock/Should_Draw_TextDecorations.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..494c8a900252641099b21c89d680145adde9046f GIT binary patch literal 1279 zcmVPx#1ZP1_K>z@;j|==^1poj9sYygZRCr$Pnma6QK@^6ELPRvT5|Kza3WZ8UL_9*` z*;1fVNoa0IqtqPH+=fJ@aunp2UWIr>M3f2=uSTJ|2_h=4f9|Yp8T-thvmN(!)|X87 znpt~ZYu1{X?Z|t6K?#BoO1^mtf)IiPh#)wS01*TS5+H)$KmtS%97uo&f&&QMmwmhfq^qk-KRd$d&`nQI>xc)C`MbC#;9Y{Qc9eXt5oiN#Q$6aBh#D*Jm+K*O9Um(; z4k|~=CYe!LzMZJ2lmb*Vj?lkbK~b&>d-0oNhX zT+t`;=jZ1tkw|FSUh8!5b&SF*K+ew2)WE=inwy(5C9hym2p$~uNR^e9fsvu>?CcD5 z^Yin%JPH_=w+SOOH#Zw?G*?$wL0#-HpH> zd3o7r)8q0V3I^UUT_mHz`vd`)w7omR7;p%RNCXia6u?PZ zT3WOWMn*=AP3)5cAXvB!FjimS%(NzUV3n7b2R7igh{EMR2nLK7<@PBV7xE$B z@3xErq`$vkO-@dl+$$7~lzb!E1-^TDn@E`$K9|Ab!(MPcIG25Gi39EGv=(8TMO<9| zg8)GpHZIJ?cazK(83hO&6jy@v^>tICbbfJh(d6EO_i6VAe7DAq!;gO6Mtyy~?jx=- z>^^Ci##s0F_q7brC(1qooDruTA1ii2zDuVgu6=w#`*1G4UN}{_4fwSg@6+xLTvtAq zE)!h-!@+eIryXt=9|3a&z9&-T4~4z+y}Gf!zCNA5xw%oRtE;NDwN+JAROqtJ%}sTE zeXV8C)6=6$N=mf6va+J??(Vc)U0to84Gj(Y$#r#gb?Wr=^j$whSy`Ft=;$!H^q@_= zdvbE3^XQZM1AMG@o2Xk`TN})agL?%?1+_lrL84!$XlkB{|xVfL~~=RcR1muh=^ z+mwd;0QxyPI?^)c!q++-+_#>;yT3ys1LRB3HzR$V$HzzY^z@{Pii%80_PM>iRfUCx zs-U32l>9sV4*S?VJUpoU{CsV*T;#{h#;gzsh^u4Ek3jSWm^CM002ovPDHLkV1l~1QeprA literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Controls/TextBlock/Should_Draw_TextDecorations.expected.png b/tests/TestFiles/Skia/Controls/TextBlock/Should_Draw_TextDecorations.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..297bd592ff27631f9c0c5738da922f49e7f3dd25 GIT binary patch literal 1516 zcmVR9JKak1zRd8c^6@WOQo{X5km70J(RM=3R0%aLc%IoM2ZM99+FHZ z$z(FwCf#j$AM9cB&-?%X{qOz%dv9ho<@>&mLZOIc$5uO_P;6&Zf+!R*s02|cVo(X9 zP{g1TM4^a5C5S>1gGvyEB8F!M-f`r}V{k*E*dnf9j}@oXi$aB>KZCbebwNIr!jZub zhx74N9bG!AQYp3_ z(zV8_KVgDs%oTNn8=WE2Ns&r5|MG%*ADJTr`KG)s^5nxAC!Nl=&8=O~Her>JP97ng zME-QjBu>gf%23;oQR$>`q{In)a%k^5H|Oi4#HTLu&2|x6tS)~#``Oqc2W^ED^fT6G zx6V-irIW{T8vf*kXvQe{)-UP&>4R+T2p3t1`bE7%vz2u*0-uWLfv*Cy7WOsSa!ulntNESa=+ zVbaM^&|5LM2qIwxPMa+GZJkxy!U;NAMrs%FYb7Xn7`{)fMBjoMCT{*v7dWB#_`Xjt zBzh6wuTjc@UG42>ekP-OVr2qU$V=gsUS9iE=+o%}wO}dVu7bpbPqfvpZK2Nwb zEk{|nK^5yhPz9BuTc#V>WkG@>97$NO=atE6TBNUaS5UT%-c?~3dVH0*Ru0n`oXwk# zPg2q*OMVqQSS8bFI-wXeD){g=C8IeT$IqWIdNKL7E#9Ptjz!XkvIAcf&Wj_g+<@t$ z2iXnq@E$9|W#92ryuPn-&&KV`EZ=OmITR)P5$um_EU8gjGWo)t=jw&aw3;0<3^wld z+F5HUois38vIwSMm}dUXd8CuV#m4&7g4ckVc@_@u5AIv9EOP0m=EcjioHM7GXh^6m zR@igSWNM;U|9WMS%ARwWQNq7h5ubg>ug%Mu`2|8IV+s6`U@x@e^X1PUu>AQ~ed4ph z?aRyD?9eocVIJk+?uXo45x8q@Nq9VzSqjyW~KdSww$Tj22ibt>WkZdT+t--f# S6vVXv0000