From aea9fd7c578e2cb9f4429d61a0ecae4fda3ee86c Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 7 Jul 2025 02:50:47 +0800 Subject: [PATCH] Update ViewSystem for CALayer --- .../Render/PlatformViewDefinition.swift | 15 +++++++++-- .../CoreGraphics/OpenSwiftUICoreView.h | 26 +++++++++++++++++++ .../CoreGraphics/OpenSwiftUICoreView.m | 20 ++++++++++++++ .../CoreGraphics/OpenSwiftUIViewSystem.h | 2 +- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h create mode 100644 Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m diff --git a/Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift b/Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift index 155dfee5a..c0775b9a6 100644 --- a/Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift +++ b/Sources/OpenSwiftUICore/Render/PlatformViewDefinition.swift @@ -6,7 +6,7 @@ // Status: Blocked by PlatformDrawable and GraphicsContext import OpenSwiftUI_SPI -#if canImport(Darwin) +#if canImport(QuartzCore) public import QuartzCore #else import Foundation @@ -49,7 +49,7 @@ open class PlatformViewDefinition: @unchecked Sendable { } } - open class var system: PlatformViewDefinition.System { .init(base: .swiftUIView) } + open class var system: PlatformViewDefinition.System { .init(base: .caLayer) } open class func makeView(kind: PlatformViewDefinition.ViewKind) -> AnyObject { _openSwiftUIBaseClassAbstractMethod() } #if canImport(Darwin) open class func makeLayerView(type: CALayer.Type, kind: PlatformViewDefinition.ViewKind) -> AnyObject { _openSwiftUIBaseClassAbstractMethod() } @@ -91,6 +91,17 @@ extension DisplayList.ViewUpdater.Platform { var definition: PlatformViewDefinition.Type { return unsafeBitCast(rawValue & ~3, to: PlatformViewDefinition.Type.self) } + + @inline(__always) + var viewSystem: ViewSystem { + return unsafeBitCast(UInt8(rawValue & 3), to: ViewSystem.self) + } + + #if canImport(QuartzCore) + package func viewLayer(_ view: AnyObject) -> CALayer { + CoreViewLayer(system: viewSystem, view: view) + } + #endif } extension DisplayList.GraphicsRenderer { diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h new file mode 100644 index 000000000..0eedff12b --- /dev/null +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.h @@ -0,0 +1,26 @@ +// +// OpenSwiftUICoreView.h +// OpenSwiftUI_SPI +// +// Status: WIP +// Audited for 6.5.4 + +#ifndef OpenSwiftUICoreView_h +#define OpenSwiftUICoreView_h + +#include "OpenSwiftUIBase.h" + +#if OPENSWIFTUI_TARGET_OS_DARWIN + +#include "OpenSwiftUIViewSystem.h" +#include + +NS_ASSUME_NONNULL_BEGIN + +CALayer * OpenSwiftUICoreViewLayer(OpenSwiftUIViewSystem system, id view) OPENSWIFTUI_SWIFT_NAME(CoreViewLayer(system:view:)); + +NS_ASSUME_NONNULL_END + +#endif /* OPENSWIFTUI_TARGET_OS_DARWIN */ + +#endif /* OpenSwiftUICoreView_h */ diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m new file mode 100644 index 000000000..824cdb17e --- /dev/null +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreView.m @@ -0,0 +1,20 @@ +// +// OpenSwiftUICoreView.m +// OpenSwiftUI_SPI +// +// Status: WIP +// Audited for 6.5.4 + +#import "OpenSwiftUICoreView.h" + +#if OPENSWIFTUI_TARGET_OS_DARWIN + +CALayer * OpenSwiftUICoreViewLayer(OpenSwiftUIViewSystem system, id view) { + if (system == OpenSwiftUIViewSystemCALayer) { + return view; + } else { + return [view layer]; + } +} + +#endif /* OPENSWIFTUI_TARGET_OS_DARWIN */ diff --git a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUIViewSystem.h b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUIViewSystem.h index aba215d81..dc8ba5045 100644 --- a/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUIViewSystem.h +++ b/Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUIViewSystem.h @@ -13,7 +13,7 @@ typedef OPENSWIFTUI_ENUM(uint8_t, OpenSwiftUIViewSystem) { OpenSwiftUIViewSystemUIView, OpenSwiftUIViewSystemNSView, - OpenSwiftUIViewSystemSwiftUIView, + OpenSwiftUIViewSystemCALayer, } OPENSWIFTUI_SWIFT_NAME(ViewSystem); #endif /* OpenSwiftUIViewSystem_h */