|
|
@@ -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);
|
|
|
}
|