From 814bef8137ed75cc84952e46b6e5bde22cfc8722 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 16:58:55 +0800 Subject: [PATCH 1/9] Update log and assert header --- .../OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/assert.hpp | 1 - Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Util/log.hpp | 1 - 2 files changed, 2 deletions(-) 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 */ - From 025dc924547f5d0024951c8b59749f4442e61c44 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 16:59:40 +0800 Subject: [PATCH 2/9] Fix ORB_OBJC_FOUNDATION condition --- Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBBase.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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" From bec171ca6446c7f71af97c94f6cfa3f691ec8fbc Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 17:14:15 +0800 Subject: [PATCH 3/9] Add ORBDevice and ORBLayer header --- Sources/OpenRenderBoxCxx/Device/ORBDevice.mm | 34 +++++++++ Sources/OpenRenderBoxCxx/Render/ORBLayer.m | 15 ++++ .../OpenRenderBoxCxx/Device/ORBDevice.hpp | 11 +++ .../OpenRenderBoxObjC/Device/ORBDevice.h | 52 +++++++++++++ .../Render/ORBDrawableStatistics.h | 20 +++++ .../Render/ORBImageRenderer.h | 20 +++++ .../OpenRenderBoxObjC/Render/ORBLayer.h | 73 +++++++++++++++++++ .../OpenRenderBoxCxx/include/module.modulemap | 6 ++ .../Device/DeviceTests.swift | 19 +++++ 9 files changed, 250 insertions(+) create mode 100644 Sources/OpenRenderBoxCxx/Device/ORBDevice.mm create mode 100644 Sources/OpenRenderBoxCxx/Render/ORBLayer.m create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBoxCxx/Device/ORBDevice.hpp create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h create mode 100644 Tests/OpenRenderBoxTests/Device/DeviceTests.swift diff --git a/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm b/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm new file mode 100644 index 0000000..0ffb42d --- /dev/null +++ b/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm @@ -0,0 +1,34 @@ +// +// ORBDevice.mm +// OpenRenderBox + +#include + +#if ORB_OBJC_FOUNDATION + +#include + +// TODO +@implementation ORBDevice + ++ (id)sharedDefaultDevice { + +} + ++ (id)allDevices { + // TODO + return nil; +} + ++ (BOOL)isSupported { + id device = [self sharedDefaultDevice]; + return device != nil; +} + +- (instancetype)initWithDevice:(id)device { + +} + +@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/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/OpenRenderBoxObjC/Device/ORBDevice.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h new file mode 100644 index 0000000..70b7684 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h @@ -0,0 +1,52 @@ +// +// ORBDevice.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include +#include +#include +#include + +@protocol MTLCaptureScope, MTLDevice, OS_dispatch_queue; + +@interface ORBDevice: NSObject + +@property (readonly, nonatomic) id device; +@property (readonly, nonatomic) NSObject *queue; +@property (readonly, nonatomic) id captureScope; +@property uint64_t GPUPriority; +@property uint64_t backgroundGPUPriority; + +///* class methods */ ++ (id)sharedDefaultDevice; ++ (id)allDevices; ++ (BOOL)isSupported; ++ (void)setAllowsRenderingInBackground:(BOOL)background; ++ (BOOL)allowsRenderingInBackground; ++ (unsigned long long)defaultBackgroundGPUPriority; ++ (unsigned long long)defaultGPUPriority; ++ (BOOL)isRunningInBackground; ++ (void)setDefaultBackgroundGPUPriority:(unsigned long long)gpupriority; ++ (void)setDefaultGPUPriority:(unsigned long long)gpupriority; ++ (id)sharedDevice:(id)device; ++ (id)sharedDeviceForDisplay:(unsigned int)display; + +/* instance methods */ +- (void)dealloc; +- (instancetype)initWithDevice:(id)device; +- (CGImageRef)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer; +- (void)collectResources; +- (void)compileShader:(id)shader completionQueue:(id)queue handler:(id /* block */)handler; +- (BOOL)compileShader:(id)shader error:(id *)error; +- (id)pipelineDescriptions:(id)descriptions extraColorFormats:(id)formats; +- (void)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer completionQueue:(id)queue handler:(id /* block */)handler; + +@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..9e387cf --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h @@ -0,0 +1,20 @@ +// +// ORBDrawableStatistics.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include + +@protocol ORBDrawableStatistics +@required +@property (readonly, copy, nonatomic) NSDictionary *statistics; +@property (copy, nonatomic) id /* block */ statisticsHandler; +- (void)resetStatistics:(unsigned long long)statistics alpha:(double)alpha; +@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..ed9860d --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h @@ -0,0 +1,20 @@ +// +// ORBImageRenderer.h +// OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include +#include + +@protocol ORBImageRenderer +@required +- (CGImageRef)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer; +- (void)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer completionQueue:(id)queue handler:(id /* block */)handler; +@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..bf7f515 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h @@ -0,0 +1,73 @@ + // + // ORBLayer.h + // OpenRenderBox + +#pragma once + +#include + +#if ORB_OBJC_FOUNDATION + +#include +#include "ORBDrawableStatistics.h" + +//#include "RBImageQueueLayer.h" +//#include "RBSurfaceContentsLayer.h" +//#include "_RBDrawableDelegate-Protocol.h" +//#include "_RBSharedSurfaceOwner-Protocol.h" + +#include +#include + +@class CAContext, CALayer; + +@interface ORBLayer: CALayer +@property (retain, nonatomic) ORBDevice *device; +@property (nonatomic) BOOL rendersAsynchronously; +@property (nonatomic) int colorMode; +@property (nonatomic) BOOL promotesFramebuffer; +@property (nonatomic) unsigned long long pixelFormat; +@property (nonatomic) BOOL clearsBackground; +//@property (nonatomic) struct { float x0; float x1; float x2; float x3; } clearColor; +@property (nonatomic) long long maxDrawableCount; +@property (nonatomic) BOOL allowsPackedDrawable; +@property (nonatomic) BOOL allowsBottomLeftOrigin; +@property (readonly, nonatomic) BOOL drawableAvailable; +@property (nonatomic) BOOL needsSynchronousUpdate; +@property (readonly) unsigned long long hash; +@property (readonly) Class superclass; +@property (readonly, copy) NSString *description; +@property (readonly, copy) NSString *debugDescription; +@property (readonly, copy, nonatomic) NSDictionary *statistics; +@property (copy, nonatomic) id /* block */ statisticsHandler; + +/* class methods */ ++ (id)defaultValueForKey:(id)key; + +/* instance methods */ +- (void)dealloc; +- (id)init; +- (id)initWithCoder:(id)coder; +- (void)display; +- (void)layoutSublayers; +- (void)displayIfNeeded; +- (void)_renderForegroundInContext:(CGContextRef)context; +- (id)actionForKey:(id)key; +- (id)initWithLayer:(id)layer; +- (BOOL)isDrawableAvailable; +- (void)layerDidBecomeVisible:(BOOL)visible; +- (void)renderInContext:(CGContextRef)context; +- (void)setBounds:(CGRect)bounds; +- (void)setContents:(id)contents; +- (void)_RBDrawableStatisticsDidChange; +- (void)_moveSubsurface:(void *)subsurface; +- (BOOL)_willMoveSubsurface:(unsigned int)subsurface; +- (void)copyImageInRect:(CGRect)rect options:(id)options completionQueue:(id)queue handler:(id /* block */)handler; +- (BOOL)displayWithBounds:(CGRect)bounds callback:(id /* block */)callback; +- (void)drawInDisplayList:(id)list; +- (void)resetStatistics:(unsigned long long)statistics alpha:(double)alpha; +- (void)waitUntilAsyncRenderingCompleted; + +@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/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 From 52acc6cd538cf2808adda54448ca20e10259e8ed Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 17:29:17 +0800 Subject: [PATCH 4/9] Add ORBColor header --- .../include/OpenRenderBox/ORBColor.h | 23 +++++++++++++++++++ .../include/OpenRenderBox/OpenRenderBox.h | 1 + .../OpenRenderBoxObjC/Render/ORBLayer.h | 5 ++-- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBColor.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/OpenRenderBoxObjC/Render/ORBLayer.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h index bf7f515..30896e3 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h @@ -9,7 +9,8 @@ #if ORB_OBJC_FOUNDATION #include -#include "ORBDrawableStatistics.h" +#include +#include //#include "RBImageQueueLayer.h" //#include "RBSurfaceContentsLayer.h" @@ -28,7 +29,7 @@ @property (nonatomic) BOOL promotesFramebuffer; @property (nonatomic) unsigned long long pixelFormat; @property (nonatomic) BOOL clearsBackground; -//@property (nonatomic) struct { float x0; float x1; float x2; float x3; } clearColor; +@property (nonatomic) ORBColor clearColor; @property (nonatomic) long long maxDrawableCount; @property (nonatomic) BOOL allowsPackedDrawable; @property (nonatomic) BOOL allowsBottomLeftOrigin; From aba38939d3422c3e69642babc0699a6c711ca2aa Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 17:51:59 +0800 Subject: [PATCH 5/9] Add DeviceTests --- Sources/OpenRenderBoxCxx/Device/ORBDevice.mm | 10 ++++-- Sources/OpenRenderBoxShims/Export.swift | 5 ++- .../DeviceTests.swift | 34 +++++++++++++++++++ .../Shims.swift | 5 ++- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift diff --git a/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm b/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm index 0ffb42d..d6759c7 100644 --- a/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm +++ b/Sources/OpenRenderBoxCxx/Device/ORBDevice.mm @@ -8,11 +8,11 @@ #include -// TODO @implementation ORBDevice + (id)sharedDefaultDevice { - + // TODO + return nil; } + (id)allDevices { @@ -26,7 +26,11 @@ + (BOOL)isSupported { } - (instancetype)initWithDevice:(id)device { - + self = [super init]; + if (self) { + // TODO + } + return self; } @end 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..3a5ebbe --- /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 ORBDeviceTests { + @Test + func classMethods() { + let device = ORBDevice.sharedDefaultDevice() + #expect(device != nil) + + let devices = ORBDevice.allDevices() + #expect(devices != nil) + + 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/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 From e44e4c3a71e0cac94c6d80b152a031cd86eb8e0c Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 17:59:09 +0800 Subject: [PATCH 6/9] Add LayerTests and optimize header --- .../OpenRenderBoxObjC/Device/ORBDevice.h | 20 ++-- .../OpenRenderBoxObjC/Render/ORBLayer.h | 16 +-- .../DeviceTests.swift | 2 +- .../LayerTests.swift | 112 ++++++++++++++++++ 4 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h index 70b7684..9107bdb 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h @@ -20,22 +20,22 @@ @property (readonly, nonatomic) id device; @property (readonly, nonatomic) NSObject *queue; @property (readonly, nonatomic) id captureScope; -@property uint64_t GPUPriority; -@property uint64_t backgroundGPUPriority; +@property NSUInteger GPUPriority; +@property NSUInteger backgroundGPUPriority; ///* class methods */ -+ (id)sharedDefaultDevice; -+ (id)allDevices; ++ (instancetype)sharedDefaultDevice; ++ (NSArray *)allDevices; + (BOOL)isSupported; + (void)setAllowsRenderingInBackground:(BOOL)background; + (BOOL)allowsRenderingInBackground; -+ (unsigned long long)defaultBackgroundGPUPriority; -+ (unsigned long long)defaultGPUPriority; ++ (NSUInteger)defaultBackgroundGPUPriority; ++ (NSUInteger)defaultGPUPriority; + (BOOL)isRunningInBackground; -+ (void)setDefaultBackgroundGPUPriority:(unsigned long long)gpupriority; -+ (void)setDefaultGPUPriority:(unsigned long long)gpupriority; -+ (id)sharedDevice:(id)device; -+ (id)sharedDeviceForDisplay:(unsigned int)display; ++ (void)setDefaultBackgroundGPUPriority:(NSUInteger)gpupriority; ++ (void)setDefaultGPUPriority:(NSUInteger)gpupriority; ++ (instancetype)sharedDevice:(id)device; ++ (instancetype)sharedDeviceForDisplay:(unsigned int)display; /* instance methods */ - (void)dealloc; diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h index 30896e3..ceb44d4 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h @@ -27,15 +27,15 @@ @property (nonatomic) BOOL rendersAsynchronously; @property (nonatomic) int colorMode; @property (nonatomic) BOOL promotesFramebuffer; -@property (nonatomic) unsigned long long pixelFormat; +@property (nonatomic) NSUInteger pixelFormat; @property (nonatomic) BOOL clearsBackground; @property (nonatomic) ORBColor clearColor; -@property (nonatomic) long long maxDrawableCount; +@property (nonatomic) NSInteger maxDrawableCount; @property (nonatomic) BOOL allowsPackedDrawable; @property (nonatomic) BOOL allowsBottomLeftOrigin; @property (readonly, nonatomic) BOOL drawableAvailable; @property (nonatomic) BOOL needsSynchronousUpdate; -@property (readonly) unsigned long long hash; +@property (readonly) NSUInteger hash; @property (readonly) Class superclass; @property (readonly, copy) NSString *description; @property (readonly, copy) NSString *debugDescription; @@ -47,14 +47,14 @@ /* instance methods */ - (void)dealloc; -- (id)init; -- (id)initWithCoder:(id)coder; +- (instancetype)init; +- (instancetype)initWithCoder:(NSCoder *)coder; - (void)display; - (void)layoutSublayers; - (void)displayIfNeeded; - (void)_renderForegroundInContext:(CGContextRef)context; -- (id)actionForKey:(id)key; -- (id)initWithLayer:(id)layer; +- (id)actionForKey:(NSString *)key; +- (instancetype)initWithLayer:(id)layer; - (BOOL)isDrawableAvailable; - (void)layerDidBecomeVisible:(BOOL)visible; - (void)renderInContext:(CGContextRef)context; @@ -66,7 +66,7 @@ - (void)copyImageInRect:(CGRect)rect options:(id)options completionQueue:(id)queue handler:(id /* block */)handler; - (BOOL)displayWithBounds:(CGRect)bounds callback:(id /* block */)callback; - (void)drawInDisplayList:(id)list; -- (void)resetStatistics:(unsigned long long)statistics alpha:(double)alpha; +- (void)resetStatistics:(NSUInteger)statistics alpha:(double)alpha; - (void)waitUntilAsyncRenderingCompleted; @end diff --git a/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift b/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift index 3a5ebbe..a0c6b6f 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift @@ -11,7 +11,7 @@ import Testing struct ORBDeviceTests { @Test func classMethods() { - let device = ORBDevice.sharedDefaultDevice() + let device = ORBDevice.sharedDefault() #expect(device != nil) let devices = ORBDevice.allDevices() diff --git a/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift new file mode 100644 index 0000000..cf5181c --- /dev/null +++ b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift @@ -0,0 +1,112 @@ +// +// LayerTests.swift +// OpenRenderBoxCompatibilityTests + +import Testing + +#if canImport(Darwin) +import QuartzCore + +@MainActor +@Suite(.enabled(if: compatibilityTestEnabled)) +struct ORBLayerTests { + @Test + func init_layer() { + let layer = ORBLayer() + #expect(layer != nil) + } + + @Test + func deviceProperty() { + let layer = ORBLayer()! + layer.device = ORBDevice.sharedDefault() + #expect(layer.device != nil) + } + + @Test + func rendersAsynchronouslyProperty() { + let layer = ORBLayer()! + layer.rendersAsynchronously = true + #expect(layer.rendersAsynchronously == true) + layer.rendersAsynchronously = false + #expect(layer.rendersAsynchronously == false) + } + + @Test + func colorModeProperty() { + let layer = ORBLayer()! + layer.colorMode = 0 + #expect(layer.colorMode == 0) + layer.colorMode = 1 + #expect(layer.colorMode == 1) + } + + @Test + func promotesFramebufferProperty() { + let layer = ORBLayer()! + layer.promotesFramebuffer = true + #expect(layer.promotesFramebuffer == true) + layer.promotesFramebuffer = false + #expect(layer.promotesFramebuffer == false) + } + + @Test + func clearsBackgroundProperty() { + let layer = ORBLayer()! + layer.clearsBackground = true + #expect(layer.clearsBackground == true) + layer.clearsBackground = false + #expect(layer.clearsBackground == false) + } + + @Test + func maxDrawableCountProperty() { + let layer = ORBLayer()! + layer.maxDrawableCount = 3 + #expect(layer.maxDrawableCount == 3) + } + + @Test + func allowsPackedDrawableProperty() { + let layer = ORBLayer()! + layer.allowsPackedDrawable = true + #expect(layer.allowsPackedDrawable == true) + layer.allowsPackedDrawable = false + #expect(layer.allowsPackedDrawable == false) + } + + @Test + func allowsBottomLeftOriginProperty() { + let layer = ORBLayer()! + layer.allowsBottomLeftOrigin = true + #expect(layer.allowsBottomLeftOrigin == true) + layer.allowsBottomLeftOrigin = false + #expect(layer.allowsBottomLeftOrigin == false) + } + + @Test + func needsSynchronousUpdateProperty() { + let layer = ORBLayer()! + layer.needsSynchronousUpdate = true + #expect(layer.needsSynchronousUpdate == true) + layer.needsSynchronousUpdate = false + #expect(layer.needsSynchronousUpdate == false) + } + + @Test + func drawableAvailableProperty() { + let layer = ORBLayer()! + // Just check it doesn't crash - value depends on device state + _ = layer.drawableAvailable + } + + @Test + func statisticsProperty() { + let layer = ORBLayer()! + // Just check it doesn't crash - may be nil + _ = layer.statistics + } +} + +#endif + From 2b11cb1443f3760437e699eebd88f363e071750e Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 18:09:16 +0800 Subject: [PATCH 7/9] Update header and test case --- .../OpenRenderBoxObjC/Device/ORBDevice.h | 26 ++++---- .../Render/ORBDrawableStatistics.h | 14 ++++- .../Render/ORBImageRenderer.h | 11 +++- .../OpenRenderBoxObjC/Render/ORBLayer.h | 33 +++++----- .../DeviceTests.swift | 4 +- .../LayerTests.swift | 62 ++++--------------- 6 files changed, 69 insertions(+), 81 deletions(-) diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h index 9107bdb..26ec47c 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Device/ORBDevice.h @@ -15,16 +15,18 @@ @protocol MTLCaptureScope, MTLDevice, OS_dispatch_queue; +ORB_ASSUME_NONNULL_BEGIN + @interface ORBDevice: NSObject -@property (readonly, nonatomic) id device; +@property (readonly, nonatomic) id device; @property (readonly, nonatomic) NSObject *queue; -@property (readonly, nonatomic) id captureScope; +@property (readonly, nonatomic, nullable) id captureScope; @property NSUInteger GPUPriority; @property NSUInteger backgroundGPUPriority; -///* class methods */ -+ (instancetype)sharedDefaultDevice; +/* class methods */ ++ (nullable instancetype)sharedDefaultDevice; + (NSArray *)allDevices; + (BOOL)isSupported; + (void)setAllowsRenderingInBackground:(BOOL)background; @@ -34,19 +36,21 @@ + (BOOL)isRunningInBackground; + (void)setDefaultBackgroundGPUPriority:(NSUInteger)gpupriority; + (void)setDefaultGPUPriority:(NSUInteger)gpupriority; -+ (instancetype)sharedDevice:(id)device; -+ (instancetype)sharedDeviceForDisplay:(unsigned int)display; ++ (nullable instancetype)sharedDevice:(id)device; ++ (nullable instancetype)sharedDeviceForDisplay:(unsigned int)display; /* instance methods */ - (void)dealloc; - (instancetype)initWithDevice:(id)device; -- (CGImageRef)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer; +- (nullable CGImageRef)renderImageInRect:(CGRect)rect options:(nullable id)options renderer:(nullable id /* block */)renderer; - (void)collectResources; -- (void)compileShader:(id)shader completionQueue:(id)queue handler:(id /* block */)handler; -- (BOOL)compileShader:(id)shader error:(id *)error; -- (id)pipelineDescriptions:(id)descriptions extraColorFormats:(id)formats; -- (void)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer completionQueue:(id)queue handler:(id /* block */)handler; +- (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 index 9e387cf..5f15021 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDrawableStatistics.h @@ -10,11 +10,19 @@ #include +ORB_ASSUME_NONNULL_BEGIN + @protocol ORBDrawableStatistics + @required -@property (readonly, copy, nonatomic) NSDictionary *statistics; -@property (copy, nonatomic) id /* block */ statisticsHandler; -- (void)resetStatistics:(unsigned long long)statistics alpha:(double)alpha; + +@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 index ed9860d..9ebafd4 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBImageRenderer.h @@ -11,10 +11,17 @@ #include #include +ORB_ASSUME_NONNULL_BEGIN + @protocol ORBImageRenderer + @required -- (CGImageRef)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer; -- (void)renderImageInRect:(CGRect)rect options:(id)options renderer:(id /* block */)renderer completionQueue:(id)queue handler:(id /* block */)handler; + +- (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 index ceb44d4..f88b138 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h @@ -1,6 +1,6 @@ - // - // ORBLayer.h - // OpenRenderBox +// +// ORBLayer.h +// OpenRenderBox #pragma once @@ -22,8 +22,11 @@ @class CAContext, CALayer; +ORB_ASSUME_NONNULL_BEGIN + @interface ORBLayer: CALayer -@property (retain, nonatomic) ORBDevice *device; + +@property (retain, nonatomic, nullable) ORBDevice *device; @property (nonatomic) BOOL rendersAsynchronously; @property (nonatomic) int colorMode; @property (nonatomic) BOOL promotesFramebuffer; @@ -38,37 +41,39 @@ @property (readonly) NSUInteger hash; @property (readonly) Class superclass; @property (readonly, copy) NSString *description; -@property (readonly, copy) NSString *debugDescription; -@property (readonly, copy, nonatomic) NSDictionary *statistics; -@property (copy, nonatomic) id /* block */ statisticsHandler; +@property (readonly, copy, nullable) NSString *debugDescription; +@property (readonly, copy, nonatomic, nullable) NSDictionary *statistics; +@property (copy, nonatomic, nullable) id /* block */ statisticsHandler; /* class methods */ -+ (id)defaultValueForKey:(id)key; ++ (nullable id)defaultValueForKey:(NSString *)key; /* instance methods */ - (void)dealloc; - (instancetype)init; -- (instancetype)initWithCoder:(NSCoder *)coder; +- (nullable instancetype)initWithCoder:(NSCoder *)coder; - (void)display; - (void)layoutSublayers; - (void)displayIfNeeded; - (void)_renderForegroundInContext:(CGContextRef)context; -- (id)actionForKey:(NSString *)key; +- (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:(id)contents; +- (void)setContents:(nullable id)contents; - (void)_RBDrawableStatisticsDidChange; - (void)_moveSubsurface:(void *)subsurface; - (BOOL)_willMoveSubsurface:(unsigned int)subsurface; -- (void)copyImageInRect:(CGRect)rect options:(id)options completionQueue:(id)queue handler:(id /* block */)handler; -- (BOOL)displayWithBounds:(CGRect)bounds callback:(id /* block */)callback; -- (void)drawInDisplayList:(id)list; +- (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/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift b/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift index a0c6b6f..a45a9c6 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/DeviceTests.swift @@ -8,14 +8,14 @@ import Testing @MainActor @Suite(.enabled(if: compatibilityTestEnabled)) -struct ORBDeviceTests { +struct DeviceTests { @Test func classMethods() { let device = ORBDevice.sharedDefault() #expect(device != nil) let devices = ORBDevice.allDevices() - #expect(devices != nil) + #expect(!devices.isEmpty) let supported = ORBDevice.isSupported() #expect(supported == true) diff --git a/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift index cf5181c..e79998b 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift @@ -9,101 +9,65 @@ import QuartzCore @MainActor @Suite(.enabled(if: compatibilityTestEnabled)) -struct ORBLayerTests { +struct LayerTests { @Test - func init_layer() { + func testLayerProperties() { let layer = ORBLayer() - #expect(layer != nil) - } - @Test - func deviceProperty() { - let layer = ORBLayer()! + // device layer.device = ORBDevice.sharedDefault() #expect(layer.device != nil) - } - @Test - func rendersAsynchronouslyProperty() { - let layer = ORBLayer()! + // rendersAsynchronously layer.rendersAsynchronously = true #expect(layer.rendersAsynchronously == true) layer.rendersAsynchronously = false #expect(layer.rendersAsynchronously == false) - } - @Test - func colorModeProperty() { - let layer = ORBLayer()! + // colorMode layer.colorMode = 0 #expect(layer.colorMode == 0) layer.colorMode = 1 #expect(layer.colorMode == 1) - } - @Test - func promotesFramebufferProperty() { - let layer = ORBLayer()! + // promotesFramebuffer layer.promotesFramebuffer = true #expect(layer.promotesFramebuffer == true) layer.promotesFramebuffer = false #expect(layer.promotesFramebuffer == false) - } - @Test - func clearsBackgroundProperty() { - let layer = ORBLayer()! + // clearsBackground layer.clearsBackground = true #expect(layer.clearsBackground == true) layer.clearsBackground = false #expect(layer.clearsBackground == false) - } - @Test - func maxDrawableCountProperty() { - let layer = ORBLayer()! + // maxDrawableCount layer.maxDrawableCount = 3 #expect(layer.maxDrawableCount == 3) - } - @Test - func allowsPackedDrawableProperty() { - let layer = ORBLayer()! + // allowsPackedDrawable layer.allowsPackedDrawable = true #expect(layer.allowsPackedDrawable == true) layer.allowsPackedDrawable = false #expect(layer.allowsPackedDrawable == false) - } - @Test - func allowsBottomLeftOriginProperty() { - let layer = ORBLayer()! + // allowsBottomLeftOrigin layer.allowsBottomLeftOrigin = true #expect(layer.allowsBottomLeftOrigin == true) layer.allowsBottomLeftOrigin = false #expect(layer.allowsBottomLeftOrigin == false) - } - @Test - func needsSynchronousUpdateProperty() { - let layer = ORBLayer()! + // needsSynchronousUpdate layer.needsSynchronousUpdate = true #expect(layer.needsSynchronousUpdate == true) layer.needsSynchronousUpdate = false #expect(layer.needsSynchronousUpdate == false) - } - @Test - func drawableAvailableProperty() { - let layer = ORBLayer()! - // Just check it doesn't crash - value depends on device state + // drawableAvailable - just check it doesn't crash _ = layer.drawableAvailable - } - @Test - func statisticsProperty() { - let layer = ORBLayer()! - // Just check it doesn't crash - may be nil + // statistics - just check it doesn't crash, may be nil _ = layer.statistics } } From 260acf6ecb8ecb682e6a6e191ceb8c16a0dc0193 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 18:14:03 +0800 Subject: [PATCH 8/9] Fix isDrawableAvailable issue --- .../include/OpenRenderBoxObjC/Render/ORBLayer.h | 2 +- Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h index f88b138..a6a1864 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBLayer.h @@ -36,7 +36,7 @@ ORB_ASSUME_NONNULL_BEGIN @property (nonatomic) NSInteger maxDrawableCount; @property (nonatomic) BOOL allowsPackedDrawable; @property (nonatomic) BOOL allowsBottomLeftOrigin; -@property (readonly, nonatomic) BOOL drawableAvailable; +@property (readonly, nonatomic, getter=isDrawableAvailable) BOOL drawableAvailable; @property (nonatomic) BOOL needsSynchronousUpdate; @property (readonly) NSUInteger hash; @property (readonly) Class superclass; diff --git a/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift index e79998b..3f71ec1 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/LayerTests.swift @@ -64,10 +64,7 @@ struct LayerTests { layer.needsSynchronousUpdate = false #expect(layer.needsSynchronousUpdate == false) - // drawableAvailable - just check it doesn't crash - _ = layer.drawableAvailable - - // statistics - just check it doesn't crash, may be nil + _ = layer.isDrawableAvailable _ = layer.statistics } } From 40a3f3df68ad6da162cd0758093a1ec68acc2150 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 4 Jan 2026 18:14:20 +0800 Subject: [PATCH 9/9] Update RenderBox dependency --- Package.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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" } }, {