7#if defined(WITH_OPENCOLORIO)
20static bool compare_floats(
float a,
float b,
float abs_diff,
int ulp_diff)
26 if (
fabsf(a -
b) < abs_diff) {
30 if ((a < 0.0f) != (
b < 0.0f)) {
34 return (
abs((*(
int *)&a) - (*(
int *)&
b)) < ulp_diff);
37static bool color_space_is_invertible(
const OCIO_NAMESPACE::ConstColorSpaceRcPtr &ocio_color_space)
39 const StringRefNull family = ocio_color_space->getFamily();
41 if (
ELEM(family,
"rrt",
"display")) {
47 if (ocio_color_space->isData()) {
52 if (ocio_color_space->getTransform(OCIO_NAMESPACE::COLORSPACE_DIR_TO_REFERENCE)) {
61static void color_space_is_builtin(
const OCIO_NAMESPACE::ConstConfigRcPtr &ocio_config,
62 const OCIO_NAMESPACE::ConstColorSpaceRcPtr &ocio_color_space,
63 bool &is_scene_linear,
66 OCIO_NAMESPACE::ConstProcessorRcPtr processor = create_ocio_processor_silent(
67 ocio_config, ocio_color_space->getName(), OCIO_NAMESPACE::ROLE_SCENE_LINEAR);
70 is_scene_linear =
false;
75 OCIO_NAMESPACE::ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor();
77 is_scene_linear =
true;
79 for (
int i = 0;
i < 256;
i++) {
82 float cR[3] = {
v, 0, 0};
83 float cG[3] = {0,
v, 0};
84 float cB[3] = {0, 0,
v};
85 float cW[3] = {
v,
v,
v};
86 cpu_processor->applyRGB(cR);
87 cpu_processor->applyRGB(cG);
88 cpu_processor->applyRGB(cB);
89 cpu_processor->applyRGB(cW);
92 if (
fabsf(cR[1]) > 1e-5f ||
fabsf(cR[2]) > 1e-5f ||
fabsf(cG[0]) > 1e-5f ||
95 is_scene_linear =
false;
103 is_scene_linear =
false;
109 is_scene_linear =
false;
114 float out_v = (cW[0] + cW[1] + cW[2]) * (1.0f / 3.0f);
116 is_scene_linear =
false;
124LibOCIOColorSpace::LibOCIOColorSpace(
const int index,
125 const OCIO_NAMESPACE::ConstConfigRcPtr &ocio_config,
126 const OCIO_NAMESPACE::ConstColorSpaceRcPtr &ocio_color_space)
127 : ocio_config_(ocio_config),
128 ocio_color_space_(ocio_color_space),
133 is_inveetible_ = color_space_is_invertible(ocio_color_space);
136bool LibOCIOColorSpace::is_scene_linear()
const
138 ensure_srgb_scene_linear_info();
139 return is_scene_linear_;
142bool LibOCIOColorSpace::is_srgb()
const
144 ensure_srgb_scene_linear_info();
148const CPUProcessor *LibOCIOColorSpace::get_to_scene_linear_cpu_processor()
const
150 return to_scene_linear_cpu_processor_.get([&]() -> std::unique_ptr<CPUProcessor> {
151 OCIO_NAMESPACE::ConstProcessorRcPtr ocio_processor = create_ocio_processor(
152 ocio_config_, ocio_color_space_->getName(), OCIO_NAMESPACE::ROLE_SCENE_LINEAR);
153 if (!ocio_processor) {
156 return std::make_unique<LibOCIOCPUProcessor>(ocio_processor->getDefaultCPUProcessor());
160const CPUProcessor *LibOCIOColorSpace::get_from_scene_linear_cpu_processor()
const
162 return from_scene_linear_cpu_processor_.get([&]() -> std::unique_ptr<CPUProcessor> {
163 OCIO_NAMESPACE::ConstProcessorRcPtr ocio_processor = create_ocio_processor(
164 ocio_config_, OCIO_NAMESPACE::ROLE_SCENE_LINEAR, ocio_color_space_->getName());
165 if (!ocio_processor) {
168 return std::make_unique<LibOCIOCPUProcessor>(ocio_processor->getDefaultCPUProcessor());
172void LibOCIOColorSpace::ensure_srgb_scene_linear_info()
const
174 if (is_info_cached_) {
177 color_space_is_builtin(ocio_config_, ocio_color_space_, is_scene_linear_, is_srgb_);
178 is_info_cached_ =
true;
float srgb_to_linearrgb(float c)
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device_inline bool compare_floats(const float a, const float b, float abs_diff, const int ulp_diff)
std::string cleanup_description(const StringRef description)