Browse Source

Merge IGeometryContext and IGeometryContext2 (#20528)

Co-authored-by: Max Katz <maxkatz6@outlook.com>
pull/20561/head
Julien Lebosquain 2 weeks ago
committed by GitHub
parent
commit
d5d7a7b0e8
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 216
      api/Avalonia.nupkg.xml
  2. 69
      src/Avalonia.Base/Media/StreamGeometryContext.cs
  3. 18
      src/Avalonia.Base/Platform/IGeometryContext.cs
  4. 46
      src/Avalonia.Base/Platform/IGeometryContext2.cs
  5. 29
      src/Avalonia.Base/Platform/PathGeometryContext.cs
  6. 8
      src/Headless/Avalonia.Headless/HeadlessPlatformRenderInterface.cs
  7. 64
      src/Skia/Avalonia.Skia/StreamGeometryImpl.cs

216
api/Avalonia.nupkg.xml

@ -13,6 +13,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Platform.IGeometryContext2</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0001</DiagnosticId> <DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.IScrollable</Target> <Target>T:Avalonia.Controls.Primitives.IScrollable</Target>
@ -37,6 +43,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Platform.IGeometryContext2</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0001</DiagnosticId> <DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.IScrollable</Target> <Target>T:Avalonia.Controls.Primitives.IScrollable</Target>
@ -85,6 +97,30 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.LineTo(Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)</Target> <Target>M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)</Target>
@ -97,6 +133,54 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.LineTo(Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Controls.TextBlock.LetterSpacingProperty</Target> <Target>F:Avalonia.Controls.TextBlock.LetterSpacingProperty</Target>
@ -283,6 +367,30 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.LineTo(Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)</Target> <Target>M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)</Target>
@ -295,6 +403,54 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.LineTo(Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0002</DiagnosticId> <DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Controls.TextBlock.LetterSpacingProperty</Target> <Target>F:Avalonia.Controls.TextBlock.LetterSpacingProperty</Target>
@ -487,6 +643,30 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0006</DiagnosticId> <DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetDataAsync(Avalonia.Input.IAsyncDataTransfer)</Target> <Target>M:Avalonia.Input.Platform.IClipboard.SetDataAsync(Avalonia.Input.IAsyncDataTransfer)</Target>
@ -595,6 +775,30 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left> <Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right> <Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point,System.Boolean)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0006</DiagnosticId> <DiagnosticId>CP0006</DiagnosticId>
<Target>M:Avalonia.Platform.IPlatformRenderInterfaceImportedImage.SnapshotWithTimelineSemaphores(Avalonia.Platform.IPlatformRenderInterfaceImportedSemaphore,System.UInt64,Avalonia.Platform.IPlatformRenderInterfaceImportedSemaphore,System.UInt64)</Target> <Target>M:Avalonia.Platform.IPlatformRenderInterfaceImportedImage.SnapshotWithTimelineSemaphores(Avalonia.Platform.IPlatformRenderInterfaceImportedSemaphore,System.UInt64,Avalonia.Platform.IPlatformRenderInterfaceImportedSemaphore,System.UInt64)</Target>
@ -685,6 +889,18 @@
<Left>baseline/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll</Left> <Left>baseline/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll</Left>
<Right>current/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll</Right> <Right>current/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll</Right>
</Suppression> </Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Media.StreamGeometryContext</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Media.StreamGeometryContext</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression> <Suppression>
<DiagnosticId>CP0009</DiagnosticId> <DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Platform.Screen</Target> <Target>T:Avalonia.Platform.Screen</Target>

69
src/Avalonia.Base/Media/StreamGeometryContext.cs

