|
|
|
@ -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()) |
|
|
|
@ -305,7 +319,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)) |
|
|
|
{ |
|
|
|
@ -318,7 +333,7 @@ namespace Avalonia.Rendering |
|
|
|
: clipRect; |
|
|
|
Render(context, child, childClipRect); |
|
|
|
} |
|
|
|
else |
|
|
|
else if (_updateTransformedBounds) |
|
|
|
{ |
|
|
|
ClearTransformedBounds(child); |
|
|
|
} |
|
|
|
@ -326,7 +341,7 @@ namespace Avalonia.Rendering |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!visual.IsVisible) |
|
|
|
if (!visual.IsVisible && _updateTransformedBounds) |
|
|
|
{ |
|
|
|
ClearTransformedBounds(visual); |
|
|
|
} |
|
|
|
|