Skip to content

Commit 2d97e53

Browse files
committed
feat: Support display color space interop IDs in I/O
* Display referred interop IDs are now chosen over scene referred ones by default on file read. This more closely matches the standards for CICP, ICC and other color metadata. Most images will now have oiio:ColorSpace set to srgb_rec709_display rather than srgb_rec709_scene on file read. There is a new global attribute color:prefer_image_state that when changed from the default "display" to "scene" will prefer scene referred color spaces as before. * Both srgb_rec709_scene and srgb_rec709_display are now (distinct) built-in color spaces. The built-in "sRGB" color space name was changed to be an alias of srgb_rec709_display rather than srgb_rec709_scene. * Previously only srgb_rec709_scene was recognized as sRGB for file metadata and display, now srgb_rec709_display and g22_rec709_display are treated as sRGB as well. The reason for g22_rec709_display behavior is that this type of display is often used to correct for the discrepancy where images are encoded as sRGB but usually decoded as gamma 2.2 by the physical display. By encoding it as gamma 2.2 and claiming it's sRGB the transfer functions cancel out exactly. * g24_rec709_display is now recognized as having gamma 2.4, and the name g24_rec709_scene was replaced with ocio:g24_rec709_scene since the former is not an official interop ID. * cio:itu709_rec709_scene and ocio:lin_ciexyzd65_display were added to complete the list of interop IDs in OCIO configs that match a CICP. Signed-off-by: Brecht Van Lommel <[email protected]>
1 parent f451788 commit 2d97e53

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+488
-333
lines changed

src/doc/stdmetadata.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,11 @@ Color information
149149
- `"lin_ap1_scene"`, `"ACEScg"` : ACEScg color space encoding.
150150
- `"lin_ap0_scene"` : ACES2065-1, the recommended ACES space for
151151
interchange and archiving.
152-
- `"srgb_rec709_scene"` : Using standard (piecewise) sRGB response and
152+
- `"srgb_rec709_display"` : Using standard (piecewise) sRGB response and
153153
primaries. The token `"sRGB"` is treated as a synonym.
154-
- `"g22_rec709_scene"` : Rec709/sRGB primaries, but using a response curve
154+
- `"srgb_rec709_scene"` : Same response and primaries as
155+
`"srgb_rec709_display"` but for scene referred images.
156+
- `"g22_rec709_display"` : Rec709/sRGB primaries, but using a response curve
155157
corresponding to gamma 2.2.
156158

157159
Additionally, `"scene_linear"` is a role that is appropriate for color