@ -10,7 +10,7 @@ namespace Avalonia.Media
/// of <see cref="StreamGeometryContext"/> is obtained by calling /// of <see cref="StreamGeometryContext"/> is obtained by calling
/// <see cref="StreamGeometry.Open"/>. /// <see cref="StreamGeometry.Open"/>.
/// </remarks> /// </remarks>
public class StreamGeometryContext : IGeometryContext, IGeometryContext2 public class StreamGeometryContext : IGeometryContext
{ {
private readonly IStreamGeometryContextImpl _impl; private readonly IStreamGeometryContextImpl _impl;
@ -34,15 +34,13 @@ namespace Avalonia.Media
_impl.SetFillRule(fillRule); _impl.SetFillRule(fillRule);
} }
/// <inheritdoc />
/// <inheritdoc/> public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked = true)
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection)
{ {
_impl.ArcTo(point, size, rotationAngle, isLargeArc, sweepDirection); _impl.ArcTo(point, size, rotationAngle, isLargeArc, sweepDirection, isStroked);
_currentPoint = point; _currentPoint = point;
} }
/// <summary> /// <summary>
/// Draws an arc to the specified point using polylines, quadratic or cubic Bezier curves /// Draws an arc to the specified point using polylines, quadratic or cubic Bezier curves
/// Significantly more precise when drawing elliptic arcs with extreme width:height ratios. /// Significantly more precise when drawing elliptic arcs with extreme width:height ratios.
@ -59,34 +57,32 @@ namespace Avalonia.Media
PreciseEllipticArcHelper.ArcTo(this, _currentPoint, point, size, rotationAngle, isLargeArc, sweepDirection); PreciseEllipticArcHelper.ArcTo(this, _currentPoint, point, size, rotationAngle, isLargeArc, sweepDirection);
} }
/// <inheritdoc/> /// <inheritdoc/>
public void BeginFigure(Point startPoint, bool isFilled) public void BeginFigure(Point startPoint, bool isFilled = true)
{ {
_impl.BeginFigure(startPoint, isFilled); _impl.BeginFigure(startPoint, isFilled);
_currentPoint = startPoint; _currentPoint = startPoint;
} }
/// <inheritdoc/> /// <inheritdoc/>
public void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint) public void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint, bool isStroked = true)
{ {
_impl.CubicBezierTo(controlPoint1, controlPoint2, endPoint); _impl.CubicBezierTo(controlPoint1, controlPoint2, endPoint, isStroked);
_currentPoint = endPoint; _currentPoint = endPoint;
} }
/// <inheritdoc/> /// <inheritdoc/>
public void QuadraticBezierTo(Point controlPoint , Point endPoint) public void QuadraticBezierTo(Point controlPoint, Point endPoint, bool isStroked = true)
{ {
_impl.QuadraticBezierTo(controlPoint , endPoint); _impl.QuadraticBezierTo(controlPoint, endPoint, isStroked);
_currentPoint = endPoint; _currentPoint = endPoint;
} }
/// <inheritdoc/> /// <inheritdoc/>
public void LineTo(Point endPoint) public void LineTo(Point point, bool isStroked = true)
{ {
_impl.LineTo(endPoint); _impl.LineTo(point, isStroked);
_currentPoint = endPoint; _currentPoint = point;
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -102,46 +98,5 @@ namespace Avalonia.Media
{ {
_impl.Dispose(); _impl.Dispose();
} }
/// <inheritdoc/>
public void LineTo(Point point, bool isStroked)
{
if (_impl is IGeometryContext2 context2)
context2.LineTo(point, isStroked);
else
_impl.LineTo(point);
_currentPoint = point;
}
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked)
{
if (_impl is IGeometryContext2 context2)
context2.ArcTo(point, size, rotationAngle, isLargeArc, sweepDirection, isStroked);
else
_impl.ArcTo(point, size, rotationAngle, isLargeArc, sweepDirection);
_currentPoint = point;
}
public void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint, bool isStroked)
{
if (_impl is IGeometryContext2 context2)
context2.CubicBezierTo(controlPoint1, controlPoint2, endPoint, isStroked);
else
_impl.CubicBezierTo(controlPoint1, controlPoint2, endPoint);
_currentPoint = endPoint;
}
public void QuadraticBezierTo(Point controlPoint, Point endPoint, bool isStroked)
{
if (_impl is IGeometryContext2 context2)
context2.QuadraticBezierTo(controlPoint, endPoint, isStroked);
else
_impl.QuadraticBezierTo(controlPoint, endPoint);
_currentPoint = endPoint;
}
} }
} }

18
src/Avalonia.Base/Platform/IGeometryContext.cs

