|
|
|
@ -9,6 +9,9 @@ using Avalonia.VisualTree; |
|
|
|
|
|
|
|
namespace Avalonia.Rendering.SceneGraph |
|
|
|
{ |
|
|
|
/// <summary>
|
|
|
|
/// A drawing context which builds a scene graph.
|
|
|
|
/// </summary>
|
|
|
|
internal class DeferredDrawingContextImpl : IDrawingContextImpl |
|
|
|
{ |
|
|
|
private readonly ISceneBuilder _sceneBuilder; |
|
|
|
@ -16,16 +19,34 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
private int _childIndex; |
|
|
|
private int _drawOperationindex; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="DeferredDrawingContextImpl"/> class.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="sceneBuilder">
|
|
|
|
/// A scene builder used for constructing child scenes for visual brushes.
|
|
|
|
/// </param>
|
|
|
|
/// <param name="layers">The scene layers.</param>
|
|
|
|
public DeferredDrawingContextImpl(ISceneBuilder sceneBuilder, SceneLayers layers) |
|
|
|
{ |
|
|
|
_sceneBuilder = sceneBuilder; |
|
|
|
Layers = layers; |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public Matrix Transform { get; set; } = Matrix.Identity; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the layers in the scene being built.
|
|
|
|
/// </summary>
|
|
|
|
public SceneLayers Layers { get; } |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Informs the drawing context of the visual node that is about to be rendered.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="node">The visual node.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// An object which when disposed will commit the changes to visual node.
|
|
|
|
/// </returns>
|
|
|
|
public UpdateState BeginUpdate(VisualNode node) |
|
|
|
{ |
|
|
|
Contract.Requires<ArgumentNullException>(node != null); |
|
|
|
@ -50,21 +71,33 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
return state; |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void Clear(Color color) |
|
|
|
{ |
|
|
|
// Cannot clear a deferred scene.
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
// Nothing to do here as we allocate no unmanaged resources.
|
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Removes any remaining drawing operations from the visual node.
|
|
|
|
/// </summary>
|
|
|
|
/// <remarks>
|
|
|
|
/// Drawing operations are updated in place, overwriting existing drawing operations if
|
|
|
|
/// they are different. Once drawing has completed for the current visual node, it is
|
|
|
|
/// possible that there are stale drawing operations at the end of the list. This method
|
|
|
|
/// trims these stale drawing operations.
|
|
|
|
/// </remarks>
|
|
|
|
public void TrimChildren() |
|
|
|
{ |
|
|
|
_node.TrimChildren(_childIndex); |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void DrawGeometry(IBrush brush, Pen pen, IGeometryImpl geometry) |
|
|
|
{ |
|
|
|
var next = NextDrawAs<GeometryNode>(); |
|
|
|
@ -79,6 +112,7 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void DrawImage(IBitmapImpl source, double opacity, Rect sourceRect, Rect destRect) |
|
|
|
{ |
|
|
|
var next = NextDrawAs<ImageNode>(); |
|
|
|
@ -93,18 +127,20 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void DrawImage(IBitmapImpl source, IBrush opacityMask, Rect opacityMaskRect, Rect sourceRect) |
|
|
|
{ |
|
|
|
throw new NotImplementedException(); |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void DrawLine(Pen pen, Point p1, Point p2) |
|
|
|
{ |
|
|
|
var next = NextDrawAs<LineNode>(); |
|
|
|
|
|
|
|
if (next == null || !next.Equals(Transform, pen, p1, p2)) |
|
|
|
{ |
|
|
|
Add(new LineNode(Transform, pen, p1, p2)); |
|
|
|
Add(new LineNode(Transform, pen, p1, p2, CreateChildScene(pen.Brush))); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
@ -112,6 +148,7 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void DrawRectangle(Pen pen, Rect rect, float cornerRadius = 0) |
|
|
|
{ |
|
|
|
var next = NextDrawAs<RectangleNode>(); |
|
|
|
@ -126,13 +163,14 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void DrawText(IBrush foreground, Point origin, IFormattedTextImpl text) |
|
|
|
{ |
|
|
|
var next = NextDrawAs<TextNode>(); |
|
|
|
|
|
|
|
if (next == null || !next.Equals(Transform, foreground, origin, text)) |
|
|
|
{ |
|
|
|
Add(new TextNode(Transform, foreground, origin, text)); |
|
|
|
Add(new TextNode(Transform, foreground, origin, text, CreateChildScene(foreground))); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
@ -140,6 +178,7 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void FillRectangle(IBrush brush, Rect rect, float cornerRadius = 0) |
|
|
|
{ |
|
|
|
var next = NextDrawAs<RectangleNode>(); |
|
|
|
@ -154,41 +193,49 @@ namespace Avalonia.Rendering.SceneGraph |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PopClip() |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PopGeometryClip() |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PopOpacity() |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PopOpacityMask() |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PushClip(Rect clip) |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PushGeometryClip(IGeometryImpl clip) |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PushOpacity(double opacity) |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public void PushOpacityMask(IBrush mask, Rect bounds) |
|
|
|
{ |
|
|
|
// TODO: Implement
|
|
|
|
|