diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 57a5e505ac..8a3d1f7d77 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -92,7 +92,7 @@ namespace Avalonia.Rendering { if (scene.Id != _lastSceneId) { - _layers.RemoveUnused(scene); + _layers.Update(scene); RenderToLayers(scene); if (DebugFramesPath != null) @@ -141,7 +141,7 @@ namespace Avalonia.Rendering { foreach (var layer in scene.Layers) { - var renderTarget = GetRenderTargetForLayer(scene, layer.LayerRoot); + var renderTarget = _layers[layer.LayerRoot].Bitmap; var node = (VisualNode)scene.FindNode(layer.LayerRoot); using (var context = renderTarget.CreateDrawingContext()) @@ -305,26 +305,6 @@ namespace Avalonia.Rendering return _overlay; } - private IRenderTargetBitmapImpl GetRenderTargetForLayer(Scene scene, IVisual layerRoot) - { - var size = new Size(scene.Size.Width * scene.Scaling, scene.Size.Height * scene.Scaling); - RenderLayer result; - - if (_layers.TryGetValue(layerRoot, out result)) - { - if (result.Size != scene.Size) - { - result.ResizeBitmap(size, scene.Scaling); - } - } - else - { - _layers.Add(layerRoot, size, scene.Scaling); - } - - return _layers[layerRoot].Bitmap; - } - private void SaveDebugFrames(int id) { var index = 0; diff --git a/src/Avalonia.Visuals/Rendering/RenderLayer.cs b/src/Avalonia.Visuals/Rendering/RenderLayer.cs index e6cbf1ede6..47522a45db 100644 --- a/src/Avalonia.Visuals/Rendering/RenderLayer.cs +++ b/src/Avalonia.Visuals/Rendering/RenderLayer.cs @@ -16,7 +16,7 @@ namespace Avalonia.Rendering IVisual layerRoot) { _factory = factory; - Bitmap = factory.CreateLayer(layerRoot, size, 96 * scaling, 96 * scaling); + Bitmap = factory.CreateLayer(layerRoot, size * scaling, 96 * scaling, 96 * scaling); Size = size; Scaling = scaling; LayerRoot = layerRoot; diff --git a/src/Avalonia.Visuals/Rendering/RenderLayers.cs b/src/Avalonia.Visuals/Rendering/RenderLayers.cs index f163578ed4..e1b22c55e0 100644 --- a/src/Avalonia.Visuals/Rendering/RenderLayers.cs +++ b/src/Avalonia.Visuals/Rendering/RenderLayers.cs @@ -20,24 +20,25 @@ namespace Avalonia.Rendering public int Count => _inner.Count; public RenderLayer this[IVisual layerRoot] => _index[layerRoot]; - public RenderLayer Add(IVisual layerRoot, Size size, double scaling) + public void Update(Scene scene) { - RenderLayer result; - - if (!_index.TryGetValue(layerRoot, out result)) + for (var i = scene.Layers.Count - 1; i >= 0; --i) { - result = new RenderLayer(_factory, size, scaling, layerRoot); - _inner.Add(result); - _index.Add(layerRoot, result); - } + var src = scene.Layers[i]; + RenderLayer layer; - return result; - } - - public bool Exists(IVisual layerRoot) => _index.ContainsKey(layerRoot); + if (!_index.TryGetValue(src.LayerRoot, out layer)) + { + layer = new RenderLayer(_factory, scene.Size, scene.Scaling, src.LayerRoot); + _inner.Add(layer); + _index.Add(src.LayerRoot, layer); + } + else + { + layer.ResizeBitmap(scene.Size, scene.Scaling); + } + } - public void RemoveUnused(Scene scene) - { for (var i = _inner.Count - 1; i >= 0; --i) { var layer = _inner[i];