[Bf-blender-cvs] [469ee7ff152] blender-v3.2-release: Python API: add mathutils.Color functions to convert color spaces

Brecht Van Lommel noreply at git.blender.org
Mon May 23 15:36:58 CEST 2022


Commit: 469ee7ff1529a1b28ce0b300835ebc42d5c5362f
Author: Brecht Van Lommel
Date:   Thu May 19 20:31:58 2022 +0200
Branches: blender-v3.2-release
https://developer.blender.org/rB469ee7ff1529a1b28ce0b300835ebc42d5c5362f

Python API: add mathutils.Color functions to convert color spaces

Between scene linear and sRGB, XYZ, linear Rec.709 and ACES2065-1.

And add some clarifications about color spaces in the docs.

Fixes T98267

Ref T68926

Differential Revision: https://developer.blender.org/D14989

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

M	intern/opencolorio/fallback_impl.cc
M	intern/opencolorio/ocio_capi.h
M	intern/opencolorio/ocio_impl.cc
M	source/blender/imbuf/IMB_colormanagement.h
M	source/blender/imbuf/intern/IMB_colormanagement_intern.h
M	source/blender/imbuf/intern/colormanagement.c
M	source/blender/imbuf/intern/colormanagement_inline.c
M	source/blender/makesrna/intern/rna_mesh.c
M	source/blender/python/mathutils/CMakeLists.txt
M	source/blender/python/mathutils/mathutils_Color.c

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

diff --git a/intern/opencolorio/fallback_impl.cc b/intern/opencolorio/fallback_impl.cc
index d78b34d3c92..71b5ab9def2 100644
--- a/intern/opencolorio/fallback_impl.cc
+++ b/intern/opencolorio/fallback_impl.cc
@@ -244,7 +244,7 @@ void FallbackImpl::configGetDefaultLumaCoefs(OCIO_ConstConfigRcPtr * /*config*/,
 void FallbackImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr * /*config*/, float xyz_to_rgb[3][3])
 {
   /* Default to ITU-BT.709. */
-  memcpy(xyz_to_rgb, OCIO_XYZ_TO_LINEAR_SRGB, sizeof(OCIO_XYZ_TO_LINEAR_SRGB));
+  memcpy(xyz_to_rgb, OCIO_XYZ_TO_REC709, sizeof(OCIO_XYZ_TO_REC709));
 }
 
 int FallbackImpl::configGetNumLooks(OCIO_ConstConfigRcPtr * /*config*/)
diff --git a/intern/opencolorio/ocio_capi.h b/intern/opencolorio/ocio_capi.h
index 9bd4ec374e2..4be838a218d 100644
--- a/intern/opencolorio/ocio_capi.h
+++ b/intern/opencolorio/ocio_capi.h
@@ -31,10 +31,15 @@ OCIO_DECLARE_HANDLE(OCIO_ConstContextRcPtr);
 OCIO_DECLARE_HANDLE(OCIO_PackedImageDesc);
 OCIO_DECLARE_HANDLE(OCIO_ConstLookRcPtr);
 
-/* Standard XYZ to linear sRGB transform, for fallback. */
-static const float OCIO_XYZ_TO_LINEAR_SRGB[3][3] = {{3.2404542f, -0.9692660f, 0.0556434f},
-                                                    {-1.5371385f, 1.8760108f, -0.2040259f},
-                                                    {-0.4985314f, 0.0415560f, 1.0572252f}};
+/* Standard XYZ (D65) to linear Rec.709 transform. */
+static const float OCIO_XYZ_TO_REC709[3][3] = {{3.2404542f, -0.9692660f, 0.0556434f},
+                                               {-1.5371385f, 1.8760108f, -0.2040259f},
+                                               {-0.4985314f, 0.0415560f, 1.0572252f}};
+/* Standard ACES to XYZ (D65) transform.
+ * Matches OpenColorIO builtin transform: UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD. */
+static const float OCIO_ACES_TO_XYZ[3][3] = {{0.938280f, 0.337369f, 0.001174f},
+                                             {-0.004451f, 0.729522f, -0.003711f},
+                                             {0.016628f, -0.066890f, 1.091595f}};
 
 /* This structure is used to pass curve mapping settings from
  * blender's DNA structure stored in view transform settings
diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc
index 8d9c5dd2d49..a352c54da86 100644
--- a/intern/opencolorio/ocio_impl.cc
+++ b/intern/opencolorio/ocio_impl.cc
@@ -317,7 +317,7 @@ void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rg
 
   /* Default to ITU-BT.709 in case no appropriate transform found.
    * Note XYZ is defined here as having a D65 white point. */
