diff --git a/Package.resolved b/Package.resolved index b862d91..97bd322 100644 --- a/Package.resolved +++ b/Package.resolved @@ -7,7 +7,7 @@ "location" : "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", "state" : { "branch" : "main", - "revision" : "381059629386a9d6004ebf39c51a0ffb8e67bea8" + "revision" : "ba41f455eb1f321921cfa15b8e0c0537faae418b" } }, { diff --git a/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm b/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm new file mode 100644 index 0000000..d6759c7 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm @@ -0,0 +1,38 @@ +// +// ORBDevice.mm +// OpenRenderBox + +#include + +#if ORB_OBJC_FOUNDATION + +#include + +@implementation ORBDevice + ++ (id)sharedDefaultDevice { + // TODO + return nil; +} + ++ (id)allDevices { + // TODO + return nil; +} + ++ (BOOL)isSupported { + id device = [self sharedDefaultDevice]; + return device != nil; +} + +- (instancetype)initWithDevice:(id)device { + self = [super init]; + if (self) { + // TODO + } + return self; +} + +@end + +#endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/Render/ORBLayer.m b/Sources/OpenRenderBoxCxx/Render/ORBLayer.m new file mode 100644 index 0000000..ef80da7 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/Render/ORBLayer.m @@ -0,0 +1,15 @@ +// +// ORBLayer.m +// OpenRenderBox + +#include + +#if ORB_OBJC_FOUNDATION + +@implementation ORBLayer + +// TODO + +@end + +#endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h index a070f88..5d3236d 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h @@ -60,11 +60,11 @@ #define ORB_EXPORT CF_EXPORT #define ORB_BRIDGED_TYPE CF_BRIDGED_TYPE -#if ORB_TARGET_OS_DARWIN && __ORBJC__ -#define ORB_ORBJC_FOUNDATION 1 +#if ORB_TARGET_OS_DARWIN && __OBJC__ +#define ORB_OBJC_FOUNDATION 1 #else -#define ORB_ORBJC_FOUNDATION 0 -#endif /* TARGET_OS_DARWIN && __ORBJC__ */ +#define ORB_OBJC_FOUNDATION 0 +#endif /* TARGET_OS_DARWIN && __OBJC__ */ #if !ORB_TRRET_OS_DARWIN #include "CFCGTypes.h" diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBColor.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBColor.h new file mode 100644 index 0000000..4683655 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBColor.h @@ -0,0 +1,23 @@ +// +// ORBColor.h +// OpenRenderBox + +#pragma once + +#include + +ORB_ASSUME_NONNULL_BEGIN + +ORB_EXTERN_C_BEGIN + +typedef struct ORBColor { + float red; + float green; + float blue; + float alpha; +} ORBColor; + +ORB_EXTERN_C_END + +ORB_ASSUME_NONNULL_END + diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h index 75bc534..58b753f 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Device/ORBDevice.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Device/ORBDevice.hpp new file mode 100644 index 0000000..ab83344 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Device/ORBDevice.hpp @@ -0,0 +1,11 @@ +// +// ORBDevice.hpp +// OpenRenderBoxCxx + +namespace ORB { + +// WIP +class Device { + +}; +} diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp index 3c3978b..6e81081 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp @@ -10,4 +10,3 @@ namespace ORB { void precondition_failure(const char *format, ...) __cold __dead2; void non_fatal_precondition_failure(const char *format, ...); } /* ORB */ - diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp index e8383e8..a032582 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp @@ -20,4 +20,3 @@ os_log_t error_log(); ORB_ASSUME_NONNULL_END #endif /* ORB_TARGET_OS_DARWIN */ - diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h new file mode 100644 index 0000000..26ec47c --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h @@ -0,0 +1,56 @@ +// +// ORBDevice.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include +#include +#include +#include + +@protocol MTLCaptureScope, MTLDevice, OS_dispatch_queue; + +ORB_ASSUME_NONNULL_BEGIN + +@interface ORBDevice: NSObject + +@property (readonly, nonatomic) id device; +@property (readonly, nonatomic) NSObject *queue; +@property (readonly, nonatomic, nullable) id captureScope; +@property NSUInteger GPUPriority; +@property NSUInteger backgroundGPUPriority; + +/* class methods */ ++ (nullable instancetype)sharedDefaultDevice; ++ (NSArray *)allDevices; ++ (BOOL)isSupported; ++ (void)setAllowsRenderingInBackground:(BOOL)background; ++ (BOOL)allowsRenderingInBackground; ++ (NSUInteger)defaultBackgroundGPUPriority; ++ (NSUInteger)defaultGPUPriority; ++ (BOOL)isRunningInBackground; ++ (void)setDefaultBackgroundGPUPriority:(NSUInteger)gpupriority; ++ (void)setDefaultGPUPriority:(NSUInteger)gpupriority; ++ (nullable instancetype)sharedDevice:(id)device; ++ (nullable instancetype)sharedDeviceForDisplay:(unsigned int)display; + +/* instance methods */ +- (void)dealloc; +- (instancetype)initWithDevice:(id)device; +- (nullable CGImageRef)renderImageInRect:(CGRect)rect options:(nullable id)options renderer:(nullable id /* block */)renderer; +- (void)collectResources; +- (void)compileShader:(id)shader completionQueue:(nullable id)queue handler:(nullable id /* block */)handler; +- (BOOL)compileShader:(id)shader error:(id _Nullable * _Nullable)error; +- (nullable id)pipelineDescriptions:(nullable id)descriptions extraColorFormats:(nullable id)formats; +- (void)renderImageInRect:(CGRect)rect options:(nullable id)options renderer:(nullable id /* block */)renderer completionQueue:(nullable id)queue handler:(nullable id /* block */)handler; + +@end + +ORB_ASSUME_NONNULL_END + +#endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h new file mode 100644 index 0000000..5f15021 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h @@ -0,0 +1,28 @@ +// +// ORBDrawableStatistics.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include + +ORB_ASSUME_NONNULL_BEGIN + +@protocol ORBDrawableStatistics + +@required + +@property (readonly, copy, nonatomic, nullable) NSDictionary *statistics; +@property (copy, nonatomic, nullable) id /* block */ statisticsHandler; + +- (void)resetStatistics:(NSUInteger)statistics alpha:(double)alpha; + +@end + +ORB_ASSUME_NONNULL_END + +#endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h new file mode 100644 index 0000000..9ebafd4 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h @@ -0,0 +1,27 @@ +// +// ORBImageRenderer.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include +#include + +ORB_ASSUME_NONNULL_BEGIN + +@protocol ORBImageRenderer + +@required + +- (nullable CGImageRef)renderImageInRect:(CGRect)rect options:(nullable id)options renderer:(nullable id /* block */)renderer; +- (void)renderImageInRect:(CGRect)rect options:(nullable id)options renderer:(nullable id /* block */)renderer completionQueue:(nullable id)queue handler:(nullable id /* block */)handler; + +@end + +ORB_ASSUME_NONNULL_END + +#endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h new file mode 100644 index 0000000..a6a1864 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h @@ -0,0 +1,79 @@ +// +// ORBLayer.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include +#include +#include + +//#include "RBImageQueueLayer.h" +//#include "RBSurfaceContentsLayer.h" +//#include "_RBDrawableDelegate-Protocol.h" +//#include "_RBSharedSurfaceOwner-Protocol.h" + +#include +#include + +@class CAContext, CALayer; + +ORB_ASSUME_NONNULL_BEGIN + +@interface ORBLayer: CALayer + +@property (retain, nonatomic, nullable) ORBDevice *device; +@property (nonatomic) BOOL rendersAsynchronously; +@property (nonatomic) int colorMode; +@property (nonatomic) BOOL promotesFramebuffer; +@property (nonatomic) NSUInteger pixelFormat; +@property (nonatomic) BOOL clearsBackground; +@property (nonatomic) ORBColor clearColor; +@property (nonatomic) NSInteger maxDrawableCount; +@property (nonatomic) BOOL allowsPackedDrawable; +@property (nonatomic) BOOL allowsBottomLeftOrigin; +@property (readonly, nonatomic, getter=isDrawableAvailable) BOOL drawableAvailable; +@property (nonatomic) BOOL needsSynchronousUpdate; +@property (readonly) NSUInteger hash; +@property (readonly) Class superclass; +@property (readonly, copy) NSString *description; +@property (readonly, copy, nullable) NSString *debugDescription; +@property (readonly, copy, nonatomic, nullable) NSDictionary *statistics; +@property (copy, nonatomic, nullable) id /* block */ statisticsHandler; + +/* class methods */ ++ (nullable id)defaultValueForKey:(NSString *)key; + +/* instance methods */ +- (void)dealloc; +- (instancetype)init; +- (nullable instancetype)initWithCoder:(NSCoder *)coder; +- (void)display; +- (void)layoutSublayers; +- (void)displayIfNeeded; +- (void)_renderForegroundInContext:(CGContextRef)context; +- (nullable id)actionForKey:(NSString *)key; +- (instancetype)initWithLayer:(id)layer; +- (BOOL)isDrawableAvailable; +- (void)layerDidBecomeVisible:(BOOL)visible; +- (void)renderInContext:(CGContextRef)context; +- (void)setBounds:(CGRect)bounds; +- (void)setContents:(nullable id)contents; +- (void)_RBDrawableStatisticsDidChange; +- (void)_moveSubsurface:(void *)subsurface; +- (BOOL)_willMoveSubsurface:(unsigned int)subsurface; +- (void)copyImageInRect:(CGRect)rect options:(nullable id)options completionQueue:(nullable id)queue handler:(nullable id /* block */)handler; +- (BOOL)displayWithBounds:(CGRect)bounds callback:(nullable id /* block */)callback; +- (void)drawInDisplayList:(nullable id)list; +- (void)resetStatistics:(NSUInteger)statistics alpha:(double)alpha; +- (void)waitUntilAsyncRenderingCompleted; + +@end + +ORB_ASSUME_NONNULL_END + +#endif diff --git a/Sources/OpenRenderBoxCxx/include/module.modulemap b/Sources/OpenRenderBoxCxx/include/module.modulemap index ff7a7d6..1d90804 100644 --- a/Sources/OpenRenderBoxCxx/include/module.modulemap +++ b/Sources/OpenRenderBoxCxx/include/module.modulemap @@ -18,3 +18,9 @@ module OpenRenderBoxCxx.Util { umbrella "OpenRenderBoxCxx/Util" export * } + +module OpenRenderBoxCxx.ObjC { + requires objc + umbrella "OpenRenderBoxObjC" + export * +} diff --git a/Sources/OpenRenderBoxShims/Export.swift b/Sources/OpenRenderBoxShims/Export.swift index 7ec7698..197e57c 100644 --- a/Sources/OpenRenderBoxShims/Export.swift +++ b/Sources/OpenRenderBoxShims/Export.swift @@ -4,8 +4,11 @@ #if OPENRENDERBOX_RENDERBOX @_exported public import RenderBox -public typealias ORBUUID = RBUUID +public typealias ORBColor = RBColor +public typealias ORBDevice = RBDevice +public typealias ORBLayer = RBLayer public typealias ORBPath = RBPath +public typealias ORBUUID = RBUUID public let renderBoxEnabled = true #else @_exported import OpenRenderBox diff --git a/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift b/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift new file mode 100644 index 0000000..a45a9c6 --- /dev/null +++ b/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift @@ -0,0 +1,34 @@ +// +// DeviceTests.swift +// OpenRenderBoxCompatibilityTests + +import Testing + +#if canImport(Darwin) + +@MainActor +@Suite(.enabled(if: compatibilityTestEnabled)) +struct DeviceTests { + @Test + func classMethods() { + let device = ORBDevice.sharedDefault() + #expect(device != nil) + + let devices = ORBDevice.allDevices() + #expect(!devices.isEmpty) + + let supported = ORBDevice.isSupported() + #expect(supported == true) + + let priority = ORBDevice.defaultGPUPriority() + #expect(priority >= 0) + + let backgroundPriority = ORBDevice.defaultBackgroundGPUPriority() + #expect(backgroundPriority >= 0) + + let _ = ORBDevice.allowsRenderingInBackground() + } +} + +#endif + diff --git a/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift new file mode 100644 index 0000000..3f71ec1 --- /dev/null +++ b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift @@ -0,0 +1,73 @@ +// +// LayerTests.swift +// OpenRenderBoxCompatibilityTests + +import Testing + +#if canImport(Darwin) +import QuartzCore + +@MainActor +@Suite(.enabled(if: compatibilityTestEnabled)) +struct LayerTests { + @Test + func testLayerProperties() { + let layer = ORBLayer() + + // device + layer.device = ORBDevice.sharedDefault() + #expect(layer.device != nil) + + // rendersAsynchronously + layer.rendersAsynchronously = true + #expect(layer.rendersAsynchronously == true) + layer.rendersAsynchronously = false + #expect(layer.rendersAsynchronously == false) + + // colorMode + layer.colorMode = 0 + #expect(layer.colorMode == 0) + layer.colorMode = 1 + #expect(layer.colorMode == 1) + + // promotesFramebuffer + layer.promotesFramebuffer = true + #expect(layer.promotesFramebuffer == true) + layer.promotesFramebuffer = false + #expect(layer.promotesFramebuffer == false) + + // clearsBackground + layer.clearsBackground = true + #expect(layer.clearsBackground == true) + layer.clearsBackground = false + #expect(layer.clearsBackground == false) + + // maxDrawableCount + layer.maxDrawableCount = 3 + #expect(layer.maxDrawableCount == 3) + + // allowsPackedDrawable + layer.allowsPackedDrawable = true + #expect(layer.allowsPackedDrawable == true) + layer.allowsPackedDrawable = false + #expect(layer.allowsPackedDrawable == false) + + // allowsBottomLeftOrigin + layer.allowsBottomLeftOrigin = true + #expect(layer.allowsBottomLeftOrigin == true) + layer.allowsBottomLeftOrigin = false + #expect(layer.allowsBottomLeftOrigin == false) + + // needsSynchronousUpdate + layer.needsSynchronousUpdate = true + #expect(layer.needsSynchronousUpdate == true) + layer.needsSynchronousUpdate = false + #expect(layer.needsSynchronousUpdate == false) + + _ = layer.isDrawableAvailable + _ = layer.statistics + } +} + +#endif + diff --git a/Tests/OpenRenderBoxCompatibilityTests/Shims.swift b/Tests/OpenRenderBoxCompatibilityTests/Shims.swift index 15e362b..0160549 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/Shims.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/Shims.swift @@ -4,8 +4,11 @@ #if OPENRENDERBOX_COMPATIBILITY_TEST @_exported public import RenderBox -public typealias ORBUUID = RBUUID +public typealias ORBColor = RBColor +public typealias ORBDevice = RBDevice +public typealias ORBLayer = RBLayer public typealias ORBPath = RBPath +public typealias ORBUUID = RBUUID public let compatibilityTestEnabled = true #else @_exported import OpenRenderBox diff --git a/Tests/OpenRenderBoxTests/Device/DeviceTests.swift b/Tests/OpenRenderBoxTests/Device/DeviceTests.swift new file mode 100644 index 0000000..23ff7d6 --- /dev/null +++ b/Tests/OpenRenderBoxTests/Device/DeviceTests.swift @@ -0,0 +1,19 @@ +// +// DeviceTests.swift +// OpenRenderBox +// +// Created by Kyle on 1/4/26. +// + +#if canImport(Darwin) +import Testing +import OpenRenderBoxCxx.ObjC + +@Suite +struct DeviceTests { + @Test + func device() { + let _ = ORBDevice() + } +} +#endif