Skip to content

Use SkiaSharp arc drawing API - #37955

Merged
kubaflo merged 10 commits into
inflight/currentfrom
jfversluis-resolve-skia-binding-todos
Aug 30, 2026
Merged

kubaflo merged 10 commits into
inflight/currentfrom
jfversluis-resolve-skia-binding-todos

Conversation

@jfversluis

@jfversluis jfversluis commented Aug 28, 2026 •

Copy link
Copy Markdown
Member

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Description

Replace the temporary SKPath workaround for partial Skia canvas arcs with the supported SKCanvas.DrawArc API.

Full sweeps retain SKPath.AddArc for behavioral compatibility. For strokes, cardinal full sweeps must remain closed ovals rather than open contours with caps at the seam. For fills and strokes, some non-cardinal full sweeps retain the existing empty-contour behavior; this is a known deviation from other ICanvas implementations, but correcting that observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain unchanged because resolving them could alter rendering behavior or requires separate feature work.

Testing

  • Added pixel-equivalence tests for clockwise and counterclockwise partial arcs
  • Added cardinal and non-cardinal full-sweep compatibility coverage, including stroke caps and dash patterns
  • Added degenerate rectangle and non-empty/empty rendering assertions
  • Existing Windows Skia golden rendering scenarios remain unchanged
  • Built Graphics.Skia for netstandard2.0, netstandard2.1, and net10.0-windows10.0.19041.0

PureWeen and others added 3 commits August 27, 2026 23:46
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Updates the pinned `@microsoft/vally-cli` version used by skill
validation and live soak workflows from 0.12.0 to the latest stable
release, 0.14.0.

Also updates direct lint command examples and makes eval-spec comments
version-neutral where the described scoring behavior remains unchanged.

## Validation

- Installed Vally 0.14.0 through `.github/scripts/SetupVallyRuntime.sh`
- Strict-linted all 16 Vally evaluation specifications with Vally 0.14.0

Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Removes the `IlcTreatWarningsAsErrors=false` workaround and its TODO
from the Apple NativeAOT simulator integration test.

The linked tracking issue, #19397, was closed after all template
trimming warnings were resolved. The dedicated
`AOTTemplateTest.PublishNativeAOT` suite also maintains an empty
expected-warning baseline for Apple NativeAOT builds, so the simulator
run should enforce the default ILC warning policy again.

## Validation

- The exact `AppleTemplateTests.RunOniOS_MauiNativeAOT` test compiled
and started on Windows, but Windows could not complete the Apple ILC
phase because the iOS-simulator NativeAOT runtime pack was unavailable
(`MSB3030` for `System.Runtime.InteropServices.RuntimeInformation.dll`).
- The Windows `AOTTemplateTest.PublishNativeAOT(... win-arm64)` proxy
passed, including its assertion that the complete NativeAOT binlog
warning list is empty.

Apple-specific ILC/codegen and simulator execution require the macOS CI
lanes and will be monitored on this draft PR.

Copilot-Session: 37f90cb9-27a1-41b7-b954-95bbbcc9e81e

Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Replace the temporary SKPath workaround now that SKCanvas.DrawArc is available, and cover both arc directions with pixel-equivalence tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI lite review requested due to automatic review settings August 28, 2026 14:09
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 37955

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 37955"

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).
There may be pipelines that require an authorized user to comment /azp run to run.

@github-actions github-actions Bot added the area-drawing Shapes, Borders, Shadows, Graphics, BoxView, custom drawing label Aug 28, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

Review tier: Lite
Findings: 1 Medium severity

New issues introduced by this change (1)
Severity Finding
Medium severity src/​Graphics/​tests/​Graphics.Tests/​SkiaCanvasTests.cs — CreateBitmap returns a newly allocated SKBitmap without clearing it. SKBitmap pixel memory is not…
What changed in this PR

This PR updates the Graphics.Skia renderer to use SkiaSharp’s supported SKCanvas.DrawArc API for drawing open (stroked) arcs and filled arcs, replacing the prior SKPath.AddArc workaround, and adds unit tests to validate pixel-equivalence against the previous path-based rendering.

Changes:

  • Replace open-arc stroke rendering from SKPath + DrawPath to SKCanvas.DrawArc.
  • Replace filled-arc rendering from SKPath + DrawPath to SKCanvas.DrawArc.
  • Add new Skia canvas arc tests that compare SkiaCanvas output against equivalent SKPath.AddArc rendering for clockwise and counterclockwise cases.
