Browse Source

Don't update transformed bounds from static render methods.

Fixes #6899
pull/6900/head
Steven Kirk 4 years ago
parent
commit
f54a75e636
  1. 25
      src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
  2. 2
      tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs

25
src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs

@ -20,6 +20,7 @@ namespace Avalonia.Rendering
{ {
private readonly IVisual _root; private readonly IVisual _root;
private readonly IRenderRoot _renderRoot; private readonly IRenderRoot _renderRoot;
private bool _updateTransformedBounds = true;
private IRenderTarget _renderTarget; private IRenderTarget _renderTarget;
/// <summary> /// <summary>
@ -34,6 +35,13 @@ namespace Avalonia.Rendering
_renderRoot = root as IRenderRoot; _renderRoot = root as IRenderRoot;
} }
private ImmediateRenderer(IVisual root, bool updateTransformedBounds)
{
_root = root ?? throw new ArgumentNullException(nameof(root));
_renderRoot = root as IRenderRoot;
_updateTransformedBounds = updateTransformedBounds;
}
/// <inheritdoc/> /// <inheritdoc/>
public bool DrawFps { get; set; } public bool DrawFps { get; set; }
@ -98,7 +106,7 @@ namespace Avalonia.Rendering
/// <param name="target">The render target.</param> /// <param name="target">The render target.</param>
public static void Render(IVisual visual, IRenderTarget 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))) using (var context = new DrawingContext(target.CreateDrawingContext(renderer)))
{ {
renderer.Render(context, visual, visual.Bounds); renderer.Render(context, visual, visual.Bounds);
@ -112,7 +120,7 @@ namespace Avalonia.Rendering
/// <param name="context">The drawing context.</param> /// <param name="context">The drawing context.</param>
public static void Render(IVisual visual, DrawingContext 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); renderer.Render(context, visual, visual.Bounds);
} }
@ -193,6 +201,12 @@ namespace Avalonia.Rendering
Render(new DrawingContext(context), visual, visual.Bounds); 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) private static void ClearTransformedBounds(IVisual visual)
{ {
foreach (var e in visual.GetSelfAndVisualDescendants()) foreach (var e in visual.GetSelfAndVisualDescendants())
@ -308,7 +322,8 @@ namespace Avalonia.Rendering
new TransformedBounds(bounds, new Rect(), context.CurrentContainerTransform); new TransformedBounds(bounds, new Rect(), context.CurrentContainerTransform);
#pragma warning restore 0618 #pragma warning restore 0618
visual.TransformedBounds = transformed; if (_updateTransformedBounds)
visual.TransformedBounds = transformed;
foreach (var child in visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance)) foreach (var child in visual.VisualChildren.OrderBy(x => x, ZIndexComparer.Instance))
{ {
@ -321,7 +336,7 @@ namespace Avalonia.Rendering
: clipRect; : clipRect;
Render(context, child, childClipRect); Render(context, child, childClipRect);
} }
else else if (_updateTransformedBounds)
{ {
ClearTransformedBounds(child); ClearTransformedBounds(child);
} }
@ -329,7 +344,7 @@ namespace Avalonia.Rendering
} }
} }
if (!visual.IsVisible) if (!visual.IsVisible && _updateTransformedBounds)
{ {
ClearTransformedBounds(visual); ClearTransformedBounds(visual);
} }

2
tests/Avalonia.Visuals.UnitTests/VisualTree/TransformedBoundsTests.cs

@ -40,7 +40,7 @@ namespace Avalonia.Visuals.UnitTests.VisualTree
tree.Measure(Size.Infinity); tree.Measure(Size.Infinity);
tree.Arrange(new Rect(0, 0, 100, 100)); tree.Arrange(new Rect(0, 0, 100, 100));
ImmediateRenderer.Render(tree, context); ImmediateRenderer.Render(tree, context, true);
var track = control.GetObservable(Visual.TransformedBoundsProperty); var track = control.GetObservable(Visual.TransformedBoundsProperty);
var results = new List<TransformedBounds?>(); var results = new List<TransformedBounds?>();

Loading…
Cancel
Save