From a600fb52ae17e05ae97f311396d0ad715fb08662 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Sun, 21 Oct 2018 18:42:35 +0300 Subject: [PATCH 01/30] unit test for invalidate on immediate renderer when renderedtransfom is used, issue #1998 --- .../Rendering/ImmediateRendererTests.cs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs new file mode 100644 index 0000000000..1fff36f8ff --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Avalonia.Media; +using Avalonia.Rendering; +using Avalonia.VisualTree; +using Moq; +using Xunit; + +namespace Avalonia.Visuals.UnitTests.Rendering +{ + public class ImmediateRendererTests + { + [Fact] + public void AddDirty_Call_RenderRoot_Invalidate() + { + var visual = new Mock(); + var child = new Mock(); + var renderRoot = visual.As(); + + visual.As().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); + + child.As().Setup(v => v.Bounds).Returns(new Rect(10, 10, 100, 100)); + child.As().Setup(v => v.VisualParent).Returns(visual.Object); + child.As().Setup(v => v.RenderTransform).Returns(default(Transform)); + child.As().Setup(v => v.RenderTransformOrigin).Returns(new RelativePoint(0.5, 0.5, RelativeUnit.Relative)); + child.As().Setup(v => v.TransformToVisual(It.IsAny())).CallBase(); + + var target = new ImmediateRenderer(visual.Object); + + target.AddDirty(child.Object); + + renderRoot.Verify(v => v.Invalidate(new Rect(10, 10, 100, 100))); + } + + + [Fact] + public void AddDirty_With_RenderTransform_Call_RenderRoot_Invalidate() + { + var visual = new Mock(); + var child = new Mock(); + var renderRoot = visual.As(); + + visual.As().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); + + child.As().Setup(v => v.Bounds).Returns(new Rect(100, 100, 100, 100)); + child.As().Setup(v => v.VisualParent).Returns(visual.Object); + child.As().Setup(v => v.RenderTransform).Returns(new ScaleTransform() { ScaleX = 2, ScaleY = 2 }); + child.As().Setup(v => v.RenderTransformOrigin).Returns(new RelativePoint(0.5, 0.5, RelativeUnit.Relative)); + child.As().Setup(v => v.TransformToVisual(It.IsAny())).CallBase(); + + var target = new ImmediateRenderer(visual.Object); + + target.AddDirty(child.Object); + + renderRoot.Verify(v => v.Invalidate(new Rect(50, 50, 200, 200))); + } + + + public class TestVisual : Visual + { + public new Rect Bounds + { + get => base.Bounds; + set => base.Bounds = value; + } + } + } +} From 7fd6975658b6fe82deb7f461174480d4b6642753 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 23 Oct 2018 01:19:16 +0300 Subject: [PATCH 02/30] fix ImmediateRenderer invalidation for controls with RenderTransform issue #1998 --- .../Rendering/ImmediateRenderer.cs | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index d373e7ef2a..96512b41a1 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -115,12 +115,45 @@ namespace Avalonia.Rendering } } + private static Matrix? TransformToVisual(IVisual visual, IVisual root) + { + var result = Matrix.Identity; + + while (visual != root) + { + if (visual.RenderTransform?.Value != null) + { + var origin = visual.RenderTransformOrigin.ToPixels(visual.Bounds.Size); + var offset = Matrix.CreateTranslation(origin); + var renderTransform = (-offset) * visual.RenderTransform.Value * (offset); + + result *= renderTransform; + } + + var topLeft = visual.Bounds.TopLeft; + + if (topLeft != default) + { + result *= Matrix.CreateTranslation(topLeft); + } + + visual = visual.VisualParent; + + if (visual == null) + { + return null; + } + } + + return result; + } + /// public void AddDirty(IVisual visual) { if (visual.Bounds != Rect.Empty) { - var m = visual.TransformToVisual(_root); + var m = TransformToVisual(visual, _root); if (m.HasValue) { @@ -191,7 +224,7 @@ namespace Avalonia.Rendering } } - static IEnumerable HitTest( + private static IEnumerable HitTest( IVisual visual, Point p, Func filter) From 5ce71be598691be6b34caaee56076096f1bded52 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 23 Oct 2018 14:00:30 +0300 Subject: [PATCH 03/30] another failing unit test for invalidate on immediate renderer when renderedtransfom is used, issue #1998 --- .../Rendering/ImmediateRendererTests.cs | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs index 1fff36f8ff..41e1691f28 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs @@ -1,7 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; +using Avalonia.Collections; using Avalonia.Media; +using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.VisualTree; using Moq; @@ -33,7 +33,6 @@ namespace Avalonia.Visuals.UnitTests.Rendering renderRoot.Verify(v => v.Invalidate(new Rect(10, 10, 100, 100))); } - [Fact] public void AddDirty_With_RenderTransform_Call_RenderRoot_Invalidate() { @@ -56,6 +55,51 @@ namespace Avalonia.Visuals.UnitTests.Rendering renderRoot.Verify(v => v.Invalidate(new Rect(50, 50, 200, 200))); } + [Fact] + public void AddDirty_For_Child_Moved_Should_Invalidate_Previous_Bounds() + { + var visual = new Mock(); + var child = new Mock(); + var renderRoot = visual.As(); + var renderTarget = visual.As(); + + renderRoot.Setup(r => r.CreateRenderTarget()).Returns(renderTarget.Object); + renderTarget.Setup(r => r.CreateDrawingContext(It.IsAny())).Returns(Mock.Of()); + + visual.As().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); + visual.As().Setup(v => v.VisualChildren).Returns(new AvaloniaList() { child.As().Object }); + + Rect childBounds = new Rect(0, 0, 100, 100); + child.As().Setup(v => v.Bounds).Returns(() => childBounds); + child.As().Setup(v => v.VisualParent).Returns(visual.Object); + child.As().Setup(v => v.TransformToVisual(It.IsAny())).CallBase(); + child.As().Setup(v => v.VisualChildren).Returns(new AvaloniaList()); + + var invalidationCalls = new List(); + + renderRoot.Setup(v => v.Invalidate(It.IsAny())).Callback(v => invalidationCalls.Add(v)); + + var target = new ImmediateRenderer(visual.Object); + + target.AddDirty(child.Object); + + Assert.Equal(new Rect(0, 0, 100, 100), invalidationCalls[0]); + + target.Paint(new Rect(0, 0, 100, 100)); + + //move child 100 pixels bottom/right + childBounds = new Rect(100, 100, 100, 100); + + //renderer should invalidate old child bounds with new one + //as on old area there can be artifacts + target.AddDirty(child.Object); + + //invalidate first old position + Assert.Equal(new Rect(0, 0, 100, 100), invalidationCalls[1]); + + //then new position + Assert.Equal(new Rect(100, 100, 100, 100), invalidationCalls[2]); + } public class TestVisual : Visual { From 03384d3b5efea383f435e276efea055d83627680 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 23 Oct 2018 14:05:53 +0300 Subject: [PATCH 04/30] fix ImmediateRenderer invalidation for controls moved with RenderTransform issue #1998 --- src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 96512b41a1..e5e3533bf6 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -23,6 +23,7 @@ namespace Avalonia.Rendering private readonly IVisual _root; private readonly IRenderRoot _renderRoot; private IRenderTarget _renderTarget; + private Rect _lastPaintBounds; /// /// Initializes a new instance of the class. @@ -45,6 +46,8 @@ namespace Avalonia.Rendering /// public void Paint(Rect rect) { + _lastPaintBounds = rect; + if (_renderTarget == null) { _renderTarget = ((IRenderRoot)_root).CreateRenderTarget(); @@ -158,6 +161,13 @@ namespace Avalonia.Rendering if (m.HasValue) { var bounds = new Rect(visual.Bounds.Size).TransformToAABB(m.Value); + + if (_lastPaintBounds != default) + { + _renderRoot?.Invalidate(_lastPaintBounds); + _lastPaintBounds = default; + } + _renderRoot?.Invalidate(bounds); } } From 8461bfc6887cbfba8e13064d2f530b7d796b100b Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 29 Oct 2018 17:21:16 +0200 Subject: [PATCH 05/30] add tests for transform to visual --- .../Avalonia.Visuals.UnitTests/VisualTests.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs index b62bf5858d..0414ac4c74 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using Avalonia.Controls; +using Avalonia.Media; using Avalonia.Rendering; using Avalonia.UnitTests; using Avalonia.VisualTree; @@ -192,5 +193,48 @@ namespace Avalonia.Visuals.UnitTests Assert.Throws(() => root2.Child = child); Assert.Empty(root2.GetVisualChildren()); } + + [Fact] + public void TransformToVisual_Should_Work() + { + var child = new Decorator { Width = 100, Height = 100 }; + var root = new TestRoot() { Child = child, Width = 400, Height = 400 }; + + root.Measure(Size.Infinity); + root.Arrange(new Rect(new Point(), root.DesiredSize)); + + var tr = child.TransformToVisual(root); + + Assert.NotNull(tr); + + var point = root.Bounds.TopLeft * tr; + + //child is centered (400 - 100)/2 + Assert.Equal(new Point(150, 150), point); + } + + [Fact] + public void TransformToVisual_With_RenderTransform_Should_Work() + { + var child = new Decorator + { + Width = 100, + Height = 100, + RenderTransform = new ScaleTransform() { ScaleX = 2, ScaleY = 2 } + }; + var root = new TestRoot() { Child = child, Width = 400, Height = 400 }; + + root.Measure(Size.Infinity); + root.Arrange(new Rect(new Point(), root.DesiredSize)); + + var tr = child.TransformToVisual(root); + + Assert.NotNull(tr); + + var point = root.Bounds.TopLeft * tr; + + //child is centered (400 - 100*2 scale)/2 + Assert.Equal(new Point(100, 100), point); + } } } From 85c786e4e993488e47e58a2f37feb2604cf80406 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 29 Oct 2018 17:23:08 +0200 Subject: [PATCH 06/30] Fir TransformToVisual and use it in ImmediateRenderer --- .../Rendering/ImmediateRenderer.cs | 35 +------------------ src/Avalonia.Visuals/Visual.cs | 23 +++++++++--- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index e5e3533bf6..967dd24acf 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -118,45 +118,12 @@ namespace Avalonia.Rendering } } - private static Matrix? TransformToVisual(IVisual visual, IVisual root) - { - var result = Matrix.Identity; - - while (visual != root) - { - if (visual.RenderTransform?.Value != null) - { - var origin = visual.RenderTransformOrigin.ToPixels(visual.Bounds.Size); - var offset = Matrix.CreateTranslation(origin); - var renderTransform = (-offset) * visual.RenderTransform.Value * (offset); - - result *= renderTransform; - } - - var topLeft = visual.Bounds.TopLeft; - - if (topLeft != default) - { - result *= Matrix.CreateTranslation(topLeft); - } - - visual = visual.VisualParent; - - if (visual == null) - { - return null; - } - } - - return result; - } - /// public void AddDirty(IVisual visual) { if (visual.Bounds != Rect.Empty) { - var m = TransformToVisual(visual, _root); + var m = visual.TransformToVisual(_root); if (m.HasValue) { diff --git a/src/Avalonia.Visuals/Visual.cs b/src/Avalonia.Visuals/Visual.cs index e5fcf1ba1d..f26c21d1b6 100644 --- a/src/Avalonia.Visuals/Visual.cs +++ b/src/Avalonia.Visuals/Visual.cs @@ -304,7 +304,7 @@ namespace Avalonia { var thisOffset = GetOffsetFrom(common, this); var thatOffset = GetOffsetFrom(common, visual); - return Matrix.CreateTranslation(-thatOffset) * Matrix.CreateTranslation(thisOffset); + return -thatOffset * thisOffset; } return null; @@ -454,13 +454,28 @@ namespace Avalonia /// The ancestor visual. /// The visual. /// The visual offset. - private static Vector GetOffsetFrom(IVisual ancestor, IVisual visual) + private static Matrix GetOffsetFrom(IVisual ancestor, IVisual visual) { - var result = new Vector(); + var result = Matrix.Identity; while (visual != ancestor) { - result = new Vector(result.X + visual.Bounds.X, result.Y + visual.Bounds.Y); + if (visual.RenderTransform?.Value != null) + { + var origin = visual.RenderTransformOrigin.ToPixels(visual.Bounds.Size); + var offset = Matrix.CreateTranslation(origin); + var renderTransform = (-offset) * visual.RenderTransform.Value * (offset); + + result *= renderTransform; + } + + var topLeft = visual.Bounds.TopLeft; + + if (topLeft != default) + { + result *= Matrix.CreateTranslation(topLeft); + } + visual = visual.VisualParent; if (visual == null) From 03dad31caefaee2b38d62562c5d3ac25807c1ff1 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 29 Oct 2018 15:29:02 +0000 Subject: [PATCH 07/30] default border thickness = 1. --- src/Avalonia.Themes.Default/Accents/BaseLight.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Themes.Default/Accents/BaseLight.xaml b/src/Avalonia.Themes.Default/Accents/BaseLight.xaml index bf778fcc93..4d1c4b1ab0 100644 --- a/src/Avalonia.Themes.Default/Accents/BaseLight.xaml +++ b/src/Avalonia.Themes.Default/Accents/BaseLight.xaml @@ -46,7 +46,7 @@ - 2 + 1 0.5 10 From 4ee07b73554d0aec44f789e924e2ebabc920a88a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 29 Oct 2018 15:35:33 +0000 Subject: [PATCH 08/30] fixes/2042-opengl-using-pixelsize-struct --- src/Avalonia.OpenGL/EglGlPlatformSurface.cs | 5 ++--- src/Avalonia.OpenGL/IGlPlatformSurfaceRenderingSession.cs | 5 ++--- src/Skia/Avalonia.Skia/GlRenderTarget.cs | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.OpenGL/EglGlPlatformSurface.cs b/src/Avalonia.OpenGL/EglGlPlatformSurface.cs index 19894e4ec5..c99c869c4f 100644 --- a/src/Avalonia.OpenGL/EglGlPlatformSurface.cs +++ b/src/Avalonia.OpenGL/EglGlPlatformSurface.cs @@ -7,8 +7,7 @@ namespace Avalonia.OpenGL public interface IEglWindowGlPlatformSurfaceInfo { IntPtr Handle { get; } - // TODO: Change to PixelSize struct once https://github.com/AvaloniaUI/Avalonia/pull/1889 is merged - System.Drawing.Size PixelSize { get; } + PixelSize Size { get; } double Scaling { get; } } @@ -71,7 +70,7 @@ namespace Avalonia.OpenGL } public IGlDisplay Display => _context.Display; - public System.Drawing.Size PixelSize => _info.PixelSize; + public PixelSize Size => _info.Size; public double Scaling => _info.Scaling; } } diff --git a/src/Avalonia.OpenGL/IGlPlatformSurfaceRenderingSession.cs b/src/Avalonia.OpenGL/IGlPlatformSurfaceRenderingSession.cs index 22641d7b53..4b0de05b77 100644 --- a/src/Avalonia.OpenGL/IGlPlatformSurfaceRenderingSession.cs +++ b/src/Avalonia.OpenGL/IGlPlatformSurfaceRenderingSession.cs @@ -5,8 +5,7 @@ namespace Avalonia.OpenGL public interface IGlPlatformSurfaceRenderingSession : IDisposable { IGlDisplay Display { get; } - // TODO: Change to PixelSize struct once https://github.com/AvaloniaUI/Avalonia/pull/1889 is merged - System.Drawing.Size PixelSize { get; } + PixelSize Size { get; } double Scaling { get; } } -} \ No newline at end of file +} diff --git a/src/Skia/Avalonia.Skia/GlRenderTarget.cs b/src/Skia/Avalonia.Skia/GlRenderTarget.cs index 0435e1060a..a6269473a6 100644 --- a/src/Skia/Avalonia.Skia/GlRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/GlRenderTarget.cs @@ -28,7 +28,7 @@ namespace Avalonia.Skia var gl = disp.GlInterface; gl.GetIntegerv(GL_FRAMEBUFFER_BINDING, out var fb); - var size = session.PixelSize; + var size = session.Size; var scaling = session.Scaling; GRBackendRenderTargetDesc desc = new GRBackendRenderTargetDesc From 43f6eb52ea9eda7332e1f097b3cd1cdfb5bd3330 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 29 Oct 2018 15:44:07 +0000 Subject: [PATCH 09/30] pixel size api impl updated. --- src/Avalonia.Native/GlPlatformFeature.cs | 4 ++-- src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 4 ++-- src/Windows/Avalonia.Win32/WindowImpl.cs | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Native/GlPlatformFeature.cs b/src/Avalonia.Native/GlPlatformFeature.cs index dbcdd244cd..97785e4a81 100644 --- a/src/Avalonia.Native/GlPlatformFeature.cs +++ b/src/Avalonia.Native/GlPlatformFeature.cs @@ -100,12 +100,12 @@ namespace Avalonia.Native public IGlDisplay Display { get; } - public System.Drawing.Size PixelSize + public PixelSize Size { get { var s = _session.GetPixelSize(); - return new System.Drawing.Size(s.Width, s.Height); + return new PixelSize(s.Width, s.Height); } } diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 6e8cf5cb18..0273f6a7d8 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -510,12 +510,12 @@ namespace Avalonia.Gtk3 : new ImmediateRenderer(root); } - System.Drawing.Size EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.PixelSize + PixelSize EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Size { get { var cs = ClientSize; - return new System.Drawing.Size((int)Math.Max(1, LastKnownScaleFactor * cs.Width), + return new PixelSize((int)Math.Max(1, LastKnownScaleFactor * cs.Width), (int)Math.Max(1, LastKnownScaleFactor * ClientSize.Height)); } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index d78c213299..21986bd2ba 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -933,14 +933,14 @@ namespace Avalonia.Win32 _topmost = value; } - - System.Drawing.Size EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.PixelSize + + PixelSize EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo.Size { get { RECT rect; GetClientRect(_hwnd, out rect); - return new System.Drawing.Size( + return new PixelSize( Math.Max(1, rect.right - rect.left), Math.Max(1, rect.bottom - rect.top)); } From 451dd5c8f0f28dfec98c01ed3284b422535abbda Mon Sep 17 00:00:00 2001 From: Henrich Date: Mon, 29 Oct 2018 16:59:26 +0100 Subject: [PATCH 10/30] fix LockedFramebuffer.Size assigment from constructor --- src/Avalonia.Visuals/Platform/LockedFramebuffer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs b/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs index c5b3c048b1..9ebfe290e1 100644 --- a/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs +++ b/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs @@ -11,7 +11,7 @@ namespace Avalonia.Platform { _onDispose = onDispose; Address = address; - Size = Size; + Size = size; RowBytes = rowBytes; Dpi = dpi; Format = format; From 7f95a3be88926b3f274c64db93cf654b6866571a Mon Sep 17 00:00:00 2001 From: Henrich Date: Mon, 29 Oct 2018 17:11:27 +0100 Subject: [PATCH 11/30] fix AccessViolationException during creating Exception --- src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs index b2c936d6ad..5efbc0861e 100644 --- a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs +++ b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs @@ -143,23 +143,26 @@ namespace Avalonia.Skia // Create bitmap using default platform settings _bitmap = new SKBitmap(destinationInfo.Width, destinationInfo.Height); + SKColorType bitmapColorType; if (!_bitmap.CanCopyTo(destinationInfo.ColorType)) { + bitmapColorType = _bitmap.ColorType; _bitmap.Dispose(); throw new Exception( - $"Unable to create pixel format shim for conversion from {_bitmap.ColorType} to {destinationInfo.ColorType}"); + $"Unable to create pixel format shim for conversion from {bitmapColorType} to {destinationInfo.ColorType}"); } Surface = SKSurface.Create(_bitmap.Info, _bitmap.GetPixels(), _bitmap.RowBytes); if (Surface == null) { + bitmapColorType = _bitmap.ColorType; _bitmap.Dispose(); throw new Exception( - $"Unable to create pixel format shim surface for conversion from {_bitmap.ColorType} to {destinationInfo.ColorType}"); + $"Unable to create pixel format shim surface for conversion from {bitmapColorType} to {destinationInfo.ColorType}"); } SurfaceCopyHandler = Disposable.Create(CopySurface); From 67c2ff25dee0e5cfff7c322cb15aef40414922ef Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 29 Oct 2018 20:23:19 +0000 Subject: [PATCH 12/30] fix win32 skia backend renderer failing. --- src/Windows/Avalonia.Win32/WindowFramebuffer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowFramebuffer.cs b/src/Windows/Avalonia.Win32/WindowFramebuffer.cs index 9c331f662d..19b90685bf 100644 --- a/src/Windows/Avalonia.Win32/WindowFramebuffer.cs +++ b/src/Windows/Avalonia.Win32/WindowFramebuffer.cs @@ -61,7 +61,7 @@ namespace Avalonia.Win32 } } - public PixelSize Size => new PixelSize(_bmpInfo.biWidth, _bmpInfo.biHeight); + public PixelSize Size => new PixelSize(_bmpInfo.biWidth, -_bmpInfo.biHeight); public void DrawToDevice(IntPtr hDC, int destX = 0, int destY = 0, int srcX = 0, int srcY = 0, int width = -1, int height = -1) From 6a537bea115d24b3e618379c7461ae52b5f92167 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 29 Oct 2018 21:47:38 +0000 Subject: [PATCH 13/30] fix keyboard input on osx. --- .../xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme | 4 ++-- src/Avalonia.Native/AvaloniaNativePlatform.cs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme b/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme index c1cc9b4887..1a665d3ea5 100644 --- a/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme +++ b/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/xcshareddata/xcschemes/Avalonia.Native.OSX.xcscheme @@ -38,7 +38,7 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "YES" - customWorkingDirectory = "$PROJECT_DIR/../../../../samples/ControlCatalog" + customWorkingDirectory = "$PROJECT_DIR/../../../../samples/ControlCatalog.NetCore" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" @@ -58,7 +58,7 @@ diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index 091a4ad285..ff410ddbe3 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -76,6 +76,7 @@ namespace Avalonia.Native .Bind().ToConstant(new DefaultRenderTimer(60)) .Bind().ToConstant(new SystemDialogs(_factory.CreateSystemDialogs())) .Bind().ToConstant(new GlPlatformFeature(_factory.ObtainGlFeature())) + .Bind().ToConstant(new PlatformHotkeyConfiguration(InputModifiers.Windows)) .Bind().ToConstant(opts); } From 80a95c5baee9bcf06e28617b0455d23f58a35994 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 09:41:17 +0000 Subject: [PATCH 14/30] fix call from invalid thread in previewer. --- .../Remote/Server/RemoteServerTopLevelImpl.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index 17cdbf834c..e1767fca36 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -211,10 +211,10 @@ namespace Avalonia.Controls.Remote.Server } if(obj is KeyEventMessage key) { - Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); - Dispatcher.UIThread.Post(() => { + Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); + Input?.Invoke(new RawKeyEventArgs( KeyboardDevice, 0, @@ -225,10 +225,10 @@ namespace Avalonia.Controls.Remote.Server } if(obj is TextInputEventMessage text) { - Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); - Dispatcher.UIThread.Post(() => { + Dispatcher.UIThread.RunJobs(DispatcherPriority.Input + 1); + Input?.Invoke(new RawTextInputEventArgs( KeyboardDevice, 0, From 7b4b2a0a4389c70c8576c90ccc8d5d39a3550eeb Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 10:29:33 +0000 Subject: [PATCH 15/30] add previewer location as an msbuild property. --- Avalonia.sln | 1 + build/Avalonia.Designer.HostApp.props | 8 ++++++++ packages/Avalonia/Avalonia.csproj | 7 ++++++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 build/Avalonia.Designer.HostApp.props diff --git a/Avalonia.sln b/Avalonia.sln index 7fa5f7736a..bf75c35d10 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -128,6 +128,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalog.NetCore", "s EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{F3AC8BC1-27F5-4255-9AFC-04ABFD11683A}" ProjectSection(SolutionItems) = preProject + build\Avalonia.Designer.HostApp.props = build\Avalonia.Designer.HostApp.props build\Base.props = build\Base.props build\Binding.props = build\Binding.props build\JetBrains.Annotations.props = build\JetBrains.Annotations.props diff --git a/build/Avalonia.Designer.HostApp.props b/build/Avalonia.Designer.HostApp.props new file mode 100644 index 0000000000..c3a9ce20a7 --- /dev/null +++ b/build/Avalonia.Designer.HostApp.props @@ -0,0 +1,8 @@ + + + $(MSBuildThisFileDirectory)\..\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll + + + $(MSBuildThisFileDirectory)\..\..\tools\net461\designer\Avalonia.Designer.HostApp.exe + + diff --git a/packages/Avalonia/Avalonia.csproj b/packages/Avalonia/Avalonia.csproj index ae209f085e..32a953ea9e 100644 --- a/packages/Avalonia/Avalonia.csproj +++ b/packages/Avalonia/Avalonia.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net461;netcoreapp2.0 @@ -27,6 +27,11 @@ false None + <_PackageFiles Include="../../build/Avalonia.Designer.HostApp.props"> + build/Avalonia.props + false + None + From 52e5f6fd23d738fb4481647965a5b14b8b8f1eac Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 12:08:55 +0000 Subject: [PATCH 16/30] suggested changes --- Avalonia.sln | 1 - {build => packages/Avalonia}/Avalonia.Designer.HostApp.props | 2 ++ packages/Avalonia/Avalonia.csproj | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) rename {build => packages/Avalonia}/Avalonia.Designer.HostApp.props (81%) diff --git a/Avalonia.sln b/Avalonia.sln index bf75c35d10..7fa5f7736a 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -128,7 +128,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlCatalog.NetCore", "s EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{F3AC8BC1-27F5-4255-9AFC-04ABFD11683A}" ProjectSection(SolutionItems) = preProject - build\Avalonia.Designer.HostApp.props = build\Avalonia.Designer.HostApp.props build\Base.props = build\Base.props build\Binding.props = build\Binding.props build\JetBrains.Annotations.props = build\JetBrains.Annotations.props diff --git a/build/Avalonia.Designer.HostApp.props b/packages/Avalonia/Avalonia.Designer.HostApp.props similarity index 81% rename from build/Avalonia.Designer.HostApp.props rename to packages/Avalonia/Avalonia.Designer.HostApp.props index c3a9ce20a7..fd7ecc9d12 100644 --- a/build/Avalonia.Designer.HostApp.props +++ b/packages/Avalonia/Avalonia.Designer.HostApp.props @@ -1,8 +1,10 @@  $(MSBuildThisFileDirectory)\..\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll + dotnet exec $(MSBuildThisFileDirectory)\..\..\tools\net461\designer\Avalonia.Designer.HostApp.exe + exe diff --git a/packages/Avalonia/Avalonia.csproj b/packages/Avalonia/Avalonia.csproj index 32a953ea9e..61e29b8016 100644 --- a/packages/Avalonia/Avalonia.csproj +++ b/packages/Avalonia/Avalonia.csproj @@ -27,7 +27,7 @@ false None - <_PackageFiles Include="../../build/Avalonia.Designer.HostApp.props"> + <_PackageFiles Include="build/Avalonia.Designer.HostApp.props"> build/Avalonia.props false None From 93b507fc116a8a63bfb0a5d35075a1d0c20ffc85 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 12:25:49 +0000 Subject: [PATCH 17/30] rename props file. --- packages/Avalonia/Avalonia.csproj | 2 +- .../{Avalonia.Designer.HostApp.props => Avalonia.props} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/Avalonia/{Avalonia.Designer.HostApp.props => Avalonia.props} (100%) diff --git a/packages/Avalonia/Avalonia.csproj b/packages/Avalonia/Avalonia.csproj index 61e29b8016..4cb2877b2f 100644 --- a/packages/Avalonia/Avalonia.csproj +++ b/packages/Avalonia/Avalonia.csproj @@ -27,7 +27,7 @@ false None - <_PackageFiles Include="build/Avalonia.Designer.HostApp.props"> + <_PackageFiles Include="build/Avalonia.props"> build/Avalonia.props false None diff --git a/packages/Avalonia/Avalonia.Designer.HostApp.props b/packages/Avalonia/Avalonia.props similarity index 100% rename from packages/Avalonia/Avalonia.Designer.HostApp.props rename to packages/Avalonia/Avalonia.props From 2eceba9e741bcea404f3633488dd7c436f4b962e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 13:34:32 +0000 Subject: [PATCH 18/30] fix location of avalonia.props. --- packages/Avalonia/Avalonia.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Avalonia/Avalonia.csproj b/packages/Avalonia/Avalonia.csproj index 4cb2877b2f..dee42fb795 100644 --- a/packages/Avalonia/Avalonia.csproj +++ b/packages/Avalonia/Avalonia.csproj @@ -27,7 +27,7 @@ false None - <_PackageFiles Include="build/Avalonia.props"> + <_PackageFiles Include="Avalonia.props"> build/Avalonia.props false None From 2daa13a11d8dcee48fce7c4de062e1985af33571 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 13:54:47 +0000 Subject: [PATCH 19/30] update build script to package releasable packages on release branches. --- parameters.cake | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/parameters.cake b/parameters.cake index 8d813accbb..8bf6ed8173 100644 --- a/parameters.cake +++ b/parameters.cake @@ -18,6 +18,7 @@ public class Parameters public bool IsPullRequest { get; private set; } public bool IsMainRepo { get; private set; } public bool IsMasterBranch { get; private set; } + public bool IsReleaseBranch { get; private set; } public bool IsTagged { get; private set; } public bool IsReleasable { get; private set; } public bool IsMyGetRelease { get; private set; } @@ -46,8 +47,9 @@ public class Parameters SkipTests = context.HasArgument("skip-tests"); // CONFIGURATION - MainRepo = "AvaloniaUI/Avalonia"; + MainRepo = "https://github.com/AvaloniaUI/Avalonia"; MasterBranch = "master"; + ReleaseBranchPrefix = "release/"; ReleaseConfiguration = "Release"; MSBuildSolution = "./dirs.proj"; @@ -59,12 +61,14 @@ public class Parameters IsRunningOnAzure = buildSystem.IsRunningOnVSTS || buildSystem.IsRunningOnTFS || context.EnvironmentVariable("LOGNAME") == "vsts"; IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest; - IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, buildSystem.AppVeyor.Environment.Repository.Name); - IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, buildSystem.AppVeyor.Environment.Repository.Branch); + IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, context.EnvironmentVariable("BUILD_REPOSITORY_URI")); + IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME")); + IsReleaseBranch = StringComparer.OrdinalIgnoreCase.StartsWith(ReleaseBranchPrefix, context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME")); IsTagged = buildSystem.AppVeyor.Environment.Repository.Tag.IsTag && !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name); IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration); IsMyGetRelease = !IsTagged && IsReleasable; + IsNuGetRelease = IsMainRepo && IsReleasable && IsReleaseBranch; // VERSION Version = context.Argument("force-nuget-version", GetVersion()); @@ -92,9 +96,13 @@ public class Parameters } else if (IsRunningOnAzure) { + if(!IsNuGetRelease) + { // Use AssemblyVersion with Build as version Version += "-build" + context.EnvironmentVariable("BUILD_BUILDID") + "-beta"; - PublishTestResults = true; + } + + PublishTestResults = true; } // DIRECTORIES From 288c56cd3e3a8a2ba79760e5f3a250ccc8f049d9 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 14:05:46 +0000 Subject: [PATCH 20/30] fix build script. --- parameters.cake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parameters.cake b/parameters.cake index 8bf6ed8173..acaab8f6b7 100644 --- a/parameters.cake +++ b/parameters.cake @@ -9,6 +9,7 @@ public class Parameters public string MasterBranch { get; private set; } public string ReleasePlatform { get; private set; } public string ReleaseConfiguration { get; private set; } + public string ReleaseBranchPrefix { get; private set; } public string MSBuildSolution { get; private set; } public bool IsLocalBuild { get; private set; } public bool IsRunningOnUnix { get; private set; } @@ -63,7 +64,7 @@ public class Parameters IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest; IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, context.EnvironmentVariable("BUILD_REPOSITORY_URI")); IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME")); - IsReleaseBranch = StringComparer.OrdinalIgnoreCase.StartsWith(ReleaseBranchPrefix, context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME")); + IsReleaseBranch = context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME").ToLower().StartsWith(ReleaseBranchPrefix.ToLower()); IsTagged = buildSystem.AppVeyor.Environment.Repository.Tag.IsTag && !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name); IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration); From a1a6c46963dbbdf6ebff54d9bd71477fc4c90f0b Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 14:09:44 +0000 Subject: [PATCH 21/30] print isrelease branch. --- build.cake | 1 + 1 file changed, 1 insertion(+) diff --git a/build.cake b/build.cake index c781c0f2e5..f10a12c4e6 100644 --- a/build.cake +++ b/build.cake @@ -50,6 +50,7 @@ Setup(context => Information("IsPullRequest: " + parameters.IsPullRequest); Information("IsMainRepo: " + parameters.IsMainRepo); Information("IsMasterBranch: " + parameters.IsMasterBranch); + Information("IsReleaseBranch: " + parameters.IsReleaseBranch); Information("IsTagged: " + parameters.IsTagged); Information("IsReleasable: " + parameters.IsReleasable); Information("IsMyGetRelease: " + parameters.IsMyGetRelease); From 1db82552a2977f4e246b6ef20c549abc823ef80c Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 30 Oct 2018 17:14:15 +0300 Subject: [PATCH 22/30] Separate previewer properties --- packages/Avalonia/Avalonia.props | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/Avalonia/Avalonia.props b/packages/Avalonia/Avalonia.props index fd7ecc9d12..8234dc4fde 100644 --- a/packages/Avalonia/Avalonia.props +++ b/packages/Avalonia/Avalonia.props @@ -1,10 +1,6 @@ - - - $(MSBuildThisFileDirectory)\..\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll - dotnet exec - - - $(MSBuildThisFileDirectory)\..\..\tools\net461\designer\Avalonia.Designer.HostApp.exe - exe + + + $(MSBuildThisFileDirectory)\..\tools\netcoreapp2.0\designer\Avalonia.Designer.HostApp.dll + $(MSBuildThisFileDirectory)\..\tools\net461\designer\Avalonia.Designer.HostApp.exe From 3979eb99630a3ca6defdb09bede751871af33ea3 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 14:36:58 +0000 Subject: [PATCH 23/30] fix release branch detection. --- parameters.cake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parameters.cake b/parameters.cake index acaab8f6b7..d13e503bd0 100644 --- a/parameters.cake +++ b/parameters.cake @@ -50,7 +50,7 @@ public class Parameters // CONFIGURATION MainRepo = "https://github.com/AvaloniaUI/Avalonia"; MasterBranch = "master"; - ReleaseBranchPrefix = "release/"; + ReleaseBranchPrefix = "refs/heads/release/"; ReleaseConfiguration = "Release"; MSBuildSolution = "./dirs.proj"; @@ -64,7 +64,7 @@ public class Parameters IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest; IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, context.EnvironmentVariable("BUILD_REPOSITORY_URI")); IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME")); - IsReleaseBranch = context.EnvironmentVariable("BUILD_SOURCEBRANCHNAME").ToLower().StartsWith(ReleaseBranchPrefix.ToLower()); + IsReleaseBranch = context.EnvironmentVariable("BUILD_SOURCEBRANCH").ToLower().StartsWith(ReleaseBranchPrefix.ToLower()); IsTagged = buildSystem.AppVeyor.Environment.Repository.Tag.IsTag && !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name); IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration); From 5dac868cf0807d825eb76bdbaae35470087e93e4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 30 Oct 2018 15:13:36 +0000 Subject: [PATCH 24/30] bump version number. --- build/SharedVersion.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/SharedVersion.props b/build/SharedVersion.props index 6ca65014b1..b46ac16a79 100644 --- a/build/SharedVersion.props +++ b/build/SharedVersion.props @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> Avalonia - 0.7.0 + 0.7.1 Copyright 2018 © The AvaloniaUI Project https://github.com/AvaloniaUI/Avalonia/blob/master/licence.md https://github.com/AvaloniaUI/Avalonia/ From bbf570198a2d261ac884942a81e00dfa18495b03 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Tue, 30 Oct 2018 08:15:43 -0700 Subject: [PATCH 25/30] Always run PublishTestArtifacts unless the build was canceled. --- azure-pipelines.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 5156bac3b5..f6929f8dee 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -29,6 +29,7 @@ jobs: inputs: testResultsFormat: 'VSTest' testResultsFiles: '$(Build.SourcesDirectory)/artifacts/test-results/*.trx' + condition: not(canceled()) - job: macOS pool: @@ -77,6 +78,7 @@ jobs: inputs: testResultsFormat: 'VSTest' testResultsFiles: '$(Build.SourcesDirectory)/artifacts/test-results/*.trx' + condition: not(canceled()) - task: PublishBuildArtifacts@1 inputs: @@ -111,6 +113,7 @@ jobs: inputs: testResultsFormat: 'VSTest' testResultsFiles: '$(Build.SourcesDirectory)/artifacts/test-results/*.trx' + condition: not(canceled()) - task: PublishBuildArtifacts@1 inputs: From 4455e698d757028cc579b2bb905e24fa9e01cf14 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 30 Oct 2018 23:54:09 +0200 Subject: [PATCH 26/30] add easy way to test rendertransform in control catalog --- samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml b/samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml index b428cd1b9f..f7e1c08cac 100644 --- a/samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml +++ b/samples/ControlCatalog/Pages/LayoutTransformControlPage.xaml @@ -19,7 +19,7 @@ - Layout Transform + From 2e430260335f54b9e68646a9c023ec10483950f2 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Wed, 31 Oct 2018 00:36:41 +0200 Subject: [PATCH 27/30] cleanup ImmediateRenderer tests --- .../Rendering/ImmediateRendererTests.cs | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs index 41e1691f28..82294246b1 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs @@ -15,16 +15,13 @@ namespace Avalonia.Visuals.UnitTests.Rendering public void AddDirty_Call_RenderRoot_Invalidate() { var visual = new Mock(); - var child = new Mock(); + var child = new Mock() { CallBase = true }; var renderRoot = visual.As(); visual.As().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); child.As().Setup(v => v.Bounds).Returns(new Rect(10, 10, 100, 100)); child.As().Setup(v => v.VisualParent).Returns(visual.Object); - child.As().Setup(v => v.RenderTransform).Returns(default(Transform)); - child.As().Setup(v => v.RenderTransformOrigin).Returns(new RelativePoint(0.5, 0.5, RelativeUnit.Relative)); - child.As().Setup(v => v.TransformToVisual(It.IsAny())).CallBase(); var target = new ImmediateRenderer(visual.Object); @@ -37,16 +34,14 @@ namespace Avalonia.Visuals.UnitTests.Rendering public void AddDirty_With_RenderTransform_Call_RenderRoot_Invalidate() { var visual = new Mock(); - var child = new Mock(); + var child = new Mock() { CallBase = true }; var renderRoot = visual.As(); visual.As().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400)); child.As().Setup(v => v.Bounds).Returns(new Rect(100, 100, 100, 100)); child.As().Setup(v => v.VisualParent).Returns(visual.Object); - child.As().Setup(v => v.RenderTransform).Returns(new ScaleTransform() { ScaleX = 2, ScaleY = 2 }); - child.As().Setup(v => v.RenderTransformOrigin).Returns(new RelativePoint(0.5, 0.5, RelativeUnit.Relative)); - child.As().Setup(v => v.TransformToVisual(It.IsAny())).CallBase(); + child.Object.RenderTransform = new ScaleTransform() { ScaleX = 2, ScaleY = 2 }; var target = new ImmediateRenderer(visual.Object); @@ -58,8 +53,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering [Fact] public void AddDirty_For_Child_Moved_Should_Invalidate_Previous_Bounds() { - var visual = new Mock(); - var child = new Mock(); + var visual = new Mock() { CallBase = true }; + var child = new Mock() { CallBase = true }; var renderRoot = visual.As(); var renderTarget = visual.As(); @@ -72,7 +67,6 @@ namespace Avalonia.Visuals.UnitTests.Rendering Rect childBounds = new Rect(0, 0, 100, 100); child.As().Setup(v => v.Bounds).Returns(() => childBounds); child.As().Setup(v => v.VisualParent).Returns(visual.Object); - child.As().Setup(v => v.TransformToVisual(It.IsAny())).CallBase(); child.As().Setup(v => v.VisualChildren).Returns(new AvaloniaList()); var invalidationCalls = new List(); @@ -100,14 +94,5 @@ namespace Avalonia.Visuals.UnitTests.Rendering //then new position Assert.Equal(new Rect(100, 100, 100, 100), invalidationCalls[2]); } - - public class TestVisual : Visual - { - public new Rect Bounds - { - get => base.Bounds; - set => base.Bounds = value; - } - } } } From b06a5a2991d66c6ff4c7d5c09ec0746d519ed248 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Wed, 31 Oct 2018 00:38:34 +0200 Subject: [PATCH 28/30] fix finally #1998 for immediaterenderer --- .../Rendering/ImmediateRenderer.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 967dd24acf..08f3803e9b 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -23,7 +23,6 @@ namespace Avalonia.Rendering private readonly IVisual _root; private readonly IRenderRoot _renderRoot; private IRenderTarget _renderTarget; - private Rect _lastPaintBounds; /// /// Initializes a new instance of the class. @@ -46,8 +45,6 @@ namespace Avalonia.Rendering /// public void Paint(Rect rect) { - _lastPaintBounds = rect; - if (_renderTarget == null) { _renderTarget = ((IRenderRoot)_root).CreateRenderTarget(); @@ -129,10 +126,17 @@ namespace Avalonia.Rendering { var bounds = new Rect(visual.Bounds.Size).TransformToAABB(m.Value); - if (_lastPaintBounds != default) + //use transformedbounds as previous render state of the visual bounds + //so we can invalidate old and new bounds of a control in case it moved/shrinked + if (visual.TransformedBounds.HasValue) { - _renderRoot?.Invalidate(_lastPaintBounds); - _lastPaintBounds = default; + var trb = visual.TransformedBounds.Value; + var trBounds = trb.Bounds.TransformToAABB(trb.Transform); + + if (trBounds != bounds) + { + _renderRoot?.Invalidate(trBounds); + } } _renderRoot?.Invalidate(bounds); From 7136750d6b12074ac89fd7ec892bec83d330dc7a Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Wed, 31 Oct 2018 19:27:13 +0200 Subject: [PATCH 29/30] add failing unittests for derivedlist --- .../Collections/AvaloniaListExtenionsTests.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListExtenionsTests.cs b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListExtenionsTests.cs index b996db8d48..7f118a2c1d 100644 --- a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListExtenionsTests.cs +++ b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListExtenionsTests.cs @@ -1,5 +1,4 @@ -using System; -using System.Linq; +using System.Linq; using Avalonia.Collections; using Xunit; @@ -82,13 +81,31 @@ namespace Avalonia.Base.UnitTests.Collections Assert.Equal(source, result); } - [Fact] - public void CreateDerivedList_Handles_MoveRange() + [Theory] + [InlineData(0, 2, 3)] + [InlineData(0, 2, 4)] + [InlineData(0, 2, 5)] + [InlineData(0, 4, 4)] + [InlineData(1, 2, 0)] + [InlineData(1, 2, 4)] + [InlineData(1, 2, 5)] + [InlineData(1, 4, 0)] + [InlineData(2, 2, 0)] + [InlineData(2, 2, 1)] + [InlineData(2, 2, 3)] + [InlineData(2, 2, 4)] + [InlineData(2, 2, 5)] + [InlineData(4, 2, 0)] + [InlineData(4, 2, 1)] + [InlineData(4, 2, 3)] + [InlineData(5, 1, 0)] + [InlineData(5, 1, 3)] + public void CreateDerivedList_Handles_MoveRange(int oldIndex, int count, int newIndex) { - var source = new AvaloniaList(new[] { 0, 1, 2, 3 }); + var source = new AvaloniaList(new[] { 0, 1, 2, 3, 4, 5 }); var target = source.CreateDerivedList(x => new Wrapper(x)); - source.MoveRange(1, 2, 0); + source.MoveRange(oldIndex, count, newIndex); var result = target.Select(x => x.Value).ToList(); From aa21fe9d17da5593ffbb81c3600a0dd8e36b1ca9 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Wed, 31 Oct 2018 19:57:31 +0200 Subject: [PATCH 30/30] fix derived list/extensions for moverange --- src/Avalonia.Base/Collections/AvaloniaListExtensions.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Collections/AvaloniaListExtensions.cs b/src/Avalonia.Base/Collections/AvaloniaListExtensions.cs index 1731950222..58f3413780 100644 --- a/src/Avalonia.Base/Collections/AvaloniaListExtensions.cs +++ b/src/Avalonia.Base/Collections/AvaloniaListExtensions.cs @@ -104,7 +104,12 @@ namespace Avalonia.Collections case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Replace: Remove(e.OldStartingIndex, e.OldItems); - Add(e.NewStartingIndex, e.NewItems); + int newIndex = e.NewStartingIndex; + if(newIndex > e.OldStartingIndex) + { + newIndex -= e.OldItems.Count; + } + Add(newIndex, e.NewItems); break; case NotifyCollectionChangedAction.Remove: