CompositionDrawList.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using Avalonia.Collections.Pooled;
  3. using Avalonia.Rendering.Composition.Server;
  4. using Avalonia.Rendering.SceneGraph;
  5. using Avalonia.Utilities;
  6. // Special license applies <see href="https://raw.githubusercontent.com/AvaloniaUI/Avalonia/master/src/Avalonia.Base/Rendering/Composition/License.md">License.md</see>
  7. namespace Avalonia.Rendering.Composition.Drawing;
  8. /// <summary>
  9. /// A list of serialized drawing commands
  10. /// </summary>
  11. internal class CompositionDrawList : PooledList<IRef<IDrawOperation>>
  12. {
  13. public Size? Size { get; set; }
  14. public CompositionDrawList()
  15. {
  16. }
  17. public CompositionDrawList(int capacity) : base(capacity)
  18. {
  19. }
  20. public override void Dispose()
  21. {
  22. foreach(var item in this)
  23. item.Dispose();
  24. base.Dispose();
  25. }
  26. public CompositionDrawList Clone()
  27. {
  28. var clone = new CompositionDrawList(Count) { Size = Size };
  29. foreach (var r in this)
  30. clone.Add(r.Clone());
  31. return clone;
  32. }
  33. public void Render(CompositorDrawingContextProxy canvas)
  34. {
  35. foreach (var cmd in this)
  36. {
  37. canvas.VisualBrushDrawList = (cmd.Item as BrushDrawOperation)?.Aux as CompositionDrawList;
  38. cmd.Item.Render(canvas);
  39. }
  40. canvas.VisualBrushDrawList = null;
  41. }
  42. }
  43. /// <summary>
  44. /// An helper class for building <see cref="CompositionDrawList"/>
  45. /// </summary>
  46. internal class CompositionDrawListBuilder
  47. {
  48. private CompositionDrawList? _operations;
  49. private bool _owns;
  50. public void Reset(CompositionDrawList? previousOperations)
  51. {
  52. _operations = previousOperations;
  53. _owns = false;
  54. }
  55. public int Count => _operations?.Count ?? 0;
  56. public CompositionDrawList? DrawOperations => _operations;
  57. void MakeWritable(int atIndex)
  58. {
  59. if(_owns)
  60. return;
  61. _owns = true;
  62. var newOps = new CompositionDrawList(_operations?.Count ?? Math.Max(1, atIndex));
  63. if (_operations != null)
  64. {
  65. for (var c = 0; c < atIndex; c++)
  66. newOps.Add(_operations[c].Clone());
  67. }
  68. _operations = newOps;
  69. }
  70. public void ReplaceDrawOperation(int index, IDrawOperation node)
  71. {
  72. MakeWritable(index);
  73. DrawOperations!.Add(RefCountable.Create(node));
  74. }
  75. public void AddDrawOperation(IDrawOperation node)
  76. {
  77. MakeWritable(Count);
  78. DrawOperations!.Add(RefCountable.Create(node));
  79. }
  80. public void TrimTo(int count)
  81. {
  82. if (count < Count)
  83. _operations!.RemoveRange(count, _operations.Count - count);
  84. }
  85. }