File Description
src/​Graphics/​src/​Graphics.Skia/​SkiaCanvas.cs Switches arc drawing/filling implementation to SKCanvas.DrawArc (removes temporary path workaround).
src/​Graphics/​tests/​Graphics.Tests/​SkiaCanvasTests.cs Adds pixel-equivalence tests for stroked and filled arcs across clockwise/counterclockwise rendering.

Clear the bitmap buffers before full-byte comparisons so untouched pixels cannot make the equivalence tests nondeterministic.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
Copilot AI review requested due to automatic review settings August 28, 2026 15:08

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

Review tier: Lite
Findings: None

Issues resolved since last review (1)
Severity Finding
Medium severity src/​Graphics/​tests/​Graphics.Tests/​SkiaCanvasTests.cs — CreateBitmap returns a newly allocated SKBitmap without clearing it. SKBitmap pixel memory is not… View resolved comment

@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added s/agent-review-in-progress AI review is currently running for this PR and removed s/agent-review-in-progress AI review is currently running for this PR labels Aug 28, 2026
@kubaflo kubaflo added the s/agent-review-in-progress AI review is currently running for this PR label Aug 28, 2026

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Expert Review — 3 findings

See inline comments for details.

MauiBot

This comment was marked as outdated.

@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) and removed s/agent-review-in-progress AI review is currently running for this PR labels Aug 28, 2026
Keep the SKPath implementation for full stroked sweeps, where SKCanvas.DrawArc uses different open-contour semantics, and cover cap styles and degenerate bounds.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Aug 29, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
Copilot AI review requested due to automatic review settings August 29, 2026 22:23

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

Review tier: Lite
Findings: None

Suppressed comments (2)

Previously missed (1) — in code that hasn't changed since the last review.

src/Graphics/src/Graphics.Skia/SkiaCanvas.cs:469

  • sweep is a float, but Math.Abs(sweep) uses the double overload, causing an implicit float→double conversion on every arc draw. Using MathF.Abs keeps the computation in float and avoids the extra conversion in this hot path.

This issue also appears on line 516 of the same file.

			else if (Math.Abs(sweep) >= 360)

src/Graphics/src/Graphics.Skia/SkiaCanvas.cs:516

  • Same as PlatformDrawArc: sweep is float, so Math.Abs(sweep) selects the double overload. Prefer MathF.Abs (and a float literal) to avoid float→double conversion in the rendering path.
			if (Math.Abs(sweep) >= 360)

@kubaflo

kubaflo commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).

@kubaflo
kubaflo changed the base branch from main to inflight/current August 30, 2026 12:47
@kubaflo
kubaflo merged commit f8ab3e5 into inflight/current Aug 30, 2026
163 of 171 checks passed
@kubaflo
kubaflo deleted the jfversluis-resolve-skia-binding-todos branch August 30, 2026 12:47
@github-actions github-actions Bot added this to the .NET 10 SR11 milestone Aug 30, 2026
kubaflo added a commit that referenced this pull request Sep 2, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

## Testing

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 3, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

## Testing

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 6, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

## Testing

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 7, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Description

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

## Testing

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 8, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 9, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 11, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 15, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 18, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 21, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 27, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
kubaflo added a commit that referenced this pull request Sep 27, 2026
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Replace the temporary `SKPath` workaround for partial Skia canvas arcs
with the supported `SKCanvas.DrawArc` API.

Full sweeps retain `SKPath.AddArc` for behavioral compatibility. For
strokes, cardinal full sweeps must remain closed ovals rather than open
contours with caps at the seam. For fills and strokes, some non-cardinal
full sweeps retain the existing empty-contour behavior; this is a known
deviation from other `ICanvas` implementations, but correcting that
observable behavior is outside this binding-cleanup scope.

Bitmap filtering and unrelated unimplemented Graphics.Skia TODOs remain
unchanged because resolving them could alter rendering behavior or
requires separate feature work.

- Added pixel-equivalence tests for clockwise and counterclockwise
partial arcs
- Added cardinal and non-cardinal full-sweep compatibility coverage,
including stroke caps and dash patterns
- Added degenerate rectangle and non-empty/empty rendering assertions
- Existing Windows Skia golden rendering scenarios remain unchanged
- Built Graphics.Skia for `netstandard2.0`, `netstandard2.1`, and
`net10.0-windows10.0.19041.0`

---------

Co-authored-by: Shane Neuville <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Copilot-Session: 9e73594e-38bc-4937-80c8-cc054aa890d2
Copilot-Session: 52631b63-ad61-4de7-91b3-10a973848203
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 30, 2026
@github-actions github-actions Bot modified the milestones: .NET 10 SR11, .NET 10 SR12 Oct 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-drawing Shapes, Borders, Shadows, Graphics, BoxView, custom drawing s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants