From 910d6e1022bc3604490970f1e4b2263035ea1ebc Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 25 Oct 2026 20:07:00 +0800 Subject: [PATCH 1/2] feat(animation): add typed symbol update APIs --- Package.resolved | 2 +- .../Animation/ORBSymbolAnimator.swift | 12 ++- .../Animation/ORBSymbolUpdate.swift | 41 ++++++++++ Sources/OpenRenderBox/Path/ORBPath.swift | 8 ++ .../OpenRenderBox/Render/ORBDisplayList.swift | 5 ++ .../Animation/ORBSymbolAnimator.m | 11 +++ .../Animation/ORBSymbolUpdate.m | 30 ++++++++ Sources/OpenRenderBoxCxx/Path/ORBPath.cpp | 12 +++ .../OpenRenderBoxCxx/Render/ORBDisplayList.m | 6 ++ .../include/OpenRenderBox/ORBDrawingState.h | 13 ++++ .../include/OpenRenderBox/ORBPath.h | 12 +++ .../OpenRenderBox/ORBSymbolRenderingMode.h | 20 +++++ .../include/OpenRenderBox/ORBSymbolUpdate.h | 75 +++++++++++++++++++ .../include/OpenRenderBox/OpenRenderBox.h | 5 +- .../Animation/ORBSymbolAnimator.h | 13 ++-- .../OpenRenderBoxObjC/Render/ORBDisplayList.h | 7 ++ Sources/OpenRenderBoxShims/ORBShims.swift | 7 ++ .../ORBShims.swift | 1 + .../SymbolAnimatorTests.swift | 4 +- 19 files changed, 267 insertions(+), 17 deletions(-) create mode 100644 Sources/OpenRenderBox/Animation/ORBSymbolUpdate.swift create mode 100644 Sources/OpenRenderBoxCxx/Animation/ORBSymbolUpdate.m create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBDrawingState.h create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolRenderingMode.h create mode 100644 Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolUpdate.h diff --git a/Package.resolved b/Package.resolved index 51f60e4..0a62266 100644 --- a/Package.resolved +++ b/Package.resolved @@ -7,7 +7,7 @@ "location" : "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", "state" : { "branch" : "main", - "revision" : "d46803e009851e31ff8190fcf2cfc9dee3ed1e0e" + "revision" : "3690622baedc4daf3cf9f9e32b38ede607fc7f11" } }, { diff --git a/Sources/OpenRenderBox/Animation/ORBSymbolAnimator.swift b/Sources/OpenRenderBox/Animation/ORBSymbolAnimator.swift index 59b9241..64abe30 100644 --- a/Sources/OpenRenderBox/Animation/ORBSymbolAnimator.swift +++ b/Sources/OpenRenderBox/Animation/ORBSymbolAnimator.swift @@ -19,7 +19,7 @@ public class ORBSymbolAnimator: NSObject { // MARK: - Properties public var glyph: AnyObject? - public var renderingMode: UInt32 = 0 + public var renderingMode: ORBSymbolRenderingMode = .preferred public var flipsRightToLeft: Bool = false public var variableValue: Double = 0 public var opacities: ORBColor = .clear @@ -79,19 +79,17 @@ public class ORBSymbolAnimator: NSObject { // MARK: - Update - public func beginUpdate(withRenderingMode mode: UInt32) -> OpaquePointer { + public func beginUpdate(with mode: ORBSymbolRenderingMode) -> ORBSymbolUpdate { _openRenderBoxUnimplementedFailure() } - public func beginUpdate(withRenderingMode mode: UInt32, position: UnsafePointer?, size: UnsafePointer?, flags: UInt32) -> OpaquePointer { + public func beginUpdate(with mode: ORBSymbolRenderingMode, position: UnsafePointer?, size: UnsafePointer?, flags: ORBSymbolUpdateFlags) -> ORBSymbolUpdate { _openRenderBoxUnimplementedFailure() } - public func endUpdate(_ update: OpaquePointer) { - _openRenderBoxUnimplementedFailure() - } + public func end(_ update: ORBSymbolUpdate) {} - public func copyDebugDescription(for update: OpaquePointer) -> Any? { + public func copyDebugDescription(for update: ORBSymbolUpdate) -> Any? { _openRenderBoxUnimplementedFailure() } diff --git a/Sources/OpenRenderBox/Animation/ORBSymbolUpdate.swift b/Sources/OpenRenderBox/Animation/ORBSymbolUpdate.swift new file mode 100644 index 0000000..de367ac --- /dev/null +++ b/Sources/OpenRenderBox/Animation/ORBSymbolUpdate.swift @@ -0,0 +1,41 @@ +// +// ORBSymbolUpdate.swift +// OpenRenderBox + +public import OpenCoreGraphicsShims +public import OpenRenderBoxCxx + +#if !canImport(ObjectiveC) + +extension ORBSymbolUpdate { + public var nextTime: Double { .infinity } + public var styleMask: UInt32 { 0 } + public var groupCount: Int { 0 } + + public func groupSize(group: Int) -> Int { 0 } + + public func templateImage(scale: UnsafeMutablePointer?, opacity: UnsafeMutablePointer?) -> CGImage? { + nil + } + + public func draw(in state: ORBDrawingState, resolver: @escaping (ORBSymbolStyle, String?) -> ORBColor) {} +} + +extension ORBSymbolUpdateLayer { + public var drawingOpacity: Float { 0 } + public var style: ORBSymbolStyle { .primary } + public var colorName: String? { nil } + public var defaultColor: CGColor? { nil } + + public func draw(in state: ORBDrawingState, color: ORBColor, opacity: Float, blendMode: ORBBlendMode, flags: ORBSymbolUpdateLayerFlags) {} +} +#endif + +#if !canImport(ObjectiveC) || !OPENRENDERBOX_CF_CGTYPES +extension ORBSymbolUpdateLayer { + public func path(transform: UnsafeMutablePointer, flags: ORBSymbolUpdateLayerFlags) -> ORBPath { + transform.pointee = .identity + return .null + } +} +#endif diff --git a/Sources/OpenRenderBox/Path/ORBPath.swift b/Sources/OpenRenderBox/Path/ORBPath.swift index 2141da5..5242128 100644 --- a/Sources/OpenRenderBox/Path/ORBPath.swift +++ b/Sources/OpenRenderBox/Path/ORBPath.swift @@ -116,6 +116,14 @@ extension ORBPath { // MARK: - Properties extension ORBPath { + public var isNull: Bool { + storage == Self.null.storage && callbacks == Self.null.callbacks + } + + public func copy(transform: UnsafePointer) -> ORBPath { + _openRenderBoxUnimplementedFailure() + } + public var isEmpty: Bool { _openRenderBoxUnimplementedFailure() } diff --git a/Sources/OpenRenderBox/Render/ORBDisplayList.swift b/Sources/OpenRenderBox/Render/ORBDisplayList.swift index fc6e53e..a36ed28 100644 --- a/Sources/OpenRenderBox/Render/ORBDisplayList.swift +++ b/Sources/OpenRenderBox/Render/ORBDisplayList.swift @@ -8,10 +8,15 @@ #if !canImport(ObjectiveC) public import Foundation public import OpenCoreGraphicsShims +public import OpenRenderBoxCxx public final class ORBDisplayList: NSObject, ORBDisplayListContents { // MARK: - Properties + public var state: ORBDrawingState { + _openRenderBoxUnimplementedFailure() + } + public var linearColors: Bool = false public var profile: UInt32 = 0 public var contentRect: CGRect = .zero diff --git a/Sources/OpenRenderBoxCxx/Animation/ORBSymbolAnimator.m b/Sources/OpenRenderBoxCxx/Animation/ORBSymbolAnimator.m index 7aa3634..dd4b2b2 100644 --- a/Sources/OpenRenderBoxCxx/Animation/ORBSymbolAnimator.m +++ b/Sources/OpenRenderBoxCxx/Animation/ORBSymbolAnimator.m @@ -10,6 +10,17 @@ @implementation ORBSymbolAnimator // TODO +- (ORBSymbolUpdate)beginUpdateWithRenderingMode:(ORBSymbolRenderingMode)mode { + return [self beginUpdateWithRenderingMode:mode position:NULL size:NULL flags:0]; +} + +- (ORBSymbolUpdate)beginUpdateWithRenderingMode:(ORBSymbolRenderingMode)mode position:(const CGPoint *)position size:(const CGSize *)size flags:(ORBSymbolUpdateFlags)flags { + [self doesNotRecognizeSelector:_cmd]; + __builtin_trap(); +} + +- (void)endUpdate:(ORBSymbolUpdate)update {} + @end #endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/Animation/ORBSymbolUpdate.m b/Sources/OpenRenderBoxCxx/Animation/ORBSymbolUpdate.m new file mode 100644 index 0000000..ffdb473 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/Animation/ORBSymbolUpdate.m @@ -0,0 +1,30 @@ +// +// ORBSymbolUpdate.m +// OpenRenderBox + +#include + +#if ORB_OBJC_FOUNDATION + +#include + +// Symbol updates are placeholders until the symbol renderer is implemented. +double ORBSymbolUpdateNextTime(ORBSymbolUpdate update) { return INFINITY; } +uint32_t ORBSymbolUpdateStyleMask(ORBSymbolUpdate update) { return 0; } +intptr_t ORBSymbolUpdateGroupCount(ORBSymbolUpdate update) { return 0; } +intptr_t ORBSymbolUpdateGroupSize(ORBSymbolUpdate update, intptr_t group) { return 0; } +CGImageRef ORBSymbolUpdateTemplateImage(ORBSymbolUpdate update, double *scale, float *opacity) { return NULL; } +void ORBSymbolUpdateDrawWithStyleResolver(ORBSymbolUpdate update, ORBDrawingState state, ORBColor (^resolver)(ORBSymbolStyle, NSString *)) {} +float ORBSymbolUpdateLayerDrawingOpacity(ORBSymbolUpdateLayer layer) { return 0; } +ORBSymbolStyle ORBSymbolUpdateLayerStyle(ORBSymbolUpdateLayer layer) { return ORBSymbolStylePrimary; } +NSString *ORBSymbolUpdateLayerColorName(ORBSymbolUpdateLayer layer) { return nil; } +CGColorRef ORBSymbolUpdateLayerDefaultColor(ORBSymbolUpdateLayer layer) { return NULL; } +#if OPENRENDERBOX_CF_CGTYPES +ORBPath ORBSymbolUpdateLayerPath(ORBSymbolUpdateLayer layer, CGAffineTransform *transform, ORBSymbolUpdateLayerFlags flags) { + *transform = CGAffineTransformIdentity; + return ORBPathNull; +} +#endif +void ORBSymbolUpdateLayerDraw(ORBSymbolUpdateLayer layer, ORBDrawingState state, ORBColor color, float opacity, ORBBlendMode blendMode, ORBSymbolUpdateLayerFlags flags) {} + +#endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/Path/ORBPath.cpp b/Sources/OpenRenderBoxCxx/Path/ORBPath.cpp index 3364c4b..b7e041b 100644 --- a/Sources/OpenRenderBoxCxx/Path/ORBPath.cpp +++ b/Sources/OpenRenderBoxCxx/Path/ORBPath.cpp @@ -55,6 +55,18 @@ void ORBPathRelease(ORBPath path) { #if ORB_TARGET_OS_DARWIN +ORBPath ORBPathCopyTransformedPath(ORBPath path, const CGAffineTransform *transform) { + if (ORBPathIsNull(path)) { + return ORBPathNull; + } + CGPathRef source = ORBPathCopyCGPath(path); + CGPathRef transformed = CGPathCreateCopyByTransformingPath(source, transform); + ORBPath result = ORBPathMakeWithCGPath(transformed); + CGPathRelease(transformed); + CGPathRelease(source); + return result; +} + // MARK: - Path Creation namespace { diff --git a/Sources/OpenRenderBoxCxx/Render/ORBDisplayList.m b/Sources/OpenRenderBoxCxx/Render/ORBDisplayList.m index 1604167..bd48800 100644 --- a/Sources/OpenRenderBoxCxx/Render/ORBDisplayList.m +++ b/Sources/OpenRenderBoxCxx/Render/ORBDisplayList.m @@ -18,4 +18,10 @@ @implementation ORBDisplayList @end +ORBDrawingState ORBDisplayListGetState(ORBDisplayList *list) { + // The drawing state is not implemented yet. + [NSException raise:NSInternalInconsistencyException format:@"ORBDisplayListGetState is not implemented"]; + __builtin_trap(); +} + #endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBDrawingState.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBDrawingState.h new file mode 100644 index 0000000..5626dea --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBDrawingState.h @@ -0,0 +1,13 @@ +// +// ORBDrawingState.h +// OpenRenderBox + +#pragma once + +#include + +ORB_ASSUME_NONNULL_BEGIN + +typedef struct _ORBDrawingState *ORBDrawingState ORB_SWIFT_STRUCT; + +ORB_ASSUME_NONNULL_END diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h index e294bd2..b5af719 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBPath.h @@ -85,6 +85,18 @@ ORB_EXPORT ORBPath ORBPathMakeUnevenRoundedRect(CGRect rect, CGFloat topLeftRadius, CGFloat bottomLeftRadius, CGFloat bottomRightRadius, CGFloat topRightRadius, ORBPathRoundedCornerStyle style, const CGAffineTransform * _Nullable transform) ORB_SWIFT_NAME(ORBPath.init(roundedRect:topLeftRadius:bottomLeftRadius:bottomRightRadius:topRightRadius:style:transform:)); #endif +#if ORB_TARGET_OS_DARWIN +// MARK: - Path Transformation + +ORB_EXPORT +ORBPath ORBPathCopyTransformedPath(ORBPath path, const CGAffineTransform *transform) ORB_SWIFT_NAME(ORBPath.copy(self:transform:)); + +static ORB_INLINE bool ORBPathIsNull(ORBPath path) ORB_SWIFT_NAME(getter:ORBPath.isNull(self:)) { + return path.storage == ORBPathNull.storage && path.callbacks == ORBPathNull.callbacks; +} + +#endif + // MARK: - Path Operation ORB_EXPORT diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolRenderingMode.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolRenderingMode.h new file mode 100644 index 0000000..9b7d7f7 --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolRenderingMode.h @@ -0,0 +1,20 @@ +// +// ORBSymbolRenderingMode.h +// OpenRenderBox + +#pragma once + +#include + +typedef ORB_ENUM(uint32_t, ORBSymbolRenderingMode) { + ORBSymbolRenderingModePreferred = 0, + ORBSymbolRenderingModeMonochrome = 1, + ORBSymbolRenderingModeMulticolor = 2, + ORBSymbolRenderingModeHierarchical = 3, + ORBSymbolRenderingModePalette = 4, + ORBSymbolRenderingModeHierarchicalUnlessSlashed = 128, + ORBSymbolRenderingModeHierarchicalSlashBadge = 129, + ORBSymbolRenderingModePaletteSlashBadge = 130, + // No explicit mode. A symbol update keeps the animator's current mode. + ORBSymbolRenderingModeUnspecified = 255, +}; diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolUpdate.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolUpdate.h new file mode 100644 index 0000000..d8de26b --- /dev/null +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/ORBSymbolUpdate.h @@ -0,0 +1,75 @@ +// +// ORBSymbolUpdate.h +// OpenRenderBox + +#pragma once + +#include +#include +#include +#include +#include + +#if ORB_OBJC_FOUNDATION +#include +#endif + +ORB_ASSUME_NONNULL_BEGIN + +typedef ORB_OPTIONS(uint32_t, ORBSymbolUpdateFlags) { + ORBSymbolUpdateFlagsSwapAxes = 1 << 0, + ORBSymbolUpdateFlagsFlipX = 1 << 1, + ORBSymbolUpdateFlagsFlipY = 1 << 2, + ORBSymbolUpdateFlagsMergeLayers = 1 << 4, + // Apply the glyph's vertical alignment offset to each layer transform. + ORBSymbolUpdateFlagsApplyVerticalOffset = 1 << 5, +}; + +typedef ORB_OPTIONS(uint32_t, ORBSymbolUpdateLayerFlags) { + ORBSymbolUpdateLayerFlagsIncludeClips = 1 << 0, +}; + +typedef ORB_ENUM(uint32_t, ORBSymbolStyle) { + ORBSymbolStylePrimary = 0, + ORBSymbolStyleSecondary = 5, + ORBSymbolStyleTertiary = 6, + ORBSymbolStyleQuaternary = 7, + ORBSymbolStyleQuinary = 8, + ORBSymbolStyleNamedColor = 9, +}; + +typedef struct _ORBSymbolUpdate *ORBSymbolUpdate ORB_SWIFT_STRUCT; + +// The update owns all layer data. A layer is valid until endUpdate:. +typedef struct ORBSymbolUpdateLayer { + ORBSymbolUpdate update; + intptr_t group; + intptr_t index; +} ORBSymbolUpdateLayer; + +#if ORB_OBJC_FOUNDATION + +ORB_EXTERN_C_BEGIN + +ORB_EXPORT double ORBSymbolUpdateNextTime(ORBSymbolUpdate update) ORB_SWIFT_NAME(getter:ORBSymbolUpdate.nextTime(self:)); +ORB_EXPORT uint32_t ORBSymbolUpdateStyleMask(ORBSymbolUpdate update) ORB_SWIFT_NAME(getter:ORBSymbolUpdate.styleMask(self:)); +ORB_EXPORT intptr_t ORBSymbolUpdateGroupCount(ORBSymbolUpdate update) ORB_SWIFT_NAME(getter:ORBSymbolUpdate.groupCount(self:)); +ORB_EXPORT intptr_t ORBSymbolUpdateGroupSize(ORBSymbolUpdate update, intptr_t group) ORB_SWIFT_NAME(ORBSymbolUpdate.groupSize(self:group:)); +ORB_EXPORT CGImageRef _Nullable ORBSymbolUpdateTemplateImage(ORBSymbolUpdate update, double * _Nullable scale, float * _Nullable opacity) CF_RETURNS_NOT_RETAINED ORB_SWIFT_NAME(ORBSymbolUpdate.templateImage(self:scale:opacity:)); +ORB_EXPORT void ORBSymbolUpdateDrawWithStyleResolver(ORBSymbolUpdate update, ORBDrawingState state, ORBColor (^resolver)(ORBSymbolStyle, NSString * _Nullable)) ORB_SWIFT_NAME(ORBSymbolUpdate.draw(self:in:resolver:)); + +ORB_EXPORT float ORBSymbolUpdateLayerDrawingOpacity(ORBSymbolUpdateLayer layer) ORB_SWIFT_NAME(getter:ORBSymbolUpdateLayer.drawingOpacity(self:)); +ORB_EXPORT ORBSymbolStyle ORBSymbolUpdateLayerStyle(ORBSymbolUpdateLayer layer) ORB_SWIFT_NAME(getter:ORBSymbolUpdateLayer.style(self:)); +ORB_EXPORT NSString * _Nullable ORBSymbolUpdateLayerColorName(ORBSymbolUpdateLayer layer) ORB_SWIFT_NAME(getter:ORBSymbolUpdateLayer.colorName(self:)); +ORB_EXPORT CGColorRef _Nullable ORBSymbolUpdateLayerDefaultColor(ORBSymbolUpdateLayer layer) CF_RETURNS_NOT_RETAINED ORB_SWIFT_NAME(getter:ORBSymbolUpdateLayer.defaultColor(self:)); +// The update owns the returned path. Copy it before the update ends. +#if OPENRENDERBOX_CF_CGTYPES +ORB_EXPORT ORBPath ORBSymbolUpdateLayerPath(ORBSymbolUpdateLayer layer, CGAffineTransform *transform, ORBSymbolUpdateLayerFlags flags) ORB_SWIFT_NAME(ORBSymbolUpdateLayer.path(self:transform:flags:)); +#endif +ORB_EXPORT void ORBSymbolUpdateLayerDraw(ORBSymbolUpdateLayer layer, ORBDrawingState state, ORBColor color, float opacity, ORBBlendMode blendMode, ORBSymbolUpdateLayerFlags flags) ORB_SWIFT_NAME(ORBSymbolUpdateLayer.draw(self:in:color:opacity:blendMode:flags:)); + +ORB_EXTERN_C_END + +#endif /* ORB_OBJC_FOUNDATION */ + +ORB_ASSUME_NONNULL_END diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h index 1528e35..d5e7cb7 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBox/OpenRenderBox.h @@ -1,13 +1,16 @@ #include -#include #include #include #include #include +#include #include #include #include #include +#include +#include +#include #include #include #include diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Animation/ORBSymbolAnimator.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Animation/ORBSymbolAnimator.h index 2a91a17..eef5f44 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Animation/ORBSymbolAnimator.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Animation/ORBSymbolAnimator.h @@ -9,6 +9,8 @@ #if ORB_OBJC_FOUNDATION #include +#include +#include #include #include #include @@ -17,13 +19,12 @@ ORB_ASSUME_NONNULL_BEGIN @class CUINamedVectorGlyph; -struct _ORBSymbolUpdate; // TODO @interface ORBSymbolAnimator : NSObject @property (retain, nonatomic, nullable) CUINamedVectorGlyph *glyph; -@property (nonatomic) unsigned int renderingMode; +@property (nonatomic) ORBSymbolRenderingMode renderingMode; @property (nonatomic) BOOL flipsRightToLeft; @property (nonatomic) double variableValue; @property (nonatomic) ORBColor opacities; @@ -45,16 +46,16 @@ struct _ORBSymbolUpdate; /* instance methods */ - (unsigned int)addAnimation:(ORBSymbolAnimation)animation options:(nullable id)options ORB_SWIFT_NAME(addAnimation(_:options:)); -- (struct _ORBSymbolUpdate *)beginUpdateWithRenderingMode:(unsigned int)mode; -- (void)endUpdate:(struct _ORBSymbolUpdate *)update; +- (ORBSymbolUpdate)beginUpdateWithRenderingMode:(ORBSymbolRenderingMode)mode; +- (void)endUpdate:(ORBSymbolUpdate)update; - (void)removeAllAnimations; - (void)removeAnimation:(ORBSymbolAnimation)animation ORB_SWIFT_NAME(removeAnimation(_:)); -- (struct _ORBSymbolUpdate *)beginUpdateWithRenderingMode:(unsigned int)mode position:(nullable const CGPoint *)position size:(nullable const CGSize *)size flags:(unsigned int)flags; +- (ORBSymbolUpdate)beginUpdateWithRenderingMode:(ORBSymbolRenderingMode)mode position:(nullable const CGPoint *)position size:(nullable const CGSize *)size flags:(ORBSymbolUpdateFlags)flags; - (void)cancelAllAnimations; - (void)cancelAnimation:(ORBSymbolAnimation)animation ORB_SWIFT_NAME(cancelAnimation(_:)); - (void)cancelAnimationWithID:(unsigned int)animationID; - (ORBColor)colorForStyle:(unsigned int)style; -- (nullable id)copyDebugDescriptionForUpdate:(struct _ORBSymbolUpdate *)update; +- (nullable id)copyDebugDescriptionForUpdate:(ORBSymbolUpdate)update; - (void)removeAnimationWithID:(unsigned int)animationID; - (void)setColor:(ORBColor)color forStyle:(unsigned int)style; - (void)setPriority:(float)priority ofAnimationWithID:(unsigned int)animationID; diff --git a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDisplayList.h b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDisplayList.h index ff88559..2fdc53b 100644 --- a/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDisplayList.h +++ b/Sources/OpenRenderBoxCxx/include/OpenRenderBoxObjC/Render/ORBDisplayList.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -112,6 +113,12 @@ ORB_ASSUME_NONNULL_BEGIN @end +ORB_EXTERN_C_BEGIN + +ORB_EXPORT ORBDrawingState ORBDisplayListGetState(ORBDisplayList *list) ORB_SWIFT_NAME(getter:ORBDisplayList.state(self:)); + +ORB_EXTERN_C_END + ORB_ASSUME_NONNULL_END #endif /* ORB_OBJC_FOUNDATION */ diff --git a/Sources/OpenRenderBoxShims/ORBShims.swift b/Sources/OpenRenderBoxShims/ORBShims.swift index 7c3bbf9..51ae8b7 100644 --- a/Sources/OpenRenderBoxShims/ORBShims.swift +++ b/Sources/OpenRenderBoxShims/ORBShims.swift @@ -34,6 +34,7 @@ public typealias ORBDisplayListInterpolator = RBDisplayListInterpolator public typealias ORBDisplayListPredicate = RBDisplayListPredicate public typealias ORBDisplayListRenderKey = RBDisplayListRenderKey public typealias ORBDisplayListTransform = RBDisplayListTransform +public typealias ORBDrawingState = RBDrawingState public typealias ORBLayer = RBLayer public typealias ORBLayerDelegate = RBLayerDelegate public typealias ORBPath = RBPath @@ -43,6 +44,12 @@ public typealias ORBSymbolAnimation = RBSymbolAnimation public typealias ORBSymbolScaleLevel = RBSymbolScaleLevel public typealias ORBSymbolAnimator = RBSymbolAnimator public typealias ORBSymbolAnimatorObserver = RBSymbolAnimatorObserver +public typealias ORBSymbolRenderingMode = RBSymbolRenderingMode +public typealias ORBSymbolUpdate = RBSymbolUpdate +public typealias ORBSymbolUpdateFlags = RBSymbolUpdateFlags +public typealias ORBSymbolUpdateLayer = RBSymbolUpdateLayer +public typealias ORBSymbolUpdateLayerFlags = RBSymbolUpdateLayerFlags +public typealias ORBSymbolStyle = RBSymbolStyle public let renderBoxVendor = RenderBoxVendor.rb #else diff --git a/Tests/OpenRenderBoxCompatibilityTests/ORBShims.swift b/Tests/OpenRenderBoxCompatibilityTests/ORBShims.swift index 705a5b2..7001808 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/ORBShims.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/ORBShims.swift @@ -20,6 +20,7 @@ public typealias ORBSymbolAnimation = RBSymbolAnimation public typealias ORBSymbolScaleLevel = RBSymbolScaleLevel public typealias ORBSymbolAnimator = RBSymbolAnimator public typealias ORBSymbolAnimatorObserver = RBSymbolAnimatorObserver +public typealias ORBSymbolRenderingMode = RBSymbolRenderingMode public let compatibilityTestEnabled = true #else diff --git a/Tests/OpenRenderBoxCompatibilityTests/SymbolAnimatorTests.swift b/Tests/OpenRenderBoxCompatibilityTests/SymbolAnimatorTests.swift index 274efcd..9321dfe 100644 --- a/Tests/OpenRenderBoxCompatibilityTests/SymbolAnimatorTests.swift +++ b/Tests/OpenRenderBoxCompatibilityTests/SymbolAnimatorTests.swift @@ -35,8 +35,8 @@ struct SymbolAnimatorTests { func renderingProperties() { let animator = ORBSymbolAnimator() - animator.renderingMode = 1 - #expect(animator.renderingMode == 1) + animator.renderingMode = .monochrome + #expect(animator.renderingMode == .monochrome) animator.flipsRightToLeft = true #expect(animator.flipsRightToLeft == true) From ee44f00f7f30275781290898d15a58fbe97a17e4 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 25 Oct 2026 21:05:03 +0800 Subject: [PATCH 2/2] chore(deps): bump OpenCoreGraphics for CGColor APIs --- Package.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.resolved b/Package.resolved index 0a62266..8d831db 100644 --- a/Package.resolved +++ b/Package.resolved @@ -16,7 +16,7 @@ "location" : "https://github.com/OpenSwiftUIProject/OpenCoreGraphics", "state" : { "branch" : "main", - "revision" : "df5ab4c4dcd0afc8fde978f6a0ad5228bb8aee17" + "revision" : "0d7a0d0d9e236cbf9dea2f10a5b0b88c8789d9e4" } }, {