-  memcpy(xyz_to_rgb, OCIO_XYZ_TO_LINEAR_SRGB, sizeof(OCIO_XYZ_TO_LINEAR_SRGB));
+  memcpy(xyz_to_rgb, OCIO_XYZ_TO_REC709, sizeof(OCIO_XYZ_TO_REC709));
 
   /* Get from OpenColorO config if it has the required roles. */
   if (!config->hasRole(ROLE_SCENE_LINEAR)) {
@@ -328,13 +328,8 @@ void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rg
     /* Standard OpenColorIO role, defined as ACES AP0 (ACES2065-1). */
     float aces_to_rgb[3][3];
     if (to_scene_linear_matrix(config, "aces_interchange", aces_to_rgb)) {
-      /* This is the OpenColorIO builtin transform:
-       * UTILITY - ACES-AP0_to_CIE-XYZ-D65_BFD. */
-      const float ACES_AP0_to_xyz_D65[3][3] = {{0.938280f, 0.337369f, 0.001174f},
-                                               {-0.004451f, 0.729522f, -0.003711f},
-                                               {0.016628f, -0.066890f, 1.091595f}};
       float xyz_to_aces[3][3];
-      invert_m3_m3(xyz_to_aces, ACES_AP0_to_xyz_D65);
+      invert_m3_m3(xyz_to_aces, OCIO_ACES_TO_XYZ);
 
       mul_m3_m3m3(xyz_to_rgb, aces_to_rgb, xyz_to_aces);
     }
diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h
index 1f0ed4cafbe..94036da9d22 100644
--- a/source/blender/imbuf/IMB_colormanagement.h
+++ b/source/blender/imbuf/IMB_colormanagement.h
@@ -72,8 +72,16 @@ BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3]);
  * Byte equivalent of #IMB_colormanagement_get_luminance().
  */
 BLI_INLINE unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3]);
+
+/**
+ * Conversion between scene linear and other color spaces.
+ */
 BLI_INLINE void IMB_colormanagement_xyz_to_rgb(float rgb[3], const float xyz[3]);
 BLI_INLINE void IMB_colormanagement_rgb_to_xyz(float xyz[3], const float rgb[3]);
+BLI_INLINE void IMB_colormanagement_rec709_to_rgb(float rgb[3], const float rec709[3]);
+BLI_INLINE void IMB_colormanagement_rgb_to_rec709(float rec709[3], const float rgb[3]);
+BLI_INLINE void IMB_colormanagement_aces_to_rgb(float rgb[3], const float aces[3]);
+BLI_INLINE void IMB_colormanagement_rgb_to_aces(float aces[3], const float rgb[3]);
 const float *IMB_colormanagement_get_xyz_to_rgb(void);
 
 /** \} */
diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h
index c89b15480a2..fd70c633f83 100644
--- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h
+++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h
@@ -20,6 +20,10 @@ struct OCIO_ConstCPUProcessorRcPtr;
 extern float imbuf_luma_coefficients[3];
 extern float imbuf_xyz_to_rgb[3][3];
 extern float imbuf_rgb_to_xyz[3][3];
+extern float imbuf_xyz_to_aces[3][3];
+extern float imbuf_aces_to_xyz[3][3];
+extern float imbuf_xyz_to_rec709[3][3];
+extern float imbuf_rec709_to_xyz[3][3];
 
 #define MAX_COLORSPACE_NAME 64
 #define MAX_COLORSPACE_DESCRIPTION 512
diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c
index 95e2d36891a..f189614e61c 100644
--- a/source/blender/imbuf/intern/colormanagement.c
+++ b/source/blender/imbuf/intern/colormanagement.c
@@ -75,8 +75,10 @@ static int global_tot_looks = 0;
 float imbuf_luma_coefficients[3] = {0.0f};
 float imbuf_xyz_to_rgb[3][3] = {{0.0f}};
 float imbuf_rgb_to_xyz[3][3] = {{0.0f}};
-static float imbuf_xyz_to_linear_srgb[3][3] = {{0.0f}};
-static float imbuf_linear_srgb_to_xyz[3][3] = {{0.0f}};
+float imbuf_xyz_to_rec709[3][3] = {{0.0f}};
+float imbuf_rec709_to_xyz[3][3] = {{0.0f}};
+float imbuf_xyz_to_aces[3][3] = {{0.0f}};
+float imbuf_aces_to_xyz[3][3] = {{0.0f}};
 
 /* lock used by pre-cached processors getters, so processor wouldn't
  * be created several times
@@ -573,10 +575,14 @@ static void colormanage_load_config(OCIO_ConstConfigRcPtr *config)
 
   /* Load luminance coefficients. */
   OCIO_configGetDefaultLumaCoefs(config, imbuf_luma_coefficients);
+
+  /* Load standard color spaces. */
   OCIO_configGetXYZtoRGB(config, imbuf_xyz_to_rgb);
   invert_m3_m3(imbuf_rgb_to_xyz, imbuf_xyz_to_rgb);
