Browse Source

Refactor render layers a bit.

We be sure of the required state at the start of rendering,
scenegraph-after-breakage
Steven Kirk 10 years ago
parent
commit
b51513befd
  1. 24
      src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
  2. 2
      src/Avalonia.Visuals/Rendering/RenderLayer.cs
  3. 29
      src/Avalonia.Visuals/Rendering/RenderLayers.cs

24
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;

2
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;

29
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];

Loading…
Cancel
Save