From 9d0762dbc04a0a79c37d3f73e8cf177e673e2be5 Mon Sep 17 00:00:00 2001 From: snowflysky <45072798+snowflysky@users.noreply.github.com> Date: Tue, 25 Nov 2025 03:23:31 +0800 Subject: [PATCH] Enable antialiasing based on EdgeMode in DrawBitmap (#20116) * Enable antialiasing based on EdgeMode in DrawBitmap * Update expected image for ImageBrush Tile UniformToFill test * Add tests for rotated image with EdgeMode options * Add expected images for Direct2D1 image rotation tests * Revert "Add expected images for Direct2D1 image rotation tests" This reverts commit 63dd6717b0ff4488ee7b453f220e3329202ec9d2. * Remove Direct2D1 in ImageTests --------- Co-authored-by: Julien Lebosquain --- src/Skia/Avalonia.Skia/DrawingContextImpl.cs | 1 + .../Controls/ImageTests.cs | 65 ++++++++++++++++++ ...mage_Rotated_EdgeMode_Aliased.expected.png | Bin 0 -> 4695 bytes ...ge_Rotated_EdgeMode_Antialias.expected.png | Bin 0 -> 6169 bytes ..._Rotated_EdgeMode_Unspecified.expected.png | Bin 0 -> 6169 bytes tests/TestFiles/Skia/Controls/Image/test2.png | Bin 0 -> 370 bytes ...ImageBrush_Tile_UniformToFill.expected.png | Bin 2253 -> 2343 bytes 7 files changed, 66 insertions(+) create mode 100644 tests/TestFiles/Skia/Controls/Image/Image_Rotated_EdgeMode_Aliased.expected.png create mode 100644 tests/TestFiles/Skia/Controls/Image/Image_Rotated_EdgeMode_Antialias.expected.png create mode 100644 tests/TestFiles/Skia/Controls/Image/Image_Rotated_EdgeMode_Unspecified.expected.png create mode 100644 tests/TestFiles/Skia/Controls/Image/test2.png diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index ce5b59a86d..6a2ec35a85 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -250,6 +250,7 @@ namespace Avalonia.Skia paint.Color = new SKColor(255, 255, 255, (byte)(255 * opacity * _currentOpacity)); paint.FilterQuality = RenderOptions.BitmapInterpolationMode.ToSKFilterQuality(); paint.BlendMode = RenderOptions.BitmapBlendingMode.ToSKBlendMode(); + paint.IsAntialias = RenderOptions.EdgeMode != EdgeMode.Aliased; drawableImage.Draw(this, s, d, paint); SKPaintCache.Shared.ReturnReset(paint); diff --git a/tests/Avalonia.RenderTests/Controls/ImageTests.cs b/tests/Avalonia.RenderTests/Controls/ImageTests.cs index 3bf935d199..7573f30445 100644 --- a/tests/Avalonia.RenderTests/Controls/ImageTests.cs +++ b/tests/Avalonia.RenderTests/Controls/ImageTests.cs @@ -14,11 +14,13 @@ namespace Avalonia.Direct2D1.RenderTests.Controls public class ImageTests : TestBase { private readonly Bitmap _bitmap; + private readonly Bitmap _bitmap2; public ImageTests() : base(@"Controls\Image") { _bitmap = new Bitmap(Path.Combine(OutputPath, "test.png")); + _bitmap2 = new Bitmap(Path.Combine(OutputPath, "test2.png")); } [Fact] @@ -112,5 +114,68 @@ namespace Avalonia.Direct2D1.RenderTests.Controls await RenderToFile(target); CompareImages(); } + + [Fact] + public async Task Image_Rotated_EdgeMode_Unspecified() + { + Decorator target = new Decorator + { + Padding = new Thickness(32, 32), + Width = 200, + Height = 200, + Child = new Image + { + Source = _bitmap2, + Stretch = Stretch.Uniform, + RenderTransform = new RotateTransform(30), + } + }; + RenderOptions.SetEdgeMode(target, EdgeMode.Unspecified); + + await RenderToFile(target); + CompareImages(); + } + + [Fact] + public async Task Image_Rotated_EdgeMode_Antialias() + { + Decorator target = new Decorator + { + Padding = new Thickness(32, 32), + Width = 200, + Height = 200, + Child = new Image + { + Source = _bitmap2, + Stretch = Stretch.Uniform, + RenderTransform = new RotateTransform(30), + } + }; + RenderOptions.SetEdgeMode(target, EdgeMode.Antialias); + + await RenderToFile(target); + CompareImages(); + } + + [Fact] + public async Task Image_Rotated_EdgeMode_Aliased() + { + Decorator target = new Decorator + { + Padding = new Thickness(32, 32), + Width = 200, + Height = 200, + Child = new Image + { + Source = _bitmap2, + Stretch = Stretch.Uniform, + RenderTransform = new RotateTransform(30), + } + }; + RenderOptions.SetEdgeMode(target, EdgeMode.Aliased); + + await RenderToFile(target); + CompareImages(); + } } } diff --git a/tests/TestFiles/Skia/Controls/Image/Image_Rotated_EdgeMode_Aliased.expected.png b/tests/TestFiles/Skia/Controls/Image/Image_Rotated_EdgeMode_Aliased.expected.png new file mode 100644 index 0000000000000000000000000000000000000000..69945c44177e07aadb16e57f33889d2d947cc822 GIT binary patch literal 4695 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 OP7I!|elF{r5}E)$)M+39 literal 0 HcmV?d00001 diff --git a/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Tile_UniformToFill.expected.png b/tests/TestFiles/Skia/Media/ImageBrush/ImageBrush_Tile_UniformToFill.expected.png index 0f134789a5063300c41f10acf4b463f5325fe957..0cbc115d645bda103708baee845180ad552db28b 100644 GIT binary patch literal 2343 zcmaJ@3p7;w8n>33CX7dktvQZUgc4??nNupq;|x=g%JFEBF@$C`oHJet%Oj0K#dS$( zT+eP8d0j5TZ5WU72zexCt`I|BA;vK7p2s<@bCz{yt^HVg_P2lE@A3Wjj<>V5g2^0| zk&=>vVXZB%fX7zh28Dq8Vki1@@UZJQbF4iS{M~_iQl+GzY^+E1E+O#r}EcwQn~1hfXc* zLcQMHf_F)~+kii5qvOPILug+eorRQ32vox+cPO{%1{tv`Q2r;e*`7=5#kkw#F(;>` z;eWLt5VwtQuyj}>swQd|4j*lE@Pe9|o!`D#z-=few9|1L8qCHaDaQTRKbc!^TVF}` z`I}ZVzYLL?Z%Rr&?wY0{dr0@<@>9F)o-W(*KmdpVFiC-Xuv(o*=H}*(#-bQ$dy~Iv zbxti$zieq7(qhz^-sKuw_pX_4W)+mU_O+C}&L8Zi8Fq1AhdEAlW#V`nqlJ!v3+<^N zIkY>=iR^W*PWajY?)J>*_rsL{P~dlFvB#<<@}YxGP|7j3Oq}8uxFe9*QY?t&8Y?@0 zS7`J-gy{<(*d(v26oznuIzDh-PUP5=;{jlM4?)ewN}hH}yLpDy7nJvqIi5EdvD9V4 zec6?ScbCIEEpzH(MydlWl2>Lf7-qVM7I*38tmvh~0RT>_c%QWk+iZ0+^p;?w@cH%z z5&P2b?<(bCt26CH71IaI#vlF0r)iNje!Zz=e-)G^52Mp<8zIZ0*M{?h(ors|#|9?} z1a~ND|4TEz2Ct~I?-1LORg&bfQ8z?CYs~n+93$@r&Lhp z*{OOp!67eL|Lk9GPP?8ze!Y$wg-q``#m#0pcrfC80)8HFxXlQhG^Z!TMZ@LRZv)6xu-ER-l8!$n`Us*jsJF!#&k&)XW)UU z;02i$lD(91Nw97~zVr1-ec0IUv#S#+mA?sNL1E__-ipw=dzO$=F*C$wyM?kIkX|7W zwyam5woB`;$Q|-AKFICnxx`s25kuOA{0st?@V;^B0@Fb-k(2w6HRcN!XiPvR{OVPQJ@3dboU;>3Ll}r!UKW z-n4!}F|Lwua|7>?a4#w#gIROVOjA6qj{=(n+L=MY3Hm6X;Fd-zynHgn3q14pbNa`q zI-?378x$;;VBNvLx>Q{olTVh5gv`wYfD$8PyP}rhPBHI$yoWr-Y@BAi`eZ8n=dmb{ zF;)Hq_Z9rx`J^Z%WKr9tT9df293m?FE?hcCfswHZ)>fm6o`s|s_+9Tq$C<_mQK3p_K$poVk=MWU)Wdiv#|T^tQ2+S36*8nm}yR9#vVl^_1SAP|`W1skEm z^h6*7t9uVhR;D7&uV^lKkyL6{YXZTHr0dg;TYv>bh74Fx57QJfvh-ln?zfDp8;29t zPlzM|#Hcy@Gm_4P$f6+_jkuHBzCy8bJ0VA`57voDNf_8ffDA_9uH{PlBVbyAfeEl< zMkRi-=_$pRpHYw8R1=}d5e0qoNn^v)&nP`!dZl=ait58ez1L$kzaDaAHZ=mR5;;qe z#j-oLqqz?Rx&z02^Qy9xe(9}b74}pwZNP%aga2bu@LX!)UZ&3gYUCM99;MaY0XossAx z4uG~W0HE$V?A!|<23Hcty0e5R9!|?N(B47JRPF-XyxE5E(}j#SJZdX9x?1Uwumh@Hl;~ z;A24W9vcoIkP}LBSb{noo3E+Bev=s0b59&U#9`lZv%Sd>ajGQ@QiKfFFoPsZNdS0Y z0KgeJwWRGjT>saxs79UEaizRJPa0Cxr?(EDCs)&5T2qlo1jI-pC+XsB^p5RNh4aRV zQ~JXzf4`#H{l=2FtFzT-axaKHq+MAzKVye1BSXnKi^_INb6_v^{O zj0L0e|171#X-0SuuBj^T*p3#MqjglmH?N2US6Y^mm}~24kH{3;S`(%UTo|{e#P?sY gfBwdJG}j#&d|Y|Aud=NJ_~j#o{n^%%ZtfoaKfBA4>i_@% literal 2253 zcmeH``&Uxw8pkafF)uWgl@}PDz)7p)Y03*qhMGsj*3lfDq|tKBTxw-P-ZC$wrl@Nq z)5>#Fag_vl1M`w*LMG#_F&lA`EI`p5#RAPs3M$SE=?|x~*7*z0UTg1n?X}JG)Cc0W$S_XIzw;#aTrM`8v!LypcqJd>ov@70E2V6-yXS1}lbgtpuT>LH< z%Zi`n82TG#u0Ef8y*u;5#!(h>)BJ|O@0t#z4MTptpSP(|+tA>oO{R0tZp%UAu&sev z30i%T2acIJZ$;^D)~@YpYk$x$++R`I+{{qYCRu*|%$Ex;WxmnlDRpSdE&}>7Ka5easP#b|e|~#6t0? zTvTLaq}4UYx86GWk5IYpW#NL+)`y<3S(Qx+n=$l_6TfpoE>$XKn~4+0RV)7N)6(H* z>4(TEvu|uUoJ$s~$_~*Jr7|2Fs)xw?^{SbF3TMXu|Lvl4G34KHHRpFI0Zc;4wQ;$-7k3`a0E zr5FqdBA3L?FPgyMr_fbO`ziA+-yF_EC6naBjWXM!mx-JhGMM|dPnh%O{26R{=(2Jo zqVfiD!>K?|1ItVH$`;8!{2V$uh{*Qa%GwC9;au@PE^iC7@ern z%ZMEmqlqzNH91cQ@{U+8ukw(%nDC(^$#&dZp}%-y>o}ZhS({)eX{p+a=6L@_N)Tp{ zo8H~4{wLhiNMAc**KO?*RVqZnNnT>GZV3!vW-K@ZM5vu%-I-dZNBMENL2mxC6w7Ym zMoaTm3A64+D_l^^cAjHqZ&&}A{4|C9>B66h-6JeeR8m8@>`}<@K7?&b4j?Zp#{XCd zIePo-7GE^6Ugp6%9cf1&vez!D=zrlvE~6g4n6#=|xeCGg!zxuT8VStK)r(VdxkCJQ zpZ{E37_QLzbXDKEexXt^9<$odBn?mW^!=+|+EGII{_9(qOBMb52L5UCxMmLwj&P__ zvTf;1+7-w#L~U4T&Qk;oUODk#wP~rBdPJp4JcYgDx2u;{9k`^5ACgY7xqRkzv-gD| zoqGks%ZeX@#4Y8Nu-=KX(M~3p0_m(p&do;(Xj-G&0qK@*#H#S45uVQ*u{yit^3!mXyFa4hMu8xT|1*M2?@Dm>k?iLk_hJ+5Bi^;q z00Zx8CQD=D;pj7oKk3bMiV&#e(dlt>5duohT5qowJOqP)a!qlBJkYiQvNq{J#!UHG z)%NGF&x;FufZG#Uu3)bKrU&*e#u3?)dTDX zRB9~vAJ73Opw!p2fwW~(JQP2KUUmSHq#{Sw+pC9bdRwG?rNx)QG{xC`7uihO zb3)&3j9NT7mlIpyZv7z}g2R1wA{F_F*=0kj9Qrey~}&Xn_%uQYV7P5SdG z%hI2E9q<0a`P0d`JvAhoYN;`zM!h$RvO$C2fhljrs2rBhB`rp;iGQUQPqfKrVB%?O zM5^ORMY@)3u<)2XoM8&3+O3n`t|onf%BXT%Gi5}>D5bsaXmfqae+9!r7i3bS`W zd>$j2j+`?h`VGCrk=DK&>xjxC{?=s{AD{On4XMbDKvoh)Uw!o61gldK{QsCvtYxiP ah}};Q#*c5a4s%#mzvKVm<;HUTIqffgC0Mio