|
|
@@ -38,8 +38,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var result = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(result);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(result, new LayerDirtyRects());
|
|
|
|
|
|
+ Assert.Same(tree, ((VisualNode)result.Root).LayerRoot);
|
|
|
Assert.Equal(1, result.Root.Children.Count);
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0];
|
|
|
@@ -85,14 +87,15 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var result = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(result);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(result, new LayerDirtyRects());
|
|
|
|
|
|
var canvasNode = result.FindNode(canvas);
|
|
|
Assert.Equal(new Rect(10, 20, 160, 240), canvasNode.ClipBounds);
|
|
|
|
|
|
// Initial ClipBounds are correct, make sure they're still correct after updating canvas.
|
|
|
result = result.Clone();
|
|
|
- Assert.True(SceneBuilder.Update(result, canvas));
|
|
|
+ Assert.True(sceneBuilder.Update(result, canvas, new LayerDirtyRects()));
|
|
|
|
|
|
canvasNode = result.FindNode(canvas);
|
|
|
Assert.Equal(new Rect(10, 20, 160, 240), canvasNode.ClipBounds);
|
|
|
@@ -134,14 +137,15 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var scene = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(scene);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(scene, new LayerDirtyRects());
|
|
|
|
|
|
var borderNode = scene.FindNode(border);
|
|
|
Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds);
|
|
|
|
|
|
// Initial ClipBounds are correct, make sure they're still correct after updating border.
|
|
|
scene = scene.Clone();
|
|
|
- Assert.True(SceneBuilder.Update(scene, border));
|
|
|
+ Assert.True(sceneBuilder.Update(scene, border, new LayerDirtyRects()));
|
|
|
|
|
|
borderNode = scene.FindNode(border);
|
|
|
Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds);
|
|
|
@@ -174,7 +178,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
};
|
|
|
|
|
|
var result = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(result);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(result, new LayerDirtyRects());
|
|
|
|
|
|
var panelNode = result.FindNode(tree.Child);
|
|
|
var expected = new IVisual[] { back, front };
|
|
|
@@ -207,7 +212,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var result = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(result);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(result, new LayerDirtyRects());
|
|
|
|
|
|
var targetNode = result.FindNode(target);
|
|
|
|
|
|
@@ -241,7 +247,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var initial = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(initial);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(initial, new LayerDirtyRects());
|
|
|
|
|
|
var initialBackgroundNode = initial.FindNode(border).Children[0];
|
|
|
var initialTextNode = initial.FindNode(textBlock).DrawOperations[0];
|
|
|
@@ -252,7 +259,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
border.Background = Brushes.Green;
|
|
|
|
|
|
var result = initial.Clone();
|
|
|
- SceneBuilder.Update(result, border);
|
|
|
+ sceneBuilder.Update(result, border, new LayerDirtyRects());
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0];
|
|
|
Assert.Same(border, borderNode.Visual);
|
|
|
@@ -295,16 +302,17 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var initial = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(initial);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(initial, new LayerDirtyRects());
|
|
|
|
|
|
border.Child = decorator;
|
|
|
var result = initial.Clone();
|
|
|
|
|
|
- Assert.True(SceneBuilder.Update(result, decorator));
|
|
|
+ Assert.True(sceneBuilder.Update(result, decorator, new LayerDirtyRects()));
|
|
|
|
|
|
// Updating canvas should result in no-op as it should have been updated along
|
|
|
// with decorator as part of the add opeation.
|
|
|
- Assert.False(SceneBuilder.Update(result, canvas));
|
|
|
+ Assert.False(sceneBuilder.Update(result, canvas, new LayerDirtyRects()));
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0];
|
|
|
Assert.Equal(1, borderNode.Children.Count);
|
|
|
@@ -349,13 +357,14 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var initial = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(initial);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(initial, new LayerDirtyRects());
|
|
|
|
|
|
border.Child = null;
|
|
|
var result = initial.Clone();
|
|
|
|
|
|
- Assert.True(SceneBuilder.Update(result, decorator));
|
|
|
- Assert.False(SceneBuilder.Update(result, canvas));
|
|
|
+ Assert.True(sceneBuilder.Update(result, decorator, new LayerDirtyRects()));
|
|
|
+ Assert.False(sceneBuilder.Update(result, canvas, new LayerDirtyRects()));
|
|
|
|
|
|
var borderNode = (VisualNode)result.Root.Children[0];
|
|
|
Assert.Equal(0, borderNode.Children.Count);
|
|
|
@@ -391,13 +400,14 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
tree.Arrange(new Rect(tree.DesiredSize));
|
|
|
|
|
|
var initial = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(initial);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(initial, new LayerDirtyRects());
|
|
|
|
|
|
border.IsVisible = false;
|
|
|
var result = initial.Clone();
|
|
|
|
|
|
- Assert.True(SceneBuilder.Update(result, border));
|
|
|
- Assert.False(SceneBuilder.Update(result, canvas));
|
|
|
+ Assert.True(sceneBuilder.Update(result, border, new LayerDirtyRects()));
|
|
|
+ Assert.False(sceneBuilder.Update(result, canvas, new LayerDirtyRects()));
|
|
|
|
|
|
var decoratorNode = (VisualNode)result.Root.Children[0];
|
|
|
Assert.Equal(0, decoratorNode.Children.Count);
|
|
|
@@ -433,7 +443,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
layout.ExecuteInitialLayoutPass(tree);
|
|
|
|
|
|
var scene = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(scene);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(scene, new LayerDirtyRects());
|
|
|
|
|
|
var borderNode = scene.FindNode(border);
|
|
|
var canvasNode = scene.FindNode(canvas);
|
|
|
@@ -444,7 +455,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
layout.ExecuteLayoutPass();
|
|
|
|
|
|
scene = scene.Clone();
|
|
|
- SceneBuilder.Update(scene, decorator);
|
|
|
+ sceneBuilder.Update(scene, decorator, new LayerDirtyRects());
|
|
|
|
|
|
borderNode = scene.FindNode(border);
|
|
|
canvasNode = scene.FindNode(canvas);
|
|
|
@@ -480,7 +491,8 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
layout.ExecuteInitialLayoutPass(tree);
|
|
|
|
|
|
var scene = new Scene(tree);
|
|
|
- SceneBuilder.UpdateAll(scene);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(scene, new LayerDirtyRects());
|
|
|
|
|
|
var borderNode = scene.FindNode(border);
|
|
|
var canvasNode = scene.FindNode(canvas);
|
|
|
@@ -492,14 +504,79 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
|
|
|
|
|
|
scene = scene.Clone();
|
|
|
|
|
|
- var dirty = new DirtyRects();
|
|
|
- SceneBuilder.Update(scene, decorator, dirty);
|
|
|
+ var dirty = new LayerDirtyRects();
|
|
|
+ sceneBuilder.Update(scene, decorator, dirty);
|
|
|
|
|
|
- var rects = dirty.ToArray();
|
|
|
+ var rects = dirty.Single().Value.ToArray();
|
|
|
Assert.Equal(new[] { new Rect(0, 10, 100, 90) }, rects);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ [Fact]
|
|
|
+ public void Control_With_Transparency_Should_Start_New_Layer()
|
|
|
+ {
|
|
|
+ using (TestApplication())
|
|
|
+ {
|
|
|
+ Decorator decorator;
|
|
|
+ Border border;
|
|
|
+ Canvas canvas;
|
|
|
+ var tree = new TestRoot
|
|
|
+ {
|
|
|
+ Padding = new Thickness(10),
|
|
|
+ Width = 100,
|
|
|
+ Height = 120,
|
|
|
+ Child = decorator = new Decorator
|
|
|
+ {
|
|
|
+ Padding = new Thickness(11),
|
|
|
+ Child = border = new Border
|
|
|
+ {
|
|
|
+ Opacity = 0.5,
|
|
|
+ Background = Brushes.Red,
|
|
|
+ Padding = new Thickness(12),
|
|
|
+ Child = canvas = new Canvas(),
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ var layout = AvaloniaLocator.Current.GetService<ILayoutManager>();
|
|
|
+ layout.ExecuteInitialLayoutPass(tree);
|
|
|
+
|
|
|
+ var dirty = new LayerDirtyRects();
|
|
|
+ var scene = new Scene(tree);
|
|
|
+ var sceneBuilder = new SceneBuilder();
|
|
|
+ sceneBuilder.UpdateAll(scene, dirty);
|
|
|
+
|
|
|
+ var rootNode = (VisualNode)scene.Root;
|
|
|
+ var borderNode = (VisualNode)scene.FindNode(border);
|
|
|
+ var canvasNode = (VisualNode)scene.FindNode(canvas);
|
|
|
+
|
|
|
+ Assert.Same(tree, rootNode.LayerRoot);
|
|
|
+ Assert.Same(border, borderNode.LayerRoot);
|
|
|
+ Assert.Same(border, canvasNode.LayerRoot);
|
|
|
+
|
|
|
+ Assert.Equal(2, dirty.Count());
|
|
|
+ Assert.Empty(dirty.Select(x => x.Key).Except(new IVisual[] { tree, border }));
|
|
|
+
|
|
|
+ border.Opacity = 1;
|
|
|
+ scene = scene.Clone();
|
|
|
+
|
|
|
+ dirty = new LayerDirtyRects();
|
|
|
+ sceneBuilder.Update(scene, border, dirty);
|
|
|
+
|
|
|
+ rootNode = (VisualNode)scene.Root;
|
|
|
+ borderNode = (VisualNode)scene.FindNode(border);
|
|
|
+ canvasNode = (VisualNode)scene.FindNode(canvas);
|
|
|
+
|
|
|
+ Assert.Same(tree, rootNode.LayerRoot);
|
|
|
+ Assert.Same(tree, borderNode.LayerRoot);
|
|
|
+ Assert.Same(tree, canvasNode.LayerRoot);
|
|
|
+
|
|
|
+ Assert.Equal(1, dirty.Count());
|
|
|
+ Assert.Equal(tree, dirty.Single().Key);
|
|
|
+ Assert.Equal(new Rect(21, 21, 58, 78), dirty.Single().Value.Single());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private IDisposable TestApplication()
|
|
|
{
|
|
|
return UnitTestApplication.Start(
|