|
|
@@ -87,6 +87,28 @@ namespace Avalonia.Rendering
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+ private void Render(Scene scene)
|
|
|
+ {
|
|
|
+ _rendering = true;
|
|
|
+ _totalFrames++;
|
|
|
+ _dirtyRectsDisplay.Tick();
|
|
|
+
|
|
|
+ if (scene.Size != Size.Empty)
|
|
|
+ {
|
|
|
+ if (scene.Id != _lastSceneId)
|
|
|
+ {
|
|
|
+ _layers.RemoveUnused(scene);
|
|
|
+ RenderToLayers(scene);
|
|
|
+ _lastSceneId = scene.Id;
|
|
|
+ }
|
|
|
+
|
|
|
+ RenderOverlay(scene);
|
|
|
+ RenderComposite(scene);
|
|
|
+ }
|
|
|
+
|
|
|
+ _rendering = false;
|
|
|
+ }
|
|
|
+
|
|
|
private void Render(IDrawingContextImpl context, VisualNode node, IVisual layer, Rect clipBounds)
|
|
|
{
|
|
|
if (node.LayerRoot == layer)
|
|
|
@@ -118,7 +140,7 @@ namespace Avalonia.Rendering
|
|
|
{
|
|
|
foreach (var layer in scene.Layers)
|
|
|
{
|
|
|
- var renderTarget = GetRenderTargetForLayer(layer.LayerRoot);
|
|
|
+ var renderTarget = GetRenderTargetForLayer(scene, layer.LayerRoot);
|
|
|
var node = (VisualNode)scene.FindNode(layer.LayerRoot);
|
|
|
|
|
|
using (var context = renderTarget.CreateDrawingContext())
|
|
|
@@ -140,11 +162,11 @@ namespace Avalonia.Rendering
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void RenderOverlay()
|
|
|
+ private void RenderOverlay(Scene scene)
|
|
|
{
|
|
|
if (DrawFps || DrawDirtyRects)
|
|
|
{
|
|
|
- var overlay = GetOverlay(_root.ClientSize);
|
|
|
+ var overlay = GetOverlay(scene.Size);
|
|
|
|
|
|
using (var context = overlay.CreateDrawingContext())
|
|
|
{
|
|
|
@@ -214,11 +236,11 @@ namespace Avalonia.Rendering
|
|
|
|
|
|
using (var context = _renderTarget.CreateDrawingContext())
|
|
|
{
|
|
|
- var clientRect = new Rect(_root.ClientSize);
|
|
|
+ var clientRect = new Rect(scene.Size);
|
|
|
|
|
|
foreach (var layer in scene.Layers)
|
|
|
{
|
|
|
- var renderLayer = _layers.Get(layer.LayerRoot);
|
|
|
+ var renderLayer = _layers[layer.LayerRoot];
|
|
|
context.DrawImage(renderLayer.Bitmap, layer.Opacity, clientRect, clientRect);
|
|
|
}
|
|
|
|
|
|
@@ -263,7 +285,7 @@ namespace Avalonia.Rendering
|
|
|
}
|
|
|
|
|
|
_dirty.Clear();
|
|
|
- _root.Invalidate(new Rect(_root.ClientSize));
|
|
|
+ _root.Invalidate(new Rect(scene.Size));
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
@@ -284,10 +306,6 @@ namespace Avalonia.Rendering
|
|
|
_dispatcher.InvokeAsync(UpdateScene, DispatcherPriority.Render);
|
|
|
}
|
|
|
|
|
|
- _rendering = true;
|
|
|
- _totalFrames++;
|
|
|
- _dirtyRectsDisplay.Tick();
|
|
|
-
|
|
|
Scene scene;
|
|
|
|
|
|
lock (_scene)
|
|
|
@@ -295,17 +313,7 @@ namespace Avalonia.Rendering
|
|
|
scene = _scene;
|
|
|
}
|
|
|
|
|
|
- if (scene.Id != _lastSceneId)
|
|
|
- {
|
|
|
- _layers.RemoveUnused(scene);
|
|
|
- RenderToLayers(scene);
|
|
|
- _lastSceneId = scene.Id;
|
|
|
- }
|
|
|
-
|
|
|
- RenderOverlay();
|
|
|
- RenderComposite(scene);
|
|
|
-
|
|
|
- _rendering = false;
|
|
|
+ Render(scene);
|
|
|
}
|
|
|
|
|
|
private IRenderTargetBitmapImpl GetOverlay(Size size)
|
|
|
@@ -322,9 +330,23 @@ namespace Avalonia.Rendering
|
|
|
return _overlay;
|
|
|
}
|
|
|
|
|
|
- private IRenderTargetBitmapImpl GetRenderTargetForLayer(IVisual layerRoot)
|
|
|
+ private IRenderTargetBitmapImpl GetRenderTargetForLayer(Scene scene, IVisual layerRoot)
|
|
|
{
|
|
|
- return (_layers.Get(layerRoot) ?? _layers.Add(layerRoot, _root.ClientSize)).Bitmap;
|
|
|
+ RenderLayer result;
|
|
|
+
|
|
|
+ if (_layers.TryGetValue(layerRoot, out result))
|
|
|
+ {
|
|
|
+ if (result.Size != scene.Size)
|
|
|
+ {
|
|
|
+ result.ResizeBitmap(scene.Size);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _layers.Add(layerRoot, scene.Size);
|
|
|
+ }
|
|
|
+
|
|
|
+ return _layers[layerRoot].Bitmap;
|
|
|
}
|
|
|
}
|
|
|
}
|