From 8fa983d5bcecdf7030434d96777b8939fff9b8db Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 May 2020 19:43:35 -0300 Subject: [PATCH 1/5] image class will not make invalid render calls if its size is 0 causing divide by zero and passing .NaN to drawing context. --- src/Avalonia.Controls/Image.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Image.cs b/src/Avalonia.Controls/Image.cs index 8d249fe790..9550aebc41 100644 --- a/src/Avalonia.Controls/Image.cs +++ b/src/Avalonia.Controls/Image.cs @@ -69,10 +69,11 @@ namespace Avalonia.Controls { var source = Source; - if (source != null) + if (source != null && Bounds.Size != Size.Empty) { Rect viewPort = new Rect(Bounds.Size); Size sourceSize = source.Size; + Vector scale = Stretch.CalculateScaling(Bounds.Size, sourceSize, StretchDirection); Size scaledSize = sourceSize * scale; Rect destRect = viewPort From 811c7c6d654e926b31cffb300becfe1a5aa8bb97 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 May 2020 20:06:56 -0300 Subject: [PATCH 2/5] check either bound of the image. --- src/Avalonia.Controls/Image.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Image.cs b/src/Avalonia.Controls/Image.cs index 9550aebc41..5fc7d8b6b6 100644 --- a/src/Avalonia.Controls/Image.cs +++ b/src/Avalonia.Controls/Image.cs @@ -69,7 +69,7 @@ namespace Avalonia.Controls { var source = Source; - if (source != null && Bounds.Size != Size.Empty) + if (source != null && Bounds.Width > 0 && Bounds.Height > 0) { Rect viewPort = new Rect(Bounds.Size); Size sourceSize = source.Size; From a8cd4cc2d863a1b7d81f2282695f2ed6febeeffb Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 May 2020 18:50:34 -0300 Subject: [PATCH 3/5] fix failing test. --- .../Rendering/SceneGraph/SceneBuilderTests.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index d59a94d597..0dbc5d635f 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs @@ -360,7 +360,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph var result = initial.CloneScene(); sceneBuilder.Update(result, border); - + var borderNode = (VisualNode)result.Root.Children[0]; Assert.Same(border, borderNode.Visual); @@ -880,16 +880,24 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) { - var bitmap = RefCountable.Create(Mock.Of()); + var bitmap = RefCountable.Create(Mock.Of( + x => x.PixelSize == new PixelSize(100, 100) && + x.Dpi == new Vector(96, 96))); + Image img; var tree = new TestRoot { Child = img = new Image { - Source = new Bitmap(bitmap) + Source = new Bitmap(bitmap), + Height = 100, + Width = 100 } }; + tree.Measure(Size.Infinity); + tree.Arrange(new Rect(new Size(100, 100))); + Assert.Equal(2, bitmap.RefCount); IRef operation; From 67e6de978b2589655a16d4abdd8b5c17173b4fff Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 May 2020 19:34:27 -0300 Subject: [PATCH 4/5] fix scenebuilder test --- .../Rendering/SceneGraph/SceneBuilderTests.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index 0dbc5d635f..00554d3ffb 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs @@ -920,13 +920,18 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) { - var bitmap = RefCountable.Create(Mock.Of()); + var bitmap = RefCountable.Create(Mock.Of( + x => x.PixelSize == new PixelSize(100, 100) && + x.Dpi == new Vector(96, 96))); + Image img; var tree = new TestRoot { Child = img = new Image { - Source = new Bitmap(bitmap) + Source = new Bitmap(bitmap), + Width = 100, + Height = 100 } }; From bc0a763481c1beacd9266a8021d0d050c3f9dfe4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 May 2020 19:41:18 -0300 Subject: [PATCH 5/5] add missing scenebuilder test. --- .../Rendering/SceneGraph/SceneBuilderTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index 00554d3ffb..b0f890b484 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs @@ -935,6 +935,9 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph } }; + tree.Measure(Size.Infinity); + tree.Arrange(new Rect(new Size(100, 100))); + var scene = new Scene(tree); var sceneBuilder = new SceneBuilder(); sceneBuilder.UpdateAll(scene);