-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathColorSpace.cpp
More file actions
148 lines (127 loc) · 4.84 KB
/
ColorSpace.cpp
File metadata and controls
148 lines (127 loc) · 4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
//
// ColorSpace.cpp
// OpenRenderBox
#include <OpenRenderBoxCxx/Color/ColorSpace.hpp>
#if ORB_TARGET_OS_DARWIN
#include <CoreFoundation/CFBase.h>
namespace ORB {
std::optional<ColorSpace> color_space_from_cg_name(CFStringRef name) {
if (name == nullptr) {
return std::nullopt;
} else if (CFEqual(name, kCGColorSpaceSRGB) ||
CFEqual(name, kCGColorSpaceExtendedSRGB)) {
return ColorSpace::SRGB;
} else if (CFEqual(name, kCGColorSpaceLinearSRGB) ||
CFEqual(name, kCGColorSpaceExtendedLinearSRGB)) {
return ColorSpace::LinearSRGB;
} else if (CFEqual(name, kCGColorSpaceDisplayP3) ||
CFEqual(name, kCGColorSpaceExtendedDisplayP3)) {
return ColorSpace::DisplayP3;
} else if (CFEqual(name, kCGColorSpaceLinearDisplayP3) ||
CFEqual(name, kCGColorSpaceExtendedLinearDisplayP3)) {
return ColorSpace::LinearDisplayP3;
} else {
return std::nullopt;
}
}
std::optional<ColorSpace> color_space_from_cg(CGColorSpaceRef colorSpace) {
if (colorSpace == nullptr) {
return std::nullopt;
}
CFStringRef name = CGColorSpaceGetName(colorSpace);
return color_space_from_cg_name(name);
}
CGColorSpaceRef cg_color_space(ColorSpace colorSpace, bool extended) {
switch (colorSpace) {
case ColorSpace::LinearSRGB:
return extended ? extended_linear_srgb_colorspace() : linear_srgb_colorspace();
case ColorSpace::SRGB:
return extended ? extended_srgb_colorspace() : srgb_colorspace();
case ColorSpace::LinearDisplayP3:
return extended ? extended_linear_display_p3_colorspace() : linear_display_p3_colorspace();
case ColorSpace::DisplayP3:
return extended ? extended_display_p3_colorspace() : display_p3_colorspace();
case ColorSpace::PQ:
return pq_colorspace();
case ColorSpace::Unknown:
abort();
}
}
CGColorSpaceRef linear_srgb_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB);
return colorSpace;
}
CGColorSpaceRef extended_linear_srgb_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearSRGB);
return colorSpace;
}
CGColorSpaceRef srgb_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
return colorSpace;
}
CGColorSpaceRef extended_srgb_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB);
return colorSpace;
}
CGColorSpaceRef linear_display_p3_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceLinearDisplayP3);
return colorSpace;
}
CGColorSpaceRef extended_linear_display_p3_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearDisplayP3);
return colorSpace;
}
CGColorSpaceRef display_p3_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);
return colorSpace;
}
CGColorSpaceRef extended_display_p3_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedDisplayP3);
return colorSpace;
}
CGColorSpaceRef pq_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceITUR_2100_PQ);
return colorSpace;
}
CGColorSpaceRef gray_colorspace() {
static CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericGrayGamma2_2);
return colorSpace;
}
} /* namespace ORB */
std::optional<ORB::ColorSpace> orb_color_space(ORBColorSpace orbColorSpace) {
switch (orbColorSpace) {
case ORBColorSpaceDefault:
return std::nullopt;
case ORBColorSpaceSRGB:
return ORB::ColorSpace::SRGB;
case ORBColorSpaceLinearSRGB:
return ORB::ColorSpace::LinearSRGB;
case ORBColorSpaceDisplayP3:
return ORB::ColorSpace::DisplayP3;
case ORBColorSpaceLinearDisplayP3:
return ORB::ColorSpace::LinearDisplayP3;
default:
return std::nullopt;
}
}
ORBColorSpace orb_color_space(std::optional<ORB::ColorSpace> colorSpace) {
if (!colorSpace.has_value()) {
return ORBColorSpaceDefault;
}
switch (colorSpace.value()) {
case ORB::ColorSpace::LinearSRGB:
return ORBColorSpaceLinearSRGB;
case ORB::ColorSpace::SRGB:
return ORBColorSpaceSRGB;
case ORB::ColorSpace::LinearDisplayP3:
return ORBColorSpaceLinearDisplayP3;
case ORB::ColorSpace::DisplayP3:
return ORBColorSpaceDisplayP3;
case ORB::ColorSpace::Unknown:
case ORB::ColorSpace::PQ:
return ORBColorSpaceDefault;
default:
return ORBColorSpaceLinearSRGB;
}
}
#endif /* ORB_TARGET_OS_DARWIN */