Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2022-04-11 20:38:45 +0300
committerBrecht Van Lommel <brecht@blender.org>2022-04-11 21:10:42 +0300
commitc65b022e6207865702357d07d19b5d576dbfb136 (patch)
tree543297567690b1bea37e0a124f54c3d6a515a25e /intern/opencolorio
parenta99639792b1628493139eb9943ae4befbdc6b613 (diff)
Fix OpenColorIO error with configs using <USE_DISPLAY_NAME>
* Don't assume the display colorspace name fully defines the transform to display space, this is not true in OpenColorIO 2 where view transforms may be defined in more complexs ways than just specifying a colorspace. * In places where we need to store the display colorspace name, resolve <USE_DISPLAY_NAME> token manually. Ref T96590
Diffstat (limited to 'intern/opencolorio')
-rw-r--r--intern/opencolorio/fallback_impl.cc9
-rw-r--r--intern/opencolorio/ocio_capi.cc6
-rw-r--r--intern/opencolorio/ocio_capi.h3
-rw-r--r--intern/opencolorio/ocio_impl.cc14
-rw-r--r--intern/opencolorio/ocio_impl.h9
-rw-r--r--intern/opencolorio/ocio_impl_glsl.cc2
6 files changed, 30 insertions, 13 deletions
diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc
index aaab8b4e6b9..d78b34d3c92 100644
--- a/intern/opencolorio/fallback_impl.cc
+++ b/intern/opencolorio/fallback_impl.cc
@@ -461,12 +461,13 @@ OCIO_ConstProcessorRcPtr *FallbackImpl::createDisplayProcessor(OCIO_ConstConfigR
const char * /*display*/,
const char * /*look*/,
const float scale,
- const float exponent)
+ const float exponent,
+ const bool inverse)
{
FallbackTransform transform;
- transform.type = TRANSFORM_LINEAR_TO_SRGB;
- transform.scale = scale;
- transform.exponent = exponent;
+ transform.type = (inverse) ? TRANSFORM_SRGB_TO_LINEAR : TRANSFORM_LINEAR_TO_SRGB;
+ transform.scale = (inverse && scale != 0.0f) ? 1.0f / scale : scale;
+ transform.exponent = (inverse && exponent != 0.0f) ? 1.0f / exponent : exponent;
return (OCIO_ConstProcessorRcPtr *)new FallbackProcessor(transform);
}
diff --git a/intern/opencolorio/ocio_capi.cc b/intern/opencolorio/ocio_capi.cc
index 91784a288c8..5e4c2a87a0b 100644
--- a/intern/opencolorio/ocio_capi.cc
+++ b/intern/opencolorio/ocio_capi.cc
@@ -250,9 +250,11 @@ OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *con
const char *display,
const char *look,
const float scale,
- const float exponent)
+ const float exponent,
+ const bool inverse)
{
- return impl->createDisplayProcessor(config, input, view, display, look, scale, exponent);
+ return impl->createDisplayProcessor(
+ config, input, view, display, look, scale, exponent, inverse);
}
OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data,
diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h
index 5c036ec263a..9bd4ec374e2 100644
--- a/intern/opencolorio/ocio_capi.h
+++ b/intern/opencolorio/ocio_capi.h
@@ -166,7 +166,8 @@ OCIO_ConstProcessorRcPtr *OCIO_createDisplayProcessor(OCIO_ConstConfigRcPtr *con
const char *display,
const char *look,
const float scale,
- const float exponent);
+ const float exponent,
+ const bool inverse);
OCIO_PackedImageDesc *OCIO_createOCIO_PackedImageDesc(float *data,
long width,
diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc
index ca1b7cc42e1..8d9c5dd2d49 100644
--- a/intern/opencolorio/ocio_impl.cc
+++ b/intern/opencolorio/ocio_impl.cc
@@ -254,7 +254,12 @@ const char *OCIOImpl::configGetDisplayColorSpaceName(OCIO_ConstConfigRcPtr *conf
const char *view)
{
try {
- return (*(ConstConfigRcPtr *)config)->getDisplayViewColorSpaceName(display, view);
+ const char *name = (*(ConstConfigRcPtr *)config)->getDisplayViewColorSpaceName(display, view);
+ /* OpenColorIO does not resolve this token for us, so do it ourselves. */
+ if (strcasecmp(name, "<USE_DISPLAY_NAME>") == 0) {
+ return display;
+ }
+ return name;
}
catch (Exception &exception) {
OCIO_reportException(exception);
@@ -655,7 +660,8 @@ OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr
const char *display,
const char *look,
const float scale,
- const float exponent)
+ const float exponent,
+ const bool inverse)
{
ConstConfigRcPtr config = *(ConstConfigRcPtr *)config_;
@@ -718,6 +724,10 @@ OCIO_ConstProcessorRcPtr *OCIOImpl::createDisplayProcessor(OCIO_ConstConfigRcPtr
group->appendTransform(et);
}
+ if (inverse) {
+ group->setDirection(TRANSFORM_DIR_INVERSE);
+ }
+
/* Create processor from transform. This is the moment were OCIO validates
* the entire transform, no need to check for the validity of inputs above. */
ConstProcessorRcPtr *p = MEM_new<ConstProcessorRcPtr>(__func__);
diff --git a/intern/opencolorio/ocio_impl.h b/intern/opencolorio/ocio_impl.h
index d42fa58121f..f8397c62e52 100644
--- a/intern/opencolorio/ocio_impl.h
+++ b/intern/opencolorio/ocio_impl.h
@@ -85,7 +85,8 @@ class IOCIOImpl {
const char *display,
const char *look,
const float scale,
- const float exponent) = 0;
+ const float exponent,
+ const bool inverse) = 0;
virtual OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data,
long width,
@@ -201,7 +202,8 @@ class FallbackImpl : public IOCIOImpl {
const char *display,
const char *look,
const float scale,
- const float exponent);
+ const float exponent,
+ const bool inverse);
OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data,
long width,
@@ -290,7 +292,8 @@ class OCIOImpl : public IOCIOImpl {
const char *display,
const char *look,
const float scale,
- const float exponent);
+ const float exponent,
+ const bool inverse);
OCIO_PackedImageDesc *createOCIO_PackedImageDesc(float *data,
long width,
diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc
index 87f9d8837c7..150ed1a58bb 100644
--- a/intern/opencolorio/ocio_impl_glsl.cc
+++ b/intern/opencolorio/ocio_impl_glsl.cc
@@ -603,7 +603,7 @@ static OCIO_GPUDisplayShader &getGPUDisplayShader(
OCIO_ConstProcessorRcPtr *processor_to_scene_linear = OCIO_configGetProcessorWithNames(
config, input, ROLE_SCENE_LINEAR);
OCIO_ConstProcessorRcPtr *processor_to_display = OCIO_createDisplayProcessor(
- config, ROLE_SCENE_LINEAR, view, display, look, 1.0f, 1.0f);
+ config, ROLE_SCENE_LINEAR, view, display, look, 1.0f, 1.0f, false);
/* Create shader descriptions. */
if (processor_to_scene_linear && processor_to_display) {