diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 920244f..5b421d4 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -38,7 +38,7 @@ jobs: - name: Set up build environment run: Scripts/CI/darwin_setup_build.sh shell: bash - - name: Build in debug mode on iOS + - name: Build in debug mode on iOS Simulator run: | xcodebuild build \ -scheme OpenRenderBox-Package \ @@ -46,8 +46,8 @@ jobs: -destination "platform=iOS Simulator,OS=${{ matrix.ios-version }},name=${{ matrix.ios-simulator-name }}" \ -derivedDataPath .build-debug \ -skipMacroValidation \ - -skipPackagePluginValidation \ - OTHER_SWIFT_FLAGS="-warnings-as-errors" + -skipPackagePluginValidation + # OTHER_SWIFT_FLAGS="-warnings-as-errors" Conflicting options '-warnings-as-errors' and '-suppress-warnings' - name: Build and run tests in debug mode with coverage on iOS Simulator run: | xcodebuild test \ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8855c78 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,7 @@ +# OpenRenderBox Agent Guidelines + +## Preprocessor Definition Naming Conventions + +- **C/C++ definitions**: Use `ORB_` prefix (e.g., `ORB_SWIFT_NAME`, `ORB_TARGET_OS_DARWIN`) +- **Package.swift injected definitions**: Use `OPENRENDERBOX_` prefix (e.g., `OPENRENDERBOX_CF_CGTYPES`, `OPENRENDERBOX_RENDERBOX`) + diff --git a/Package.resolved b/Package.resolved index 1b961f6..1af8b00 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "690a05887e434b4960ff5a0cb3c6ff7828728045e61fb5fcc5094b76e1d28222", + "originHash" : "4fcdebfe2c90ba26fcba7ec801dbb697ae67f942fbae6db543f3f15c85ec2747", "pins" : [ { "identity" : "darwinprivateframeworks", @@ -7,7 +7,16 @@ "location" : "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", "state" : { "branch" : "main", - "revision" : "db8c67d76c1c95d70389e6aa8d1a26ec6720adda" + "revision" : "381059629386a9d6004ebf39c51a0ffb8e67bea8" + } + }, + { + "identity" : "opencoregraphics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/OpenSwiftUIProject/OpenCoreGraphics", + "state" : { + "branch" : "main", + "revision" : "968794a73efbc0b5c14be13bca10e57771b57460" } }, { diff --git a/Package.swift b/Package.swift index ff8d04f..91f85b8 100644 --- a/Package.swift +++ b/Package.swift @@ -155,6 +155,13 @@ let compatibilityTestCondition = envBoolValue("COMPATIBILITY_TEST", default: fal let useLocalDeps = envBoolValue("USE_LOCAL_DEPS") let renderBoxCondtion = envBoolValue("RENDERBOX", default: buildForDarwinPlatform && !isSPIBuild) +/// CGFloat and CGRect def in CFCGTypes.h will conflict with Foundation's CGSize/CGRect def on Linux. +/// macOS: true -> no issue +/// macOS: false -> use Swift implementation with OpenCoreGraphics Swift CGPath +/// Linux: true + No CGPathRef support in ORBPath -> confilict with Foundation def +/// Linux: false -> use Swift implementation with OpenCoreGraphics Swift CGPath +let cfCGTypes = envBoolValue("CF_CGTYPES", default: buildForDarwinPlatform) + // MARK: - Shared Settings var sharedCSettings: [CSetting] = [ @@ -176,6 +183,12 @@ if libraryEvolutionCondition { sharedSwiftSettings.append(.unsafeFlags(["-enable-library-evolution", "-no-verify-emitted-module-interface"])) } +if cfCGTypes { + sharedCSettings.append(.define("OPENRENDERBOX_CF_CGTYPES")) + sharedCxxSettings.append(.define("OPENRENDERBOX_CF_CGTYPES")) + sharedSwiftSettings.append(.define("OPENRENDERBOX_CF_CGTYPES")) +} + // MARK: - Extension extension Target { @@ -199,6 +212,19 @@ extension [Platform] { let openRenderBoxTarget = Target.target( name: "OpenRenderBox", + dependencies: [ + "OpenRenderBoxCxx", + .product(name: "OpenCoreGraphicsShims", package: "OpenCoreGraphics"), + ], + cSettings: sharedCSettings, + cxxSettings: sharedCxxSettings, + swiftSettings: sharedSwiftSettings +) +// FIXME: Merge into one target +// OpenRenderBox is a C++ & Swift mix target. +// The SwiftPM support for such usage is still in progress. +let openRenderBoxCxxTarget = Target.target( + name: "OpenRenderBoxCxx", cSettings: sharedCSettings, cxxSettings: sharedCxxSettings ) @@ -206,13 +232,14 @@ let openRenderBoxShimsTarget = Target.target( name: "OpenRenderBoxShims", swiftSettings: sharedSwiftSettings ) -let openRenderBoxCxxTestTarget = Target.testTarget( - name: "OpenRenderBoxCxxTests", +let openRenderBoxTestsTarget = Target.testTarget( + name: "OpenRenderBoxTests", dependencies: [ "OpenRenderBox", ], exclude: ["README.md"], cSettings: sharedCSettings + [.define("SWIFT_TESTING")], + cxxSettings: sharedCxxSettings + [.define("SWIFT_TESTING")], swiftSettings: sharedSwiftSettings + [.interoperabilityMode(.Cxx)] ) let openRenderBoxCompatibilityTestTarget = Target.testTarget( @@ -221,6 +248,8 @@ let openRenderBoxCompatibilityTestTarget = Target.testTarget( .product(name: "RealModule", package: "swift-numerics"), ], exclude: ["README.md"], + cSettings: sharedCSettings + [.define("SWIFT_TESTING")], + cxxSettings: sharedCxxSettings + [.define("SWIFT_TESTING")], swiftSettings: sharedSwiftSettings ) @@ -239,35 +268,31 @@ default: let package = Package( name: "OpenRenderBox", products: [ - .library(name: "OpenRenderBox", type: libraryType, targets: ["OpenRenderBox"]), + .library(name: "OpenRenderBox", type: libraryType, targets: ["OpenRenderBox", "OpenRenderBoxCxx"]), .library(name: "OpenRenderBoxShims", type: libraryType, targets: ["OpenRenderBoxShims"]), ], dependencies: [ - .package(url: "https://github.com/apple/swift-numerics", from: "1.0.2"), + .package(url: "https://github.com/apple/swift-numerics", from: "1.1.1"), ], targets: [ openRenderBoxTarget, + openRenderBoxCxxTarget, openRenderBoxShimsTarget, - openRenderBoxCxxTestTarget, + openRenderBoxTestsTarget, openRenderBoxCompatibilityTestTarget, ], cxxLanguageStandard: .cxx20 ) if renderBoxCondtion { - let privateFrameworkRepo: Package.Dependency - if useLocalDeps { - privateFrameworkRepo = Package.Dependency.package(path: "../DarwinPrivateFrameworks") - } else { - privateFrameworkRepo = Package.Dependency.package(url: "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", branch: "main") - } - package.dependencies.append(privateFrameworkRepo) openRenderBoxShimsTarget.addRBSettings() +} - let rbVersion = EnvManager.shared.withDomain("DarwinPrivateFrameworks") { +if renderBoxCondtion { + let release = EnvManager.shared.withDomain("DarwinPrivateFrameworks") { envIntValue("TARGET_RELEASE", default: 2024) } - package.platforms = switch rbVersion { + package.platforms = switch release { case 2024: [.iOS(.v18), .macOS(.v15), .macCatalyst(.v18), .tvOS(.v18), .watchOS(.v10), .visionOS(.v2)] case 2021: [.iOS(.v15), .macOS(.v12), .macCatalyst(.v15), .tvOS(.v15), .watchOS(.v7)] default: nil @@ -276,6 +301,24 @@ if renderBoxCondtion { openRenderBoxShimsTarget.dependencies.append("OpenRenderBox") } +if useLocalDeps { + var dependencies: [Package.Dependency] = [ + .package(path: "../OpenCoreGraphics"), + ] + if renderBoxCondtion { + dependencies.append(.package(path: "../DarwinPrivateFrameworks")) + } + package.dependencies += dependencies +} else { + var dependencies: [Package.Dependency] = [ + .package(url: "https://github.com/OpenSwiftUIProject/OpenCoreGraphics", branch: "main"), + ] + if renderBoxCondtion { + dependencies.append(.package(url: "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", branch: "main")) + } + package.dependencies += dependencies +} + if compatibilityTestCondition && renderBoxCondtion { openRenderBoxCompatibilityTestTarget.addRBSettings() var swiftSettings: [SwiftSetting] = (openRenderBoxCompatibilityTestTarget.swiftSettings ?? []) diff --git a/Scripts/CI/darwin_setup_build.sh b/Scripts/CI/darwin_setup_build.sh index 0c1f016..d85ad83 100755 --- a/Scripts/CI/darwin_setup_build.sh +++ b/Scripts/CI/darwin_setup_build.sh @@ -8,4 +8,5 @@ filepath() { REPO_ROOT="$(dirname $(dirname $(dirname $(filepath $0))))" cd $REPO_ROOT +Scripts/CI/opencoregraphics_setup.sh Scripts/CI/rb_setup.sh \ No newline at end of file diff --git a/Scripts/CI/opencoregraphics_setup.sh b/Scripts/CI/opencoregraphics_setup.sh new file mode 100755 index 0000000..e1ae4b5 --- /dev/null +++ b/Scripts/CI/opencoregraphics_setup.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# A `realpath` alternative using the default C implementation. +filepath() { + [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" +} + +REPO_ROOT="$(dirname $(dirname $(dirname $(filepath $0))))" + +clone_checkout_opencoregraphics() { + cd $REPO_ROOT + revision=$(Scripts/CI/get_revision.sh opencoregraphics) + cd .. + if [ ! -d OpenCoreGraphics ]; then + gh repo clone OpenSwiftUIProject/OpenCoreGraphics + cd OpenCoreGraphics + else + echo "OpenCoreGraphics already exists, skipping clone." + cd OpenCoreGraphics + git fetch --all --quiet + git stash --quiet || true + git reset --hard --quiet origin/main + fi + git checkout --quiet $revision +} + +clone_checkout_opencoregraphics diff --git a/Sources/OpenRenderBox/Export.swift b/Sources/OpenRenderBox/Export.swift new file mode 100644 index 0000000..d29d410 --- /dev/null +++ b/Sources/OpenRenderBox/Export.swift @@ -0,0 +1,5 @@ +// +// Export.swift +// OpenRenderBox + +@_exported public import OpenRenderBoxCxx diff --git a/Sources/OpenRenderBox/Path/ORBPath.swift b/Sources/OpenRenderBox/Path/ORBPath.swift new file mode 100644 index 0000000..2141da5 --- /dev/null +++ b/Sources/OpenRenderBox/Path/ORBPath.swift @@ -0,0 +1,149 @@ +// +// ORBPath.swift +// OpenRenderBox + +#if !OPENRENDERBOX_CF_CGTYPES +public import OpenCoreGraphicsShims + +public typealias ORBPathApplyCallback = (UnsafeMutableRawPointer, ORBPath.Element, UnsafePointer, UnsafeRawPointer?) -> Bool + +public struct ORBPath { + public var storage: ORBPath.Storage + public var callbacks: UnsafePointer + + public init(storage: ORBPath.Storage, callbacks: UnsafePointer) { + self.storage = storage + self.callbacks = callbacks + } +} + +// MARK: - Element + +extension ORBPath { + /// Path element type for path enumeration + public enum Element: Int32, @unchecked Sendable { + case moveToPoint = 0 + case addLineToPoint = 1 + case addQuadCurveToPoint = 2 + case addCurveToPoint = 3 + case closeSubpath = 4 + case rect = 5 + case roundedRect = 6 + case fixedRoundedRectCircular = 8 + case fixedRoundedRectContinuous = 9 + case invalid = 25 + } +} + +// MARK: - RoundedCornerStyle + +extension ORBPath { + /// Defines the shape of a rounded rectangle's corners. + public enum RoundedCornerStyle: Int32, @unchecked Sendable { + /// Quarter-circle rounded rect corners. + case circular = 0 + /// Continuous curvature rounded rect corners. + case continuous = 1 + } +} + +// MARK: - Storage + +extension ORBPath { + public struct Storage: Hashable, Equatable, RawRepresentable, @unchecked Sendable { + public var rawValue: OpaquePointer + + public init(_ rawValue: OpaquePointer) { + self.rawValue = rawValue + } + + public init(rawValue: OpaquePointer) { + self.rawValue = rawValue + } + } +} + +// MARK: - Static Properties + +extension ORBPath { + /// Global empty path (storage = null, callbacks = &ORBPathEmptyCallbacks) + public static var empty: ORBPath { + _openRenderBoxUnimplementedFailure() + } + + /// Global null path (storage = 0x1, callbacks = &ORBPathEmptyCallbacks) + public static var null: ORBPath { + _openRenderBoxUnimplementedFailure() + } +} + +// MARK: - Memory Management + +extension ORBPath { + public func retain() { + _openRenderBoxUnimplementedFailure() + } + + public func release() { + _openRenderBoxUnimplementedFailure() + } +} + +// MARK: - Initializers + +extension ORBPath { + public init(cgPath: CGPath) { + _openRenderBoxUnimplementedFailure() + } + + public init(rect: CGRect, transform: UnsafePointer?) { + _openRenderBoxUnimplementedFailure() + } + + public init(ellipseIn rect: CGRect, transform: UnsafePointer?) { + _openRenderBoxUnimplementedFailure() + } + + public init(roundedRect rect: CGRect, cornerWidth: CGFloat, cornerHeight: CGFloat, style: ORBPath.RoundedCornerStyle, transform: UnsafePointer?) { + _openRenderBoxUnimplementedFailure() + } + + public init(roundedRect rect: CGRect, topLeftRadius: CGFloat, bottomLeftRadius: CGFloat, bottomRightRadius: CGFloat, topRightRadius: CGFloat, style: ORBPath.RoundedCornerStyle, transform: UnsafePointer?) { + _openRenderBoxUnimplementedFailure() + } +} + +// MARK: - Properties + +extension ORBPath { + public var isEmpty: Bool { + _openRenderBoxUnimplementedFailure() + } + + public var cgPath: CGPath { + _openRenderBoxUnimplementedFailure() + } +} + +// MARK: - Methods + +extension ORBPath { + public func apply(info: UnsafeMutableRawPointer, callback: ORBPathApplyCallback?) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public func isEqual(to rhs: ORBPath) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public func contains(point: CGPoint, eoFill: Bool) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public func containsPoints(count: UInt64, points: UnsafePointer, eoFill: Bool, transform: UnsafePointer?) -> Bool { + _openRenderBoxUnimplementedFailure() + } +} + +#endif + diff --git a/Sources/OpenRenderBox/Path/ORBPathCallbacks.swift b/Sources/OpenRenderBox/Path/ORBPathCallbacks.swift new file mode 100644 index 0000000..c4d21c6 --- /dev/null +++ b/Sources/OpenRenderBox/Path/ORBPathCallbacks.swift @@ -0,0 +1,159 @@ +// +// ORBPathCallbacks.swift +// OpenRenderBox + +#if !OPENRENDERBOX_CF_CGTYPES +public import OpenCoreGraphicsShims + +// MARK: - ORBPath.Callbacks + +extension ORBPath { + /// Callbacks structure for path operations + /// This allows different path storage types (CGPath, custom storage, etc.) to provide their own implementations + public struct Callbacks { + /// Flags for path callbacks + public struct Flags { + public var unknown0: UInt8 + public var unknown1: UInt8 + public var isExtended: Bool + public var padding: (UInt8, UInt8, UInt8, UInt8, UInt8) + + public init() { + self.unknown0 = 0 + self.unknown1 = 0 + self.isExtended = false + self.padding = (0, 0, 0, 0, 0) + } + + public init(unknown0: UInt8, unknown1: UInt8, isExtended: Bool, padding: (UInt8, UInt8, UInt8, UInt8, UInt8)) { + self.unknown0 = unknown0 + self.unknown1 = unknown1 + self.isExtended = isExtended + self.padding = padding + } + } + + public var flags: ORBPath.Callbacks.Flags + public var retain: ((UnsafeRawPointer) -> UnsafeRawPointer)? + public var release: ((UnsafeRawPointer) -> Void)? + public var apply: ((UnsafeRawPointer, UnsafeMutableRawPointer, ORBPathApplyCallback?) -> Bool)? + public var isEqual: ((UnsafeRawPointer, UnsafeRawPointer) -> Bool)? + public var isEmpty: ((UnsafeRawPointer) -> Bool)? + public var isSingleElement: ((UnsafeRawPointer) -> Bool)? + public var bezierOrder: ((UnsafeRawPointer) -> UInt32)? + public var boundingRect: ((UnsafeRawPointer) -> CGRect)? + public var cgPath: ((UnsafeRawPointer) -> Unmanaged?)? + public var next: ((UnsafeRawPointer) -> UnsafePointer?)? + + public init() { + self.flags = ORBPath.Callbacks.Flags() + self.retain = nil + self.release = nil + self.apply = nil + self.isEqual = nil + self.isEmpty = nil + self.isSingleElement = nil + self.bezierOrder = nil + self.boundingRect = nil + self.cgPath = nil + self.next = nil + } + + public init( + flags: ORBPath.Callbacks.Flags, + retain: ((UnsafeRawPointer) -> UnsafeRawPointer)?, + release: ((UnsafeRawPointer) -> Void)?, + apply: ((UnsafeRawPointer, UnsafeMutableRawPointer, ORBPathApplyCallback?) -> Bool)?, + isEqual: ((UnsafeRawPointer, UnsafeRawPointer) -> Bool)?, + isEmpty: ((UnsafeRawPointer) -> Bool)?, + isSingleElement: ((UnsafeRawPointer) -> Bool)?, + bezierOrder: ((UnsafeRawPointer) -> UInt32)?, + boundingRect: ((UnsafeRawPointer) -> CGRect)?, + cgPath: ((UnsafeRawPointer) -> Unmanaged?)?, + next: ((UnsafeRawPointer) -> UnsafePointer?)? + ) { + self.flags = flags + self.retain = retain + self.release = release + self.apply = apply + self.isEqual = isEqual + self.isEmpty = isEmpty + self.isSingleElement = isSingleElement + self.bezierOrder = bezierOrder + self.boundingRect = boundingRect + self.cgPath = cgPath + self.next = next + } + } +} + +// MARK: - ORBPath.Callbacks Static Properties + +extension ORBPath.Callbacks { + /// Global callbacks for CGPath-backed paths + public static var cgPath: ORBPath.Callbacks { + _openRenderBoxUnimplementedFailure() + } +} + +// MARK: - ORBPath.CallbacksExtended + +extension ORBPath { + /// Extended callbacks structure with additional extended callbacks argument + public struct CallbacksExtended { + public var flags: ORBPath.Callbacks.Flags + public var retain: ((UnsafeRawPointer) -> UnsafeRawPointer)? + public var release: ((UnsafeRawPointer) -> Void)? + public var apply: ((UnsafeRawPointer, UnsafeMutableRawPointer, ORBPathApplyCallback?, UnsafePointer) -> Bool)? + public var isEqual: ((UnsafeRawPointer, UnsafeRawPointer, UnsafePointer) -> Bool)? + public var isEmpty: ((UnsafeRawPointer, UnsafePointer) -> Bool)? + public var isSingleElement: ((UnsafeRawPointer, UnsafePointer) -> Bool)? + public var bezierOrder: ((UnsafeRawPointer, UnsafePointer) -> UInt32)? + public var boundingRect: ((UnsafeRawPointer, UnsafePointer) -> CGRect)? + public var cgPath: ((UnsafeRawPointer, UnsafePointer) -> Unmanaged?)? + public var next: ((UnsafeRawPointer, UnsafePointer) -> UnsafePointer?)? + + public init() { + self.flags = ORBPath.Callbacks.Flags() + self.retain = nil + self.release = nil + self.apply = nil + self.isEqual = nil + self.isEmpty = nil + self.isSingleElement = nil + self.bezierOrder = nil + self.boundingRect = nil + self.cgPath = nil + self.next = nil + } + + public init( + flags: ORBPath.Callbacks.Flags, + retain: ((UnsafeRawPointer) -> UnsafeRawPointer)?, + release: ((UnsafeRawPointer) -> Void)?, + apply: ((UnsafeRawPointer, UnsafeMutableRawPointer, ORBPathApplyCallback?, UnsafePointer) -> Bool)?, + isEqual: ((UnsafeRawPointer, UnsafeRawPointer, UnsafePointer) -> Bool)?, + isEmpty: ((UnsafeRawPointer, UnsafePointer) -> Bool)?, + isSingleElement: ((UnsafeRawPointer, UnsafePointer) -> Bool)?, + bezierOrder: ((UnsafeRawPointer, UnsafePointer) -> UInt32)?, + boundingRect: ((UnsafeRawPointer, UnsafePointer) -> CGRect)?, + cgPath: ((UnsafeRawPointer, UnsafePointer) -> Unmanaged?)?, + next: ((UnsafeRawPointer, UnsafePointer) -> UnsafePointer?)? + ) { + self.flags = flags + self.retain = retain + self.release = release + self.apply = apply + self.isEqual = isEqual + self.isEmpty = isEmpty + self.isSingleElement = isSingleElement + self.bezierOrder = bezierOrder + self.boundingRect = boundingRect + self.cgPath = cgPath + self.next = next + } + } +} + +#endif + diff --git a/Sources/OpenRenderBox/Path/ORBPathStorage.swift b/Sources/OpenRenderBox/Path/ORBPathStorage.swift new file mode 100644 index 0000000..2a8a022 --- /dev/null +++ b/Sources/OpenRenderBox/Path/ORBPathStorage.swift @@ -0,0 +1,59 @@ +// +// ORBPathStorage.swift +// OpenRenderBox + +#if !OPENRENDERBOX_CF_CGTYPES +public import OpenCoreGraphicsShims + +extension ORBPath.Storage { + public func initialize(capacity: UInt32, source: ORBPath.Storage?) { + _openRenderBoxUnimplementedFailure() + } + + public func destroy() { + _openRenderBoxUnimplementedFailure() + } + + public func clear() { + _openRenderBoxUnimplementedFailure() + } + + public func append(element: ORBPath.Element, points: UnsafePointer, userInfo: UnsafeRawPointer?) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public func append(path: ORBPath) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public func apply(info: UnsafeMutableRawPointer, callback: ORBPathApplyCallback?) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public var isEmpty: Bool { + _openRenderBoxUnimplementedFailure() + } + + public func isEqual(to rhs: ORBPath.Storage) -> Bool { + _openRenderBoxUnimplementedFailure() + } + + public var isSingleElement: Bool { + _openRenderBoxUnimplementedFailure() + } + + public var bezierOrder: UInt32 { + _openRenderBoxUnimplementedFailure() + } + + public var boundingRect: CGRect { + _openRenderBoxUnimplementedFailure() + } + + public var cgPath: CGPath? { + _openRenderBoxUnimplementedFailure() + } +} + +#endif + diff --git a/Sources/OpenRenderBox/Util/Logging.swift b/Sources/OpenRenderBox/Util/Logging.swift new file mode 100644 index 0000000..092fd6a --- /dev/null +++ b/Sources/OpenRenderBox/Util/Logging.swift @@ -0,0 +1,9 @@ +// +// Logging.swift +// OpenRenderBox + +@_transparent +package func _openRenderBoxUnimplementedFailure(_ function: String = #function, file: StaticString = #fileID, line: UInt = #line) -> Never { + preconditionFailure("Unimplemented yet", file: file, line: line) +} + diff --git a/Sources/OpenRenderBox/Path/NestedCallbacks.cpp b/Sources/OpenRenderBoxCxx/Path/NestedCallbacks.cpp similarity index 99% rename from Sources/OpenRenderBox/Path/NestedCallbacks.cpp rename to Sources/OpenRenderBoxCxx/Path/NestedCallbacks.cpp index 00e8d88..7fe6be6 100644 --- a/Sources/OpenRenderBox/Path/NestedCallbacks.cpp +++ b/Sources/OpenRenderBoxCxx/Path/NestedCallbacks.cpp @@ -4,6 +4,8 @@ // TODO: Implement NestedCallbacks +#if OPENRENDERBOX_CF_CGTYPES + #include #include #if ORB_TARGET_OS_DARWIN @@ -303,3 +305,4 @@ bool NestedCallbacks::first_element(const Storage& storage, void* iterator, size } /* namespace Path */ } /* namespace ORB */ +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/Path/ORBPath.cpp b/Sources/OpenRenderBoxCxx/Path/ORBPath.cpp similarity index 99% rename from Sources/OpenRenderBox/Path/ORBPath.cpp rename to Sources/OpenRenderBoxCxx/Path/ORBPath.cpp index 43f3de0..3364c4b 100644 --- a/Sources/OpenRenderBox/Path/ORBPath.cpp +++ b/Sources/OpenRenderBoxCxx/Path/ORBPath.cpp @@ -5,6 +5,8 @@ // Created by Kyle on 2025/3/25. // +#if OPENRENDERBOX_CF_CGTYPES + #include #include #include @@ -255,3 +257,5 @@ bool ORBPathContainsPoints(ORBPath path, uint64_t count, const CGPoint *points, return false; } #endif /* ORB_TARGET_OS_DARWIN */ + +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/Path/ORBPathCallbacks.cpp b/Sources/OpenRenderBoxCxx/Path/ORBPathCallbacks.cpp similarity index 97% rename from Sources/OpenRenderBox/Path/ORBPathCallbacks.cpp rename to Sources/OpenRenderBoxCxx/Path/ORBPathCallbacks.cpp index fbd7e06..0c091d1 100644 --- a/Sources/OpenRenderBox/Path/ORBPathCallbacks.cpp +++ b/Sources/OpenRenderBoxCxx/Path/ORBPathCallbacks.cpp @@ -5,6 +5,8 @@ // Audited for 6.5.1 // Status: Complete +#if OPENRENDERBOX_CF_CGTYPES + #include #include @@ -73,3 +75,5 @@ const ORBPathCallbacks ORBPathCGPathCallbacks = { }; #endif /* ORB_TARGET_OS_DARWIN */ + +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/Path/ORBPathStorage.cpp b/Sources/OpenRenderBoxCxx/Path/ORBPathStorage.cpp similarity index 96% rename from Sources/OpenRenderBox/Path/ORBPathStorage.cpp rename to Sources/OpenRenderBoxCxx/Path/ORBPathStorage.cpp index 4b76466..5f4f699 100644 --- a/Sources/OpenRenderBox/Path/ORBPathStorage.cpp +++ b/Sources/OpenRenderBoxCxx/Path/ORBPathStorage.cpp @@ -2,6 +2,8 @@ // ORBPathStorage.cpp // OpenRenderBox +#if OPENRENDERBOX_CF_CGTYPES + #include #include #include @@ -74,3 +76,5 @@ CGPathRef ORBPathStorageGetCGPath(ORBPathStorageRef storage) { return storage->storage.cgpath(); } #endif + +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/Path/Storage.cpp b/Sources/OpenRenderBoxCxx/Path/Storage.cpp similarity index 98% rename from Sources/OpenRenderBox/Path/Storage.cpp rename to Sources/OpenRenderBoxCxx/Path/Storage.cpp index 5aae837..30c6a4e 100644 --- a/Sources/OpenRenderBox/Path/Storage.cpp +++ b/Sources/OpenRenderBoxCxx/Path/Storage.cpp @@ -2,6 +2,8 @@ // Storage.cpp // OpenRenderBox +#if OPENRENDERBOX_CF_CGTYPES + #include #include #include @@ -152,3 +154,5 @@ CGPathRef Storage::cgpath() const ORB_NOEXCEPT { } /* Path */ } /* ORB */ + +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/UUID/ORBUUID.mm b/Sources/OpenRenderBoxCxx/UUID/ORBUUID.mm similarity index 100% rename from Sources/OpenRenderBox/UUID/ORBUUID.mm rename to Sources/OpenRenderBoxCxx/UUID/ORBUUID.mm diff --git a/Sources/OpenRenderBox/Util/assert.cpp b/Sources/OpenRenderBoxCxx/Util/assert.cpp similarity index 100% rename from Sources/OpenRenderBox/Util/assert.cpp rename to Sources/OpenRenderBoxCxx/Util/assert.cpp diff --git a/Sources/OpenRenderBox/Util/log.cpp b/Sources/OpenRenderBoxCxx/Util/log.cpp similarity index 100% rename from Sources/OpenRenderBox/Util/log.cpp rename to Sources/OpenRenderBoxCxx/Util/log.cpp diff --git a/Sources/OpenRenderBox/Version/ORBVersion.c b/Sources/OpenRenderBoxCxx/Version/ORBVersion.c similarity index 100% rename from Sources/OpenRenderBox/Version/ORBVersion.c rename to Sources/OpenRenderBoxCxx/Version/ORBVersion.c diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/CFCGTypes.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/CFCGTypes.h similarity index 98% rename from Sources/OpenRenderBox/include/OpenRenderBox/CFCGTypes.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/CFCGTypes.h index 1ca3d8d..84705fb 100644 --- a/Sources/OpenRenderBox/include/OpenRenderBox/CFCGTypes.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/CFCGTypes.h @@ -1,3 +1,5 @@ +#if OPENRENDERBOX_CF_CGTYPES + /* CFCGTypes.h Copyright (c) 1998-2021, Apple Inc. and the Swift project authors @@ -122,3 +124,5 @@ struct CGAffineTransformComponents { }; #endif /* ! __COREFOUNDATION_CFCGTYPES__ */ + +#endif /* OPENRENDERBOX_CF_CGTYPES */ \ No newline at end of file diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBBase.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBBase.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBPath.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h similarity index 98% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBPath.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h index 67c385e..e294bd2 100644 --- a/Sources/OpenRenderBox/include/OpenRenderBox/ORBPath.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h @@ -4,7 +4,10 @@ #pragma once +#if OPENRENDERBOX_CF_CGTYPES + #include + #if ORB_TARGET_OS_DARWIN #include #endif @@ -112,3 +115,5 @@ bool ORBPathContainsPoints(ORBPath path, uint64_t count, const CGPoint *points, ORB_EXTERN_C_END ORB_ASSUME_NONNULL_END + +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBPathCallbacks.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPathCallbacks.h similarity index 97% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBPathCallbacks.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPathCallbacks.h index c2fc4d3..05d973f 100644 --- a/Sources/OpenRenderBox/include/OpenRenderBox/ORBPathCallbacks.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPathCallbacks.h @@ -7,6 +7,8 @@ #pragma once +#if OPENRENDERBOX_CF_CGTYPES + #include #include #include @@ -19,7 +21,7 @@ ORB_ASSUME_NONNULL_BEGIN ORB_EXTERN_C_BEGIN /// Flags for path callbacks -typedef struct ORBPathCallbacksFlags { +typedef struct ORB_SWIFT_NAME(ORBPath.Callbacks.Flags) ORBPathCallbacksFlags { uint8_t unknown0; uint8_t unknown1; bool isExtended; @@ -106,3 +108,5 @@ const ORBPathCallbacks ORBPathCGPathCallbacks ORB_SWIFT_NAME(ORBPathCallbacks.cg ORB_EXTERN_C_END ORB_ASSUME_NONNULL_END + +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBPathStorage.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPathStorage.h similarity index 96% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBPathStorage.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPathStorage.h index aa378a4..6bfd731 100644 --- a/Sources/OpenRenderBox/include/OpenRenderBox/ORBPathStorage.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPathStorage.h @@ -7,6 +7,8 @@ #pragma once +#if OPENRENDERBOX_CF_CGTYPES + #include #include #if ORB_TARGET_OS_DARWIN @@ -60,3 +62,4 @@ ORB_EXTERN_C_END ORB_ASSUME_NONNULL_END +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBSwiftSupport.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSwiftSupport.h similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBSwiftSupport.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSwiftSupport.h diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBTargetConditionals.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBTargetConditionals.h similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBTargetConditionals.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBTargetConditionals.h diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBUUID.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBUUID.h similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBUUID.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBUUID.h diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/ORBVersion.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBVersion.h similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBox/ORBVersion.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBVersion.h diff --git a/Sources/OpenRenderBox/include/OpenRenderBox/OpenRenderBox.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBox/OpenRenderBox.h rename to Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Path/NestedCallbacks.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Path/NestedCallbacks.hpp similarity index 96% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Path/NestedCallbacks.hpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Path/NestedCallbacks.hpp index f117434..acc6611 100644 --- a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Path/NestedCallbacks.hpp +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Path/NestedCallbacks.hpp @@ -4,6 +4,8 @@ #pragma once +#if OPENRENDERBOX_CF_CGTYPES + #include #include @@ -52,3 +54,4 @@ static_assert(offsetof(NestedCallbacks, nestedIndex) == 0x60, "nestedIndex offse ORB_ASSUME_NONNULL_END +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Path/Storage.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Path/Storage.hpp similarity index 98% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Path/Storage.hpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Path/Storage.hpp index c2d53bb..b9ab8f2 100644 --- a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Path/Storage.hpp +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Path/Storage.hpp @@ -4,6 +4,8 @@ #pragma once +#if OPENRENDERBOX_CF_CGTYPES + #include #include #include @@ -246,3 +248,4 @@ struct ORBPathStorage { ORB_ASSUME_NONNULL_END +#endif /* OPENRENDERBOX_CF_CGTYPES */ diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Util/assert.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Util/assert.hpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Util/log.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Util/log.hpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Vector/realloc_vector.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Vector/realloc_vector.hpp similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Vector/realloc_vector.hpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Vector/realloc_vector.hpp diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Vector/vector.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Vector/vector.hpp similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Vector/vector.hpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Vector/vector.hpp diff --git a/Sources/OpenRenderBox/include/OpenRenderBoxCxx/Vector/vector.tpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Vector/vector.tpp similarity index 100% rename from Sources/OpenRenderBox/include/OpenRenderBoxCxx/Vector/vector.tpp rename to Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Vector/vector.tpp diff --git a/Sources/OpenRenderBox/include/module.modulemap b/Sources/OpenRenderBoxCxx/include/module.modulemap similarity index 87% rename from Sources/OpenRenderBox/include/module.modulemap rename to Sources/OpenRenderBoxCxx/include/module.modulemap index ffce96a..ff7a7d6 100644 --- a/Sources/OpenRenderBox/include/module.modulemap +++ b/Sources/OpenRenderBoxCxx/include/module.modulemap @@ -1,10 +1,9 @@ -module OpenRenderBox { - umbrella header "OpenRenderBox/OpenRenderBox.h" +module OpenRenderBoxCxx { export * } -module OpenRenderBoxCxx { - requires cplusplus +module OpenRenderBoxCxx.C { + umbrella header "OpenRenderBox/OpenRenderBox.h" export * } diff --git a/Tests/OpenRenderBoxCompatibilityTests/Shims.swift b/Tests/OpenRenderBoxCompatibilityTests/Shims.swift index 7f51306..15e362b 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/Shims.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/Shims.swift @@ -9,5 +9,6 @@ public typealias ORBPath = RBPath public let compatibilityTestEnabled = true #else @_exported import OpenRenderBox +@_exported import OpenRenderBoxCxx public let compatibilityTestEnabled = false #endif diff --git a/Tests/OpenRenderBoxCxxTests/Path/PathTests.swift b/Tests/OpenRenderBoxTests/Path/PathTests.swift similarity index 100% rename from Tests/OpenRenderBoxCxxTests/Path/PathTests.swift rename to Tests/OpenRenderBoxTests/Path/PathTests.swift diff --git a/Tests/OpenRenderBoxCxxTests/README.md b/Tests/OpenRenderBoxTests/README.md similarity index 100% rename from Tests/OpenRenderBoxCxxTests/README.md rename to Tests/OpenRenderBoxTests/README.md diff --git a/Tests/OpenRenderBoxCxxTests/Util/LogTests.swift b/Tests/OpenRenderBoxTests/Util/LogTests.swift similarity index 100% rename from Tests/OpenRenderBoxCxxTests/Util/LogTests.swift rename to Tests/OpenRenderBoxTests/Util/LogTests.swift