From d6342e906a4358c9d9e9d109823faae5fb85150e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 27 May 2017 12:01:26 +0200 Subject: [PATCH] Adjusted expected test output. The output images were off-center. --- .../Rendering/SceneGraph/ClipNode.cs | 64 ++++++++++++++++++ .../SceneGraph/DeferredDrawingContextImpl.cs | 22 +++++- .../Controls/CustomRenderTests.cs | 10 +-- .../Controls/CustomRender/Clip.expected.png | Bin 766 -> 807 bytes .../CustomRender/Opacity.expected.png | Bin 612 -> 988 bytes .../Controls/CustomRender/Clip.expected.png | Bin 766 -> 807 bytes .../CustomRender/Opacity.expected.png | Bin 942 -> 988 bytes .../Controls/CustomRender/Clip.expected.png | Bin 766 -> 807 bytes .../CustomRender/Opacity.expected.png | Bin 942 -> 988 bytes 9 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 src/Avalonia.Visuals/Rendering/SceneGraph/ClipNode.cs diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/ClipNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/ClipNode.cs new file mode 100644 index 0000000000..cea2c9e633 --- /dev/null +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/ClipNode.cs @@ -0,0 +1,64 @@ +using System; +using Avalonia.Platform; + +namespace Avalonia.Rendering.SceneGraph +{ + /// + /// A node in the scene graph which represents a clip push or pop. + /// + internal class ClipNode : IDrawOperation + { + /// + /// Initializes a new instance of the class that represents an + /// clip push. + /// + /// The clip to push. + public ClipNode(Rect clip) + { + Clip = clip; + } + + /// + /// Initializes a new instance of the class that represents an + /// opacity pop. + /// + public ClipNode() + { + } + + /// + public Rect Bounds => Rect.Empty; + + /// + /// Gets the opacity to be pushed or null if the operation represents a pop. + /// + public Rect? Clip { get; } + + /// + public bool HitTest(Point p) => false; + + /// + /// Determines if this draw operation equals another. + /// + /// The clip of the other draw operation. + /// True if the draw operations are the same, otherwise false. + /// + /// The properties of the other draw operation are passed in as arguments to prevent + /// allocation of a not-yet-constructed draw operation object. + /// + public bool Equals(Rect? clip) => Clip == clip; + + /// + public void Render(IDrawingContextImpl context) + { + if (Clip.HasValue) + { + context.PushClip(Clip.Value); + } + else + { + context.PopClip(); + } + } + } +} diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs index 5659bda1d9..2dfd26bca5 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs @@ -196,7 +196,16 @@ namespace Avalonia.Rendering.SceneGraph /// public void PopClip() { - // TODO: Implement + var next = NextDrawAs(); + + if (next == null || !next.Equals(null)) + { + Add(new ClipNode()); + } + else + { + ++_drawOperationindex; + } } /// @@ -229,7 +238,16 @@ namespace Avalonia.Rendering.SceneGraph /// public void PushClip(Rect clip) { - // TODO: Implement + var next = NextDrawAs(); + + if (next == null || !next.Equals(clip)) + { + Add(new ClipNode(clip)); + } + else + { + ++_drawOperationindex; + } } /// diff --git a/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs b/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs index 995b285df1..2f311f4800 100644 --- a/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs +++ b/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs @@ -35,14 +35,14 @@ namespace Avalonia.Direct2D1.RenderTests.Controls { context.FillRectangle( Brushes.Red, - control.Bounds, + new Rect(control.Bounds.Size), 4); - using (context.PushClip(control.Bounds.Deflate(20))) + using (context.PushClip(new Rect(control.Bounds.Size).Deflate(20))) { context.FillRectangle( Brushes.Blue, - control.Bounds, + new Rect(control.Bounds.Size), 4); } }), @@ -64,14 +64,14 @@ namespace Avalonia.Direct2D1.RenderTests.Controls { context.FillRectangle( Brushes.Red, - control.Bounds, + new Rect(control.Bounds.Size), 4); using (context.PushOpacity(0.5)) { context.FillRectangle( Brushes.Blue, - control.Bounds.Deflate(20), + new Rect(control.Bounds.Size).Deflate(20), 4); } }), diff --git a/tests/TestFiles/Cairo/Controls/CustomRender/Clip.expected.png b/tests/TestFiles/Cairo/Controls/CustomRender/Clip.expected.png index 3347370368a9ecbd9713c1f9e105fe73610d8cfb..c64045d17e89beba95e3c53999ec419f1e0203a5 100644 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg>7u8LV@O5Z+nb7$t~f|ET-1?jbZ`lz7m zrpB}%H+$#&GzwL?@gdGPTz%!t75`QR&jgwR1PRO6U9`--}HLAiyG zH_4>!n)~tF$-{-Wcv5;FPd2zQne*xIH7{RFmcL#)S#6Q8`J;sVG++DK9{1KRPe1$p z)*FR*)+Z~wee|@d>Qb6Q@#LQe?0gw+9#HL%_;6o{gQd|y07U%A&fmCh&znc` zMR($EecyAm$zDN#gQ;VM%xNb!1@J z*w6hZk(GggX@#eYV@O5Z+nb6-B90Ob7b8uKgbuPQ6|wV8TwTD%=fu+9(b0cEN#M1E z!UdiBpyZ!jr*Z<{T&XsVwcWiawEpVm&D=m!;XwT9hI6z3L`^d{uAT8QPi#-sKOwyf znUQ_Qch6V+&w6LhzUkOU4W4f)PCpH+e?60FteNAQcfEguwD8HhmP|jNeM#t_C%4^< z-KhHv>u;0&&JFg094w6v0wCf?dj3YfxU!G(mVcjKD{q1bf@MYtXb=s2Kv=B#+&y=m z{tb0?c)SU4w4806Gwtc`D(>Az)xRtHgrC&SP0W`&_tE~uZOQrR3$MQpFZh_||9{TQ zw9lMIi8XTzZMo}aJuK|*Hmm+&@i;F}z3=Jid`=&|U1tQIx`2|Jr>mdKI;Vst05mk$ A9RL6T diff --git a/tests/TestFiles/Cairo/Controls/CustomRender/Opacity.expected.png b/tests/TestFiles/Cairo/Controls/CustomRender/Opacity.expected.png index 159f428344f7ab12fc9ff8ce7993444e11041493..66d12819f43f98f17113f8b7e753f127bdb3786a 100644 GIT binary patch delta 584 zcmV-O0=NC-1l$LZB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP000AqNkl@?UzJQOAA}25=xJaMEZ3x1sO9;XQV^Tz! zm8X>c6=;pD&G)g7H*Z*NH9s>v4FCWD004kJ^Pj=Bt)7a5eKXhe(TwDW^?0rMy*77{ zKLo-)+8np$4)OJRywcV{=8wz|?57z(HgJ<87W{7s1cE>y2n2#aAnf!l)|+uSo{y99 z`}k(O9S3U`K32TLx%!UB>3A|;T#j#Q+gq%i1+t0b+4xQv+^NsTySWOVjiYhCX4>T3YuDzRyyqNpQuIwz3&9MqT2Cv7%HM+f>1!DK$W3f5z?~1orvC&)sk-#Q@ zb{5FNc)Lb$w+_dfHM+f>1#&!2*9h*`!|{5JZf|FSoQ&t=)A7%Gg1fOqY8PUc>6JP%w4YZgAd&9Q2;b8O=HV*Iscx0?ZE13L`_?wf6ac#8!= zAP@usK_CzW0%2<)7i0XnhOk%W+CE!j!)x7S2YI>fuy1}@_iNqc{~*WndNsfJ`I>@z zZ?5UT=k4*_A%1&5bG5BI$PD9jUXSJv{xmPgE$+3shR^2p;~Z{{0{{R3003ZrjqxAN W23Ieb$wEN@0000G8DLj6i)b@W6B1V&-dStR4&OSbTjy ze}lC!2TP-a04h-tzcpk2-&LU>uC9N7k)O#?L4akH7-V6PXl<2nc8xJ#qxGj|^!Niu a=MRR>%h+>29Lu%<#l5GipUXO@geCx_PiVye diff --git a/tests/TestFiles/Direct2D1/Controls/CustomRender/Clip.expected.png b/tests/TestFiles/Direct2D1/Controls/CustomRender/Clip.expected.png index 3347370368a9ecbd9713c1f9e105fe73610d8cfb..c64045d17e89beba95e3c53999ec419f1e0203a5 100644 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg>7u8LV@O5Z+nb7$t~f|ET-1?jbZ`lz7m zrpB}%H+$#&GzwL?@gdGPTz%!t75`QR&jgwR1PRO6U9`--}HLAiyG zH_4>!n)~tF$-{-Wcv5;FPd2zQne*xIH7{RFmcL#)S#6Q8`J;sVG++DK9{1KRPe1$p z)*FR*)+Z~wee|@d>Qb6Q@#LQe?0gw+9#HL%_;6o{gQd|y07U%A&fmCh&znc` zMR($EecyAm$zDN#gQ;VM%xNb!1@J z*w6hZk(GggX@#eYV@O5Z+nb6-B90Ob7b8uKgbuPQ6|wV8TwTD%=fu+9(b0cEN#M1E z!UdiBpyZ!jr*Z<{T&XsVwcWiawEpVm&D=m!;XwT9hI6z3L`^d{uAT8QPi#-sKOwyf znUQ_Qch6V+&w6LhzUkOU4W4f)PCpH+e?60FteNAQcfEguwD8HhmP|jNeM#t_C%4^< z-KhHv>u;0&&JFg094w6v0wCf?dj3YfxU!G(mVcjKD{q1bf@MYtXb=s2Kv=B#+&y=m z{tb0?c)SU4w4806Gwtc`D(>Az)xRtHgrC&SP0W`&_tE~uZOQrR3$MQpFZh_||9{TQ zw9lMIi8XTzZMo}aJuK|*Hmm+&@i;F}z3=Jid`=&|U1tQIx`2|Jr>mdKI;Vst05mk$ A9RL6T diff --git a/tests/TestFiles/Direct2D1/Controls/CustomRender/Opacity.expected.png b/tests/TestFiles/Direct2D1/Controls/CustomRender/Opacity.expected.png index 399d502a5664efbe39e34a0a532c89a9bacbe80d..66d12819f43f98f17113f8b7e753f127bdb3786a 100644 GIT binary patch literal 988 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Gggxy{qXF{C2y?M=h17hdZ7L^FEVoc+GB-#kAe*VNwFh8JiF14D!D*Mz&5 z_b1nw=KDYYn)2`9^y!le_+xtt&GPl1fBmce{&;4#f_7hg>p{Dj3+J3S{aX>YJo}ZG z@uIc!x|(Z^uYbAN^Q8T2#oC{H&B`a(vmCO!CA0k*-^Z_2doEpbc-DW0|IKnq2eX37 z%3^==Ia!(<6gWV{n=iW8W*1t_>!1Ab_m8wavh3Mnc6$!*{MC2-Wra~(OkaN1?dUag zSvPe)zWKvX;?BzR$9C`Jn%}#)a9`T3Z4PB+M{d25dGui2-r1ddX8b;}?v2ibvm3eW z*w!CEY`SajT-K!T50W=pzI)%bJwkwm$x&gH7{D+n6FYIRVz*ntcE01Y!Ld_h<9D6o z-L=CXt9tYD(;MgXJb!%o*rEOw3jgPyVyBZA198TXxZhv+t&` zSMGebA-^v2d-mNY{}qmZt}@;Kil&t_dkF8@s46$wSDo{wbmzi9+$-RKjZ&r yqJLcX-PWCL=bwFjER)yE49qAD3<>qUALY-oh3n5a=>*J~3=E#GelF{r5}E+GL_jM5 literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggIl|M$F{C2y?M=fhS$BqphlO0iE&^&xc-)rwKh$PfZ2W{{r_;F!+&|a~ zCkjgl$L#Q*XvUIw<)%bplcDCKGhMl#?I)`5fByZ4-94kt(K)8}#!ilKlEV6nSgcAX4RF5H~z7S z|Ma(t+dbLs(-%Fa%G~b{By^9jUCTUEf2O^K-{$uzOf3)b%e%<(u5StKoj*n^Azs}h_m$k@D@0#SB>xVyP&CT7m+2P#r&4u-U_TD>Kr<46* z_s7>&+i&hI{d0d^e%d9l@FiTXd>a+zUUe!gp&0m=%Vu6{1-oD!M< DAN5a? diff --git a/tests/TestFiles/Skia/Controls/CustomRender/Clip.expected.png b/tests/TestFiles/Skia/Controls/CustomRender/Clip.expected.png index 3347370368a9ecbd9713c1f9e105fe73610d8cfb..c64045d17e89beba95e3c53999ec419f1e0203a5 100644 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Ggg>7u8LV@O5Z+nb7$t~f|ET-1?jbZ`lz7m zrpB}%H+$#&GzwL?@gdGPTz%!t75`QR&jgwR1PRO6U9`--}HLAiyG zH_4>!n)~tF$-{-Wcv5;FPd2zQne*xIH7{RFmcL#)S#6Q8`J;sVG++DK9{1KRPe1$p z)*FR*)+Z~wee|@d>Qb6Q@#LQe?0gw+9#HL%_;6o{gQd|y07U%A&fmCh&znc` zMR($EecyAm$zDN#gQ;VM%xNb!1@J z*w6hZk(GggX@#eYV@O5Z+nb6-B90Ob7b8uKgbuPQ6|wV8TwTD%=fu+9(b0cEN#M1E z!UdiBpyZ!jr*Z<{T&XsVwcWiawEpVm&D=m!;XwT9hI6z3L`^d{uAT8QPi#-sKOwyf znUQ_Qch6V+&w6LhzUkOU4W4f)PCpH+e?60FteNAQcfEguwD8HhmP|jNeM#t_C%4^< z-KhHv>u;0&&JFg094w6v0wCf?dj3YfxU!G(mVcjKD{q1bf@MYtXb=s2Kv=B#+&y=m z{tb0?c)SU4w4806Gwtc`D(>Az)xRtHgrC&SP0W`&_tE~uZOQrR3$MQpFZh_||9{TQ zw9lMIi8XTzZMo}aJuK|*Hmm+&@i;F}z3=Jid`=&|U1tQIx`2|Jr>mdKI;Vst05mk$ A9RL6T diff --git a/tests/TestFiles/Skia/Controls/CustomRender/Opacity.expected.png b/tests/TestFiles/Skia/Controls/CustomRender/Opacity.expected.png index 399d502a5664efbe39e34a0a532c89a9bacbe80d..66d12819f43f98f17113f8b7e753f127bdb3786a 100644 GIT binary patch literal 988 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(Gggxy{qXF{C2y?M=h17hdZ7L^FEVoc+GB-#kAe*VNwFh8JiF14D!D*Mz&5 z_b1nw=KDYYn)2`9^y!le_+xtt&GPl1fBmce{&;4#f_7hg>p{Dj3+J3S{aX>YJo}ZG z@uIc!x|(Z^uYbAN^Q8T2#oC{H&B`a(vmCO!CA0k*-^Z_2doEpbc-DW0|IKnq2eX37 z%3^==Ia!(<6gWV{n=iW8W*1t_>!1Ab_m8wavh3Mnc6$!*{MC2-Wra~(OkaN1?dUag zSvPe)zWKvX;?BzR$9C`Jn%}#)a9`T3Z4PB+M{d25dGui2-r1ddX8b;}?v2ibvm3eW z*w!CEY`SajT-K!T50W=pzI)%bJwkwm$x&gH7{D+n6FYIRVz*ntcE01Y!Ld_h<9D6o z-L=CXt9tYD(;MgXJb!%o*rEOw3jgPyVyBZA198TXxZhv+t&` zSMGebA-^v2d-mNY{}qmZt}@;Kil&t_dkF8@s46$wSDo{wbmzi9+$-RKjZ&r yqJLcX-PWCL=bwFjER)yE49qAD3<>qUALY-oh3n5a=>*J~3=E#GelF{r5}E+GL_jM5 literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggIl|M$F{C2y?M=fhS$BqphlO0iE&^&xc-)rwKh$PfZ2W{{r_;F!+&|a~ zCkjgl$L#Q*XvUIw<)%bplcDCKGhMl#?I)`5fByZ4-94kt(K)8}#!ilKlEV6nSgcAX4RF5H~z7S z|Ma(t+dbLs(-%Fa%G~b{By^9jUCTUEf2O^K-{$uzOf3)b%e%<(u5StKoj*n^Azs}h_m$k@D@0#SB>xVyP&CT7m+2P#r&4u-U_TD>Kr<46* z_s7>&+i&hI{d0d^e%d9l@FiTXd>a+zUUe!gp&0m=%Vu6{1-oD!M< DAN5a?