11 # pragma warning(push)
12 # pragma warning(disable : 4251 4275)
14 #include <OpenColorIO/OpenColorIO.h>
19 using namespace OCIO_NAMESPACE;
29 #if !defined(WITH_ASSERT_ABORT)
33 # define OCIO_abort() abort()
37 # define __func__ __FUNCTION__
42 std::cerr <<
"OpenColorIO Error: " <<
err << std::endl;
52 OCIO_ConstConfigRcPtr *OCIOImpl::getCurrentConfig(
void)
54 ConstConfigRcPtr *config = MEM_new<ConstConfigRcPtr>(__func__);
57 *config = GetCurrentConfig();
60 return (OCIO_ConstConfigRcPtr *)config;
62 catch (Exception &exception) {
71 void OCIOImpl::setCurrentConfig(
const OCIO_ConstConfigRcPtr *config)
74 SetCurrentConfig(*(ConstConfigRcPtr *)config);
76 catch (Exception &exception) {
81 OCIO_ConstConfigRcPtr *OCIOImpl::configCreateFromEnv(
void)
83 ConstConfigRcPtr *config = MEM_new<ConstConfigRcPtr>(__func__);
86 *config = Config::CreateFromEnv();
89 return (OCIO_ConstConfigRcPtr *)config;
91 catch (Exception &exception) {
100 OCIO_ConstConfigRcPtr *OCIOImpl::configCreateFromFile(
const char *filename)
102 ConstConfigRcPtr *config = MEM_new<ConstConfigRcPtr>(__func__);
105 *config = Config::CreateFromFile(filename);
108 return (OCIO_ConstConfigRcPtr *)config;
110 catch (Exception &exception) {
119 void OCIOImpl::configRelease(OCIO_ConstConfigRcPtr *config)
121 MEM_delete((ConstConfigRcPtr *)config);
124 int OCIOImpl::configGetNumColorSpaces(OCIO_ConstConfigRcPtr *config)
127 return (*(ConstConfigRcPtr *)config)->getNumColorSpaces();
129 catch (Exception &exception) {
136 const char *OCIOImpl::configGetColorSpaceNameByIndex(OCIO_ConstConfigRcPtr *config,
int index)
139 return (*(ConstConfigRcPtr *)config)->getColorSpaceNameByIndex(index);
141 catch (Exception &exception) {
148 OCIO_ConstColorSpaceRcPtr *OCIOImpl::configGetColorSpace(OCIO_ConstConfigRcPtr *config,
151 ConstColorSpaceRcPtr *cs = MEM_new<ConstColorSpaceRcPtr>(__func__);
154 *cs = (*(ConstConfigRcPtr *)config)->getColorSpace(name);
157 return (OCIO_ConstColorSpaceRcPtr *)cs;
159 catch (Exception &exception) {
168 int OCIOImpl::configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config,
const char *name)
171 return (*(ConstConfigRcPtr *)config)->getIndexForColorSpace(name);
173 catch (Exception &exception) {
180 const char *OCIOImpl::configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config)
183 return (*(ConstConfigRcPtr *)config)->getDefaultDisplay();
185 catch (Exception &exception) {
192 int OCIOImpl::configGetNumDisplays(OCIO_ConstConfigRcPtr *config)
195 return (*(ConstConfigRcPtr *)config)->getNumDisplays();
197 catch (Exception &exception) {
204 const char *OCIOImpl::configGetDisplay(OCIO_ConstConfigRcPtr *config,
int index)
207 return (*(ConstConfigRcPtr *)config)->getDisplay(index);
209 catch (Exception &exception) {
216 const char *OCIOImpl::configGetDefaultView(OCIO_ConstConfigRcPtr *config,
const char *display)
219 return (*(ConstConfigRcPtr *)config)->getDefaultView(display);
221 catch (Exception &exception) {
228 int OCIOImpl::configGetNumViews(OCIO_ConstConfigRcPtr *config,
const char *display)
231 return (*(ConstConfigRcPtr *)config)->getNumViews(display);
233 catch (Exception &exception) {
240 const char *OCIOImpl::configGetView(OCIO_ConstConfigRcPtr *config,
const char *display,
int index)
243 return (*(ConstConfigRcPtr *)config)->getView(display, index);
245 catch (Exception &exception) {
252 const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *config,
257 const char *name = (*(ConstConfigRcPtr *)config)->getDisplayViewColorSpaceName(display,
view);
259 if (strcasecmp(name,
"<USE_DISPLAY_NAME>") == 0) {
264 catch (Exception &exception) {
271 void OCIOImpl::configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr *config,
float *
rgb)
274 double rgb_double[3];
275 (*(ConstConfigRcPtr *)config)->getDefaultLumaCoefs(rgb_double);
276 rgb[0] = rgb_double[0];
277 rgb[1] = rgb_double[1];
278 rgb[2] = rgb_double[2];
280 catch (Exception &exception) {
286 const char *colorspace,
287 float to_scene_linear[3][3])
289 ConstProcessorRcPtr processor;
291 processor = config->getProcessor(colorspace, ROLE_SCENE_LINEAR);
293 catch (Exception &exception) {
302 ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor();
303 if (!cpu_processor) {
308 cpu_processor->applyRGB(to_scene_linear[0]);
309 cpu_processor->applyRGB(to_scene_linear[1]);
310 cpu_processor->applyRGB(to_scene_linear[2]);
314 void OCIOImpl::configGetXYZtoSceneLinear(OCIO_ConstConfigRcPtr *config_,
315 float xyz_to_scene_linear[3][3])
317 ConstConfigRcPtr config = (*(ConstConfigRcPtr *)config_);
324 if (!config->hasRole(ROLE_SCENE_LINEAR)) {
328 if (config->hasRole(
"aces_interchange")) {
330 float aces_to_scene_linear[3][3];
332 float xyz_to_aces[3][3];
335 mul_m3_m3m3(xyz_to_scene_linear, aces_to_scene_linear, xyz_to_aces);
338 else if (config->hasRole(
"XYZ")) {
344 int OCIOImpl::configGetNumLooks(OCIO_ConstConfigRcPtr *config)
347 return (*(ConstConfigRcPtr *)config)->getNumLooks();
349 catch (Exception &exception) {
356 const char *OCIOImpl::configGetLookNameByIndex(OCIO_ConstConfigRcPtr *config,
int index)
359 return (*(ConstConfigRcPtr *)config)->getLookNameByIndex(index);
361 catch (Exception &exception) {
368 OCIO_ConstLookRcPtr *OCIOImpl::configGetLook(OCIO_ConstConfigRcPtr *config,
const char *name)
370 ConstLookRcPtr *look = MEM_new<ConstLookRcPtr>(__func__);
373 *look = (*(ConstConfigRcPtr *)config)->getLook(name);
376 return (OCIO_ConstLookRcPtr *)look;
378 catch (Exception &exception) {
387 const char *OCIOImpl::lookGetProcessSpace(OCIO_ConstLookRcPtr *look)
389 return (*(ConstLookRcPtr *)look)->getProcessSpace();
392 void OCIOImpl::lookRelease(OCIO_ConstLookRcPtr *look)
394 MEM_delete((ConstLookRcPtr *)look);
397 int OCIOImpl::colorSpaceIsInvertible(OCIO_ConstColorSpaceRcPtr *cs_)
399 ConstColorSpaceRcPtr *cs = (ConstColorSpaceRcPtr *)cs_;
400 const char *family = (*cs)->getFamily();
402 if (!strcmp(family,
"rrt") || !strcmp(family,
"display")) {
408 if ((*cs)->isData()) {
413 if ((*cs)->getTransform(COLORSPACE_DIR_TO_REFERENCE)) {
422 int OCIOImpl::colorSpaceIsData(OCIO_ConstColorSpaceRcPtr *cs)
424 return (*(ConstColorSpaceRcPtr *)cs)->isData();
436 if ((
a < 0.0f) != (
b < 0.0f)) {
440 return (
abs((*(
int *)&
a) - (*(
int *)&
b)) < ulp_diff);
443 void OCIOImpl::colorSpaceIsBuiltin(OCIO_ConstConfigRcPtr *config_,
444 OCIO_ConstColorSpaceRcPtr *cs_,
445 bool &is_scene_linear,
448 ConstConfigRcPtr *config = (ConstConfigRcPtr *)config_;
449 ConstColorSpaceRcPtr *cs = (ConstColorSpaceRcPtr *)cs_;
450 ConstProcessorRcPtr processor;
453 processor = (*config)->getProcessor((*cs)->getName(),
"scene_linear");
455 catch (Exception &) {
457 is_scene_linear =
false;
462 ConstCPUProcessorRcPtr cpu_processor = processor->getDefaultCPUProcessor();
464 is_scene_linear =
true;
466 for (
int i = 0; i < 256; i++) {
467 float v = i / 255.0f;
469 float cR[3] = {
v, 0, 0};
470 float cG[3] = {0,
v, 0};
471 float cB[3] = {0, 0,
v};
472 float cW[3] = {
v,
v,
v};
473 cpu_processor->applyRGB(cR);
474 cpu_processor->applyRGB(cG);
475 cpu_processor->applyRGB(cB);
476 cpu_processor->applyRGB(cW);
479 if (
fabsf(cR[1]) > 1e-5f ||
fabsf(cR[2]) > 1e-5f ||
fabsf(cG[0]) > 1e-5f ||
480 fabsf(cG[2]) > 1e-5f ||
fabsf(cB[0]) > 1e-5f ||
fabsf(cB[1]) > 1e-5f) {
481 is_scene_linear =
false;
488 is_scene_linear =
false;
494 is_scene_linear =
false;
499 float out_v = (cW[0] + cW[1] + cW[2]) * (1.0f / 3.0f);
501 is_scene_linear =
false;
509 void OCIOImpl::colorSpaceRelease(OCIO_ConstColorSpaceRcPtr *cs)
511 MEM_delete((ConstColorSpaceRcPtr *)cs);
514 OCIO_ConstProcessorRcPtr *OCIOImpl::configGetProcessorWithNames(OCIO_ConstConfigRcPtr *config,
518 ConstProcessorRcPtr *processor = MEM_new<ConstProcessorRcPtr>(__func__);
521 *processor = (*(ConstConfigRcPtr *)config)->getProcessor(srcName, dstName);
524 return (OCIO_ConstProcessorRcPtr *)processor;
526 catch (Exception &exception) {
530 MEM_delete(processor);
535 void OCIOImpl::processorRelease(OCIO_ConstProcessorRcPtr *processor)
537 MEM_delete(processor);
540 OCIO_ConstCPUProcessorRcPtr *OCIOImpl::processorGetCPUProcessor(
541 OCIO_ConstProcessorRcPtr *processor)
543 ConstCPUProcessorRcPtr *cpu_processor = MEM_new<ConstCPUProcessorRcPtr>(__func__);
544 *cpu_processor = (*(ConstProcessorRcPtr *)processor)->getDefaultCPUProcessor();
545 return (OCIO_ConstCPUProcessorRcPtr *)cpu_processor;
548 void OCIOImpl::cpuProcessorApply(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
549 OCIO_PackedImageDesc *img)
552 (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*(PackedImageDesc *)img);
554 catch (Exception &exception) {
559 void OCIOImpl::cpuProcessorApply_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
560 OCIO_PackedImageDesc *img_)
563 PackedImageDesc *img = (PackedImageDesc *)img_;
564 int channels = img->getNumChannels();
567 assert(img->isFloat());
568 float *pixels = (
float *)img->getData();
570 size_t width = img->getWidth();
571 size_t height = img->getHeight();
575 float *pixel = pixels + 4 * (
y *
width +
x);
577 cpuProcessorApplyRGBA_predivide(cpu_processor, pixel);
582 (*(ConstCPUProcessorRcPtr *)cpu_processor)->apply(*img);
585 catch (Exception &exception) {
590 void OCIOImpl::cpuProcessorApplyRGB(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
float *pixel)
592 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGB(pixel);
595 void OCIOImpl::cpuProcessorApplyRGBA(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
float *pixel)
597 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel);
600 void OCIOImpl::cpuProcessorApplyRGBA_predivide(OCIO_ConstCPUProcessorRcPtr *cpu_processor,
603 if (pixel[3] == 1.0f || pixel[3] == 0.0f) {
604 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel);
607 float alpha, inv_alpha;
610 inv_alpha = 1.0f / alpha;
612 pixel[0] *= inv_alpha;
613 pixel[1] *= inv_alpha;
614 pixel[2] *= inv_alpha;
616 (*(ConstCPUProcessorRcPtr *)cpu_processor)->applyRGBA(pixel);
624 void OCIOImpl::cpuProcessorRelease(OCIO_ConstCPUProcessorRcPtr *cpu_processor)
626 MEM_delete(cpu_processor);
629 const char *OCIOImpl::colorSpaceGetName(OCIO_ConstColorSpaceRcPtr *cs)
631 return (*(ConstColorSpaceRcPtr *)cs)->getName();
634 const char *OCIOImpl::colorSpaceGetDescription(OCIO_ConstColorSpaceRcPtr *cs)
636 return (*(ConstColorSpaceRcPtr *)cs)->getDescription();
639 const char *OCIOImpl::colorSpaceGetFamily(OCIO_ConstColorSpaceRcPtr *cs)
641 return (*(ConstColorSpaceRcPtr *)cs)->getFamily();
644 int OCIOImpl::colorSpaceGetNumAliases(OCIO_ConstColorSpaceRcPtr *cs)
646 return (*(ConstColorSpaceRcPtr *)cs)->getNumAliases();
648 const char *OCIOImpl::colorSpaceGetAlias(OCIO_ConstColorSpaceRcPtr *cs,
const int index)
650 return (*(ConstColorSpaceRcPtr *)cs)->getAlias(index);
653 OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr *config_,
659 const float exponent,
663 ConstConfigRcPtr config = *(ConstConfigRcPtr *)config_;
664 GroupTransformRcPtr group = GroupTransform::Create();
669 ColorSpaceTransformRcPtr ct = ColorSpaceTransform::Create();
671 ct->setDst(ROLE_SCENE_LINEAR);
672 group->appendTransform(ct);
675 input = ROLE_SCENE_LINEAR;
678 MatrixTransformRcPtr mt = MatrixTransform::Create();
679 const double matrix[16] = {
680 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};
681 mt->setMatrix(matrix);
682 group->appendTransform(mt);
686 bool use_look = (look !=
nullptr && look[0] != 0);
688 const char *look_output = LookTransform::GetLooksResultColorSpace(
689 config, config->getCurrentContext(), look);
691 if (look_output !=
nullptr && look_output[0] != 0) {
692 LookTransformRcPtr lt = LookTransform::Create();
694 lt->setDst(look_output);
696 group->appendTransform(lt);
708 DisplayViewTransformRcPtr dvt = DisplayViewTransform::Create();
710 dvt->setLooksBypass(use_look);
712 dvt->setDisplay(display);
713 group->appendTransform(dvt);
716 if (exponent != 1.0f) {
717 ExponentTransformRcPtr et = ExponentTransform::Create();
718 const double value[4] = {exponent, exponent, exponent, 1.0};
720 group->appendTransform(et);
724 group->setDirection(TRANSFORM_DIR_INVERSE);
729 ConstProcessorRcPtr *p = MEM_new<ConstProcessorRcPtr>(__func__);
732 *p = config->getProcessor(group);
735 return (OCIO_ConstProcessorRcPtr *)p;
737 catch (Exception &exception) {
745 OCIO_PackedImageDesc *OCIOImpl::createOCIO_PackedImageDesc(
float *
data,
749 long chanStrideBytes,
754 void *mem =
MEM_mallocN(
sizeof(PackedImageDesc), __func__);
755 PackedImageDesc *
id =
new (mem) PackedImageDesc(
data,
764 return (OCIO_PackedImageDesc *)
id;
766 catch (Exception &exception) {
775 MEM_delete((PackedImageDesc *)
id);
778 const char *OCIOImpl::getVersionString(
void)
783 int OCIOImpl::getVersionHex(
void)
785 return GetVersionHex();
float srgb_to_linearrgb(float c)
void unit_m3(float m[3][3])
bool invert_m3_m3(float R[3][3], const float A[3][3])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
_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
_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
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
ATTR_WARN_UNUSED_RESULT const BMVert * v
btMatrix3x3 inverse() const
Return the inverse of the matrix.
ccl_global KernelShaderEvalInput * input
void *(* MEM_mallocN)(size_t len, const char *str)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static const pxr::TfToken rgb("rgb", pxr::TfToken::Immortal)
void OCIO_PackedImageDescRelease(OCIO_PackedImageDesc *id)
static const float OCIO_XYZ_TO_REC709[3][3]
static const float OCIO_ACES_TO_XYZ[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)