Skip to content

Commit 8f83072

Browse files
authored
feat: support OCIO Viewing Rules, other OCIO-related improvements (#4780)
This PR fixes and improves a tiny constellation of OCIO-related bits, directly or indirectly pertaining to OCIO Viewing Rules and File Rules, and the propagation of `oiio:ColorSpace`. ## Description The focus of this PR: - feat: Permit the `ociodisplay` ImageBufAlgo to dynamically select a default View for the `fromspace` (or current `oiio:ColorSpace` value), as directed by the OCIO config's Viewing Rules (if present) - feat: Have the `ociodisplay` IBA appropriately set the destination ImageSpec's color space. As part of this effort, a handful of additional changes and improvements are addressed: - fix: Re-enable the "looks" override functionality, matching the previous OCIO-1-style behavior. - fix: Improve `ColorConfig::getDisplayViewColorSpaceName(...)`'s handling of Shared Views - feat: Overload `ColorConfig::getDefaultViewName(...)` with function that takes an additional `inputColorSpace` argument - change: Alter the `ociofiletransform` IBA's behavior pertaining to setting the destination spec's color space: instead of storing the filepath as the `oiio:ColorSpace` value, attempt to get the color space from the filepath; else, leave the `oiio:ColorSpace` attribute alone. This isn't 100% foolproof, obviously, but I'd prefer to reserve the `oiio:ColorSpace` attribute for color space names, unless there's a reason not to. In a future PR, we can additionally attempt to divine a valid color space string from specific CLF and CTF metadata, if present. - feat: Implement a `ColorConfig::filepathOnlyMatchesDefaultRule(...)` function, which wraps the OCIO::Config function of the same name. - change: Alter `ColorConfig::getColorSpaceFromFilepath(...)` to behave more like the OCIO::Config function of the same name. In particular, return the Config's default color space name (instead of failing over to OCIO-1 string-parsing heuristics, which, in turn, fail over to an empty string); and provide an overloaded variant for implementing the legacy (i.e., current) behavior. Update all usages in the codebase (i.e., in oiiotool, w.r.t. autocc) to use the overloaded variant, so there's no apparent change in behavior to how autocc functions. ## Background This PR was inspired by #4753, which adds to the Python ImageBuf bindings a `_repr_png_` magic method which returns a PNG bytestring (which Jupyter notebooks can display inline), similar in behavior to other libraries, like Pillow. This is great for previewing gamma-encoded output-referred buffer data, but less great for previewing "linear" encodings. Ideally, the `_repr_png_` method would apply an `ociodisplay` ImageBufAlgo just before writing the PNG; but there would need to be some means of controlling for the buffer "image state" when determining how / whether to apply an `ociodisplay` IBA. For example, it would be appropriate to apply the default ColorConfig's "ACES 1.0 - SDR Video" View to an image buffer that contains scene-referred data; but very evidently inappropriate to apply that same View to an image buffer that holds display-referred data, yielding a "double-LUTted" appearance. Fortunately, OCIO-2 `Viewing Rules` provides a solution. Viewing Rules allow OCIO Config authors to selectively filter the set of Views available for a given Display, on a per-input-colorspace basis. Ostensibly, applications use the OCIO API's DisplayViewHelper class for building View menu UX widgets that dynamically update as a function of both the selected Display and Input Color Space; but there are implications for headless applications, as well -- crucially, the Config author may order Active Views such that different Input Color Spaces elicit different default Views. ## Tests I've included a test OCIO config with some Viewing Rules and File Rules in testsuite/python-colorconfig; I'm testing that the new and updated python bindings behave as expected; and I'm testing that the `ociodisplay` IBA is OCIO-Viewing-Rules-aware and is properly propagating `oiio:ColorSpace` to the dst buffer's spec. Notably: ```python import os import OpenImageIO as oiio import numpy as np os.environ["OCIO"] = "/path/to/testsuite/python-colorconfig/src/oiio_test_v0.9.2.ocio" a = oiio.ImageBuf(np.array([[[0.1, 0.2, 0.3]]])) # The first time the ociodisplay IBA is applied, the lack of an `oiio:ColorSpace` # attribute will be interpreted as the OCIO config's default color space -- in this case, # "lin_rec709", which corresponds to a scene-referred default view (ACES 1.0 - SDR Video). b = oiio.ImageBufAlgo.ociodisplay(a, "", "") # The second time around, the `oiio:ColorSpace` attribute is now "sRGB (~2.22) - Display", # a display-referred color space, thanks to the previous operation; as such, the IBA uses # a different colorimetric "pass-thru" View as its default ("Colorimetry"), instead of the # ACES View. Upshot is, values remain unchanged this time. assert b.spec()['oiio:ColorSpace'], 'sRGB (~2.22) - Display' c = oiio.ImageBufAlgo.ociodisplay(b, "", "") assert c.spec()['oiio:ColorSpace'], 'sRGB (~2.22) - Display' # Subsequent applications will be noops as well. d = oiio.ImageBufAlgo.ociodisplay(c, "", "") assert np.allclose(b.get_pixels(), c.get_pixels()) assert np.allclose(b.get_pixels(), d.get_pixels()) assert not np.allclose(b.get_pixels(), a.get_pixels()) ``` ## TL;DR This PR enables OCIO config authors to dynamically control `ociodisplay` IBA behavior w.r.t. the `oiio:ColorSpace` attribute, such that `ImageBufAlgo.ociodisplay(buf, "", "")` always "does the right thing", regardless of whether `buf` holds scene-referred or display-referred data. --------- Signed-off-by: Zach Lewis <zachcanbereached@gmail.com>
1 parent 98dec00 commit 8f83072

File tree

10 files changed

+508
-23
lines changed

10 files changed

+508
-23
lines changed

src/include/OpenImageIO/color.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,16 @@ class OIIO_API ColorConfig {
236236

237237
/// Query the name of the default view for the specified display. If the
238238
/// display is empty or not specified, the default display will be used.
239+
/// This version does not consider the input color space.
239240
const char* getDefaultViewName(string_view display = "") const;
240241

242+
/// Query the name of the default view for the specified display, given
243+
/// the input color space. If `display` is "default" or an empty string,
244+
/// the default display will be used. The input color space is used to
245+
/// determine the most appropriate default view for the given display.
246+
const char* getDefaultViewName(string_view display,
247+
string_view inputColorSpace) const;
248+
241249
/// Returns the colorspace attribute of the (display, view) pair. (Note
242250
/// that this may be either a color space or a display color space.)
243251
/// Returns nullptr for failure.
@@ -351,9 +359,25 @@ class OIIO_API ColorConfig {
351359
/// Given a filepath, ask OCIO what color space it thinks the file
352360
/// should be, based on how the name matches file naming rules in the
353361
/// OCIO config. (This is mostly a wrapper around OCIO's
354-
/// ColorConfig::getColorSpaceFromSFilepath.)
362+
/// ColorConfig::getColorSpaceFromFilepath.)
355363
string_view getColorSpaceFromFilepath(string_view str) const;
356364

365+
/// Given a filepath, ask OCIO what color space it thinks the file
366+
/// should be, based on how the name matches file naming rules in the
367+
/// OCIO config. If no match is found, return `default_cs` instead of
368+
/// the OCIO config's default color space. If `cs_name_match` is
369+
/// true, additionally attempt to match the color space name in the
370+
/// filename, if the OCIO config heuristics fail to find a match.
371+
string_view getColorSpaceFromFilepath(string_view str,
372+
string_view default_cs,
373+
bool cs_name_match = false) const;
374+
375+
/// Given a filepath, returns whether the result of
376+
/// getColorSpaceFromFilepath() is the failover condition, due
377+
/// to the OCIO config's file rules not otherwise finding a match
378+
/// for the filepath.
379+
bool filepathOnlyMatchesDefaultRule(string_view str) const;
380+
357381
/// Given a string (like a filename), look for the longest, right-most
358382
/// colorspace substring that appears. Returns "" if no such color space
359383
/// is found.

src/libOpenImageIO/color_ocio.cpp

Lines changed: 81 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,14 +1218,35 @@ ColorConfig::getDefaultViewName(string_view display) const
12181218
}
12191219

12201220

1221+
const char*
1222+
ColorConfig::getDefaultViewName(string_view display,
1223+
string_view inputColorSpace) const
1224+
{
1225+
if (display.empty() || display == "default")
1226+
display = getDefaultDisplayName();
1227+
if (inputColorSpace.empty() || inputColorSpace == "default")
1228+
inputColorSpace = getImpl()->config_->getColorSpaceFromFilepath(
1229+
c_str(inputColorSpace));
1230+
if (getImpl()->config_ && !disable_ocio)
1231+
return getImpl()->config_->getDefaultView(c_str(display),
1232+
c_str(inputColorSpace));
1233+
return nullptr;
1234+
}
1235+
12211236

12221237
const char*
12231238
ColorConfig::getDisplayViewColorSpaceName(const std::string& display,
12241239
const std::string& view) const
12251240
{
1226-
if (getImpl()->config_ && !disable_ocio)
1227-
return getImpl()->config_->getDisplayViewColorSpaceName(display.c_str(),
1228-
view.c_str());
1241+
if (getImpl()->config_ && !disable_ocio) {
1242+
string_view name
1243+
= getImpl()->config_->getDisplayViewColorSpaceName(c_str(display),
1244+
c_str(view));
1245+
// Handle certain Shared View cases
1246+
if (strcmp(c_str(name), "<USE_DISPLAY_NAME>") == 0)
1247+
name = display;
1248+
return c_str(name);
1249+
}
12291250
return nullptr;
12301251
}
12311252

@@ -1893,7 +1914,7 @@ ColorConfig::createDisplayTransform(ustring display, ustring view,
18931914
if (display.empty() || display == "default")
18941915
display = getDefaultDisplayName();
18951916
if (view.empty() || view == "default")
1896-
view = getDefaultViewName(display);
1917+
view = getDefaultViewName(display, inputColorSpace);
18971918
// First, look up the requested processor in the cache. If it already
18981919
// exists, just return it.
18991920
ColorProcCacheKey prockey(inputColorSpace, ustring() /*outputColorSpace*/,
@@ -1909,15 +1930,18 @@ ColorConfig::createDisplayTransform(ustring display, ustring view,
19091930
if (getImpl()->config_ && !disable_ocio) {
19101931
OCIO::ConstConfigRcPtr config = getImpl()->config_;
19111932
auto transform = OCIO::DisplayViewTransform::Create();
1933+
auto legacy_viewing_pipeline = OCIO::LegacyViewingPipeline::Create();
1934+
OCIO::TransformDirection dir = inverse ? OCIO::TRANSFORM_DIR_INVERSE
1935+
: OCIO::TRANSFORM_DIR_FORWARD;
19121936
transform->setSrc(inputColorSpace.c_str());
1913-
if (looks.size()) {
1914-
getImpl()->error(
1915-
"createDisplayTransform: looks overrides are not allowed in OpenColorIO v2");
1916-
}
1917-
OCIO::TransformDirection dir = inverse ? OCIO::TRANSFORM_DIR_INVERSE
1918-
: OCIO::TRANSFORM_DIR_FORWARD;
19191937
transform->setDisplay(display.c_str());
19201938
transform->setView(view.c_str());
1939+
transform->setDirection(dir);
1940+
legacy_viewing_pipeline->setDisplayViewTransform(transform);
1941+
if (looks.size()) {
1942+
legacy_viewing_pipeline->setLooksOverride(looks.c_str());
1943+
legacy_viewing_pipeline->setLooksOverrideEnabled(true);
1944+
}
19211945
auto context = config->getCurrentContext();
19221946
auto keys = Strutil::splits(context_key, ",");
19231947
auto values = Strutil::splits(context_value, ",");
@@ -1931,7 +1955,7 @@ ColorConfig::createDisplayTransform(ustring display, ustring view,
19311955
OCIO::ConstProcessorRcPtr p;
19321956
try {
19331957
// Get the processor corresponding to this transform.
1934-
p = config->getProcessor(context, transform, dir);
1958+
p = legacy_viewing_pipeline->getProcessor(config, context);
19351959
getImpl()->clear_error();
19361960
handle = ColorProcessorHandle(new ColorProcessor_OCIO(p));
19371961
} catch (OCIO::Exception& e) {
@@ -2083,14 +2107,36 @@ ColorConfig::getColorSpaceFromFilepath(string_view str) const
20832107
std::string s(str);
20842108
string_view r = getImpl()->config_->getColorSpaceFromFilepath(
20852109
s.c_str());
2086-
if (!getImpl()->config_->filepathOnlyMatchesDefaultRule(s.c_str()))
2087-
return r;
2110+
return r;
20882111
}
20892112
// Fall back on parseColorSpaceFromString
20902113
return parseColorSpaceFromString(str);
20912114
}
20922115

2116+
string_view
2117+
ColorConfig::getColorSpaceFromFilepath(string_view str, string_view default_cs,
2118+
bool cs_name_match) const
2119+
{
2120+
if (getImpl() && getImpl()->config_) {
2121+
std::string s(str);
2122+
string_view r = getImpl()->config_->getColorSpaceFromFilepath(
2123+
s.c_str());
2124+
if (!getImpl()->config_->filepathOnlyMatchesDefaultRule(s.c_str()))
2125+
return r;
2126+
}
2127+
if (cs_name_match) {
2128+
string_view parsed = parseColorSpaceFromString(str);
2129+
if (parsed.size())
2130+
return parsed;
2131+
}
2132+
return default_cs;
2133+
}
20932134

2135+
bool
2136+
ColorConfig::filepathOnlyMatchesDefaultRule(string_view str) const
2137+
{
2138+
return getImpl()->config_->filepathOnlyMatchesDefaultRule(c_str(str));
2139+
}
20942140

20952141
string_view
20962142
ColorConfig::parseColorSpaceFromString(string_view str) const
@@ -2549,6 +2595,20 @@ ImageBufAlgo::ociodisplay(ImageBuf& dst, const ImageBuf& src,
25492595

25502596
logtime.stop(); // transition to colorconvert
25512597
bool ok = colorconvert(dst, src, processor.get(), unpremult, roi, nthreads);
2598+
if (ok) {
2599+
if (inverse)
2600+
dst.specmod().set_colorspace(colorconfig->resolve(from));
2601+
else {
2602+
if (display.empty() || display == "default")
2603+
display = colorconfig->getDefaultDisplayName();
2604+
if (view.empty() || view == "default")
2605+
view = colorconfig->getDefaultViewName(display,
2606+
colorconfig->resolve(
2607+
from));
2608+
dst.specmod().set_colorspace(
2609+
colorconfig->getDisplayViewColorSpaceName(display, view));
2610+
}
2611+
}
25522612
return ok;
25532613
}
25542614

@@ -2600,7 +2660,14 @@ ImageBufAlgo::ociofiletransform(ImageBuf& dst, const ImageBuf& src,
26002660
logtime.stop(); // transition to colorconvert
26012661
bool ok = colorconvert(dst, src, processor.get(), unpremult, roi, nthreads);
26022662
if (ok)
2603-
dst.specmod().set_colorspace(name);
2663+
// If we can parse a color space from the file name, and we're not inverting
2664+
// the transform, then we'll use the color space name from the file.
2665+
// Otherwise, we'll leave `oiio:ColorSpace` alone.
2666+
// TODO: Use OCIO to extract InputDescription and OutputDescription CLF
2667+
// metadata attributes, if present.
2668+
if (!colorconfig->filepathOnlyMatchesDefaultRule(name))
2669+
dst.specmod().set_colorspace(
2670+
colorconfig->getColorSpaceFromFilepath(name));
26042671
return ok;
26052672
}
26062673

src/oiiotool/oiiotool.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5341,7 +5341,7 @@ input_file(Oiiotool& ot, cspan<const char*> argv)
53415341
if (autocc) {
53425342
// Try to deduce the color space it's in
53435343
std::string colorspace(
5344-
ot.colorconfig().getColorSpaceFromFilepath(filename));
5344+
ot.colorconfig().getColorSpaceFromFilepath(filename, "", true));
53455345
if (colorspace.size() && ot.debug)
53465346
print(" From {}, we deduce color space \"{}\"\n", filename,
53475347
colorspace);
@@ -5659,8 +5659,8 @@ output_file(Oiiotool& ot, cspan<const char*> argv)
56595659
// automatically set -d based on the name if --autocc is used.
56605660
bool autocc = fileoptions.get_int("autocc", ot.autocc);
56615661
bool autoccunpremult = fileoptions.get_int("unpremult", ot.autoccunpremult);
5662-
std::string outcolorspace = ot.colorconfig().getColorSpaceFromFilepath(
5663-
filename);
5662+
std::string outcolorspace
5663+
= ot.colorconfig().getColorSpaceFromFilepath(filename, "", true);
56645664
if (autocc && outcolorspace.size()) {
56655665
TypeDesc type;
56665666
int bits;

src/python/py_colorconfig.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ declare_colorconfig(py::module& m)
8888
return self.getDefaultViewName(display);
8989
},
9090
"display"_a = "")
91+
.def(
92+
"getDefaultViewName",
93+
[](const ColorConfig& self, const std::string& display,
94+
const std::string& input_color_space) {
95+
return self.getDefaultViewName(display, input_color_space);
96+
},
97+
"display"_a = "", "input_color_space"_a)
9198
.def(
9299
"getDisplayViewColorSpaceName",
93100
[](const ColorConfig& self, const std::string& display,
@@ -115,10 +122,27 @@ declare_colorconfig(py::module& m)
115122
[](const ColorConfig& self, const std::string& named_transform) {
116123
return self.getNamedTransformAliases(named_transform);
117124
})
118-
.def("getColorSpaceFromFilepath",
119-
[](const ColorConfig& self, const std::string& str) {
120-
return std::string(self.getColorSpaceFromFilepath(str));
121-
})
125+
.def(
126+
"getColorSpaceFromFilepath",
127+
[](const ColorConfig& self, const std::string& filepath) {
128+
return std::string(self.getColorSpaceFromFilepath(filepath));
129+
},
130+
"filepath"_a)
131+
.def(
132+
"getColorSpaceFromFilepath",
133+
[](const ColorConfig& self, const std::string& filepath,
134+
const std::string& default_cs, const bool& cs_name_match) {
135+
return std::string(
136+
self.getColorSpaceFromFilepath(filepath, default_cs,
137+
cs_name_match));
138+
},
139+
"filepath"_a, "default_cs"_a, "cs_name_match"_a = false)
140+
.def(
141+
"filepathOnlyMatchesDefaultRule",
142+
[](const ColorConfig& self, const std::string& filepath) {
143+
return self.filepathOnlyMatchesDefaultRule(filepath);
144+
},
145+
"filepath"_a)
122146
.def("parseColorSpaceFromString",
123147
[](const ColorConfig& self, const std::string& str) {
124148
return std::string(self.parseColorSpaceFromString(str));

src/python/stubs/OpenImageIO/__init__.pyi

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,16 +169,23 @@ class ColorConfig:
169169
@staticmethod
170170
def default_colorconfig() -> ColorConfig: ...
171171
def equivalent(self, color_space: str, other_color_space: str) -> bool: ...
172+
def filepathOnlyMatchesDefaultRule(self, filepath: str) -> bool: ...
172173
def getAliases(self, arg0: str, /) -> list[str]: ...
173174
def getColorSpaceDataType(self, name: str) -> tuple[TypeDesc, int]: ...
174175
def getColorSpaceFamilyByName(self, name: str) -> str: ...
175-
def getColorSpaceFromFilepath(self, arg0: str, /) -> str: ...
176+
@overload
177+
def getColorSpaceFromFilepath(self, filepath: str) -> str: ...
178+
@overload
179+
def getColorSpaceFromFilepath(self, filepath: str, default_cs: str, cs_name_match: bool = ...) -> str: ...
176180
def getColorSpaceIndex(self, name: str) -> int: ...
177181
def getColorSpaceNameByIndex(self, arg0: int, /) -> str: ...
178182
def getColorSpaceNameByRole(self, role: str) -> str: ...
179183
def getColorSpaceNames(self) -> list[str]: ...
180184
def getDefaultDisplayName(self) -> str: ...
185+
@overload
181186
def getDefaultViewName(self, display: str = ...) -> str: ...
187+
@overload
188+
def getDefaultViewName(self, display: str = ..., *, input_color_space: str) -> str: ...
182189
def getDisplayNameByIndex(self, arg0: int, /) -> str: ...
183190
def getDisplayNames(self) -> list[str]: ...
184191
def getDisplayViewColorSpaceName(self, display: str, view: str) -> str: ...

testsuite/python-colorconfig/ref/out-ocio23.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,18 @@ equivalent('scene_linear', 'lin_srgb'): False
2727
equivalent('ACEScg', 'scene_linear'): True
2828
equivalent('lnf', 'scene_linear'): False
2929

30+
Loaded test OCIO config: oiio_test_v0.9.2.ocio
31+
Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg
32+
Default color space: lin_rec709
33+
Default display: sRGB (~2.22) - Display
34+
Default view for sRGB (~2.22) - Display (from lin_rec709): ACES 1.0 - SDR Video
35+
Default view for sRGB (~2.22) - Display (from 'srgb_tx'): Colorimetry
36+
Color space name from DisplayView transform referencing Shared View: sRGB (~2.22) - Display
37+
Test buffer -- initial values: [[[0.1 0.5 0.9]]] (ACEScg)
38+
ociodisplay #1 (apply default display/view): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
39+
ociodisplay #2 (apply default display/view again): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
40+
ociodisplay #3 (inverse look): [[[-2.252 0.6714 0.8037]]] (sRGB (~2.22) - Display)
41+
ociodisplay #4 (forwards look): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
42+
ociodisplay #5 (inverse look + forwards look): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
43+
3044
Done.

testsuite/python-colorconfig/ref/out-ocio24.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,18 @@ equivalent('scene_linear', 'lin_srgb'): False
2727
equivalent('ACEScg', 'scene_linear'): True
2828
equivalent('lnf', 'scene_linear'): False
2929

30+
Loaded test OCIO config: oiio_test_v0.9.2.ocio
31+
Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg
32+
Default color space: lin_rec709
33+
Default display: sRGB (~2.22) - Display
34+
Default view for sRGB (~2.22) - Display (from lin_rec709): ACES 1.0 - SDR Video
35+
Default view for sRGB (~2.22) - Display (from 'srgb_tx'): Colorimetry
36+
Color space name from DisplayView transform referencing Shared View: sRGB (~2.22) - Display
37+
Test buffer -- initial values: [[[0.1 0.5 0.9]]] (ACEScg)
38+
ociodisplay #1 (apply default display/view): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
39+
ociodisplay #2 (apply default display/view again): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
40+
ociodisplay #3 (inverse look): [[[-2.252 0.6714 0.8037]]] (sRGB (~2.22) - Display)
41+
ociodisplay #4 (forwards look): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
42+
ociodisplay #5 (inverse look + forwards look): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
43+
3044
Done.

testsuite/python-colorconfig/ref/out.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,18 @@ equivalent('scene_linear', 'lin_srgb'): False
2727
equivalent('ACEScg', 'scene_linear'): True
2828
equivalent('lnf', 'scene_linear'): False
2929

30+
Loaded test OCIO config: oiio_test_v0.9.2.ocio
31+
Parsed color space for filepath 'foo_lin_ap1.exr': ACEScg
32+
Default color space: lin_rec709
33+
Default display: sRGB (~2.22) - Display
34+
Default view for sRGB (~2.22) - Display (from lin_rec709): ACES 1.0 - SDR Video
35+
Default view for sRGB (~2.22) - Display (from 'srgb_tx'): Colorimetry
36+
Color space name from DisplayView transform referencing Shared View: sRGB (~2.22) - Display
37+
Test buffer -- initial values: [[[0.1 0.5 0.9]]] (ACEScg)
38+
ociodisplay #1 (apply default display/view): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
39+
ociodisplay #2 (apply default display/view again): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
40+
ociodisplay #3 (inverse look): [[[-2.252 0.6714 0.8037]]] (sRGB (~2.22) - Display)
41+
ociodisplay #4 (forwards look): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
42+
ociodisplay #5 (inverse look + forwards look): [[[-2.123 0.671 0.8037]]] (sRGB (~2.22) - Display)
43+
3044
Done.

0 commit comments

Comments
 (0)