Skip to content

Commit 141998e

Browse files
committed
Add CorePlatformImage support
1 parent 8eaadf0 commit 141998e

File tree

5 files changed

+300
-1
lines changed

5 files changed

+300
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//
2+
// CorePlatformImage.swift
3+
// OpenSwiftUICore
4+
//
5+
// Audited for RELEASE_2024
6+
// Status: WIP
7+
8+
#if canImport(Darwin)
9+
import Foundation
10+
package import OpenSwiftUI_SPI
11+
12+
@objc(OpenSwiftUICorePlatformImage)
13+
package final class CorePlatformImage: NSObject {
14+
package var system: CoreSystem
15+
package var kitImage: NSObject
16+
package var isTemplate: Bool
17+
18+
package init(system: CoreSystem, kitImage: NSObject) {
19+
self.system = system
20+
self.kitImage = kitImage
21+
self.isTemplate = _CorePlatformImageIsTemplate(system: system, kitImage: kitImage)
22+
super.init()
23+
}
24+
25+
convenience package init(system: CoreSystem, cgImage: CGImage, scale: CGFloat, orientation: UInt8){
26+
self.init(
27+
system: system,
28+
kitImage: _CorePlatformImageMakeKitImage(system: system, cgImage: cgImage, scale: scale, orientation: orientation)
29+
)
30+
}
31+
32+
package var cgImage: CGImage? {
33+
_CorePlatformImageGetCGImage(system: system, kitImage: kitImage)
34+
}
35+
36+
package var size: CGSize {
37+
_CorePlatformImageGetSize(system: system, kitImage: kitImage)
38+
}
39+
40+
package var scale: CGFloat {
41+
_CorePlatformImageGetScale(system: system, kitImage: kitImage)
42+
}
43+
44+
package var imageOrientation: UInt8 {
45+
_CorePlatformImageGetImageOrientation(system: system, kitImage: kitImage)
46+
}
47+
48+
package var baselineOffsetFromBottom: CGFloat {
49+
_CorePlatformImageGetBaselineOffsetFromBottom(system: system, kitImage: kitImage)
50+
}
51+
52+
package var alignmentRect: CGRect {
53+
get { _CorePlatformImageGetAlignmentRect(system: system, kitImage: kitImage) }
54+
set { _CorePlatformImageSetAlignmentRect(system: system, kitImage: kitImage, newValue) }
55+
}
56+
}
57+
#endif

Sources/OpenSwiftUI_SPI/OpenSwiftUIBase.h

+16
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,20 @@
7070

7171
#define OPENSWIFTUI_ENUM CF_ENUM
7272

