From afaf698903e3374f99823d5bc02d45cac985afad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Franz=C3=A9n?= Date: Wed, 14 Jan 2026 12:20:16 +0100 Subject: [PATCH 1/4] Add Windows support Import ucrt for Windows C runtime and add Float overloads for math functions (sin, cos, tan, etc.) which are missing in the Windows ucrt module, similar to the existing Android workaround. --- CommandLine/main.swift | 2 ++ SwiftDraw/Sources/LayerTree/LayerTree.Transform.swift | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CommandLine/main.swift b/CommandLine/main.swift index d47a098..f802846 100644 --- a/CommandLine/main.swift +++ b/CommandLine/main.swift @@ -33,6 +33,8 @@ import Darwin.POSIX #elseif canImport(Android) import Android +#elseif canImport(ucrt) +import ucrt #else import Glibc #endif diff --git a/SwiftDraw/Sources/LayerTree/LayerTree.Transform.swift b/SwiftDraw/Sources/LayerTree/LayerTree.Transform.swift index 2c157fa..07d390e 100644 --- a/SwiftDraw/Sources/LayerTree/LayerTree.Transform.swift +++ b/SwiftDraw/Sources/LayerTree/LayerTree.Transform.swift @@ -33,6 +33,8 @@ import Darwin #elseif canImport(Android) import Android +#elseif canImport(ucrt) +import ucrt #else import Glibc #endif @@ -117,8 +119,8 @@ extension Array where Element == LayerTree.Transform { } } -#if os(Android) -// The Android module does not have Float overloads for the various math functions +#if os(Android) || os(Windows) +// The Android/Windows modules do not have Float overloads for the various math functions func tan(_ value: Float) -> Float { tanf(value) } func atan(_ value: Float) -> Float { atanf(value) } func cos(_ value: Float) -> Float { cosf(value) } From b7ba414d933273dfcee0a8858d9f830982184a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Franz=C3=A9n?= Date: Wed, 14 Jan 2026 12:41:40 +0100 Subject: [PATCH 2/4] Add Windows CI build Add a Windows job to the CI workflow using Swift 6.0.3. --- .github/workflows/build.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b32bd50..8e5a6a0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -118,3 +118,20 @@ jobs: uses: skiptools/swift-android-action@v2 with: swift-version: 6.2 + + windows: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Swift + uses: compnerd/gha-setup-swift@main + with: + branch: swift-6.0.3-release + tag: 6.0.3-RELEASE + - name: Version + run: swift --version + - name: Build + run: swift build --build-tests + - name: Test + run: swift test --skip-build From 2f6164a8e5c54d230dfd071fff312f6584e33333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Franze=CC=81n?= Date: Wed, 14 Jan 2026 13:06:57 +0100 Subject: [PATCH 3/4] Fix Windows CI by upgrading to Swift 6.1.2 Swift 6.0.3 has a cyclic dependency bug with the ucrt module on Windows. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e5a6a0..ad2c228 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -127,8 +127,8 @@ jobs: - name: Setup Swift uses: compnerd/gha-setup-swift@main with: - branch: swift-6.0.3-release - tag: 6.0.3-RELEASE + branch: swift-6.1.2-release + tag: 6.1.2-RELEASE - name: Version run: swift --version - name: Build From e46746d8a8379e7372f507bac22f1c2cbf7e3cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20Franze=CC=81n?= Date: Wed, 14 Jan 2026 13:31:49 +0100 Subject: [PATCH 4/4] Fix Windows transform test math --- .../Tests/LayerTree/LayerTree.TransformTests.swift | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/SwiftDraw/Tests/LayerTree/LayerTree.TransformTests.swift b/SwiftDraw/Tests/LayerTree/LayerTree.TransformTests.swift index 1248ae4..463a828 100644 --- a/SwiftDraw/Tests/LayerTree/LayerTree.TransformTests.swift +++ b/SwiftDraw/Tests/LayerTree/LayerTree.TransformTests.swift @@ -37,12 +37,14 @@ final class LayerTreeTransformTests: XCTestCase { func testSkewXMatrix() { let transform = Transform.skewX(angle: LayerTree.Float.pi/4) - XCTAssertEqual(transform.toMatrix(), Matrix(a: 1, b: 0, c: tan(LayerTree.Float.pi/4), d: 1, tx: 0, ty: 0)) + let angle = LayerTree.Float.pi / 4 + XCTAssertEqual(transform.toMatrix(), Matrix(a: 1, b: 0, c: LayerTree.Float(tan(Double(angle))), d: 1, tx: 0, ty: 0)) } func testSkewYMatrix() { let transform = Transform.skewY(angle: LayerTree.Float.pi/4) - XCTAssertEqual(transform.toMatrix(), Matrix(a: 1, b: tan(LayerTree.Float.pi/4), c: 0, d: 1, tx: 0, ty: 0)) + let angle = LayerTree.Float.pi / 4 + XCTAssertEqual(transform.toMatrix(), Matrix(a: 1, b: LayerTree.Float(tan(Double(angle))), c: 0, d: 1, tx: 0, ty: 0)) } func testScaleMatrix() { @@ -59,7 +61,11 @@ final class LayerTreeTransformTests: XCTestCase { let angle = LayerTree.Float.pi/4 let transform = Transform.rotate(radians: angle) XCTAssertEqual(transform.toMatrix(), - Matrix(a: cos(angle), b: sin(angle), c: -sin(angle), d: cos(angle), tx: 0, ty: 0)) + Matrix(a: LayerTree.Float(cos(Double(angle))), + b: LayerTree.Float(sin(Double(angle))), + c: -LayerTree.Float(sin(Double(angle))), + d: LayerTree.Float(cos(Double(angle))), + tx: 0, ty: 0)) } func testMatrixConcatenation() {