src/include/OpenImageIO/color.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,14 @@ class OIIO_API ColorConfig {
415415
string_view get_color_interop_id(string_view colorspace) const;
416416

417417
/// Find color interop ID corresponding to the CICP code.
418+
/// If prefer_image_state is set to "scene", prefer returning a scene
419+
/// referred interop ID over a display referred interop ID if both exist.
418420
/// Returns empty string if not found.
419421
///
420422
/// @version 3.1
421-
string_view get_color_interop_id(const int cicp[4]) const;
423+
string_view
424+
get_color_interop_id(const int cicp[4],
425+
string_view prefer_image_state = "display") const;
422426

423427
/// Return a filename or other identifier for the config we're using.
424428
std::string configname() const;

src/include/OpenImageIO/imageio.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3843,6 +3843,17 @@ OIIO_API std::string geterror(bool clear = true);
38433843
/// For more information, please see OpenImageIO's documentation on the
38443844
/// built-in PNG format support.
38453845
///
3846+
/// - `string color:prefer_image_state` ("display")
3847+
///
3848+
/// When the color space of an image file is ambiguous and can be
3849+
/// interpreted as either a display referred or scene referred, by default
3850+
/// the `oiio:ColorSpace` attribute will be set to a display color space
3851+
/// like `srgb_rec709_display`.
3852+
///
3853+
/// By setting the preferred image state to "scene", the corresponding
3854+
/// scene referred color space like `srgb_rec709_scene` will be chosen
3855+
/// instead. For textures in particular this can be a better default guess.
3856+
///
38463857
/// - `int limits:channels` (1024)
38473858
///
38483859
/// When nonzero, the maximum number of color channels in an image. Image

src/libOpenImageIO/color_ocio.cpp

Lines changed: 150 additions & 76 deletions
Large diffs are not rendered by default.

src/libOpenImageIO/imageio.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ int png_linear_premult(0);
5353
int tiff_half(0);
5454
int tiff_multithread(1);
5555
int dds_bc5normal(0);
56+
ustring color_prefer_image_state("display");
5657
int limit_channels(1024);
5758
int limit_imagesize_MB(std::min(32 * 1024,
5859
int(Sysutil::physical_memory() >> 20)));
@@ -406,6 +407,10 @@ attribute(string_view name, TypeDesc type, const void* val)
406407
dds_bc5normal = *(const int*)val;
407408
return true;
408409
}
410+
if (name == "color:prefer_image_state" && type == TypeString) {
411+
color_prefer_image_state = ustring(*(const char**)val);
412+
return true;
413+
}
409414
if (name == "limits:channels" && type == TypeInt) {
410415
limit_channels = *(const int*)val;
411416
return true;
@@ -612,6 +617,10 @@ getattribute(string_view name, TypeDesc type, void* val)
612617
*(int*)val = dds_bc5normal;
613618
return true;
614619
}
620+
if (name == "color:prefer_image_state" && type == TypeString) {
621+
*(ustring*)val = color_prefer_image_state;
622+
return true;
623+
}
615624
if (name == "oiio:print_uncaught_errors" && type == TypeInt) {
616625
*(int*)val = oiio_print_uncaught_errors;
617626
return true;

src/oiiotool/oiiotool.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5789,7 +5789,7 @@ output_file(Oiiotool& ot, cspan<const char*> argv)
57895789
|| Strutil::iends_with(filename, ".jpeg")
57905790
|| Strutil::iends_with(filename, ".gif")
57915791
|| Strutil::iends_with(filename, ".webp")))
5792-
outcolorspace = string_view("srgb_rec709_scene");
5792+
outcolorspace = string_view("srgb_rec709_display");
57935793
if (outcolorspace.empty()
57945794
&& (Strutil::iends_with(filename, ".ppm")
57955795
|| Strutil::iends_with(filename, ".pnm")))

