|
|
|
@ -246,22 +246,7 @@ namespace Avalonia.Rendering |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
IDrawingContextImpl GetContext() |
|
|
|
{ |
|
|
|
if (context != null) |
|
|
|
return context; |
|
|
|
if ((RenderTarget as IRenderTargetWithCorruptionInfo)?.IsCorrupted == true) |
|
|
|
{ |
|
|
|
RenderTarget.Dispose(); |
|
|
|
RenderTarget = null; |
|
|
|
} |
|
|
|
if (RenderTarget == null) |
|
|
|
RenderTarget = ((IRenderRoot)_root).CreateRenderTarget(); |
|
|
|
return context = RenderTarget.CreateDrawingContext(this); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var (scene, updated) = UpdateRenderLayersAndConsumeSceneIfNeeded(GetContext); |
|
|
|
var (scene, updated) = UpdateRenderLayersAndConsumeSceneIfNeeded(ref context); |
|
|
|
|
|
|
|
using (scene) |
|
|
|
{ |
|
|
|
@ -271,9 +256,9 @@ namespace Avalonia.Rendering |
|
|
|
if (DrawDirtyRects) |
|
|
|
_dirtyRectsDisplay.Tick(); |
|
|
|
if (overlay) |
|
|
|
RenderOverlay(scene.Item, GetContext()); |
|
|
|
RenderOverlay(scene.Item, ref context); |
|
|
|
if (updated || forceComposite || overlay) |
|
|
|
RenderComposite(scene.Item, GetContext()); |
|
|
|
RenderComposite(scene.Item, ref context); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -291,7 +276,7 @@ namespace Avalonia.Rendering |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private (IRef<Scene> scene, bool updated) UpdateRenderLayersAndConsumeSceneIfNeeded(Func<IDrawingContextImpl> contextFactory, |
|
|
|
private (IRef<Scene> scene, bool updated) UpdateRenderLayersAndConsumeSceneIfNeeded(ref IDrawingContextImpl context, |
|
|
|
bool recursiveCall = false) |
|
|
|
{ |
|
|
|
IRef<Scene> sceneRef; |
|
|
|
@ -304,7 +289,8 @@ namespace Avalonia.Rendering |
|
|
|
var scene = sceneRef.Item; |
|
|
|
if (scene.Generation != _lastSceneId) |
|
|
|
{ |
|
|
|
var context = contextFactory(); |
|
|
|
EnsureDrawingContext(ref context); |
|
|
|
|
|
|
|
Layers.Update(scene, context); |
|
|
|
|
|
|
|
RenderToLayers(scene); |
|
|
|
@ -325,7 +311,7 @@ namespace Avalonia.Rendering |
|
|
|
if (!recursiveCall && Dispatcher.UIThread.CheckAccess() && NeedsUpdate) |
|
|
|
{ |
|
|
|
UpdateScene(); |
|
|
|
var (rs, _) = UpdateRenderLayersAndConsumeSceneIfNeeded(contextFactory, true); |
|
|
|
var (rs, _) = UpdateRenderLayersAndConsumeSceneIfNeeded(ref context, true); |
|
|
|
return (rs, true); |
|
|
|
} |
|
|
|
|
|
|
|
@ -432,8 +418,10 @@ namespace Avalonia.Rendering |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private void RenderOverlay(Scene scene, IDrawingContextImpl parentContent) |
|
|
|
private void RenderOverlay(Scene scene, ref IDrawingContextImpl parentContent) |
|
|
|
{ |
|
|
|
EnsureDrawingContext(ref parentContent); |
|
|
|
|
|
|
|
if (DrawDirtyRects) |
|
|
|
{ |
|
|
|
var overlay = GetOverlay(parentContent, scene.Size, scene.Scaling); |
|
|
|
@ -460,8 +448,10 @@ namespace Avalonia.Rendering |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void RenderComposite(Scene scene, IDrawingContextImpl context) |
|
|
|
private void RenderComposite(Scene scene, ref IDrawingContextImpl context) |
|
|
|
{ |
|
|
|
EnsureDrawingContext(ref context); |
|
|
|
|
|
|
|
context.Clear(Colors.Transparent); |
|
|
|
|
|
|
|
var clientRect = new Rect(scene.Size); |
|
|
|
@ -503,6 +493,27 @@ namespace Avalonia.Rendering |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void EnsureDrawingContext(ref IDrawingContextImpl context) |
|
|
|
{ |
|
|
|
if (context != null) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if ((RenderTarget as IRenderTargetWithCorruptionInfo)?.IsCorrupted == true) |
|
|
|
{ |
|
|
|
RenderTarget.Dispose(); |
|
|
|
RenderTarget = null; |
|
|
|
} |
|
|
|
|
|
|
|
if (RenderTarget == null) |
|
|
|
{ |
|
|
|
RenderTarget = ((IRenderRoot)_root).CreateRenderTarget(); |
|
|
|
} |
|
|
|
|
|
|
|
context = RenderTarget.CreateDrawingContext(this); |
|
|
|
} |
|
|
|
|
|
|
|
private void UpdateScene() |
|
|
|
{ |
|
|
|
Dispatcher.UIThread.VerifyAccess(); |
|
|
|
|