Browse Source

Add rounded rect clip to drawing context.

pull/4081/head
Dan Walmsley 6 years ago
parent
commit
b51cc92ba5
  1. 6
      src/Avalonia.Visuals/Media/DrawingContext.cs
  2. 6
      src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs
  3. 5
      src/Avalonia.Visuals/Rendering/SceneGraph/IVisualNode.cs
  4. 3
      src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs
  5. 6
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  6. 15
      src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs

6
src/Avalonia.Visuals/Media/DrawingContext.cs

@ -282,6 +282,12 @@ namespace Avalonia.Media
}
public PushedState PushClip(RoundedRect clip)
{
PlatformImpl.PushClip(clip);
return new PushedState(this, PushedState.PushedStateType.Clip);
}
/// <summary>
/// Pushes a clip rectangle.
/// </summary>

6
src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs

@ -107,6 +107,12 @@ namespace Avalonia.Platform
/// <param name="clip">The clip rectangle.</param>
void PushClip(Rect clip);
/// <summary>
/// Pushes a clip rounded rectangle.
/// </summary>
/// <param name="clip">The clip rounded rectangle</param>
void PushClip(RoundedRect clip);
/// <summary>
/// Pops the latest pushed clip rectangle.
/// </summary>

5
src/Avalonia.Visuals/Rendering/SceneGraph/IVisualNode.cs

@ -26,6 +26,11 @@ namespace Avalonia.Rendering.SceneGraph
/// </summary>
Matrix Transform { get; }
/// <summary>
/// Gets the corner radius of visual. Contents are clipped to this radius.
/// </summary>
CornerRadius CornerRadius { get; }
/// <summary>
/// Gets the bounds of the node's geometry in global coordinates.
/// </summary>

3
src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs

@ -46,6 +46,9 @@ namespace Avalonia.Rendering.SceneGraph
/// <inheritdoc/>
public IVisualNode Parent { get; }
/// <inheritdoc/>
public CornerRadius CornerRadius { get; }
/// <inheritdoc/>
public Matrix Transform { get; set; }

6
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -389,6 +389,12 @@ namespace Avalonia.Skia
Canvas.ClipRect(clip.ToSKRect());
}
public void PushClip(RoundedRect clip)
{
Canvas.Save();
Canvas.ClipRoundRect(clip.ToSKRoundRect());
}
/// <inheritdoc />
public void PopClip()
{

15
src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs

@ -40,6 +40,21 @@ namespace Avalonia.Skia
return new SKRect((float)r.X, (float)r.Y, (float)r.Right, (float)r.Bottom);
}
public static SKRoundRect ToSKRoundRect(this RoundedRect r)
{
var rc = r.Rect.ToSKRect();
var result = new SKRoundRect();
result.SetRectRadii(rc,
new[]
{
r.RadiiTopLeft.ToSKPoint(), r.RadiiTopRight.ToSKPoint(),
r.RadiiBottomRight.ToSKPoint(), r.RadiiBottomLeft.ToSKPoint(),
});
return result;
}
public static Rect ToAvaloniaRect(this SKRect r)
{
return new Rect(r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top);

Loading…
Cancel
Save