Browse Source

Correctly handle Push/Pop without inner items

pull/11557/head
Nikita Tsukanov 3 years ago
parent
commit
72c549a205
  1. 17
      src/Avalonia.Base/Rendering/Composition/Drawing/RenderDataDrawingContext.cs
  2. 13
      tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs

17
src/Avalonia.Base/Rendering/Composition/Drawing/RenderDataDrawingContext.cs

@ -79,12 +79,19 @@ internal class RenderDataDrawingContext : DrawingContext
if (!(parent.Node is T))
throw new InvalidOperationException("Invalid Pop operation");
foreach(var item in _currentItemList!)
parent.Node.Children.Add(item);
_currentItemList.Clear();
s_listPool.ReturnAndSetNull(ref _currentItemList);
var removeLastPush = true;
if (_currentItemList != null)
{
removeLastPush = _currentItemList.Count == 0;
foreach (var item in _currentItemList)
parent.Node.Children.Add(item);
_currentItemList.Clear();
s_listPool.ReturnAndSetNull(ref _currentItemList);
}
_currentItemList = parent.Items;
if (removeLastPush)
_currentItemList.RemoveAt(_currentItemList.Count - 1);
}
void AddResource(object? resource)

13
tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs

@ -132,5 +132,18 @@ namespace Avalonia.Base.UnitTests.Rendering.SceneGraph
Assert.True(ctx.Context.GetRenderResults()!.HitTest(new Point(25, 25)));
}
[Fact]
public void Empty_Push_Pop_Sequence_Produces_No_Results()
{
var ctx = new TestContext(_services);
using (ctx.Context.PushTransform(Matrix.CreateTranslation(20, 20)))
using (ctx.Context.PushOpacity(1, default))
{
}
Assert.Null(ctx.Context.GetRenderResults());
}
}
}

Loading…
Cancel
Save