@ -18,7 +18,8 @@ namespace Avalonia.Platform
/// <param name="sweepDirection"> /// <param name="sweepDirection">
/// A value that indicates whether the arc is drawn in the Clockwise or Counterclockwise direction. /// A value that indicates whether the arc is drawn in the Clockwise or Counterclockwise direction.
/// </param> /// </param>
void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection); /// <param name="isStroked">Whether the segment is stroked</param>
void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked = true);
/// <summary> /// <summary>
/// Begins a new figure. /// Begins a new figure.
@ -33,20 +34,23 @@ namespace Avalonia.Platform
/// <param name="controlPoint1">The first control point used to specify the shape of the curve.</param> /// <param name="controlPoint1">The first control point used to specify the shape of the curve.</param>
/// <param name="controlPoint2">The second control point used to specify the shape of the curve.</param> /// <param name="controlPoint2">The second control point used to specify the shape of the curve.</param>
/// <param name="endPoint">The destination point for the end of the curve.</param> /// <param name="endPoint">The destination point for the end of the curve.</param>
void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint); /// <param name="isStroked">Whether the segment is stroked</param>
void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint, bool isStroked = true);
/// <summary> /// <summary>
/// Draws a quadratic Bezier curve to the specified point /// Draws a quadratic Bezier curve to the specified point
/// </summary> /// </summary>
/// <param name="controlPoint ">Control point</param> /// <param name="controlPoint">The control point used to specify the shape of the curve.</param>
/// <param name="endPoint">DestinationPoint</param> /// <param name="endPoint">The destination point for the end of the curve.</param>
void QuadraticBezierTo(Point controlPoint , Point endPoint); /// <param name="isStroked">Whether the segment is stroked</param>
void QuadraticBezierTo(Point controlPoint, Point endPoint, bool isStroked = true);
/// <summary> /// <summary>
/// Draws a line to the specified point. /// Draws a line to the specified point.
/// </summary> /// </summary>
/// <param name="endPoint">The destination point.</param> /// <param name="point">The destination point.</param>
void LineTo(Point endPoint); /// <param name="isStroked">Whether the segment is stroked</param>
void LineTo(Point point, bool isStroked = true);
/// <summary> /// <summary>
/// Ends the figure started by <see cref="BeginFigure(Point, bool)"/>. /// Ends the figure started by <see cref="BeginFigure(Point, bool)"/>.

46
src/Avalonia.Base/Platform/IGeometryContext2.cs

@ -1,46 +0,0 @@
using Avalonia.Media;
namespace Avalonia.Platform
{
// TODO12 combine with IGeometryContext
public interface IGeometryContext2 : IGeometryContext
{
/// <summary>
/// Draws a line to the specified point.
/// </summary>
/// <param name="point">The destination point.</param>
/// <param name="isStroked">Whether the segment is stroked</param>
void LineTo(Point point, bool isStroked);
/// <summary>
/// Draws an arc to the specified point.
/// </summary>
/// <param name="point">The destination point.</param>
/// <param name="size">The radii of an oval whose perimeter is used to draw the angle.</param>
/// <param name="rotationAngle">The rotation angle (in radians) of the oval that specifies the curve.</param>
/// <param name="isLargeArc">true to draw the arc greater than 180 degrees; otherwise, false.</param>
/// <param name="sweepDirection">
/// A value that indicates whether the arc is drawn in the Clockwise or Counterclockwise direction.
/// </param>
/// <param name="isStroked">Whether the segment is stroked</param>
void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked);
/// <summary>
/// Draws a Bezier curve to the specified point.
/// </summary>
/// <param name="controlPoint1">The first control point used to specify the shape of the curve.</param>
/// <param name="controlPoint2">The second control point used to specify the shape of the curve.</param>
/// <param name="endPoint">The destination point for the end of the curve.</param>
/// <param name="isStroked">Whether the segment is stroked</param>
void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint, bool isStroked);
/// <summary>
/// Draws a quadratic Bezier curve to the specified point
/// </summary>
/// <param name="controlPoint ">Control point</param>
/// <param name="endPoint">DestinationPoint</param>
/// <param name="isStroked">Whether the segment is stroked</param>
void QuadraticBezierTo(Point controlPoint, Point endPoint, bool isStroked);
}
}

29
src/Avalonia.Base/Platform/PathGeometryContext.cs