-  copy_m3_m3(imbuf_xyz_to_linear_srgb, OCIO_XYZ_TO_LINEAR_SRGB);
-  invert_m3_m3(imbuf_linear_srgb_to_xyz, imbuf_xyz_to_linear_srgb);
+  copy_m3_m3(imbuf_xyz_to_rec709, OCIO_XYZ_TO_REC709);
+  invert_m3_m3(imbuf_rec709_to_xyz, imbuf_xyz_to_rec709);
+  copy_m3_m3(imbuf_aces_to_xyz, OCIO_ACES_TO_XYZ);
+  invert_m3_m3(imbuf_xyz_to_aces, imbuf_aces_to_xyz);
 }
 
 static void colormanage_free_config(void)
@@ -2370,14 +2376,14 @@ void IMB_colormanagement_color_picking_to_scene_linear_v3(float pixel[3])
 void IMB_colormanagement_scene_linear_to_srgb_v3(float pixel[3])
 {
   mul_m3_v3(imbuf_rgb_to_xyz, pixel);
-  mul_m3_v3(imbuf_xyz_to_linear_srgb, pixel);
+  mul_m3_v3(imbuf_xyz_to_rec709, pixel);
   linearrgb_to_srgb_v3_v3(pixel, pixel);
 }
 
 void IMB_colormanagement_srgb_to_scene_linear_v3(float pixel[3])
 {
   srgb_to_linearrgb_v3_v3(pixel, pixel);
-  mul_m3_v3(imbuf_linear_srgb_to_xyz, pixel);
+  mul_m3_v3(imbuf_rec709_to_xyz, pixel);
   mul_m3_v3(imbuf_xyz_to_rgb, pixel);
 }
 
diff --git a/source/blender/imbuf/intern/colormanagement_inline.c b/source/blender/imbuf/intern/colormanagement_inline.c
index 411cf9af802..4c632da1520 100644
--- a/source/blender/imbuf/intern/colormanagement_inline.c
+++ b/source/blender/imbuf/intern/colormanagement_inline.c
@@ -37,4 +37,28 @@ void IMB_colormanagement_rgb_to_xyz(float xyz[3], const float rgb[3])
   mul_v3_m3v3(xyz, imbuf_rgb_to_xyz, rgb);
 }
 
+void IMB_colormanagement_rec709_to_rgb(float rgb[3], const float rec709[3])
+{
+  mul_v3_m3v3(rgb, imbuf_rec709_to_xyz, rec709);
+  mul_v3_m3v3(rgb, imbuf_xyz_to_rgb, rgb);
+}
+
+void IMB_colormanagement_rgb_to_rec709(float rec709[3], const float rgb[3])
+{
+  mul_v3_m3v3(rec709, imbuf_rgb_to_xyz, rgb);
+  mul_v3_m3v3(rec709, imbuf_xyz_to_rec709, rec709);
+}
+
+void IMB_colormanagement_aces_to_rgb(float rgb[3], const float aces[3])
+{
+  mul_v3_m3v3(rgb, imbuf_aces_to_xyz, aces);
+  mul_v3_m3v3(rgb, imbuf_xyz_to_rgb, rgb);
+}
+
+void IMB_colormanagement_rgb_to_aces(float aces[3], const float rgb[3])
+{
+  mul_v3_m3v3(aces, imbuf_rgb_to_xyz, rgb);
+  mul_v3_m3v3(aces, imbuf_xyz_to_aces, aces);
+}
+
 #endif /* __IMB_COLORMANAGEMENT_INLINE_H__ */
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 38d473f04dd..ec0a182e338 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -2195,7 +2195,7 @@ static void rna_def_mloopcol(BlenderRNA *brna)
   RNA_def_property_range(prop, 0.0f, 1.0f);
   RNA_def_property_float_funcs(
       prop, "rna_MeshLoopColor_color_get", "rna_MeshLoopColor_color_set", NULL);
-  RNA_def_property_ui_text(prop, "Color", "");
+  RNA_def_property_ui_text(prop, "Color", "Color in sRGB color space");
   RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all");
 }
 
@@ -3210,7 +3210,9 @@ static void rna_def_mesh(BlenderRNA *brna)
                                     NULL);
   RNA_def_property_struct_type(prop, "MeshLoopColorLayer");
   RNA_def_property_override_flag(prop, PROPOVERRIDE_IGNORE);
-  RNA_def_property_ui_text(prop, "Vertex Colors", "All vertex colors");
+  RNA_def_property_ui_text(prop,
+                           "Vertex Colors",
+                           "Legacy vertex color layers. Deprecated, use color attributes instead");
   rna_def_loop_colors(brna, prop);
 
   /* Sculpt Vertex colors */
@@ -3228,7 +3230,9 @@ static void rna_def_mesh(BlenderRNA *brna)
                                     NULL);
   RNA_def_property_struct_type(prop, 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list