[Bf-blender-cvs] [c65b022e620] master: Fix OpenColorIO error with configs using <USE_DISPLAY_NAME>

Brecht Van Lommel noreply at git.blender.org
Mon Apr 11 20:11:02 CEST 2022


Commit: c65b022e6207865702357d07d19b5d576dbfb136
Author: Brecht Van Lommel
Date:   Mon Apr 11 19:38:45 2022 +0200
Branches: master
https://developer.blender.org/rBc65b022e6207865702357d07d19b5d576dbfb136

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

===================================================================

M	intern/opencolorio/fallback_impl.cc
M	intern/opencolorio/ocio_capi.cc
M	intern/opencolorio/ocio_capi.h
M	intern/opencolorio/ocio_impl.cc
M	intern/opencolorio/ocio_impl.h
M	intern/opencolorio/ocio_impl_glsl.cc
M	source/blender/imbuf/IMB_colormanagement.h
M	source/blender/imbuf/intern/colormanagement.c

===================================================================

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) {
diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h
index 7cf2c02e657..97030d44047 100644
--- a/source/blender/imbuf/IMB_colormanagement.h
+++ b/source/blender/imbuf/IMB_colormanagement.h
@@ -256,10 +256,6 @@ void IMB_colormanagement_display_settings_from_ctx(
     struct ColorManagedViewSettings **r_view_settings,
     struct ColorManagedDisplaySettings **r_display_settings);
 
-const char *IMB_colormanagement_get_display_colorspace_name(
-    const struct ColorManagedViewSettings *view_settings,
-    const struct ColorManagedDisplaySettings *display_settings);
-
 /**
  * Acquire display buffer for given image buffer using specified view and display settings.
  */
diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c
index 193fda01816..53aa74edc61 100644
--- a/source/blender/imbuf/intern/colormanagement.c
+++ b/source/blender/imbuf/intern/colormanagement.c
@@ -794,9 +794,8 @@ void IMB_colormanagement_display_settings_from_ctx(
   }
 }
 
-const char *IMB_colormanagement_get_display_colorspace_name(
-    const ColorManagedViewSettings *view_settings,
-    const ColorManagedDisplaySettings *display_settings)
+static const char *get_display_colorspace_name(const ColorManagedViewSettings *view_settings,
+                                               const ColorManagedDisplaySettings *display_settings)
 {
   OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig();
 
@@ -815,8 +814,7 @@ static ColorSpace *display_transform_get_colorspace(
     const ColorManagedViewSettings *view_settings,
     const ColorManagedDisplaySettings *display_settings)
 {
-  const char *colorspace_name = IMB_colormanagement_get_display_colorspace_name(view_settings,
-                                                                                display_settings);
+  const char *colorspace_name = get_display_colorspace_name(view_settings, display_settings);
 
   if (colorspace_name) {
     return colormanage_colorspace_get_named(colorspace_name);
@@ -837,8 +835,14 @@ static OCIO_ConstCPUProcessorRcPtr *create_display_buffer_processor(const char *
   const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure);
   const float exponent = (gamma == 1.0f) 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list