Skip to content

Commit e4a4e34

Browse files
committed
Add Color.Resolved init with platformColor
1 parent 3d95540 commit e4a4e34

File tree

4 files changed

+145
-1
lines changed

4 files changed

+145
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//
2+
// CoreColor.h
3+
// COpenSwiftUI
4+
// Audited for RELEASE_2024
5+
// Status: Complete
6+
7+
#import "CoreColor.h"
8+
9+
#if OPENSWIFTUI_TARGET_OS_DARWIN
10+
11+
Class CoreColorClass(BOOL isAppKitBased);
12+
13+
#if OPENSWIFTUI_TARGET_OS_OSX
14+
id NSColorSpaceForCGColorSpace(CGColorSpaceRef cgColorSpace);
15+
Class NSColorSpaceClass(void);
16+
#endif
17+
18+
BOOL CoreColorPlatformColorGetComponents(BOOL isAppKitBased, id color, CGFloat *red, CGFloat *green, CGFloat *blue, CGFloat *alpha) {
19+
if (!color) {
20+
return NO;
21+
}
22+
Class colorClass = CoreColorClass(isAppKitBased);
23+
if (colorClass) {
24+
#if OPENSWIFTUI_TARGET_OS_OSX
25+
if (isAppKitBased) {
26+
id colorSpace =
27+
NSColorSpaceForCGColorSpace(CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB));
28+
NSColor *nameSpaceColor = [color colorUsingColorSpace:colorSpace];
29+
if (nameSpaceColor) {
30+
[nameSpaceColor getRed:red green:green blue: blue alpha: alpha];
31+
return YES;
32+
} else {
33+
return NO;
34+
}
35+
}
36+
#endif
37+
return ((BOOL (*)(id, SEL))[color methodForSelector:@selector(getRed:green:blue:alpha:)])(color, @selector(getRed:green:blue:alpha:));
38+
} else {
39+
return NO;
40+
}
41+
}
42+
43+
Class CoreColorGetKitColorClass(BOOL isAppKitBased) {
44+
CoreColorClass(isAppKitBased);
45+
}
46+
47+
Class CoreColorClass(BOOL isAppKitBased) {
48+
static BOOL isValid = false;
49+
static Class colorClass;
50+
static dispatch_once_t once;
51+
dispatch_once(&once, ^{
52+
if (isAppKitBased) {
53+
Class class = NSClassFromString(@"NSColor");
54+
colorClass = class;
55+
isValid = class != nil;
56+
} else {
57+
Class class = NSClassFromString(@"UIColor");
58+
colorClass = class;
59+
isValid = class != nil;
60+
}
61+
});
62+
if (isValid) {
63+
return colorClass;
64+
} else {
65+
[NSException raise:@"Invalid core color" format:@""];
66+
}
67+
}
68+
69+
#if OPENSWIFTUI_TARGET_OS_OSX
70+
id NSColorSpaceForCGColorSpace(CGColorSpaceRef cgColorSpace) {
71+
Class colorSpaceClass = NSColorSpaceClass();
72+
if (colorSpaceClass) {
73+
return [[colorSpaceClass alloc] initWithCGColorSpace:cgColorSpace];
74+
} else {
75+
return nil;
76+
}
77+
}
78+
79+
OPENSWIFTUI_INLINE
80+
Class NSColorSpaceClass(void) {
81+
static Class colorSpaceClass;
82+
static dispatch_once_t once;
83+
dispatch_once(&once, ^{
84+
colorSpaceClass = NSClassFromString(@"NSColorSpace");
85+
});
86+
return colorSpaceClass;
87+
}
88+
#endif
89+
90+
#endif
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// CoreColor.h
3+
// COpenSwiftUI
4+
// Audited for RELEASE_2024
5+
// Status: Complete
6+
7+
#ifndef CoreColor_h
8+
#define CoreColor_h
9+
10+
#include "OpenSwiftUIBase.h"
11+
12+
#if OPENSWIFTUI_TARGET_OS_DARWIN
13+
14+
#if OPENSWIFTUI_TARGET_OS_IOS
15+
#include <UIKit/UIKit.h>
16+
#else
17+
#include <AppKit/AppKit.h>
18+
#endif
19+
20+
OPENSWIFTUI_ASSUME_NONNULL_BEGIN
21+
22+
OPENSWIFTUI_EXPORT
23+
BOOL CoreColorPlatformColorGetComponents(BOOL isAppKitBased, id color, CGFloat *red, CGFloat *green, CGFloat *blue, CGFloat *alpha);
24+
25+
OPENSWIFTUI_EXPORT
26+
Class CoreColorGetKitColorClass(BOOL isAppKitBased);
27+
28+
OPENSWIFTUI_ASSUME_NONNULL_END
29+
30+
#endif
31+
32+
#endif /* CoreColor_h */

Sources/COpenSwiftUI/include/OpenSwiftUITargetConditionals.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@
136136

137137
#define OPENSWIFTUI_TARGET_OS_WIN32 OPENSWIFTUI_TARGET_OS_WINDOWS
138138
#define OPENSWIFTUI_TARGET_OS_MAC OPENSWIFTUI_TARGET_OS_DARWIN
139-
#define OPENSWIFTUI_TARGET_OS_OSX OPENSWIFTUI_TARGET_OS_DARWIN
140139

141140
/* OpenSwiftUI Addition Begin */
142141
#if OPENSWIFTUI_TARGET_OS_DARWIN
143142
#include <TargetConditionals.h>
143+
#define OPENSWIFTUI_TARGET_OS_OSX TARGET_OS_OSX
144144
#define OPENSWIFTUI_TARGET_OS_IPHONE TARGET_OS_IPHONE
145145
#define OPENSWIFTUI_TARGET_OS_IOS TARGET_OS_IOS
146146
#define OPENSWIFTUI_TARGET_OS_WATCH TARGET_OS_WATCH

Sources/OpenSwiftUI/View/Graphic/Color/ColorResolved.swift

+22
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// Status: WIP
77

88
import Foundation
9+
import OpenSwiftUICore
10+
internal import COpenSwiftUI
911

1012
// MARK: - Color.Resolved
1113

@@ -289,3 +291,23 @@ func sRGBToLinear(_ sRGB: Float) -> Float {
289291
}
290292
return sRGB > 0 ? result : -result
291293
}
294+
295+
#if canImport(Darwin)
296+
297+
// MARK: - Color.Resolved + platformColor
298+
299+
extension Color.Resolved {
300+
package init?(platformColor: AnyObject) {
301+
var red: CGFloat = 0
302+
var green: CGFloat = 0
303+
var blue: CGFloat = 0
304+
var alpha: CGFloat = 0
305+
let result = CoreColorPlatformColorGetComponents(isAppKitBased(), platformColor, &red, &green, &blue, &alpha)
306+
if result {
307+
self.init(red: Float(red), green: Float(green), blue: Float(blue), opacity: Float(alpha))
308+
} else {
309+
return nil
310+
}
311+
}
312+
}
313+
#endif

0 commit comments

Comments
 (0)