diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bc8d065137..9fa79ec5ba 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,3 +1,6 @@ +variables: + MSBuildEnableWorkloadResolver: 'false' + jobs: - job: Linux pool: @@ -9,9 +12,9 @@ jobs: version: 3.1.414 - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 5.0.402' + displayName: 'Use .NET Core SDK 6.0.100' inputs: - version: 5.0.402 + version: 6.0.100 - task: CmdLine@2 displayName: 'Run Build' @@ -40,9 +43,9 @@ jobs: version: 3.1.414 - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 5.0.402' + displayName: 'Use .NET Core SDK 6.0.100' inputs: - version: 5.0.402 + version: 6.0.100 - task: CmdLine@2 displayName: 'Install Mono 5.18' @@ -56,7 +59,7 @@ jobs: inputs: script: | export PATH="`pwd`/sdk:$PATH" - cd src/tools/MicroComGenerator; dotnet run -i ../../Avalonia.Native/avn.idl --cpp ../../../native/Avalonia.Native/inc/avalonia-native.h + cd src/tools/MicroComGenerator; dotnet run -f net6.0 -i ../../Avalonia.Native/avn.idl --cpp ../../../native/Avalonia.Native/inc/avalonia-native.h - task: Xcode@5 inputs: @@ -110,9 +113,9 @@ jobs: version: 3.1.414 - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 5.0.402' + displayName: 'Use .NET Core SDK 6.0.100' inputs: - version: 5.0.402 + version: 6.0.100 - task: CmdLine@2 displayName: 'Install Nuke' diff --git a/build/MicroCom.targets b/build/MicroCom.targets index 49d2cdce72..1ed388f689 100644 --- a/build/MicroCom.targets +++ b/build/MicroCom.targets @@ -15,7 +15,7 @@ Inputs="@(AvnComIdl);$(MSBuildThisFileDirectory)../src/tools/MicroComGenerator/**/*.cs" Outputs="%(AvnComIdl.OutputFile)"> - diff --git a/global.json b/global.json index 9f83c1ea1e..e3e652761c 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,7 @@ { - "sdk": { - "version": "5.0.402" - }, + "sdk": { + "version": "6.0.100" + }, "msbuild-sdks": { "Microsoft.Build.Traversal": "1.0.43", "MSBuild.Sdk.Extras": "2.0.54", diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 52427c4ae6..88fbd290e6 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -20,6 +20,7 @@ namespace Avalonia.Rendering { private readonly IVisual _root; private readonly IRenderRoot _renderRoot; + private bool _updateTransformedBounds = true; private IRenderTarget _renderTarget; /// @@ -34,6 +35,13 @@ namespace Avalonia.Rendering _renderRoot = root as IRenderRoot; } + private ImmediateRenderer(IVisual root, bool updateTransformedBounds) + { + _root = root ?? throw new ArgumentNullException(nameof(root)); + _renderRoot = root as IRenderRoot; + _updateTransformedBounds = updateTransformedBounds; + } + /// public bool DrawFps { get; set; } @@ -98,7 +106,7 @@ namespace Avalonia.Rendering /// The render target. public static void Render(IVisual visual, IRenderTarget target) { - using (var renderer = new ImmediateRenderer(visual)) + using (var renderer = new ImmediateRenderer(visual, updateTransformedBounds: false)) using (var context = new DrawingContext(target.CreateDrawingContext(renderer))) { renderer.Render(context, visual, visual.Bounds); @@ -112,7 +120,7 @@ namespace Avalonia.Rendering /// The drawing context. public static void Render(IVisual visual, DrawingContext context) { - using (var renderer = new ImmediateRenderer(visual)) + using (var renderer = new ImmediateRenderer(visual, updateTransformedBounds: false)) { renderer.Render(context, visual, visual.Bounds); } @@ -193,6 +201,12 @@ namespace Avalonia.Rendering Render(new DrawingContext(context), visual, visual.Bounds); } + internal static void Render(IVisual visual, DrawingContext context, bool updateTransformedBounds) + { + using var renderer = new ImmediateRenderer(visual, updateTransformedBounds); + renderer.Render(context, visual, visual.Bounds); + } + private static void ClearTransformedBounds(IVisual visual) { foreach (var e in visual.GetSelfAndVisualDescendants()) @@ -308,7 +322,8 @@ namespace Avalonia.Rendering new TransformedBounds(bounds, new Rect(), context.CurrentContainerTransform); #pragma warning restore 0618 - visual.TransformedBounds = transformed; + if (_updateTransformedBounds) + visual.TransformedBounds = transformed; foreach (var child in visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance)) { @@ -321,7 +336,7 @@ namespace Avalonia.Rendering : clipRect; Render(context, child, childClipRect); } - else + else if (_updateTransformedBounds) { ClearTransformedBounds(child); } @@ -329,7 +344,7 @@ namespace Avalonia.Rendering } } - if (!visual.IsVisible) + if (!visual.IsVisible && _updateTransformedBounds) { ClearTransformedBounds(visual); } diff --git a/src/tools/MicroComGenerator/MicroComGenerator.csproj b/src/tools/MicroComGenerator/MicroComGenerator.csproj index 5ae431b4b9..eab14760a4 100644 --- a/src/tools/MicroComGenerator/MicroComGenerator.csproj +++ b/src/tools/MicroComGenerator/MicroComGenerator.csproj @@ -1,7 +1,7 @@ Exe - netcoreapp3.1 + net6.0;netcoreapp3.1 diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs index acee9a50f5..6859b2b139 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs @@ -291,6 +291,24 @@ namespace Avalonia.Visuals.UnitTests.Rendering } } + [Fact] + public void Static_Render_Method_Does_Not_Update_TransformedBounds() + { + using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) + { + var target = new Border(); + var expected = new TransformedBounds(new Rect(1, 2, 3, 4), new Rect(4, 5, 6, 7), Matrix.CreateRotation(0.8)); + + ((IVisual)target).TransformedBounds = expected; + + var renderTarget = Mock.Of(x => + x.CreateDrawingContext(It.IsAny()) == Mock.Of()); + ImmediateRenderer.Render(target, renderTarget); + + Assert.Equal(expected, target.TransformedBounds); + } + } + private class TestControl : Control { public bool Rendered { get; private set; } diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs b/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs index 8202735e5d..54d9ce40f0 100644 --- a/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs @@ -40,7 +40,7 @@ namespace Avalonia.Visuals.UnitTests.VisualTree tree.Measure(Size.Infinity); tree.Arrange(new Rect(0, 0, 100, 100)); - ImmediateRenderer.Render(tree, context); + ImmediateRenderer.Render(tree, context, true); var track = control.GetObservable(Visual.TransformedBoundsProperty); var results = new List();