src/raw.imageio/rawinput.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,8 @@ RawInput::open_raw(bool unpack, bool process, const std::string& name,
577577
m_processor->imgdata.params.output_color = 0;
578578
m_processor->imgdata.params.gamm[0] = 1.0;
579579
m_processor->imgdata.params.gamm[1] = 1.0;
580-
} else if (cs.empty() || colorconfig.equivalent(cs, "srgb_rec709_scene")
580+
} else if (cs.empty() || colorconfig.equivalent(cs, "srgb_rec709_display")
581+
|| colorconfig.equivalent(cs, "srgb_rec709_scene")
581582
|| Strutil::iequals(cs, "sRGB") /* Necessary? */) {
582583
// Request explicit sRGB, including usual sRGB response
583584
m_processor->imgdata.params.output_color = 1;

testsuite/bmp/ref/out.txt

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Reading ../oiio-images/bmpsuite/g01bg.bmp
44
channel list: R, G, B
55
bmp:bitsperpixel: 1
66
bmp:version: 3
7-
oiio:ColorSpace: "srgb_rec709_scene"
7+
oiio:ColorSpace: "srgb_rec709_display"
88
Comparing "../oiio-images/bmpsuite/g01bg.bmp" and "g01bg.bmp"
99
PASS
1010
Reading ../oiio-images/bmpsuite/g01bw.bmp
@@ -13,7 +13,7 @@ Reading ../oiio-images/bmpsuite/g01bw.bmp
1313
channel list: R, G, B
1414
bmp:bitsperpixel: 1
1515
bmp:version: 3
16-
oiio:ColorSpace: "srgb_rec709_scene"
16+
oiio:ColorSpace: "srgb_rec709_display"
1717
Comparing "../oiio-images/bmpsuite/g01bw.bmp" and "g01bw.bmp"
1818
PASS
1919
Reading ../oiio-images/bmpsuite/g01p1.bmp
@@ -22,7 +22,7 @@ Reading ../oiio-images/bmpsuite/g01p1.bmp
2222
channel list: R, G, B
2323
bmp:bitsperpixel: 1
2424
bmp:version: 3
25-
oiio:ColorSpace: "srgb_rec709_scene"
25+
oiio:ColorSpace: "srgb_rec709_display"
2626
Comparing "../oiio-images/bmpsuite/g01p1.bmp" and "g01p1.bmp"
2727
PASS
2828
Reading ../oiio-images/bmpsuite/g01wb.bmp
@@ -31,7 +31,7 @@ Reading ../oiio-images/bmpsuite/g01wb.bmp
3131
channel list: R, G, B
3232
bmp:bitsperpixel: 1
3333
bmp:version: 3
34-
oiio:ColorSpace: "srgb_rec709_scene"
34+
oiio:ColorSpace: "srgb_rec709_display"
3535
Comparing "../oiio-images/bmpsuite/g01wb.bmp" and "g01wb.bmp"
3636
PASS
3737
Reading ../oiio-images/bmpsuite/g04.bmp
@@ -40,7 +40,7 @@ Reading ../oiio-images/bmpsuite/g04.bmp
4040
channel list: R, G, B
4141
bmp:bitsperpixel: 4
4242
bmp:version: 3
43-
oiio:ColorSpace: "srgb_rec709_scene"
43+
oiio:ColorSpace: "srgb_rec709_display"
4444
Comparing "../oiio-images/bmpsuite/g04.bmp" and "g04.bmp"
4545
PASS
4646
Reading ../oiio-images/bmpsuite/g04p4.bmp
@@ -49,7 +49,7 @@ Reading ../oiio-images/bmpsuite/g04p4.bmp
4949
channel list: R, G, B
5050
bmp:bitsperpixel: 4
5151
bmp:version: 3
52-
oiio:ColorSpace: "srgb_rec709_scene"
52+
oiio:ColorSpace: "srgb_rec709_display"
5353
Comparing "../oiio-images/bmpsuite/g04p4.bmp" and "g04p4.bmp"
5454
PASS
5555
Reading ../oiio-images/bmpsuite/g04rle.bmp
@@ -59,7 +59,7 @@ Reading ../oiio-images/bmpsuite/g04rle.bmp
5959
compression: "rle4"
6060
bmp:bitsperpixel: 4
6161
bmp:version: 3
62-
oiio:ColorSpace: "srgb_rec709_scene"
62+
oiio:ColorSpace: "srgb_rec709_display"
6363
Comparing "../oiio-images/bmpsuite/g04rle.bmp" and "g04rle.bmp"
6464
PASS
6565
Reading ../oiio-images/bmpsuite/g08.bmp
@@ -68,7 +68,7 @@ Reading ../oiio-images/bmpsuite/g08.bmp
6868
channel list: R, G, B
6969
bmp:bitsperpixel: 8
7070
bmp:version: 3
71-
oiio:ColorSpace: "srgb_rec709_scene"
71+
oiio:ColorSpace: "srgb_rec709_display"
7272
Comparing "../oiio-images/bmpsuite/g08.bmp" and "g08.bmp"
7373
PASS
7474
Reading ../oiio-images/bmpsuite/g08os2.bmp
@@ -77,7 +77,7 @@ Reading ../oiio-images/bmpsuite/g08os2.bmp
7777
channel list: R, G, B
7878
bmp:bitsperpixel: 8
7979
bmp:version: 1
80-
oiio:ColorSpace: "srgb_rec709_scene"
80+
oiio:ColorSpace: "srgb_rec709_display"
8181
Comparing "../oiio-images/bmpsuite/g08os2.bmp" and "g08os2.bmp"
8282
PASS
8383
Reading ../oiio-images/bmpsuite/g08p64.bmp
@@ -86,7 +86,7 @@ Reading ../oiio-images/bmpsuite/g08p64.bmp
8686
channel list: Y
8787
bmp:bitsperpixel: 8
8888
bmp:version: 3
89-
oiio:ColorSpace: "srgb_rec709_scene"
89+
oiio:ColorSpace: "srgb_rec709_display"
9090
Comparing "../oiio-images/bmpsuite/g08p64.bmp" and "g08p64.bmp"
9191
PASS
9292
Reading ../oiio-images/bmpsuite/g08p256.bmp
@@ -95,7 +95,7 @@ Reading ../oiio-images/bmpsuite/g08p256.bmp
9595
channel list: R, G, B
9696
bmp:bitsperpixel: 8
9797
bmp:version: 3
98-
oiio:ColorSpace: "srgb_rec709_scene"
98+
oiio:ColorSpace: "srgb_rec709_display"
9999
Comparing "../oiio-images/bmpsuite/g08p256.bmp" and "g08p256.bmp"
100100
PASS
101101
Reading ../oiio-images/bmpsuite/g08pi64.bmp
@@ -104,7 +104,7 @@ Reading ../oiio-images/bmpsuite/g08pi64.bmp
104104
channel list: R, G, B
105105
bmp:bitsperpixel: 8
106106
bmp:version: 3
107-
oiio:ColorSpace: "srgb_rec709_scene"
107+
oiio:ColorSpace: "srgb_rec709_display"
108108
Comparing "../oiio-images/bmpsuite/g08pi64.bmp" and "g08pi64.bmp"
109109
PASS
110110
Reading ../oiio-images/bmpsuite/g08pi256.bmp
@@ -113,7 +113,7 @@ Reading ../oiio-images/bmpsuite/g08pi256.bmp
113113
channel list: R, G, B
114114
bmp:bitsperpixel: 8
115115
bmp:version: 3
116-
oiio:ColorSpace: "srgb_rec709_scene"
116+
oiio:ColorSpace: "srgb_rec709_display"
117117
Comparing "../oiio-images/bmpsuite/g08pi256.bmp" and "g08pi256.bmp"
118118
PASS
119119
Reading ../oiio-images/bmpsuite/g08res11.bmp
@@ -125,7 +125,7 @@ Reading ../oiio-images/bmpsuite/g08res11.bmp
125125
YResolution: 3937
126126
bmp:bitsperpixel: 8
127127
bmp:version: 3
128-
oiio:ColorSpace: "srgb_rec709_scene"
128+
oiio:ColorSpace: "srgb_rec709_display"
129129
Comparing "../oiio-images/bmpsuite/g08res11.bmp" and "g08res11.bmp"
130130
PASS
131131
Reading ../oiio-images/bmpsuite/g08res21.bmp
@@ -137,7 +137,7 @@ Reading ../oiio-images/bmpsuite/g08res21.bmp
137137
YResolution: 3937
138138
bmp:bitsperpixel: 8
139139
bmp:version: 3
140-
oiio:ColorSpace: "srgb_rec709_scene"
140+
oiio:ColorSpace: "srgb_rec709_display"
141141
Comparing "../oiio-images/bmpsuite/g08res21.bmp" and "g08res21.bmp"
142142
PASS
143143
Reading ../oiio-images/bmpsuite/g08res22.bmp
@@ -149,7 +149,7 @@ Reading ../oiio-images/bmpsuite/g08res22.bmp
149149
YResolution: 7874
150150
bmp:bitsperpixel: 8
151151
bmp:version: 3
152-
oiio:ColorSpace: "srgb_rec709_scene"
152+
oiio:ColorSpace: "srgb_rec709_display"
153153
Comparing "../oiio-images/bmpsuite/g08res22.bmp" and "g08res22.bmp"
154154
PASS
155155
Reading ../oiio-images/bmpsuite/g08s0.bmp
@@ -158,7 +158,7 @@ Reading ../oiio-images/bmpsuite/g08s0.bmp
158158
channel list: R, G, B
159159
bmp:bitsperpixel: 8
160160
bmp:version: 3
161-
oiio:ColorSpace: "srgb_rec709_scene"
161+
oiio:ColorSpace: "srgb_rec709_display"
162162
Comparing "../oiio-images/bmpsuite/g08s0.bmp" and "g08s0.bmp"
163163
PASS
164164
Reading ../oiio-images/bmpsuite/g08w124.bmp
@@ -167,7 +167,7 @@ Reading ../oiio-images/bmpsuite/g08w124.bmp
167167
channel list: R, G, B
168168
bmp:bitsperpixel: 8
169169
bmp:version: 3
170-
oiio:ColorSpace: "srgb_rec709_scene"
170+
oiio:ColorSpace: "srgb_rec709_display"
171171
Comparing "../oiio-images/bmpsuite/g08w124.bmp" and "g08w124.bmp"
172172
PASS
173173
Reading ../oiio-images/bmpsuite/g08w125.bmp
@@ -176,7 +176,7 @@ Reading ../oiio-images/bmpsuite/g08w125.bmp
176176
channel list: R, G, B
177177
bmp:bitsperpixel: 8
178178
bmp:version: 3
179-
oiio:ColorSpace: "srgb_rec709_scene"
179+
oiio:ColorSpace: "srgb_rec709_display"
180180
Comparing "../oiio-images/bmpsuite/g08w125.bmp" and "g08w125.bmp"
181181
PASS
182182
Reading ../oiio-images/bmpsuite/g08w126.bmp
@@ -185,7 +185,7 @@ Reading ../oiio-images/bmpsuite/g08w126.bmp
185185
channel list: R, G, B
186186
bmp:bitsperpixel: 8
187187
bmp:version: 3
188-
oiio:ColorSpace: "srgb_rec709_scene"
188+
oiio:ColorSpace: "srgb_rec709_display"
189189
Comparing "../oiio-images/bmpsuite/g08w126.bmp" and "g08w126.bmp"
190190
PASS
191191
Reading ../oiio-images/bmpsuite/g08rle.bmp
@@ -195,7 +195,7 @@ Reading ../oiio-images/bmpsuite/g08rle.bmp
195195
compression: "rle8"
196196
bmp:bitsperpixel: 8
197197
bmp:version: 3
198-
oiio:ColorSpace: "srgb_rec709_scene"
198+
oiio:ColorSpace: "srgb_rec709_display"
199199
Comparing "../oiio-images/bmpsuite/g08rle.bmp" and "g08rle.bmp"
200200
PASS
201201
Reading ../oiio-images/bmpsuite/g08offs.bmp
@@ -204,31 +204,31 @@ Reading ../oiio-images/bmpsuite/g08offs.bmp
204204
channel list: R, G, B
205205
bmp:bitsperpixel: 8
206206
bmp:version: 3
207-
oiio:ColorSpace: "srgb_rec709_scene"
207+
oiio:ColorSpace: "srgb_rec709_display"
208208
Comparing "../oiio-images/bmpsuite/g08offs.bmp" and "g08offs.bmp"
209209
PASS
210210
Reading ../oiio-images/bmpsuite/g24.bmp
211211
../oiio-images/bmpsuite/g24.bmp : 127 x 64, 3 channel, uint8 bmp
212212
SHA-1: B1FB63649469F31D02D7AD065D3128EE04CC662E
213213
channel list: R, G, B
214214
bmp:version: 3
215-
oiio:ColorSpace: "srgb_rec709_scene"
215+
oiio:ColorSpace: "srgb_rec709_display"
216216
Comparing "../oiio-images/bmpsuite/g24.bmp" and "g24.bmp"
217217
PASS
218218
Reading ../oiio-images/bmpsuite/g32bf.bmp
219219
../oiio-images/bmpsuite/g32bf.bmp : 127 x 64, 4 channel, uint8 bmp
220220
SHA-1: D8807C680B17C70CB33B43AC072E0A9121C551B4
221221
channel list: R, G, B, A
222222
bmp:version: 3
223-
oiio:ColorSpace: "srgb_rec709_scene"
223+
oiio:ColorSpace: "srgb_rec709_display"
224224
Comparing "../oiio-images/bmpsuite/g32bf.bmp" and "g32bf.bmp"
225225
PASS
226226
Reading ../oiio-images/bmpsuite/g32def.bmp
227227
../oiio-images/bmpsuite/g32def.bmp : 127 x 64, 4 channel, uint8 bmp
228228
SHA-1: D8807C680B17C70CB33B43AC072E0A9121C551B4
229229
channel list: R, G, B, A
230230
bmp:version: 3
231-
oiio:ColorSpace: "srgb_rec709_scene"
231+
oiio:ColorSpace: "srgb_rec709_display"
232232
Comparing "../oiio-images/bmpsuite/g32def.bmp" and "g32def.bmp"
233233
PASS
234234
Reading ../oiio-images/bmpsuite/g16bf555.bmp
@@ -238,7 +238,7 @@ Reading ../oiio-images/bmpsuite/g16bf555.bmp
238238
bmp:bitsperpixel: 16
239239
bmp:version: 3
240240
oiio:BitsPerSample: 5
241-
oiio:ColorSpace: "srgb_rec709_scene"
241+
oiio:ColorSpace: "srgb_rec709_display"
242242
Comparing "../oiio-images/bmpsuite/g16bf555.bmp" and "g16bf555.bmp"
243243
PASS
244244
Reading ../oiio-images/bmpsuite/g16bf565.bmp
@@ -248,7 +248,7 @@ Reading ../oiio-images/bmpsuite/g16bf565.bmp
248248
bmp:bitsperpixel: 16
249249
bmp:version: 3
250250
oiio:BitsPerSample: 5
251-
oiio:ColorSpace: "srgb_rec709_scene"
251+
oiio:ColorSpace: "srgb_rec709_display"
252252
Comparing "../oiio-images/bmpsuite/g16bf565.bmp" and "g16bf565.bmp"
253253
PASS
254254
Reading ../oiio-images/bmpsuite/g16def555.bmp
@@ -258,7 +258,7 @@ Reading ../oiio-images/bmpsuite/g16def555.bmp
258258
bmp:bitsperpixel: 16
259259
bmp:version: 3
260260
oiio:BitsPerSample: 5
261-
oiio:ColorSpace: "srgb_rec709_scene"
261+
oiio:ColorSpace: "srgb_rec709_display"
262262
Comparing "../oiio-images/bmpsuite/g16def555.bmp" and "g16def555.bmp"
263263
PASS
264264
Reading src/g01bg2-v5.bmp
@@ -269,7 +269,7 @@ src/g01bg2-v5.bmp : 127 x 64, 3 channel, uint8 bmp
269269
XResolution: 2835
270270
YResolution: 2835
271271
bmp:version: 5
272-
oiio:ColorSpace: "srgb_rec709_scene"
272+
oiio:ColorSpace: "srgb_rec709_display"
273273
Comparing "src/g01bg2-v5.bmp" and "g01bg2-v5.bmp"
274274
PASS
275275
Reading src/PRINTER.BMP
@@ -278,7 +278,7 @@ src/PRINTER.BMP : 160 x 120, 3 channel, uint8 bmp
278278
channel list: R, G, B
279279
bmp:bitsperpixel: 8
280280
bmp:version: 1
281-
oiio:ColorSpace: "srgb_rec709_scene"
281+
oiio:ColorSpace: "srgb_rec709_display"
282282
Comparing "src/PRINTER.BMP" and "PRINTER.BMP"
283283
PASS
284284
Reading ../oiio-images/bmp/gracehopper.bmp
@@ -288,7 +288,7 @@ Reading ../oiio-images/bmp/gracehopper.bmp
288288
ResolutionUnit: "m"
289289
XResolution: 2835
290290
YResolution: 2835
291-
oiio:ColorSpace: "srgb_rec709_scene"
291+
oiio:ColorSpace: "srgb_rec709_display"
292292
Comparing "../oiio-images/bmp/gracehopper.bmp" and "gracehopper.bmp"
293293
PASS
294294
oiiotool ERROR: read : "src/decodecolormap-corrupt.bmp": Possible corrupted header, invalid palette size

0 commit comments

Comments
 (0)