From d1eb0512bbffdec59b7c4664311693f057f29912 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 14:23:45 +0200 Subject: [PATCH 1/3] Added failing test for #1171. --- .../Rendering/SceneGraph/SceneBuilderTests.cs | 54 +++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index c51e8941a9..d0f7671956 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs @@ -143,13 +143,61 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph var borderNode = scene.FindNode(border); Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds); + } + } + + [Fact] + public void Should_Update_Descendent_ClipBounds_When_Margin_Changed() + { + using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) + { + Border border; + Canvas canvas; + var tree = new TestRoot + { + Width = 200, + Height = 300, + Child = canvas = new Canvas + { + ClipToBounds = true, + Width = 100, + Height = 100, + HorizontalAlignment = HorizontalAlignment.Left, + VerticalAlignment = VerticalAlignment.Top, + Children = + { + (border = new Border + { + Background = Brushes.AliceBlue, + Width = 100, + Height = 100, + [Canvas.LeftProperty] = 50, + [Canvas.TopProperty] = 50, + }) + } + } + }; + + tree.Measure(Size.Infinity); + tree.Arrange(new Rect(tree.DesiredSize)); - // Initial ClipBounds are correct, make sure they're still correct after updating border. + var scene = new Scene(tree); + var sceneBuilder = new SceneBuilder(); + sceneBuilder.UpdateAll(scene); + + var borderNode = scene.FindNode(border); + Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds); + + canvas.Width = canvas.Height = 125; + canvas.Measure(Size.Infinity); + canvas.Arrange(new Rect(tree.DesiredSize)); + + // Initial ClipBounds are correct, make sure they're still correct after updating canvas. scene = scene.Clone(); - Assert.True(sceneBuilder.Update(scene, border)); + Assert.True(sceneBuilder.Update(scene, canvas)); borderNode = scene.FindNode(border); - Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds); + Assert.Equal(new Rect(50, 50, 75, 75), borderNode.ClipBounds); } } From dc7740554ecda45c444ffd8807e30108d941f94e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 14:24:41 +0200 Subject: [PATCH 2/3] Propagate ClipBounds to child nodes. When a scenegraph node's ClipBounds changes, ensure that that change is propagated to child nodes. Fixes #1171 --- src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs index 10455eb147..90ef78de37 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs @@ -168,11 +168,14 @@ namespace Avalonia.Rendering.SceneGraph using (context.PushTransformContainer()) { var startLayer = opacity < 1 || visual.OpacityMask != null; + var clipBounds = bounds.TransformToAABB(contextImpl.Transform).Intersect(clip); - forceRecurse = forceRecurse || node.Transform != contextImpl.Transform; + forceRecurse = forceRecurse || + node.Transform != contextImpl.Transform || + node.ClipBounds != clipBounds; node.Transform = contextImpl.Transform; - node.ClipBounds = bounds.TransformToAABB(node.Transform).Intersect(clip); + node.ClipBounds = clipBounds; node.ClipToBounds = clipToBounds; node.GeometryClip = visual.Clip?.PlatformImpl; node.Opacity = opacity; From a0f4d3fb051897d521f76241d8428a62317c9548 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 23:27:25 +0200 Subject: [PATCH 3/3] Ignore Avalonia.Designer.HostApp in ncrunch. --- .ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject diff --git a/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject b/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file