73+
#ifndef OPENSWIFTUI_IMPLICIT_BRIDGING_ENABLED
74+
#if __has_feature(arc_cf_code_audited)
75+
#define OPENSWIFTUI_IMPLICIT_BRIDGING_ENABLED _Pragma("clang arc_cf_code_audited begin")
76+
#else
77+
#define OPENSWIFTUI_IMPLICIT_BRIDGING_ENABLED
78+
#endif
79+
#endif
80+
81+
#ifndef OPENSWIFTUI_IMPLICIT_BRIDGING_DISABLED
82+
#if __has_feature(arc_cf_code_audited)
83+
#define OPENSWIFTUI_IMPLICIT_BRIDGING_DISABLED _Pragma("clang arc_cf_code_audited end")
84+
#else
85+
#define OPENSWIFTUI_IMPLICIT_BRIDGING_DISABLED
86+
#endif
87+
#endif
88+
7389
#endif /* OpenSwiftUIBase_h */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//
2+
// OpenSwiftUICorePlatformImage.h
3+
// OpenSwiftUI_SPI
4+
//
5+
// Audited for RELEASE_2024
6+
// Status: Complete
7+
8+
#ifndef OpenSwiftUICorePlatformImage_h
9+
#define OpenSwiftUICorePlatformImage_h
10+
11+
#include "OpenSwiftUIBase.h"
12+
13+
#if OPENSWIFTUI_TARGET_OS_DARWIN
14+
15+
#include <CoreGraphics/CoreGraphics.h>
16+
#include "OpenSwiftUICoreSystem.h"
17+
18+
OPENSWIFTUI_IMPLICIT_BRIDGING_ENABLED
19+
20+
OPENSWIFTUI_ASSUME_NONNULL_BEGIN
21+
22+
OPENSWIFTUI_EXPORT
23+
NSObject* _OpenSwiftUICorePlatformImageMakeKitImage(OpenSwiftUICoreSystem system, CGImageRef cgImage, CGFloat scale, uint8_t orientation) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageMakeKitImage(system:cgImage:scale:orientation:));
24+
25+
OPENSWIFTUI_EXPORT
26+
BOOL _OpenSwiftUICorePlatformImageIsTemplate(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageIsTemplate(system:kitImage:));
27+
28+
OPENSWIFTUI_EXPORT
29+
CGImageRef _Nullable _OpenSwiftUICorePlatformImageGetCGImage(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageGetCGImage(system:kitImage:));
30+
31+
OPENSWIFTUI_EXPORT
32+
CGSize _OpenSwiftUICorePlatformImageGetSize(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageGetSize(system:kitImage:));
33+
34+
OPENSWIFTUI_EXPORT
35+
CGFloat _OpenSwiftUICorePlatformImageGetScale(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageGetScale(system:kitImage:));
36+
37+
OPENSWIFTUI_EXPORT
38+
uint8_t _OpenSwiftUICorePlatformImageGetImageOrientation(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageGetImageOrientation(system:kitImage:));
39+
40+
OPENSWIFTUI_EXPORT
41+
CGFloat _OpenSwiftUICorePlatformImageGetBaselineOffsetFromBottom(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageGetBaselineOffsetFromBottom(system:kitImage:));
42+
43+
OPENSWIFTUI_EXPORT
44+
CGRect _OpenSwiftUICorePlatformImageGetAlignmentRect(OpenSwiftUICoreSystem system, id kitImage) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageGetAlignmentRect(system:kitImage:));
45+
46+
OPENSWIFTUI_EXPORT
47+
void _OpenSwiftUICorePlatformImageSetAlignmentRect(OpenSwiftUICoreSystem system, id kitImage, CGRect rect) OPENSWIFTUI_SWIFT_NAME(_CorePlatformImageSetAlignmentRect(system:kitImage:_:));
48+
49+
OPENSWIFTUI_ASSUME_NONNULL_END
50+
51+
OPENSWIFTUI_IMPLICIT_BRIDGING_DISABLED
52+
53+
#endif
54+
55+
#endif /* OpenSwiftUICorePlatformImage_h */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
//
2+
// OpenSwiftUICorePlatformImage.h
3+
// OpenSwiftUICore
4+
//
5+
// Audited for RELEASE_2024
6+
// Status: Blocked by macOS implementation and Mac Catalyst support
7+
8+
#include "OpenSwiftUICorePlatformImage.h"
9+
10+
#if OPENSWIFTUI_TARGET_OS_DARWIN
11+
12+
#include <Foundation/Foundation.h>
13+
#if OPENSWIFTUI_TARGET_OS_IOS
14+
#include <UIKit/UIKit.h>
15+
#else
16+
#include <AppKit/AppKit.h>
17+
#endif
18+
19+
Class _Nullable _OpenSwiftUICorePlatformImageClass(void) {
20+
static BOOL isValid = true;
21+
static Class imageClass;
22+
static dispatch_once_t once;
23+
dispatch_once(&once, ^{
24+
#if OPENSWIFTUI_TARGET_OS_OSX
25+
Class class = NSClassFromString(@"NSImage");
26+
imageClass = class;
27+
isValid = class != nil;
28+
#else
29+
Class class = NSClassFromString(@"UIImage");
30+
imageClass = class;
31+
isValid = class != nil;
32+
#endif
33+
});
34+
if (isValid) {
35+
return imageClass;
36+
} else {
37+
[NSException raise:@"Invalid image class" format:@""];
38+
}
39+
}
40+
41+
NSObject* _OpenSwiftUICorePlatformImageMakeKitImage(OpenSwiftUICoreSystem system, CGImageRef cgImage, CGFloat scale, uint8_t orientation) {
42+
Class imageClass = _OpenSwiftUICorePlatformImageClass();
43+
#if OPENSWIFTUI_TARGET_OS_OSX
44+
if (system == OpenSwiftUICoreSystemAppKit) {
45+
CGSize size = CGSizeMake(CGImageGetWidth(cgImage), CGImageGetHeight(cgImage));
46+
NSImage *kitImage = [[imageClass alloc] initWithCGImage:cgImage size:size];
47+
return kitImage;
48+
} else {
49+
// FIXME: How to import macOS SDK's iOS Support <UIKit/UIImage.h> header here
50+
// UIImage *kitImage = [[imageClass alloc] initWithCGImage:cgImage scale:scale orientation:orientation];
51+
// TODO: Unimplemented
52+
return nil;
53+
}
54+
#else
55+
UIImage *kitImage = [[imageClass alloc] initWithCGImage:cgImage scale:scale orientation:orientation];
56+
if (kitImage.renderingMode == UIImageRenderingModeAlwaysTemplate) {
57+
kitImage = [kitImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
58+
}
59+
if (kitImage.baselineOffsetFromBottom > 0.0) {
60+
kitImage = [kitImage imageWithBaselineOffsetFromBottom:kitImage.baselineOffsetFromBottom];
61+
}
62+
return kitImage;
63+
#endif
64+
}
65+
66+
BOOL _OpenSwiftUICorePlatformImageIsTemplate(OpenSwiftUICoreSystem system, id kitImage) {
67+
#if OPENSWIFTUI_TARGET_OS_OSX
68+
if (system == OpenSwiftUICoreSystemAppKit) {
69+
return NO;
70+
} else {
71+
// FIXME: How to import macOS SDK's iOS Support <UIKit/UIImage.h> header here
72+
return [kitImage renderingMode] == 2 /* UIImageRenderingModeAlwaysTemplate */;
73+
}
74+
#else
75+
return [(UIImage *)kitImage renderingMode] == UIImageRenderingModeAlwaysTemplate;
76+
#endif
77+
}
78+
79+
CGImageRef _OpenSwiftUICorePlatformImageGetCGImage(OpenSwiftUICoreSystem system, id kitImage) {
80+
if (!kitImage) {
81+
return nil;
82+
}
83+
#if OPENSWIFTUI_TARGET_OS_OSX
84+
if (system == OpenSwiftUICoreSystemAppKit) {
85+
return [kitImage CGImageForProposedRect:nil context:nil hints:nil];
86+
} else {
87+
return [kitImage CGImage];
88+
}
89+
#else
90+
return [(UIImage *)kitImage CGImage];
91+
#endif
92+
}
93+
94+
CGSize _OpenSwiftUICorePlatformImageGetSize(OpenSwiftUICoreSystem system, id kitImage) {
95+
CGImageRef cgImage = _OpenSwiftUICorePlatformImageGetCGImage(system, kitImage);
96+
if (!cgImage) {
97+
return CGSizeZero;
98+
}
99+
return CGSizeMake(CGImageGetWidth(cgImage), CGImageGetHeight(cgImage));
100+
}
101+
102+
CGFloat _OpenSwiftUICorePlatformImageGetScale(OpenSwiftUICoreSystem system, id kitImage) {
103+
#if OPENSWIFTUI_TARGET_OS_OSX
104+
if (system == OpenSwiftUICoreSystemAppKit) {
105+
CGFloat kitImageWidth = [(NSImage *)kitImage size].width;
106+
CGFloat cgImageWidth = _OpenSwiftUICorePlatformImageGetSize(OpenSwiftUICoreSystemAppKit, kitImage).width;
107+
CGFloat scale = kitImageWidth / cgImageWidth;
108+
return scale;
109+
} else {
110+
return [kitImage scale];
111+
}
112+
#else
113+
return [(UIImage *)kitImage scale];
114+
#endif
115+
}
116+
117+
uint8_t _OpenSwiftUICorePlatformImageGetImageOrientation(OpenSwiftUICoreSystem system, id kitImage) {
118+
#if OPENSWIFTUI_TARGET_OS_OSX
119+
if (system == OpenSwiftUICoreSystemAppKit) {
120+
return 0;
121+
} else {
122+
// FIXME: How to import macOS SDK's iOS Support <UIKit/UIImage.h> header here
123+
// return [(UIImage *)kitImage imageOrientation];
124+
// TODO: Unimplemented
125+
return 0;
126+
}
127+
#else
128+
return [(UIImage *)kitImage imageOrientation];
129+
#endif
130+
}
131+
132+
CGFloat _OpenSwiftUICorePlatformImageGetBaselineOffsetFromBottom(OpenSwiftUICoreSystem system, id kitImage) {
133+
#if OPENSWIFTUI_TARGET_OS_OSX
134+
if (system == OpenSwiftUICoreSystemAppKit) {
135+
return [(NSImage *)kitImage alignmentRect].origin.y;
136+
} else {
137+
// FIXME: How to import macOS SDK's iOS Support <UIKit/UIImage.h> header here
138+
// return [(UIImage *)kitImage baselineOffsetFromBottom];
139+
// TODO: Unimplemented
140+
return 0.0;
141+
}
142+
#else
143+
return [(UIImage *)kitImage baselineOffsetFromBottom];
144+
#endif
145+
}
146+
147+
CGRect _OpenSwiftUICorePlatformImageGetAlignmentRect(OpenSwiftUICoreSystem system, id kitImage) {
148+
#if OPENSWIFTUI_TARGET_OS_OSX
149+
if (system == OpenSwiftUICoreSystemAppKit) {
150+
return [(NSImage *)kitImage alignmentRect];
151+
} else {
152+
return CGRectZero;
153+
}
154+
#else
155+
return CGRectZero;
156+
#endif
157+
}
158+
159+
void _OpenSwiftUICorePlatformImageSetAlignmentRect(OpenSwiftUICoreSystem system, id kitImage, CGRect rect) {
160+
#if OPENSWIFTUI_TARGET_OS_OSX
161+
if (system == OpenSwiftUICoreSystemAppKit) {
162+
return [(NSImage *)kitImage setAlignmentRect:rect];
163+
} else {
164+
return;
165+
}
166+
#else
167+
return;
168+
#endif
169+
}
170+
171+
#endif

Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/OpenSwiftUICoreSystem.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "OpenSwiftUIBase.h"
1212

1313
typedef OPENSWIFTUI_ENUM(uint8_t, OpenSwiftUICoreSystem) {
14-
OpenSwiftUICoreSystemUIKit ,
14+
OpenSwiftUICoreSystemUIKit,
1515
OpenSwiftUICoreSystemAppKit,
1616
} OPENSWIFTUI_SWIFT_NAME(CoreSystem);
1717

0 commit comments

Comments
 (0)