|
|
|
@ -11,6 +11,7 @@ using System.Collections.Generic; |
|
|
|
using System.IO; |
|
|
|
using Avalonia.Media.Immutable; |
|
|
|
using System.Threading; |
|
|
|
using System.Linq; |
|
|
|
|
|
|
|
namespace Avalonia.Rendering |
|
|
|
{ |
|
|
|
@ -58,7 +59,6 @@ namespace Avalonia.Rendering |
|
|
|
_dispatcher = dispatcher ?? Dispatcher.UIThread; |
|
|
|
_root = root; |
|
|
|
_sceneBuilder = sceneBuilder ?? new SceneBuilder(); |
|
|
|
_scene = new Scene(root); |
|
|
|
_layerFactory = layerFactory ?? new DefaultRenderLayerFactory(); |
|
|
|
_layers = new RenderLayers(_layerFactory); |
|
|
|
_renderLoop = renderLoop; |
|
|
|
@ -86,7 +86,6 @@ namespace Avalonia.Rendering |
|
|
|
_root = root; |
|
|
|
_renderTarget = renderTarget; |
|
|
|
_sceneBuilder = sceneBuilder ?? new SceneBuilder(); |
|
|
|
_scene = new Scene(root); |
|
|
|
_layerFactory = layerFactory ?? new DefaultRenderLayerFactory(); |
|
|
|
_layers = new RenderLayers(_layerFactory); |
|
|
|
} |
|
|
|
@ -122,7 +121,7 @@ namespace Avalonia.Rendering |
|
|
|
UpdateScene(); |
|
|
|
} |
|
|
|
|
|
|
|
return _scene.HitTest(p, filter); |
|
|
|
return _scene?.HitTest(p, filter) ?? Enumerable.Empty<IVisual>(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
@ -186,7 +185,7 @@ namespace Avalonia.Rendering |
|
|
|
_dirtyRectsDisplay.Tick(); |
|
|
|
} |
|
|
|
|
|
|
|
if (scene.Size != Size.Empty) |
|
|
|
if (scene != null && scene.Size != Size.Empty) |
|
|
|
{ |
|
|
|
if (scene.Generation != _lastSceneId) |
|
|
|
{ |
|
|
|
@ -366,25 +365,32 @@ namespace Avalonia.Rendering |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
var scene = _scene.Clone(); |
|
|
|
|
|
|
|
if (_dirty == null) |
|
|
|
{ |
|
|
|
_dirty = new DirtyVisuals(); |
|
|
|
_sceneBuilder.UpdateAll(scene); |
|
|
|
} |
|
|
|
else if (_dirty.Count > 0) |
|
|
|
if (_root.IsVisible) |
|
|
|
{ |
|
|
|
foreach (var visual in _dirty) |
|
|
|
var scene = _scene?.Clone() ?? new Scene(_root); |
|
|
|
|
|
|
|
if (_dirty == null) |
|
|
|
{ |
|
|
|
_sceneBuilder.Update(scene, visual); |
|
|
|
_dirty = new DirtyVisuals(); |
|
|
|
_sceneBuilder.UpdateAll(scene); |
|
|
|
} |
|
|
|
else if (_dirty.Count > 0) |
|
|
|
{ |
|
|
|
foreach (var visual in _dirty) |
|
|
|
{ |
|
|
|
_sceneBuilder.Update(scene, visual); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Interlocked.Exchange(ref _scene, scene); |
|
|
|
Interlocked.Exchange(ref _scene, scene); |
|
|
|
|
|
|
|
_dirty.Clear(); |
|
|
|
(_root as IRenderRoot)?.Invalidate(new Rect(scene.Size)); |
|
|
|
_dirty.Clear(); |
|
|
|
(_root as IRenderRoot)?.Invalidate(new Rect(scene.Size)); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
Interlocked.Exchange(ref _scene, null); |
|
|
|
} |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
|