27 # pragma warning(push)
28 # pragma warning(disable : 4251 4275)
30 #include <OpenColorIO/OpenColorIO.h>
35 using namespace OCIO_NAMESPACE;
45 #if !defined(WITH_ASSERT_ABORT)
49 # define OCIO_abort() abort()
53 # define __func__ __FUNCTION__
58 std::cerr <<
"OpenColorIO Error: " <<
err << std::endl;
68 OCIO_ConstConfigRcPtr *OCIOImpl::getCurrentConfig(
void)
70 ConstConfigRcPtr *config = OBJECT_GUARDED_NEW(ConstConfigRcPtr);
73 *config = GetCurrentConfig();
76 return (OCIO_ConstConfigRcPtr *)config;
78 catch (Exception &exception) {
82 OBJECT_GUARDED_DELETE(config, ConstConfigRcPtr);
87 void OCIOImpl::setCurrentConfig(
const OCIO_ConstConfigRcPtr *config)
90 SetCurrentConfig(*(ConstConfigRcPtr *)config);
92 catch (Exception &exception) {
97 OCIO_ConstConfigRcPtr *OCIOImpl::configCreateFromEnv(
void)
99 ConstConfigRcPtr *config = OBJECT_GUARDED_NEW(ConstConfigRcPtr);
102 *config = Config::CreateFromEnv();
105 return (OCIO_ConstConfigRcPtr *)config;
107 catch (Exception &exception) {
111 OBJECT_GUARDED_DELETE(config, ConstConfigRcPtr);
116 OCIO_ConstConfigRcPtr *OCIOImpl::configCreateFromFile(
const char *filename)
118 ConstConfigRcPtr *config = OBJECT_GUARDED_NEW(ConstConfigRcPtr);
121 *config = Config::CreateFromFile(filename);
124 return (OCIO_ConstConfigRcPtr *)config;
126 catch (Exception &exception) {
130 OBJECT_GUARDED_DELETE(config, ConstConfigRcPtr);
135 void OCIOImpl::configRelease(OCIO_ConstConfigRcPtr *config)
137 OBJECT_GUARDED_DELETE((ConstConfigRcPtr *)config, ConstConfigRcPtr);
140 int OCIOImpl::configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config)
143 return (*(ConstConfigRcPtr *)config)->getNumColorSpaces();
145 catch (Exception &exception) {
152 const char *OCIOImpl::configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config,
int index)
155 return (*(ConstConfigRcPtr *)config)->getColorSpaceNameByIndex(index);
157 catch (Exception &exception) {
164 OCIO_ConstColorSpaceRcPtr *OCIOImpl::configGetColorSpace(OCIO_ConstConfigRcPtr *config,
167 ConstColorSpaceRcPtr *cs = OBJECT_GUARDED_NEW(ConstColorSpaceRcPtr);
170 *cs = (*(ConstConfigRcPtr *)config)->getColorSpace(name);
173 return (OCIO_ConstColorSpaceRcPtr *)cs;
175 catch (Exception &exception) {
179 OBJECT_GUARDED_DELETE(cs, ConstColorSpaceRcPtr);
184 int OCIOImpl::configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config,
const char *name)
187 return (*(ConstConfigRcPtr *)config)->getIndexForColorSpace(name);
189 catch (Exception &exception) {
196 const char *OCIOImpl::configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config)
199 return (*(ConstConfigRcPtr *)config)->getDefaultDisplay();
201 catch (Exception &exception) {
208 int OCIOImpl::configGetNumDisplays(OCIO_ConstConfigRcPtr *config)
211 return (*(ConstConfigRcPtr *)config)->getNumDisplays();
213 catch (Exception &exception) {
220 const char *OCIOImpl::configGetDisplay(OCIO_ConstConfigRcPtr *config,
int index)
223 return (*(ConstConfigRcPtr *)config)->getDisplay(index);
225 catch (Exception &exception) {
232 const char *OCIOImpl::configGetDefaultView(OCIO_ConstConfigRcPtr *config,
const char *display)
235 return (*(ConstConfigRcPtr *)config)->getDefaultView(display);
237 catch (Exception &exception) {
244 int OCIOImpl::configGetNumViews(OCIO_ConstConfigRcPtr *config,
const char *display)
247 return (*(ConstConfigRcPtr *)config)->getNumViews(display);
249 catch (Exception &exception) {
256 const char *OCIOImpl::configGetView(OCIO_ConstConfigRcPtr *config,
const char *display,
int index)
259 return (*(ConstConfigRcPtr *)config)->getView(display, index);
261 catch (Exception &exception) {
268 const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
273 return (*(ConstConfigRcPtr *)config)->getDisplayViewColorSpaceName(display,
view);
275 catch (Exception &exception) {
282 void OCIOImpl::configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config,
float *rgb)
285 double rgb_double[3];
286 (*(ConstConfigRcPtr *)config)->getDefaultLumaCoefs(rgb_double);
287 rgb[0] = rgb_double[0];
288 rgb[1] = rgb_double[1];
289 rgb[2] = rgb_double[2];
291 catch (Exception &exception) {
297 const char *colorspace,
298 float to_scene_linear[3][3])
300 ConstProcessorRcPtr processor;
302 processor = config->getProcessor(colorspace, ROLE_SCENE_LINEAR);
304 catch (Exception &exception) {
313 ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor();
314 if (!cpu_processor) {
319 cpu_processor->applyRGB(to_scene_linear[0]);
320 cpu_processor->applyRGB(to_scene_linear[1]);
321 cpu_processor->applyRGB(to_scene_linear[2]);
325 void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_,
float xyz_to_rgb[3][3])
327 ConstConfigRcPtr config = (*(ConstConfigRcPtr *)config_);
334 if (!config->hasRole(ROLE_SCENE_LINEAR)) {
338 if (config->hasRole(
"aces_interchange")) {
340 const float xyz_E_to_aces[3][3] = {{1.0498110175f, -0.4959030231f, 0.0f},
341 {0.0f, 1.3733130458f, 0.0f},
342 {-0.0000974845f, 0.0982400361f, 0.9912520182f}};
343 const float xyz_D65_to_E[3][3] = {
344 {1.0521111f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 0.9184170f}};
346 float aces_to_rgb[3][3];
351 else if (config->hasRole(
"XYZ")) {
357 int OCIOImpl::configGetNumLooks(OCIO_ConstConfigRcPtr *config)
360 return (*(ConstConfigRcPtr *)config)->getNumLooks();
362 catch (Exception &exception) {
369 const char *OCIOImpl::configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config,
int index)
372 return (*(ConstConfigRcPtr *)config)->getLookNameByIndex(index);
374 catch (Exception &exception) {
381 OCIO_ConstLookRcPtr *OCIOImpl::configGetLook(OCIO_ConstConfigRcPtr *config,
const char *name)
383 ConstLookRcPtr *look = OBJECT_GUARDED_NEW(ConstLookRcPtr);
386 *look = (*(ConstConfigRcPtr *)config)->getLook(name);
389 return (OCIO_ConstLookRcPtr *)look;
391 catch (Exception &exception) {
395 OBJECT_GUARDED_DELETE(look, ConstLookRcPtr);
400 const char *OCIOImpl::lookGetProcessSpace(OCIO_ConstLookRcPtr *look)
402 return (*(ConstLookRcPtr *)look)->getProcessSpace();
405 void OCIOImpl::lookRelease(OCIO_ConstLookRcPtr *look)
407 OBJECT_GUARDED_DELETE((ConstLookRcPtr *)look, ConstLookRcPtr);
410 int OCIOImpl::colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs_)
412 ConstColorSpaceRcPtr *cs = (ConstColorSpaceRcPtr *)cs_;
413 const char *family = (*cs)->getFamily();
415 if (!strcmp(family,
"rrt") || !strcmp(family,
"display")) {
421 if ((*cs)->isData()) {
426 if ((*cs)->getTransform(COLORSPACE_DIR_TO_REFERENCE)) {
435 int OCIOImpl::colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs)
437 return (*(ConstColorSpaceRcPtr *)cs)->isData();
445 if (
fabsf(
a - b) < abs_diff) {
449 if ((
a < 0.0f) != (b < 0.0f)) {
453 return (
abs((*(
int *)&
a) - (*(
int *)&b)) < ulp_diff);
456 void OCIOImpl::colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config_,
457 OCIO_ConstColorSpaceRcPtr *cs_,
458 bool &is_scene_linear,
461 ConstConfigRcPtr *config = (ConstConfigRcPtr *)config_;
462 ConstColorSpaceRcPtr *cs = (ConstColorSpaceRcPtr *)cs_;
463 ConstProcessorRcPtr processor;
466 processor = (*config)->getProcessor((*cs)->getName(),
"scene_linear");
468 catch (Exception &) {
470 is_scene_linear =
false;
475 ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor();
477 is_scene_linear =
true;
479 for (
int i = 0; i < 256; i++) {
480 float v = i / 255.0f;
482 float cR[3] = {
v, 0, 0};
483 float cG[3] = {0,
v, 0};
484 float cB[3] = {0, 0,
v};
485 float cW[3] = {
v,
v,
v};
486 cpu_processor->applyRGB(cR);
487 cpu_processor->applyRGB(cG);
488 cpu_processor->applyRGB(cB);
489 cpu_processor->applyRGB(cW);
492 if (
fabsf(cR[1]) > 1e-5f ||
fabsf(cR[2]) > 1e-5f ||
fabsf(cG[0]) > 1e-5f ||
493 fabsf(cG[2]) > 1e-5f ||
fabsf(cB[0]) > 1e-5f ||
fabsf(cB[1]) > 1e-5f) {
494 is_scene_linear =
false;
501 is_scene_linear =
false;
507 is_scene_linear =
false;
512 float out_v = (cW[0] + cW[1] + cW[2]) * (1.0f / 3.0f);
514 is_scene_linear =
false;
522 void OCIOImpl::colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs)
524 OBJECT_GUARDED_DELETE((ConstColorSpaceRcPtr *)cs, ConstColorSpaceRcPtr);
527 OCIO_ConstProcessorRcPtr *OCIOImpl::configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
531 ConstProcessorRcPtr *processor = OBJECT_GUARDED_NEW(ConstProcessorRcPtr);
534 *processor = (*(ConstConfigRcPtr *)config)->getProcessor(srcName, dstName);
537 return (OCIO_ConstProcessorRcPtr *)processor;
539 catch (Exception &exception) {
543 OBJECT_GUARDED_DELETE(processor, ConstProcessorRcPtr);
548 void OCIOImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor)
550 OBJECT_GUARDED_DELETE(processor, ConstProcessorRcPtr);
553 OCIO_ConstCPUProcessorRcPtr *OCIOImpl::processorGetCPUProcessor(
554 OCIO_ConstProcessorRcPtr *processor)
556 ConstCPUProcessorRcPtr *cpu_processor = OBJECT_GUARDED_NEW(ConstCPUProcessorRcPtr);
557 *cpu_processor = (*(ConstProcessorRcPtr *)processor)->getDefaultCPUProcessor();
558 return (OCIO_ConstCPUProcessorRcPtr *)cpu_processor;
561 void OCIOImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
562 OCIO_PackedImageDesc *img)
565 (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*(PackedImageDesc *)img);
567 catch (Exception &exception) {
572 void OCIOImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
573 OCIO_PackedImageDesc *img_)
576 PackedImageDesc *img = (PackedImageDesc *)img_;
577 int channels = img->getNumChannels();
580 assert(img->isFloat());
581 float *pixels = (
float *)img->getData();
583 int width = img->getWidth();
584 int height = img->getHeight();
588 float *pixel = pixels + 4 * (
y *
width +
x);
590 cpuProcessorApplyRGBA_predivide(cpu_processor, pixel);
595 (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*img);
598 catch (Exception &exception) {
603 void OCIOImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
float *pixel)
605 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGB(pixel);
608 void OCIOImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
float *pixel)
610 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel);
613 void OCIOImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
616 if (pixel[3] == 1.0f || pixel[3] == 0.0f) {
617 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel);
620 float alpha, inv_alpha;
623 inv_alpha = 1.0f /
alpha;
625 pixel[0] *= inv_alpha;
626 pixel[1] *= inv_alpha;
627 pixel[2] *= inv_alpha;
629 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel);
637 void OCIOImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor)
639 OBJECT_GUARDED_DELETE(cpu_processor, ConstCPUProcessorRcPtr);
642 const char *OCIOImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs)
644 return (*(ConstColorSpaceRcPtr *)cs)->getName();
647 const char *OCIOImpl::colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs)
649 return (*(ConstColorSpaceRcPtr *)cs)->getDescription();
652 const char *OCIOImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs)
654 return (*(ConstColorSpaceRcPtr *)cs)->getFamily();
657 OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr *config_,
663 const float exponent)
666 ConstConfigRcPtr config = *(ConstConfigRcPtr *)config_;
667 GroupTransformRcPtr group = GroupTransform::Create();
672 ColorSpaceTransformRcPtr ct = ColorSpaceTransform::Create();
674 ct->setDst(ROLE_SCENE_LINEAR);
675 group->appendTransform(ct);
678 input = ROLE_SCENE_LINEAR;
681 MatrixTransformRcPtr mt = MatrixTransform::Create();
682 const double matrix[16] = {
683 scale, 0.0, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 0.0, scale, 0.0, 0.0, 0.0, 0.0, 1.0};
684 mt->setMatrix(matrix);
685 group->appendTransform(mt);
689 bool use_look = (look !=
nullptr && look[0] != 0);
691 const char *look_output = LookTransform::GetLooksResultColorSpace(
692 config, config->getCurrentContext(), look);
694 if (look_output !=
nullptr && look_output[0] != 0) {
695 LookTransformRcPtr lt = LookTransform::Create();
697 lt->setDst(look_output);
699 group->appendTransform(lt);
711 DisplayViewTransformRcPtr dvt = DisplayViewTransform::Create();
713 dvt->setLooksBypass(use_look);
715 dvt->setDisplay(display);
716 group->appendTransform(dvt);
719 if (exponent != 1.0f) {
720 ExponentTransformRcPtr et = ExponentTransform::Create();
721 const double value[4] = {exponent, exponent, exponent, 1.0};
723 group->appendTransform(et);
728 ConstProcessorRcPtr *p = OBJECT_GUARDED_NEW(ConstProcessorRcPtr);
731 *p = config->getProcessor(group);
734 return (OCIO_ConstProcessorRcPtr *)p;
736 catch (Exception &exception) {
740 OBJECT_GUARDED_DELETE(p, ConstProcessorRcPtr);
744 OCIO_PackedImageDesc *OCIOImpl::createOCIO_PackedImageDesc(
float *
data,
748 long chanStrideBytes,
753 void *mem =
MEM_mallocN(
sizeof(PackedImageDesc), __func__);
754 PackedImageDesc *
id =
new (mem) PackedImageDesc(
data,
763 return (OCIO_PackedImageDesc *)
id;
765 catch (Exception &exception) {
774 OBJECT_GUARDED_DELETE((PackedImageDesc *)
id, PackedImageDesc);
777 const char *OCIOImpl::getVersionString(
void)
782 int OCIOImpl::getVersionHex(
void)
784 return GetVersionHex();
float srgb_to_linearrgb(float c)
void unit_m3(float m[3][3])
#define mul_m3_series(...)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v
static CCL_NAMESPACE_BEGIN const double alpha
CCL_NAMESPACE_BEGIN ccl_device float3 xyz_to_rgb(KernelGlobals *kg, float3 xyz)
void *(* MEM_mallocN)(size_t len, const char *str)
void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id)
static const float OCIO_XYZ_TO_LINEAR_SRGB[3][3]
static void OCIO_reportException(Exception &exception)
static bool to_scene_linear_matrix(ConstConfigRcPtr &config, const char *colorspace, float to_scene_linear[3][3])
static void OCIO_reportError(const char *err)
static float compare_floats(float a, float b, float abs_diff, int ulp_diff)
__forceinline const avxi abs(const avxi &a)