Skip to content

Commit a662bef

Browse files
authored
Add Color.Resolved kitColor implementation (#115)
* FIx COpenSwiftUI compile issue * Add CoreGraphicsContext and update CoreColor class * Add Color.Resolved kitColor implementation * Fix macOS selector crash issue
1 parent 65d8c50 commit a662bef

File tree

20 files changed

+515
-123
lines changed

20 files changed

+515
-123
lines changed

Sources/COpenSwiftUI/Overlay/CoreColor/CoreColor.m

-90
This file was deleted.

Sources/COpenSwiftUI/ProtocolDescriptor.c renamed to Sources/COpenSwiftUI/ProtocolDescriptor.m

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//
22
// ProtocolDescriptor.c
3+
// FIXME: Use ProtocolDescriptor.m due to COpenSwiftUICore module contains ObjC symbol.
4+
// Solution: Move down to COpenSwiftUICore module.
35
// COpenSwiftUI
46

57

Sources/COpenSwiftUI/include/CoreColor.h

-32
This file was deleted.
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
//
2+
// CoreColor.h
3+
// COpenSwiftUI
4+
// Audited for RELEASE_2024
5+
// Status: Complete
6+
7+
#include "CoreColor.h"
8+
9+
#if OPENSWIFTUI_TARGET_OS_DARWIN
10+
#include "CoreGraphicsContext.h"
11+
12+
Class CoreColorClass(BOOL isAppKitBased);
13+
14+
#if OPENSWIFTUI_TARGET_OS_OSX
15+
id NSColorSpaceForCGColorSpace(CGColorSpaceRef cgColorSpace);
16+
Class NSColorSpaceClass(void);
17+
#endif
18+
19+
BOOL CoreColorPlatformColorGetComponents(BOOL system, id color, CGFloat *red, CGFloat *green, CGFloat *blue, CGFloat *alpha) {
20+
if (!color) {
21+
return NO;
22+
}
23+
Class colorClass = CoreColorClass(system);
24+
if (!colorClass) {
25+
return NO;
26+
}
27+
#if OPENSWIFTUI_TARGET_OS_OSX
28+
if (system) {
29+
id colorSpace = NSColorSpaceForCGColorSpace(CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB));
30+
NSColor *nameSpaceColor = [color colorUsingColorSpace:colorSpace];
31+
if (nameSpaceColor) {
32+
[nameSpaceColor getRed:red green:green blue: blue alpha: alpha];
33+
return YES;
34+
} else {
35+
return NO;
36+
}
37+
}
38+
#endif
39+
// NOTE: Fix Mac Catalyst selector type issue
40+
return ((BOOL (*)(id, SEL))[color methodForSelector:@selector(getRed:green:blue:alpha:)])(color, @selector(getRed:green:blue:alpha:));
41+
}
42+
43+
NSObject *CorePlatformColorForRGBA(BOOL system, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha) {
44+
Class colorClass = CoreColorClass(system);
45+
if (!colorClass) {
46+
return nil;
47+
}
48+
#if OPENSWIFTUI_TARGET_OS_OSX
49+
if (system) {
50+
id colorSpace = NSColorSpaceForCGColorSpace(CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB));
51+
return [colorClass colorWithColorSpace:colorSpace components:(CGFloat[]){red, green, blue, alpha} count:4];
52+
}
53+
#endif
54+
return [[colorClass alloc] initWithRed:red green:green blue:blue alpha:alpha];
55+
}
56+
57+
Class CoreColorGetKitColorClass(BOOL system) {
58+
CoreColorClass(system);
59+
}
60+
61+
Class CoreColorClass(BOOL system) {
62+
static BOOL isValid = false;
63+
static Class colorClass;
64+
static dispatch_once_t once;
65+
dispatch_once(&once, ^{
66+
if (system) {
67+
Class class = NSClassFromString(@"NSColor");
68+
colorClass = class;
69+
isValid = class != nil;
70+
} else {
71+
Class class = NSClassFromString(@"UIColor");
72+
colorClass = class;
73+
isValid = class != nil;
74+
}
75+
});
76+
if (isValid) {
77+
return colorClass;
78+
} else {
79+
[NSException raise:@"Invalid core color" format:@""];
80+
}
81+
}
82+
83+
#if OPENSWIFTUI_TARGET_OS_OSX
84+
id NSColorSpaceForCGColorSpace(CGColorSpaceRef cgColorSpace) {
85+
Class colorSpaceClass = NSColorSpaceClass();
86+
if (colorSpaceClass) {
87+
return [[colorSpaceClass alloc] initWithCGColorSpace:cgColorSpace];
88+
} else {
89+
return nil;
90+
}
91+
}
92+
93+
OPENSWIFTUI_INLINE
94+
Class NSColorSpaceClass(void) {
95+
static Class colorSpaceClass;
96+
static dispatch_once_t once;
97+
dispatch_once(&once, ^{
98+
colorSpaceClass = NSClassFromString(@"NSColorSpace");
99+
});
100+
return colorSpaceClass;
101+
}
102+
#endif
103+
104+
@interface CoreColor () {
105+
CGColorRef _color;
106+
}
107+
@end
108+
109+
@implementation CoreColor
110+
111+
+ (NSObject *)colorWithSystem:(BOOL)system cgColor: (CGColorRef)cgColor {
112+
Class colorClass = CoreColorClass(system);
113+
if (colorClass) {
114+
return [colorClass colorWithCGColor: cgColor];
115+
} else {
116+
return [[CoreColor alloc] initWithCGColor: cgColor];
117+
}
118+
}
119+
120+
+ (NSObject *)blackColorWithSystem:(BOOL)system {
121+
Class colorClass = CoreColorClass(system);
122+
return [colorClass blackColor];
123+
}
124+
125+
+ (NSObject *)systemRedColorWithSystem:(BOOL)system {
126+
Class colorClass = CoreColorClass(system);
127+
return [colorClass systemRedColor];
128+
}
129+
130+
+ (NSObject *)systemOrangeColorWithSystem:(BOOL)system {
131+
Class colorClass = CoreColorClass(system);
132+
return [colorClass systemOrangeColor];
133+
}
134+
135+
+ (NSObject *)systemYellowColorWithSystem:(BOOL)system {
136+
Class colorClass = CoreColorClass(system);
137+
return [colorClass systemYellowColor];
138+
}
139+
140+
+ (NSObject *)systemGreenColorWithSystem:(BOOL)system {
141+
Class colorClass = CoreColorClass(system);
142+
return [colorClass systemGreenColor];
143+
}
144+
145+
+ (NSObject *)systemTealColorWithSystem:(BOOL)system {
146+
Class colorClass = CoreColorClass(system);
147+
return [colorClass systemTealColor];
148+
}
149+
150+
+ (NSObject *)systemMintColorWithSystem:(BOOL)system {
151+
Class colorClass = CoreColorClass(system);
152+
return [colorClass systemMintColor];
153+
}
154+
155+
+ (NSObject *)systemCyanColorWithSystem:(BOOL)system {
156+
Class colorClass = CoreColorClass(system);
157+
return [colorClass systemCyanColor];
158+
}
159+
160+
+ (NSObject *)systemBlueColorWithSystem:(BOOL)system {
161+
Class colorClass = CoreColorClass(system);
162+
return [colorClass systemBlueColor];
163+
}
164+
165+
+ (NSObject *)systemIndigoColorWithSystem:(BOOL)system {
166+
Class colorClass = CoreColorClass(system);
167+
return [colorClass systemIndigoColor];
168+
}
169+
170+
+ (NSObject *)systemPurpleColorWithSystem:(BOOL)system {
171+
Class colorClass = CoreColorClass(system);
172+
return [colorClass systemPurpleColor];
173+
}
174+
175+
+ (NSObject *)systemPinkColorWithSystem:(BOOL)system {
176+
Class colorClass = CoreColorClass(system);
177+
return [colorClass systemPinkColor];
178+
}
179+
180+
+ (NSObject *)systemBrownColorWithSystem:(BOOL)system {
181+
Class colorClass = CoreColorClass(system);
182+
return [colorClass systemBrownColor];
183+
}
184+
185+
+ (NSObject *)systemGrayColorWithSystem:(BOOL)system {
186+
Class colorClass = CoreColorClass(system);
187+
return [colorClass systemGrayColor];
188+
}
189+
190+
- (instancetype)initWithCGColor:(CGColorRef)cgColor {
191+
if (self = [super init]) {
192+
_color = CGColorRetain(cgColor);
193+
}
194+
return self;
195+
}
196+
197+
- (void)dealloc {
198+
CGColorRelease(_color);
199+
}
200+
201+
- (void)set {
202+
CGContextRef context = CoreGraphicsContext.current.CGContext;
203+
if (!context) {
204+
return;
205+
}
206+
CGContextSetFillColorWithColor(context, self.CGColor);
207+
CGContextSetStrokeColorWithColor(context, self.CGColor);
208+
}
209+
210+
- (void)setFill {
211+
CGContextRef context = CoreGraphicsContext.current.CGContext;
212+
if (!context) {
213+
return;
214+
}
215+
CGContextSetFillColorWithColor(context, self.CGColor);
216+
}
217+
218+
- (void)setStroke {
219+
CGContextRef context = CoreGraphicsContext.current.CGContext;
220+
if (!context) {
221+
return;
222+
}
223+
CGContextSetStrokeColorWithColor(context, self.CGColor);
224+
}
225+
226+
- (CGColorRef)CGColor {
227+
return _color;
228+
}
229+
230+
- (CoreColor *)colorWithAlphaComponent:(CGFloat)alpha {
231+
CGColorRef newColor = CGColorCreateCopyWithAlpha(_color, alpha);
232+
CoreColor *color = [[CoreColor alloc] initWithCGColor:newColor];
233+
CGColorRelease(newColor);
234+
return color;
235+
}
236+
237+
@end
238+
239+
#endif

0 commit comments

Comments
 (0)