From 756b4785c130c55beba95f219c434ee9db46b791 Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Sun, 10 May 2026 11:15:24 -0700 Subject: [PATCH] fix(color mgmt): More sensible OCIO file rules Oh dear, a recent discovery: OCIO's built-in configs' "file rules" that come into play when using getColorSpaceFromFilepath actually does not incorporate the search for color space name embedded in the filename into the logic, and moreover, assume that files ending in ".exr" are ACES2065-1, of all things. This seems an unfortunate choice because in the real world, almost no exr files people will encounter actually use the ap0 primaries. This PR does the following to shore up this and related edge cases: * For OCIO built-in configs, fully replace the existing file rules with a blank slate that just uses the path parsing rule. Everything else is categorized as "unknown". (Though many of our format readers already do something better, setting the metdata if they actually know what the file is.) * Recognize "unknown" is equivalent to having an empty color space, an error if you pass such a color space name to IBA color transform functions. * For all IBA color conversion, if the input space is not color managed, be sure NOT TO mark the output color space as the original `to` request! Input raw means output is also raw. Signed-off-by: Larry Gritz --- src/libOpenImageIO/color_ocio.cpp | 113 ++++++++++++++---- src/oiiotool/oiiotool.cpp | 2 + testsuite/oiiotool-color/ref/out-ocio2.3.txt | 65 ++++++++++ testsuite/oiiotool-color/ref/out.txt | 8 ++ testsuite/oiiotool-color/run.py | 31 +++++ .../python-colorconfig/ref/out-ocio230.txt | 59 +++++++++ .../python-colorconfig/ref/out-ocio230b.txt | 59 +++++++++ .../ref/{out-ocio23.txt => out-ocio232.txt} | 6 + .../python-colorconfig/ref/out-ocio24.txt | 6 + .../python-colorconfig/ref/out-ocio25.txt | 6 + testsuite/python-colorconfig/ref/out.txt | 6 + .../src/test_colorconfig.py | 6 + 12 files changed, 342 insertions(+), 25 deletions(-) create mode 100644 testsuite/oiiotool-color/ref/out-ocio2.3.txt create mode 100644 testsuite/python-colorconfig/ref/out-ocio230.txt create mode 100644 testsuite/python-colorconfig/ref/out-ocio230b.txt rename testsuite/python-colorconfig/ref/{out-ocio23.txt => out-ocio232.txt} (91%) diff --git a/src/libOpenImageIO/color_ocio.cpp b/src/libOpenImageIO/color_ocio.cpp index c6f8b4b715..726e4f55e6 100644 --- a/src/libOpenImageIO/color_ocio.cpp +++ b/src/libOpenImageIO/color_ocio.cpp @@ -201,8 +201,8 @@ struct CSInfo { // Hidden implementation of ColorConfig class ColorConfig::Impl { public: - OCIO::ConstConfigRcPtr config_; - OCIO::ConstConfigRcPtr builtinconfig_; + OCIO::ConfigRcPtr config_; + OCIO::ConfigRcPtr builtinconfig_; private: std::vector colorspaces; @@ -815,6 +815,49 @@ ColorConfig::~ColorConfig() {} +// OIIO doctoring of OCIO configs for different default file rules. Currently, +// we only do this for built-in configs. +static void +fix_config_file_rules(OCIO::ConfigRcPtr& config) +{ + OIIO_CONTRACT_ASSERT(config); + DBG("Fixing up rules:\n"); +#if 1 + // Just start with a clean slate + auto rules = OCIO::FileRules::Create(); +#else + // Alternate universe: Start with the existing rules + auto rules = config->getFileRules()->createEditableCopy(); +#endif + for (size_t i = 0, e = rules->getNumEntries(); i != e; ++i) { + DBG(" rule {}/{}: pat='{}' ext='{}' -> \"{}\"\n", i, rules->getName(i), + rules->getRegex(i), rules->getExtension(i), + rules->getColorSpace(i)); + if (Strutil::iequals(rules->getExtension(i), "exr")) { + // Change the rule for exr extension, if it exists, to "unknown". + // Make no assumptions. OCIO's built-in configs think it should be + // ACES2065-1, which is almost never right. + rules->setColorSpace(i, "unknown"); + DBG(" changed cs to \"{}\"\n", rules->getColorSpace(i)); + } else if (!strcmp(rules->getName(i), "Default")) { + // Default rule or one that matches everything -- for OIIO, we + // just want to change this to unknown. We made decisions about + // default per-file-format color space decisions in the individual + // readers. We don't even consider file extension to be reliable + // evidence of the file type. + rules->setColorSpace(i, "unknown"); + DBG(" changed cs to \"{}\"\n", rules->getColorSpace(i)); + } + } + + // But make the path search rule (look for the right-most color space name + // embedded in the path) have precedence over file naming rules. + rules->insertPathSearchRule(0); + config->setFileRules(rules); +} + + + bool ColorConfig::Impl::init(string_view filename) { @@ -825,7 +868,10 @@ ColorConfig::Impl::init(string_view filename) OCIO::SetLoggingLevel(OCIO::LOGGING_LEVEL_NONE); try { - builtinconfig_ = OCIO::Config::CreateFromFile("ocio://default"); + auto cfg = OCIO::Config::CreateFromFile("ocio://default"); + OIIO_CONTRACT_ASSERT(cfg); + builtinconfig_ = cfg->createEditableCopy(); + fix_config_file_rules(builtinconfig_); } catch (OCIO::Exception& e) { error("Error making OCIO built-in config: {}", e.what()); } @@ -841,10 +887,13 @@ ColorConfig::Impl::init(string_view filename) } else { // Either filename passed, or taken from $OCIO, and it seems to exist try { - config_ = OCIO::Config::CreateFromFile( - std::string(filename).c_str()); configname(filename); - m_config_is_built_in = Strutil::istarts_with(filename, "ocio://"); + auto cfg = OCIO::Config::CreateFromFile( + std::string(filename).c_str()); + if (cfg) + config_ = cfg->createEditableCopy(); + if (config_ && Strutil::istarts_with(filename, "ocio://")) + fix_config_file_rules(config_); } catch (OCIO::Exception& e) { error("Error reading OCIO config \"{}\": {}", filename, e.what()); } catch (...) { @@ -2344,27 +2393,41 @@ ImageBufAlgo::colorconvert(ImageBuf& dst, const ImageBuf& src, string_view from, from = src.spec().get_string_attribute("oiio:Colorspace", "scene_linear"); } - if (from.empty() || to.empty()) { - dst.errorfmt("Unknown color space name"); + if (from.empty() || from == "unknown" || to.empty() || to == "unknown") { + dst.errorfmt("Unknown color space name (from=\"{}\", to=\"{}\")", from, + to); return false; } - ColorProcessorHandle processor; - { - if (!colorconfig) - colorconfig = &ColorConfig::default_colorconfig(); - processor - = colorconfig->createColorProcessor(colorconfig->resolve(from), - colorconfig->resolve(to), - context_key, context_value); - if (!processor) { - if (colorconfig->has_error()) - dst.errorfmt("{}", colorconfig->geterror()); - else - dst.errorfmt( - "Could not construct the color transform {} -> {} (unknown error)", - from, to); - return false; - } + + if (!colorconfig) + colorconfig = &ColorConfig::default_colorconfig(); + + if (colorconfig->isData(from) || colorconfig->equivalent(from, "raw")) { + // If the input color space is not color managed, the transformation + // is meaningless, just set 'to' to the same space so that the whole + // thing is a no-op, including continuing to think it's in the raw + // space. + to = from; + } else if (colorconfig->isData(to) || colorconfig->equivalent(to, "raw")) { + // If the output color space is not color managed, the transformation + // is meaningless, just make it look like it's already in the 'from' + // space. Note that this DOES change the apparent color space label + // to the requested raw output space. + from = to; + } + + ColorProcessorHandle processor + = colorconfig->createColorProcessor(colorconfig->resolve(from), + colorconfig->resolve(to), + context_key, context_value); + if (!processor) { + if (colorconfig->has_error()) + dst.errorfmt("{}", colorconfig->geterror()); + else + dst.errorfmt( + "Could not construct the color transform {} -> {} (unknown error)", + from, to); + return false; } logtime.stop(-1); // transition to other colorconvert diff --git a/src/oiiotool/oiiotool.cpp b/src/oiiotool/oiiotool.cpp index c86f3449f5..4a1f6c8121 100644 --- a/src/oiiotool/oiiotool.cpp +++ b/src/oiiotool/oiiotool.cpp @@ -5566,6 +5566,8 @@ input_file(Oiiotool& ot, cspan argv) // Try to deduce the color space it's in std::string colorspace( ot.colorconfig().getColorSpaceFromFilepath(filename, "", true)); + if (colorspace == "unknown") + colorspace.clear(); if (colorspace.size() && ot.debug) OIIO::print(" From {}, we deduce color space \"{}\"\n", filename, colorspace); diff --git a/testsuite/oiiotool-color/ref/out-ocio2.3.txt b/testsuite/oiiotool-color/ref/out-ocio2.3.txt new file mode 100644 index 0000000000..bb81a57fe8 --- /dev/null +++ b/testsuite/oiiotool-color/ref/out-ocio2.3.txt @@ -0,0 +1,65 @@ +oiiotool ERROR: --colorconfig : Requested non-existent OCIO config "missing.ocio" +Full command line was: +> oiiotool --nostderr --colorconfig missing.ocio -echo "Nonexistent config" +nope: 0.5,0.5,0.5 half +raw: 0.5,0.5,0.5 half +acescg: 0.5,0.5,0.5 half +srgb_tx: 0.5,0.5,0.5 half +nope: 0.5,0.5,0.5 half +raw: 0.5,0.5,0.5 half +acescg: 0.5,0.5,0.5 half +srgb_tx: 0.5,0.5,0.5 half +Comparing "colormap-inferno.tif" and "ref/colormap-inferno.tif" +PASS +Comparing "colormap-custom.tif" and "ref/colormap-custom.tif" +PASS +Comparing "unpremult.exr" and "ref/unpremult.exr" +PASS +Comparing "premult.exr" and "ref/premult.exr" +PASS +Comparing "contrast-stretch.tif" and "ref/contrast-stretch.tif" +PASS +Comparing "contrast-shrink.tif" and "ref/contrast-shrink.tif" +PASS +Comparing "contrast-inverse.tif" and "ref/contrast-inverse.tif" +PASS +Comparing "contrast-threshold.tif" and "ref/contrast-threshold.tif" +PASS +Comparing "contrast-sigmoid5.tif" and "ref/contrast-sigmoid5.tif" +PASS +Comparing "display-sRGB.tif" and "ref/display-sRGB.tif" +PASS +Comparing "rgbfromtga.png" and "ref/rgbfromtga.png" +PASS +Comparing "greyalpha_sRGB.tif" and "ref/greyalpha_sRGB.tif" +PASS +Comparing "greyalpha_sRGB_un.tif" and "ref/greyalpha_sRGB_un-ocio22.tif" +PASS +Comparing "grey_sRGB.tif" and "ref/grey_sRGB.tif" +PASS +Comparing "grey_sRGB_un.tif" and "ref/grey_sRGB_un.tif" +PASS +Comparing "tahoe-ccmatrix.tif" and "ref/tahoe-ccmatrix.tif" +PASS +Comparing "tahoe-sat0.tif" and "ref/tahoe-sat0.tif" +PASS +Comparing "tahoe-sat2.tif" and "ref/tahoe-sat2.tif" +PASS +Comparing "cmap-magma.tif" and "ref/cmap-magma.tif" +PASS +Comparing "cmap-inferno.tif" and "ref/cmap-inferno.tif" +PASS +Comparing "cmap-plasma.tif" and "ref/cmap-plasma.tif" +PASS +Comparing "cmap-viridis.tif" and "ref/cmap-viridis.tif" +PASS +Comparing "cmap-turbo.tif" and "ref/cmap-turbo.tif" +PASS +Comparing "cmap-blue-red.tif" and "ref/cmap-blue-red.tif" +PASS +Comparing "cmap-spectrum.tif" and "ref/cmap-spectrum.tif" +PASS +Comparing "cmap-heat.tif" and "ref/cmap-heat.tif" +PASS +Comparing "look-default.tif" and "ref/look-default.tif" +PASS diff --git a/testsuite/oiiotool-color/ref/out.txt b/testsuite/oiiotool-color/ref/out.txt index 4a1e2ff159..fc3c28d95c 100644 --- a/testsuite/oiiotool-color/ref/out.txt +++ b/testsuite/oiiotool-color/ref/out.txt @@ -1,6 +1,14 @@ oiiotool ERROR: --colorconfig : Requested non-existent OCIO config "missing.ocio" Full command line was: > oiiotool --nostderr --colorconfig missing.ocio -echo "Nonexistent config" +nope: 0.5,0.5,0.5 half +raw: 0.5,0.5,0.5 half +acescg: 0.5,0.5,0.5 half +srgb_tx: 0.213989,0.213989,0.213989 half +nope: 0.5,0.5,0.5 half +raw: 0.5,0.5,0.5 half +acescg: 0.5,0.5,0.5 half +srgb_tx: 0.735352,0.735352,0.735352 half Comparing "colormap-inferno.tif" and "ref/colormap-inferno.tif" PASS Comparing "colormap-custom.tif" and "ref/colormap-custom.tif" diff --git a/testsuite/oiiotool-color/run.py b/testsuite/oiiotool-color/run.py index a40f7f3c55..11947d9e86 100644 --- a/testsuite/oiiotool-color/run.py +++ b/testsuite/oiiotool-color/run.py @@ -7,6 +7,9 @@ import os +redirect = " >> out.txt 2>&1 " + + # print("ociover =", ociover) # Make test pattern with increasing intensity left to right, decreasing @@ -97,6 +100,34 @@ # test various behaviors and misbehaviors related to OCIO configs. command += oiiotool ("--nostderr --colorconfig missing.ocio -echo \"Nonexistent config\"", failureok=True) +# Test what happens with autocc and input files with color space names in +# their filenames, for both color-managed and non-color-managed spaces. +# +# Input: We transform an exr with each name to acescg, with autocc. +# - "nope" is an unknown color space, and should warn. +# - "raw" means known to be not color managed, and should warn. +# - "acescg" is known and should end up with output (as acescg) that is +# unchanged, so the value should still be 0.5. +# - "srgb_tx" is known but should make a real transformation, giving a pixel +# value that is not 0.5. +for c in ("nope", "raw", "acescg", "srgb_tx") : + command += oiiotool (f"--pattern constant:color=.5 1x1 3 -d half -o in_{c}.exr") + command += oiiotool (f"--autocc in_{c}.exr -o out_acescg.exr") + command += oiiotool (f"out_acescg.exr -echo \"{c}: {{TOP.AVGCOLOR}} {{TOP.nativeformat}}\"") +# Output: We transform an acescg image to outputs with each name, with autocc. +# - "nope" is an unknown color space, and should warn. Or should it? +# - "raw" should retain the 0.5 value with no warning, since you're asking to +# output a non-color-manaaged image. +# - "acescg" is known and should end up with output (as acescg) that is +# unchanged, so the value should still be 0.5. +# - "srgb_tx" is known but should make a real transformation, giving a pixel +# value that is not 0.5. +for c in ("nope", "raw", "acescg", "srgb_tx") : + command += oiiotool (f"--pattern constant:color=.5 1x1 3 -d half -iscolorspace acescg " + + f"-autocc -o out_{c}.exr") + command += oiiotool (f"out_{c}.exr -echo \"{c}: {{TOP.AVGCOLOR}} {{TOP.nativeformat}}\"") + + # To add more tests, just append more lines like the above and also add # the new 'feature.tif' (or whatever you call it) to the outputs list, diff --git a/testsuite/python-colorconfig/ref/out-ocio230.txt b/testsuite/python-colorconfig/ref/out-ocio230.txt new file mode 100644 index 0000000000..17071b04df --- /dev/null +++ b/testsuite/python-colorconfig/ref/out-ocio230.txt @@ -0,0 +1,59 @@ +getNumColorSpaces = 15 +getColorSpaceNames = ['ACES2065-1', 'ACEScc', 'ACEScct', 'ACEScg', 'Linear P3-D65', 'Linear Rec.2020', 'Linear Rec.709 (sRGB)', 'Gamma 1.8 Rec.709 - Texture', 'Gamma 2.2 AP1 - Texture', 'Gamma 2.2 Rec.709 - Texture', 'Gamma 2.4 Rec.709 - Texture', 'sRGB Encoded AP1 - Texture', 'sRGB Encoded P3-D65 - Texture', 'sRGB - Texture', 'Raw'] +Index of 'lin_srgb' = 6 +Index of 'unknown' = -1 +Name of color space 2 = ACEScct +getNumLooks = 1 +getLookNames = ['ACES 1.3 Reference Gamut Compression'] +getNumDisplays = 6 +getDisplayNames = ['sRGB - Display', 'Display P3 - Display', 'Rec.1886 Rec.709 - Display', 'Rec.2100-PQ - Display', 'ST2084-P3-D65 - Display', 'P3-D65 - Display'] +getDefaultDisplayName = sRGB - Display +getNumViews = 3 +getViewNames = ['ACES 1.0 - SDR Video', 'Un-tone-mapped', 'Raw'] +getDefaultViewName = ACES 1.0 - SDR Video +getNumRoles = 9 +getRoles = ['aces_interchange', 'cie_xyz_d65_interchange', 'color_picking', 'color_timing', 'compositing_log', 'data', 'matte_paint', 'scene_linear', 'texture_paint'] +aliases of 'scene_linear' are ['ACES - ACEScg', 'lin_ap1'] +resolve('foo'): foo +resolve('linear'): Linear Rec.709 (sRGB) +resolve('scene_linear'): ACEScg +resolve('lin_srgb'): Linear Rec.709 (sRGB) +resolve('srgb'): sRGB - Texture +resolve('ACEScg'): ACEScg +equivalent('lin_srgb', 'srgb'): False +equivalent('scene_linear', 'srgb'): False +equivalent('linear', 'lin_srgb'): False +equivalent('scene_linear', 'lin_srgb'): False +equivalent('ACEScg', 'scene_linear'): True +equivalent('lnf', 'scene_linear'): False +get_color_interop_id('ACEScg') = lin_ap1_scene +get_color_interop_id('lin_srgb') = lin_rec709_scene +get_color_interop_id([1, 13, 1, 1]) = srgb_rec709_scene +get_cicp('pq_rec2020_display') = [9, 16, 9, 1] +get_cicp('unknown_interop_id') = None +isColorSpaceLinear('scene_linear') = True +isColorSpaceLinear('srgb') = False +isData('scene_linear') = False +isData('Raw') = True +equivalent('ACEScg', 'Raw'): False +getColorSpaceFromFilepath('in_acescg.exr') = ACEScg +getColorSpaceFromFilepath('in_srgb_tx.exr') = sRGB - Texture +getColorSpaceFromFilepath('in_raw.exr') = Raw +getColorSpaceFromFilepath('none.exr') = unknown +getColorSpaceFromFilepath('noclue.exr') = unknown + +Loaded test OCIO config: oiio_test_v0.9.2.ocio +Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg +Default color space: lin_rec709 +Default display: sRGB (~2.22) - Display +Default view for sRGB (~2.22) - Display (from lin_rec709): ACES 1.0 - SDR Video +Default view for sRGB (~2.22) - Display (from 'srgb_tx'): Colorimetry +Color space name from DisplayView transform referencing Shared View: sRGB (~2.22) - Display +Test buffer -- initial values: [[[0.1 0.5 0.9]]] (ACEScg) +ociodisplay #1 (apply default display/view): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display) +ociodisplay #2 (apply default display/view again): [[[-2.783 0.766 0.9873]]] (sRGB (~2.22) - Display) +ociodisplay #3 (inverse look): [[[-18.22 0.876 2.121]]] (sRGB (~2.22) - Display) +ociodisplay #4 (forwards look): [[[-21330. 29.03 100.4 ]]] (sRGB (~2.22) - Display) +ociodisplay #5 (inverse look + forwards look): [[[93.44 93.44 93.44]]] (sRGB (~2.22) - Display) + +Done. diff --git a/testsuite/python-colorconfig/ref/out-ocio230b.txt b/testsuite/python-colorconfig/ref/out-ocio230b.txt new file mode 100644 index 0000000000..d52992d9dd --- /dev/null +++ b/testsuite/python-colorconfig/ref/out-ocio230b.txt @@ -0,0 +1,59 @@ +getNumColorSpaces = 15 +getColorSpaceNames = ['ACES2065-1', 'ACEScc', 'ACEScct', 'ACEScg', 'Linear P3-D65', 'Linear Rec.2020', 'Linear Rec.709 (sRGB)', 'Gamma 1.8 Rec.709 - Texture', 'Gamma 2.2 AP1 - Texture', 'Gamma 2.2 Rec.709 - Texture', 'Gamma 2.4 Rec.709 - Texture', 'sRGB Encoded AP1 - Texture', 'sRGB Encoded P3-D65 - Texture', 'sRGB - Texture', 'Raw'] +Index of 'lin_srgb' = 6 +Index of 'unknown' = -1 +Name of color space 2 = ACEScct +getNumLooks = 1 +getLookNames = ['ACES 1.3 Reference Gamut Compression'] +getNumDisplays = 6 +getDisplayNames = ['sRGB - Display', 'Display P3 - Display', 'Rec.1886 Rec.709 - Display', 'Rec.2100-PQ - Display', 'ST2084-P3-D65 - Display', 'P3-D65 - Display'] +getDefaultDisplayName = sRGB - Display +getNumViews = 3 +getViewNames = ['ACES 1.0 - SDR Video', 'Un-tone-mapped', 'Raw'] +getDefaultViewName = ACES 1.0 - SDR Video +getNumRoles = 9 +getRoles = ['aces_interchange', 'cie_xyz_d65_interchange', 'color_picking', 'color_timing', 'compositing_log', 'data', 'matte_paint', 'scene_linear', 'texture_paint'] +aliases of 'scene_linear' are ['ACES - ACEScg', 'lin_ap1'] +resolve('foo'): foo +resolve('linear'): Linear Rec.709 (sRGB) +resolve('scene_linear'): ACEScg +resolve('lin_srgb'): Linear Rec.709 (sRGB) +resolve('srgb'): sRGB - Texture +resolve('ACEScg'): ACEScg +equivalent('lin_srgb', 'srgb'): False +equivalent('scene_linear', 'srgb'): False +equivalent('linear', 'lin_srgb'): False +equivalent('scene_linear', 'lin_srgb'): False +equivalent('ACEScg', 'scene_linear'): True +equivalent('lnf', 'scene_linear'): False +get_color_interop_id('ACEScg') = lin_ap1_scene +get_color_interop_id('lin_srgb') = lin_rec709_scene +get_color_interop_id([1, 13, 1, 1]) = srgb_rec709_scene +get_cicp('pq_rec2020_display') = [9, 16, 9, 1] +get_cicp('unknown_interop_id') = None +isColorSpaceLinear('scene_linear') = True +isColorSpaceLinear('srgb') = False +isData('scene_linear') = False +isData('Raw') = True +equivalent('ACEScg', 'Raw'): False +getColorSpaceFromFilepath('in_acescg.exr') = ACEScg +getColorSpaceFromFilepath('in_srgb_tx.exr') = sRGB - Texture +getColorSpaceFromFilepath('in_raw.exr') = Raw +getColorSpaceFromFilepath('none.exr') = unknown +getColorSpaceFromFilepath('noclue.exr') = unknown + +Loaded test OCIO config: oiio_test_v0.9.2.ocio +Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg +Default color space: lin_rec709 +Default display: sRGB (~2.22) - Display +Default view for sRGB (~2.22) - Display (from lin_rec709): ACES 1.0 - SDR Video +Default view for sRGB (~2.22) - Display (from 'srgb_tx'): Colorimetry +Color space name from DisplayView transform referencing Shared View: sRGB (~2.22) - Display +Test buffer -- initial values: [[[0.1 0.5 0.9]]] (ACEScg) +ociodisplay #1 (apply default display/view): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display) +ociodisplay #2 (apply default display/view again): [[[-2.783 0.766 0.9873]]] (sRGB (~2.22) - Display) +ociodisplay #3 (inverse look): [[[-18.22 0.876 2.121]]] (sRGB (~2.22) - Display) +ociodisplay #4 (forwards look): [[[-21328. 29.03 100.4 ]]] (sRGB (~2.22) - Display) +ociodisplay #5 (inverse look + forwards look): [[[93.44 93.44 93.44]]] (sRGB (~2.22) - Display) + +Done. diff --git a/testsuite/python-colorconfig/ref/out-ocio23.txt b/testsuite/python-colorconfig/ref/out-ocio232.txt similarity index 91% rename from testsuite/python-colorconfig/ref/out-ocio23.txt rename to testsuite/python-colorconfig/ref/out-ocio232.txt index 96211f623a..c3452050e1 100644 --- a/testsuite/python-colorconfig/ref/out-ocio23.txt +++ b/testsuite/python-colorconfig/ref/out-ocio232.txt @@ -35,6 +35,12 @@ isColorSpaceLinear('scene_linear') = True isColorSpaceLinear('srgb') = False isData('scene_linear') = False isData('Raw') = True +equivalent('ACEScg', 'Raw'): False +getColorSpaceFromFilepath('in_acescg.exr') = ACEScg +getColorSpaceFromFilepath('in_srgb_tx.exr') = sRGB - Texture +getColorSpaceFromFilepath('in_raw.exr') = Raw +getColorSpaceFromFilepath('none.exr') = unknown +getColorSpaceFromFilepath('noclue.exr') = unknown Loaded test OCIO config: oiio_test_v0.9.2.ocio Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg diff --git a/testsuite/python-colorconfig/ref/out-ocio24.txt b/testsuite/python-colorconfig/ref/out-ocio24.txt index d962047b60..c568d2266d 100644 --- a/testsuite/python-colorconfig/ref/out-ocio24.txt +++ b/testsuite/python-colorconfig/ref/out-ocio24.txt @@ -35,6 +35,12 @@ isColorSpaceLinear('scene_linear') = True isColorSpaceLinear('srgb') = False isData('scene_linear') = False isData('Raw') = True +equivalent('ACEScg', 'Raw'): False +getColorSpaceFromFilepath('in_acescg.exr') = ACEScg +getColorSpaceFromFilepath('in_srgb_tx.exr') = sRGB Encoded Rec.709 (sRGB) +getColorSpaceFromFilepath('in_raw.exr') = Raw +getColorSpaceFromFilepath('none.exr') = Raw +getColorSpaceFromFilepath('noclue.exr') = unknown Loaded test OCIO config: oiio_test_v0.9.2.ocio Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg diff --git a/testsuite/python-colorconfig/ref/out-ocio25.txt b/testsuite/python-colorconfig/ref/out-ocio25.txt index 72293a8d8b..ced1f69a1c 100644 --- a/testsuite/python-colorconfig/ref/out-ocio25.txt +++ b/testsuite/python-colorconfig/ref/out-ocio25.txt @@ -35,6 +35,12 @@ isColorSpaceLinear('scene_linear') = True isColorSpaceLinear('srgb') = False isData('scene_linear') = False isData('Raw') = True +equivalent('ACEScg', 'Raw'): False +getColorSpaceFromFilepath('in_acescg.exr') = ACEScg +getColorSpaceFromFilepath('in_srgb_tx.exr') = sRGB Encoded Rec.709 (sRGB) +getColorSpaceFromFilepath('in_raw.exr') = Raw +getColorSpaceFromFilepath('none.exr') = Raw +getColorSpaceFromFilepath('noclue.exr') = unknown Loaded test OCIO config: oiio_test_v0.9.2.ocio Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg diff --git a/testsuite/python-colorconfig/ref/out.txt b/testsuite/python-colorconfig/ref/out.txt index 25fb8279e5..590a997026 100644 --- a/testsuite/python-colorconfig/ref/out.txt +++ b/testsuite/python-colorconfig/ref/out.txt @@ -35,6 +35,12 @@ isColorSpaceLinear('scene_linear') = True isColorSpaceLinear('srgb') = False isData('scene_linear') = False isData('Raw') = True +equivalent('ACEScg', 'Raw'): False +getColorSpaceFromFilepath('in_acescg.exr') = ACEScg +getColorSpaceFromFilepath('in_srgb_tx.exr') = sRGB Encoded Rec.709 (sRGB) +getColorSpaceFromFilepath('in_raw.exr') = Raw +getColorSpaceFromFilepath('none.exr') = Raw +getColorSpaceFromFilepath('noclue.exr') = unknown Loaded test OCIO config: oiio_test_v0.9.2.ocio Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg diff --git a/testsuite/python-colorconfig/src/test_colorconfig.py b/testsuite/python-colorconfig/src/test_colorconfig.py index c45881038c..16f3ce0ef2 100755 --- a/testsuite/python-colorconfig/src/test_colorconfig.py +++ b/testsuite/python-colorconfig/src/test_colorconfig.py @@ -57,6 +57,12 @@ print ("isColorSpaceLinear('srgb') = ", config.isColorSpaceLinear('srgb')) print ("isData('scene_linear') = ", config.isData('scene_linear')) print ("isData('Raw') = ", config.isData('Raw')) + print ("equivalent('ACEScg', 'Raw'):", config.equivalent("ACEScg", "Raw")) + print ("getColorSpaceFromFilepath('in_acescg.exr') =", config.getColorSpaceFromFilepath("in_acescg.exr")) + print ("getColorSpaceFromFilepath('in_srgb_tx.exr') =", config.getColorSpaceFromFilepath("in_srgb_tx.exr")) + print ("getColorSpaceFromFilepath('in_raw.exr') =", config.getColorSpaceFromFilepath("in_raw.exr")) + print ("getColorSpaceFromFilepath('none.exr') =", config.getColorSpaceFromFilepath("none.exr")) + print ("getColorSpaceFromFilepath('noclue.exr') =", config.getColorSpaceFromFilepath("noclue.exr")) print ("") config = oiio.ColorConfig(str(TEST_CONFIG_PATH))