Browse Source

Merge branch 'master' into fixes/clipping-rendering-issues-osx

pull/6896/head
Dan Walmsley 4 years ago
committed by GitHub
parent
commit
02a343f12b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      azure-pipelines.yml
  2. 2
      build/MicroCom.targets
  3. 6
      global.json
  4. 25
      src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
  5. 2
      src/tools/MicroComGenerator/MicroComGenerator.csproj
  6. 18
      tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs
  7. 2
      tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs

17
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'

2
build/MicroCom.targets

@ -15,7 +15,7 @@
Inputs="@(AvnComIdl);$(MSBuildThisFileDirectory)../src/tools/MicroComGenerator/**/*.cs"
Outputs="%(AvnComIdl.OutputFile)">
<Message Importance="high" Text="Generating file %(AvnComIdl.OutputFile) from @(AvnComIdl)" />
<Exec Command="dotnet &quot;$(MSBuildThisFileDirectory)../src/tools/MicroComGenerator/bin/$(Configuration)/netcoreapp3.1/MicroComGenerator.dll&quot; -i @(AvnComIdl) --cs %(AvnComIdl.OutputFile)"
<Exec Command="dotnet &quot;$(MSBuildThisFileDirectory)../src/tools/MicroComGenerator/bin/$(Configuration)/net6.0/MicroComGenerator.dll&quot; -i @(AvnComIdl) --cs %(AvnComIdl.OutputFile)"
LogStandardErrorAsError="true" />
<ItemGroup>
<!-- Remove and re-add generated file, this is needed for the clean build -->

6
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",

25
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;
/// <summary>
@ -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;
}
/// <inheritdoc/>
public bool DrawFps { get; set; }
@ -98,7 +106,7 @@ namespace Avalonia.Rendering
/// <param name="target">The render target.</param>
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
/// <param name="context">The drawing context.</param>
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);
}

2
src/tools/MicroComGenerator/MicroComGenerator.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFrameworks>net6.0;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser" Version="2.8.0" />

18
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<IRenderTarget>(x =>
x.CreateDrawingContext(It.IsAny<IVisualBrushRenderer>()) == Mock.Of<IDrawingContextImpl>());
ImmediateRenderer.Render(target, renderTarget);
Assert.Equal(expected, target.TransformedBounds);
}
}
private class TestControl : Control
{
public bool Rendered { get; private set; }

2
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<TransformedBounds?>();

Loading…
Cancel
Save