@ -21,7 +21,7 @@ namespace Avalonia.Visuals.Platform
} }
/// <inheritdoc/> /// <inheritdoc/>
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection) public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked = true)
{ {
var arcSegment = new ArcSegment var arcSegment = new ArcSegment
{ {
@ -29,7 +29,8 @@ namespace Avalonia.Visuals.Platform
RotationAngle = rotationAngle, RotationAngle = rotationAngle,
IsLargeArc = isLargeArc, IsLargeArc = isLargeArc,
SweepDirection = sweepDirection, SweepDirection = sweepDirection,
Point = point Point = point,
IsStroked = isStroked
}; };
CurrentFigureSegments().Add(arcSegment); CurrentFigureSegments().Add(arcSegment);
@ -47,27 +48,39 @@ namespace Avalonia.Visuals.Platform
} }
/// <inheritdoc/> /// <inheritdoc/>
public void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint) public void CubicBezierTo(Point controlPoint1, Point controlPoint2, Point endPoint, bool isStroked = true)
{ {
var bezierSegment = new BezierSegment { Point1 = controlPoint1, Point2 = controlPoint2, Point3 = endPoint }; var bezierSegment = new BezierSegment
{
Point1 = controlPoint1,
Point2 = controlPoint2,
Point3 = endPoint,
IsStroked = isStroked
};
CurrentFigureSegments().Add(bezierSegment); CurrentFigureSegments().Add(bezierSegment);
} }
/// <inheritdoc/> /// <inheritdoc/>
public void QuadraticBezierTo(Point controlPoint , Point endPoint) public void QuadraticBezierTo(Point controlPoint , Point endPoint, bool isStroked = true)
{ {
var quadraticBezierSegment = new QuadraticBezierSegment { Point1 = controlPoint , Point2 = endPoint }; var quadraticBezierSegment = new QuadraticBezierSegment
{
Point1 = controlPoint,
Point2 = endPoint,
IsStroked = isStroked
};
CurrentFigureSegments().Add(quadraticBezierSegment); CurrentFigureSegments().Add(quadraticBezierSegment);
} }
/// <inheritdoc/> /// <inheritdoc/>
public void LineTo(Point endPoint) public void LineTo(Point point, bool isStroked = true)
{ {
var lineSegment = new LineSegment var lineSegment = new LineSegment
{ {
Point = endPoint Point = point,
IsStroked = isStroked
}; };
CurrentFigureSegments().Add(lineSegment); CurrentFigureSegments().Add(lineSegment);

8
src/Headless/Avalonia.Headless/HeadlessPlatformRenderInterface.cs

@ -313,25 +313,25 @@ namespace Avalonia.Headless
_parent.Bounds = CalculateBounds(); _parent.Bounds = CalculateBounds();
} }
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection) public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked = true)
=> Track(point); => Track(point);
public void BeginFigure(Point startPoint, bool isFilled = true) => Track(startPoint); public void BeginFigure(Point startPoint, bool isFilled = true) => Track(startPoint);
public void CubicBezierTo(Point point1, Point point2, Point point3) public void CubicBezierTo(Point point1, Point point2, Point point3, bool isStroked = true)
{ {
Track(point1); Track(point1);
Track(point2); Track(point2);
Track(point3); Track(point3);
} }
public void QuadraticBezierTo(Point control, Point endPoint) public void QuadraticBezierTo(Point control, Point endPoint, bool isStroked = true)
{ {
Track(control); Track(control);
Track(endPoint); Track(endPoint);
} }
public void LineTo(Point point) => Track(point); public void LineTo(Point point, bool isStroked = true) => Track(point);
public void EndFigure(bool isClosed) public void EndFigure(bool isClosed)
{ {

64
src/Skia/Avalonia.Skia/StreamGeometryImpl.cs

@ -1,5 +1,3 @@
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Platform; using Avalonia.Platform;
using SkiaSharp; using SkiaSharp;
@ -78,7 +76,7 @@ namespace Avalonia.Skia
/// <summary> /// <summary>
/// A Skia implementation of a <see cref="IStreamGeometryContextImpl"/>. /// A Skia implementation of a <see cref="IStreamGeometryContextImpl"/>.
/// </summary> /// </summary>
private class StreamContext : IStreamGeometryContextImpl, IGeometryContext2 private class StreamContext : IStreamGeometryContextImpl
{ {
private readonly StreamGeometryImpl _geometryImpl; private readonly StreamGeometryImpl _geometryImpl;
private SKPath Stroke => _geometryImpl._strokePath; private SKPath Stroke => _geometryImpl._strokePath;
@ -122,33 +120,7 @@ namespace Avalonia.Skia
} }
/// <inheritdoc /> /// <inheritdoc />
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection) public void BeginFigure(Point startPoint, bool isFilled = true)
{
var arc = isLargeArc ? SKPathArcSize.Large : SKPathArcSize.Small;
var sweep = sweepDirection == SweepDirection.Clockwise
? SKPathDirection.Clockwise
: SKPathDirection.CounterClockwise;
Stroke.ArcTo(
(float)size.Width,
(float)size.Height,
(float)rotationAngle,
arc,
sweep,
(float)point.X,
(float)point.Y);
if (Duplicate)
Fill.ArcTo(
(float)size.Width,
(float)size.Height,
(float)rotationAngle,
arc,
sweep,
(float)point.X,
(float)point.Y);
}
/// <inheritdoc />
public void BeginFigure(Point startPoint, bool isFilled)
{ {
if (!isFilled) if (!isFilled)
EnsureSeparateFillPath(); EnsureSeparateFillPath();
@ -161,30 +133,6 @@ namespace Avalonia.Skia
Fill.MoveTo((float)startPoint.X, (float)startPoint.Y); Fill.MoveTo((float)startPoint.X, (float)startPoint.Y);
} }
/// <inheritdoc />
public void CubicBezierTo(Point point1, Point point2, Point point3)
{
Stroke.CubicTo((float)point1.X, (float)point1.Y, (float)point2.X, (float)point2.Y, (float)point3.X, (float)point3.Y);
if (Duplicate)
Fill.CubicTo((float)point1.X, (float)point1.Y, (float)point2.X, (float)point2.Y, (float)point3.X, (float)point3.Y);
}
/// <inheritdoc />
public void QuadraticBezierTo(Point point1, Point point2)
{
Stroke.QuadTo((float)point1.X, (float)point1.Y, (float)point2.X, (float)point2.Y);
if (Duplicate)
Fill.QuadTo((float)point1.X, (float)point1.Y, (float)point2.X, (float)point2.Y);
}
/// <inheritdoc />
public void LineTo(Point point)
{
Stroke.LineTo((float)point.X, (float)point.Y);
if (Duplicate)
Fill.LineTo((float)point.X, (float)point.Y);
}
/// <inheritdoc /> /// <inheritdoc />
public void EndFigure(bool isClosed) public void EndFigure(bool isClosed)
{ {
@ -209,7 +157,7 @@ namespace Avalonia.Skia
} }
/// <inheritdoc /> /// <inheritdoc />
public void LineTo(Point point, bool isStroked) public void LineTo(Point point, bool isStroked = true)
{ {
if (isStroked) if (isStroked)
{ {
@ -225,7 +173,7 @@ namespace Avalonia.Skia
} }
/// <inheritdoc /> /// <inheritdoc />
public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked) public void ArcTo(Point point, Size size, double rotationAngle, bool isLargeArc, SweepDirection sweepDirection, bool isStroked = true)
{ {
var arc = isLargeArc ? SKPathArcSize.Large : SKPathArcSize.Small; var arc = isLargeArc ? SKPathArcSize.Large : SKPathArcSize.Small;
var sweep = sweepDirection == SweepDirection.Clockwise var sweep = sweepDirection == SweepDirection.Clockwise
@ -260,7 +208,7 @@ namespace Avalonia.Skia
} }
/// <inheritdoc /> /// <inheritdoc />
public void CubicBezierTo(Point point1, Point point2, Point point3, bool isStroked) public void CubicBezierTo(Point point1, Point point2, Point point3, bool isStroked = true)
{ {
if (isStroked) if (isStroked)
{ {
@ -276,7 +224,7 @@ namespace Avalonia.Skia
} }
/// <inheritdoc /> /// <inheritdoc />
public void QuadraticBezierTo(Point point1, Point point2, bool isStroked) public void QuadraticBezierTo(Point point1, Point point2, bool isStroked = true)
{ {
if (isStroked) if (isStroked)
{ {

Loading…
Cancel
Save