From e91c8300a6a21a25c065e0c39ec7645e6800c610 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 25 Sep 2025 23:27:14 +0200 Subject: [PATCH] OpenEXR: Write colorspace metadata for multilayer EXR Previously it was only working for the single layer case. For multipart we write the colorspace in each part. For single part we write the first non-data colorspace, and hope data passes will be identified based on channel name like Blender does (e.g. XYZ instead of RGB). Reading is unchanged and still the same as before, in that it only reads the colorspace from the first part. There is only one color space per image datablock, so we can not store anything more currently. In practice it would be unusual for all passes in a file not to either have the same colorspace or be data. All the compositor file output test images were updated to include the metadata, so that the test will check if the metadata is there. Ref #144911 Pull Request: https://projects.blender.org/blender/blender/pulls/146809 --- .../blender/blenkernel/intern/image_save.cc | 67 +++++++++----- source/blender/imbuf/IMB_openexr.hh | 3 +- .../imbuf/intern/openexr/openexr_api.cpp | 87 +++++++++++++++---- .../imbuf/intern/openexr/openexr_stub.cpp | 1 + .../exr_multilayer_passes/0001.exr | 4 +- .../multilayer_multipart0001_L.exr | 4 +- .../multilayer_multipart0001_R.exr | 4 +- .../multilayer_singlepart0001_L.exr | 4 +- .../multilayer_singlepart0001_R.exr | 4 +- .../exr_multipart/multiview_multipart0001.exr | 4 +- .../multiview_singlepart0001.exr | 4 +- .../file_output/exr_passes/Alpha0001.exr | 4 +- .../exr_passes/CryptoObject000001.exr | 4 +- .../exr_passes/CryptoObject010001.exr | 4 +- .../file_output/exr_passes/Depth0001.exr | 4 +- .../file_output/exr_passes/DiffCol0001.exr | 4 +- .../file_output/exr_passes/Image0001.exr | 4 +- .../file_output/exr_passes/Normal0001.exr | 4 +- .../file_output/exr_passes/Vector0001.exr | 4 +- .../exr_png_group_multilayer_passes/0001.exr | 4 +- .../file_output/png_exr_single/Image0001.exr | 4 +- .../file_output/png_to_exr/A0001.exr | 4 +- .../file_output/png_to_exr/B0001.exr | 4 +- .../file_output/png_to_exr/G0001.exr | 4 +- .../file_output/png_to_exr/Image0001.exr | 4 +- .../file_output/png_to_exr/R0001.exr | 4 +- 26 files changed, 162 insertions(+), 84 deletions(-) diff --git a/source/blender/blenkernel/intern/image_save.cc b/source/blender/blenkernel/intern/image_save.cc index bdf1e775a16..dee869966ed 100644 --- a/source/blender/blenkernel/intern/image_save.cc +++ b/source/blender/blenkernel/intern/image_save.cc @@ -703,7 +703,8 @@ static float *image_exr_from_scene_linear_to_output(float *rect, const int height, const int channels, const ImageFormatData *imf, - Vector &tmp_output_rects) + Vector &tmp_output_rects, + blender::StringRefNull &r_colorspace) { if (imf == nullptr) { return rect; @@ -722,6 +723,8 @@ static float *image_exr_from_scene_linear_to_output(float *rect, IMB_colormanagement_transform_float( output_rect, width, height, channels, from_colorspace, to_colorspace, false); + r_colorspace = to_colorspace; + return output_rect; } @@ -805,14 +808,19 @@ static void add_exr_compositing_result(ExrHandle *exr_handle, /* Compositing results is always a 4-channel RGBA. */ const int channels_count_in_buffer = 4; - float *output_buffer = (save_as_render) ? image_exr_from_scene_linear_to_output( - render_view->ibuf->float_buffer.data, - render_result->rectx, - render_result->recty, - channels_count_in_buffer, - imf, - temporary_buffers) : - render_view->ibuf->float_buffer.data; + float *output_buffer = render_view->ibuf->float_buffer.data; + blender::StringRefNull colorspace = IMB_colormanagement_role_colorspace_name_get( + COLOR_ROLE_SCENE_LINEAR); + + if (save_as_render) { + output_buffer = image_exr_from_scene_linear_to_output(output_buffer, + render_result->rectx, + render_result->recty, + channels_count_in_buffer, + imf, + temporary_buffers, + colorspace); + } /* For multi-layer EXRs, we write the buffer as is with all its 4 channels. */ const bool half_float = (imf && imf->depth == R_IMF_CHAN_DEPTH_16); @@ -821,6 +829,7 @@ static void add_exr_compositing_result(ExrHandle *exr_handle, "Composite.Combined", "RGBA", render_view_name, + colorspace, channels_count_in_buffer, channels_count_in_buffer * render_result->rectx, output_buffer, @@ -843,6 +852,7 @@ static void add_exr_compositing_result(ExrHandle *exr_handle, "", "V", render_view_name, + colorspace, 1, render_result->rectx, gray_scale_output, @@ -857,6 +867,7 @@ static void add_exr_compositing_result(ExrHandle *exr_handle, "", channelnames, render_view_name, + colorspace, channels_count_in_buffer, channels_count_in_buffer * render_result->rectx, output_buffer, @@ -928,15 +939,19 @@ bool BKE_image_render_write_exr(ReportList *reports, const bool pass_half_float = half_float && pass_RGBA; /* Color-space conversion only happens on RGBA passes. */ - float *output_rect = (save_as_render && pass_RGBA) ? - image_exr_from_scene_linear_to_output( - render_pass->ibuf->float_buffer.data, - rr->rectx, - rr->recty, - render_pass->channels, - imf, - tmp_output_rects) : - render_pass->ibuf->float_buffer.data; + float *output_rect = render_pass->ibuf->float_buffer.data; + blender::StringRefNull colorspace = IMB_colormanagement_role_colorspace_name_get( + (pass_RGBA) ? COLOR_ROLE_SCENE_LINEAR : COLOR_ROLE_DATA); + + if (save_as_render && pass_RGBA) { + output_rect = image_exr_from_scene_linear_to_output(output_rect, + rr->rectx, + rr->recty, + render_pass->channels, + imf, + tmp_output_rects, + colorspace); + } /* For multi-layer EXRs, we write the pass as is with all of its channels. */ if (multi_layer) { @@ -952,6 +967,7 @@ bool BKE_image_render_write_exr(ReportList *reports, layer_pass_name, channelnames, viewname, + colorspace, render_pass->channels, render_pass->channels * rr->rectx, output_rect, @@ -975,6 +991,7 @@ bool BKE_image_render_write_exr(ReportList *reports, "", channelnames, viewname, + colorspace, render_pass->channels, render_pass->channels * rr->rectx, output_rect, @@ -985,8 +1002,15 @@ bool BKE_image_render_write_exr(ReportList *reports, * the input is RGB[A] and not single channel because it filed the condition above. */ float *gray_scale_output = image_exr_from_rgb_to_bw( output_rect, rr->rectx, rr->recty, render_pass->channels, tmp_output_rects); - IMB_exr_add_channels( - exrhandle, "", "V", viewname, 1, rr->rectx, gray_scale_output, pass_half_float); + IMB_exr_add_channels(exrhandle, + "", + "V", + viewname, + colorspace, + 1, + rr->rectx, + gray_scale_output, + pass_half_float); } else if (render_pass->channels == 1) { /* In case of a single channel pass, we need to broadcast the same channel for each of @@ -997,6 +1021,7 @@ bool BKE_image_render_write_exr(ReportList *reports, "", std::string(1, "RGB"[i]).c_str(), viewname, + colorspace, 1, rr->rectx, output_rect, @@ -1010,7 +1035,7 @@ bool BKE_image_render_write_exr(ReportList *reports, float *alpha_output = image_exr_opaque_alpha_buffer( rr->rectx, rr->recty, tmp_output_rects); IMB_exr_add_channels( - exrhandle, "", "A", viewname, 1, rr->rectx, alpha_output, pass_half_float); + exrhandle, "", "A", viewname, colorspace, 1, rr->rectx, alpha_output, pass_half_float); } } } diff --git a/source/blender/imbuf/IMB_openexr.hh b/source/blender/imbuf/IMB_openexr.hh index e7c32e421d1..3f5fd804cf8 100644 --- a/source/blender/imbuf/IMB_openexr.hh +++ b/source/blender/imbuf/IMB_openexr.hh @@ -29,12 +29,13 @@ ExrHandle *IMB_exr_get_handle(bool write_multipart = false); * Add multiple channels to EXR file. * The number of channels is determined by channelnames.size() with * each character a channel name. - * Layer and pass name, and view name are optional. + * Layer and pass name, view name and colorspace are all optional. */ void IMB_exr_add_channels(ExrHandle *handle, blender::StringRefNull layerpassname, blender::StringRefNull channelnames, blender::StringRefNull viewname, + blender::StringRefNull colorspace, size_t xstride, size_t ystride, float *rect, diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index 821610481f0..197b4c7b97f 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -111,6 +111,7 @@ using namespace Imath; static bool exr_has_multiview(MultiPartInputFile &file); static bool exr_has_multipart_file(MultiPartInputFile &file); static bool exr_has_alpha(MultiPartInputFile &file); +static const ColorSpace *imb_exr_part_colorspace(const Header &header); /* XYZ with Illuminant E */ static Imf::Chromaticities CHROMATICITIES_XYZ_E{ @@ -521,6 +522,29 @@ static void openexr_header_metadata_global(Header *header, } } +static void openexr_header_metadata_colorspace(Header *header, const ColorSpace *colorspace) +{ + if (colorspace == nullptr) { + return; + } + + const char *aces_colorspace = IMB_colormanagement_role_colorspace_name_get( + COLOR_ROLE_ACES_INTERCHANGE); + const char *ibuf_colorspace = IMB_colormanagement_colorspace_get_name(colorspace); + + /* Write chromaticities for ACES-2065-1, as required by ACES container format. */ + if (aces_colorspace && STREQ(aces_colorspace, ibuf_colorspace)) { + header->insert("chromaticities", TypedAttribute(CHROMATICITIES_ACES_2065_1)); + header->insert("adoptedNeutral", TypedAttribute(CHROMATICITIES_ACES_2065_1.white)); + } + + /* Write interop ID if available. */ + blender::StringRefNull interop_id = IMB_colormanagement_space_get_interop_id(colorspace); + if (!interop_id.is_empty()) { + header->insert("colorInteropID", TypedAttribute(interop_id)); + } +} + static void openexr_header_metadata_colorspace(Header *header, ImBuf *ibuf) { /* Get colorspace from image buffer. */ @@ -536,23 +560,7 @@ static void openexr_header_metadata_colorspace(Header *header, ImBuf *ibuf) colorspace = ibuf->byte_buffer.colorspace; } - if (colorspace) { - const char *aces_colorspace = IMB_colormanagement_role_colorspace_name_get( - COLOR_ROLE_ACES_INTERCHANGE); - const char *ibuf_colorspace = IMB_colormanagement_colorspace_get_name(colorspace); - - /* Write chromaticities for ACES-2065-1, as required by ACES container format. */ - if (aces_colorspace && STREQ(aces_colorspace, ibuf_colorspace)) { - header->insert("chromaticities", TypedAttribute(CHROMATICITIES_ACES_2065_1)); - header->insert("adoptedNeutral", TypedAttribute(CHROMATICITIES_ACES_2065_1.white)); - } - - /* Write interop ID if available. */ - blender::StringRefNull interop_id = IMB_colormanagement_space_get_interop_id(colorspace); - if (!interop_id.is_empty()) { - header->insert("colorInteropID", TypedAttribute(interop_id)); - } - } + openexr_header_metadata_colorspace(header, colorspace); } static void openexr_header_metadata_callback(void *data, @@ -780,6 +788,9 @@ struct ExrChannel { /* Channel view. */ std::string view; + /* Colorspace. */ + const ColorSpace *colorspace; + int xstride = 0, ystride = 0; /* step to next pixel, to next scan-line. */ float *rect = nullptr; /* first pointer to write in */ char chan_id = 0; /* quick lookup of channel char */ @@ -899,6 +910,7 @@ void IMB_exr_add_channels(ExrHandle *handle, blender::StringRefNull layerpassname, blender::StringRefNull channelnames, blender::StringRefNull viewname, + blender::StringRefNull colorspace, size_t xstride, size_t ystride, float *rect, @@ -948,6 +960,7 @@ void IMB_exr_add_channels(ExrHandle *handle, echan.internal_name = full_name; echan.part_name = part_name; echan.view = viewname; + echan.colorspace = IMB_colormanagement_space_get_named(colorspace.c_str()); echan.xstride = xstride; echan.ystride = ystride; @@ -995,6 +1008,26 @@ bool IMB_exr_begin_write(ExrHandle *handle, openexr_header_compression(&header, compress, quality); + if (!handle->write_multipart) { + /* If we're writing single part, we can only add one colorspace even if there are + * multiple passes with potentially different spaces. Prefer to write non-data + * colorspace in that case, since readers can detect data passes based on + * channels names being e.g. XYZ instead of RGB. */ + bool found = false; + for (const ExrChannel &echan : handle->channels) { + if (echan.colorspace && !IMB_colormanagement_space_is_data(echan.colorspace)) { + openexr_header_metadata_colorspace(&header, echan.colorspace); + found = true; + break; + } + } + if (!found) { + if (const ColorSpace *colorspace = handle->channels[0].colorspace) { + openexr_header_metadata_colorspace(&header, colorspace); + } + } + } + blender::Vector
part_headers; blender::StringRefNull last_part_name; @@ -1003,13 +1036,14 @@ bool IMB_exr_begin_write(ExrHandle *handle, if (part_headers.is_empty() || last_part_name != echan.part_name) { Header part_header = header; - /* When writing multipart, set name, view and type in each part. */ + /* When writing multipart, set name, view,type and colorspace in each part. */ if (handle->write_multipart) { part_header.setName(echan.part_name); if (!echan.view.empty()) { part_header.insert("view", StringAttribute(echan.view)); } part_header.insert("type", StringAttribute(SCANLINEIMAGE)); + openexr_header_metadata_colorspace(&part_header, echan.colorspace); } /* Store global metadata in the first header only. Large metadata like cryptomatte would @@ -1552,10 +1586,19 @@ static blender::Vector exr_channels_in_multi_part_file(const MultiPa const bool parse_layers) { blender::Vector channels; + const ColorSpace *global_colorspace = imb_exr_part_colorspace(file.header(0)); + /* Get channels from each part. */ for (int p = 0; p < file.parts(); p++) { const ChannelList &c = file.header(p).channels(); + /* Parse colorspace. Per part colorspaces are not currently used, but + * might as well populate them them for consistency with writing. */ + const ColorSpace *colorspace = imb_exr_part_colorspace(file.header(p)); + if (colorspace == nullptr) { + colorspace = global_colorspace; + } + /* There are two ways of storing multiview EXRs: * - Multiple views in part with multiView attribute. * - Each view in its own part with view attribute. */ @@ -1609,6 +1652,7 @@ static blender::Vector exr_channels_in_multi_part_file(const MultiPa } echan.part_number = p; + echan.colorspace = colorspace; channels.append(std::move(echan)); } } @@ -1983,6 +2027,13 @@ static void imb_exr_set_known_colorspace(const Header &header, ImFileColorSpace } } +static const ColorSpace *imb_exr_part_colorspace(const Header &header) +{ + ImFileColorSpace colorspace; + imb_exr_set_known_colorspace(header, colorspace); + return IMB_colormanagement_space_get_named(colorspace.metadata_colorspace); +} + static bool exr_get_ppm(MultiPartInputFile &file, double ppm[2]) { const Header &header = file.header(0); diff --git a/source/blender/imbuf/intern/openexr/openexr_stub.cpp b/source/blender/imbuf/intern/openexr/openexr_stub.cpp index 97c9ae609eb..5441be76ef9 100644 --- a/source/blender/imbuf/intern/openexr/openexr_stub.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_stub.cpp @@ -17,6 +17,7 @@ void IMB_exr_add_channels(ExrHandle * /*handle*/, blender::StringRefNull /*layerpassname*/, blender::StringRefNull /*channelnames*/, blender::StringRefNull /*viewname*/, + blender::StringRefNull /*colorspace*/, size_t /*xstride*/, size_t /*ystride*/, float * /*rect*/, diff --git a/tests/files/compositor/file_output/exr_multilayer_passes/0001.exr b/tests/files/compositor/file_output/exr_multilayer_passes/0001.exr index 7e834fe0da6..f6c6aa69cd2 100644 --- a/tests/files/compositor/file_output/exr_multilayer_passes/0001.exr +++ b/tests/files/compositor/file_output/exr_multilayer_passes/0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:494205c90c7faeabb40b424ac2fc60d82c2ecad9d1e4b919458f821a18303d90 -size 5378 +oid sha256:207c7cfe7824731a0a11eb31afeaa118dd85e25641ed2d272365c08874a441bd +size 5408 diff --git a/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_L.exr b/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_L.exr index 140908862e6..2f308b69603 100644 --- a/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_L.exr +++ b/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_L.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38f4347bf148b3a881daa1a0e903086e26c337583e7f9bb6093bae7e544a6d11 -size 23733 +oid sha256:bcc4463e4170bd89e3b49c5913554763a3bbb4c01f20a54f2900b83814f016b5 +size 23877 diff --git a/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_R.exr b/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_R.exr index f8e40dcb8d0..f76173a479c 100644 --- a/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_R.exr +++ b/tests/files/compositor/file_output/exr_multipart/multilayer_multipart0001_R.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:635186ddb32909fcd6f1275d0fb725bd5babb126fae184f0fd6c8ed9aead4d72 -size 23733 +oid sha256:3195c27b3e7915cedb891d57a5bec80bdb445de21a5f10c3bbba7b44eaad4e86 +size 23877 diff --git a/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_L.exr b/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_L.exr index ab33a568d00..93c228f194b 100644 --- a/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_L.exr +++ b/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_L.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3780497e510bab1b5bc7bf111bb678b2a9d9c4b199225165dda6cbd2b8caa932 -size 21082 +oid sha256:4e971da5fd633d63e367539fe65fd8996c2fc2394215ad93e52e7b246ada988b +size 21124 diff --git a/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_R.exr b/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_R.exr index 5154e1f8fa8..015ab9cadb4 100644 --- a/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_R.exr +++ b/tests/files/compositor/file_output/exr_multipart/multilayer_singlepart0001_R.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a64de347b64300333ec6c2e2a9c37b3fc5f0fa79673698b2d65eba20fe9385d9 -size 21082 +oid sha256:f80af266a64dc9b91dd87fb669056a9957b222573d89182a08ed457f116c3b48 +size 21124 diff --git a/tests/files/compositor/file_output/exr_multipart/multiview_multipart0001.exr b/tests/files/compositor/file_output/exr_multipart/multiview_multipart0001.exr index fd6160fbe4e..855100f0c1c 100644 --- a/tests/files/compositor/file_output/exr_multipart/multiview_multipart0001.exr +++ b/tests/files/compositor/file_output/exr_multipart/multiview_multipart0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f09afce7df1cd251f9a251aa360c4ea95af0bfbe948ed43e42686c6dd153438e -size 47547 +oid sha256:6ef2f16a11fb5afc8322f2103d994dcd698c9c93b516143e2fe4b3e31d365489 +size 47835 diff --git a/tests/files/compositor/file_output/exr_multipart/multiview_singlepart0001.exr b/tests/files/compositor/file_output/exr_multipart/multiview_singlepart0001.exr index 99bfddb41ee..b8faaa4a6f5 100644 --- a/tests/files/compositor/file_output/exr_multipart/multiview_singlepart0001.exr +++ b/tests/files/compositor/file_output/exr_multipart/multiview_singlepart0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33ecbf237abe33eda557bbdaaf31f68b1105dd7ad41399440093533ca51d2303 -size 41563 +oid sha256:ff30a5467565bf3360eb24672fa9c477f15dbf14e88728dbc7345da7b7108466 +size 41605 diff --git a/tests/files/compositor/file_output/exr_passes/Alpha0001.exr b/tests/files/compositor/file_output/exr_passes/Alpha0001.exr index c3007ea4723..0065b88ea14 100644 --- a/tests/files/compositor/file_output/exr_passes/Alpha0001.exr +++ b/tests/files/compositor/file_output/exr_passes/Alpha0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:351b16545172beb388c0543f5a09d263255171ae386acebc9bebfda940f4e74c -size 631 +oid sha256:104396197d3e2cc35a3a54f17d7b952a7be21554cb5177b82f4d9f0051c29adf +size 718 diff --git a/tests/files/compositor/file_output/exr_passes/CryptoObject000001.exr b/tests/files/compositor/file_output/exr_passes/CryptoObject000001.exr index d09551d6e96..2e6dbcc6709 100644 --- a/tests/files/compositor/file_output/exr_passes/CryptoObject000001.exr +++ b/tests/files/compositor/file_output/exr_passes/CryptoObject000001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e849156a128ed84ddc083d1fe042df2221eac4a02165719343f52b028945ac7 -size 2552 +oid sha256:5d4df9e5479988185a654b2449b23ce4fde0b1557a8e8eb8dd90d2efeb638038 +size 2639 diff --git a/tests/files/compositor/file_output/exr_passes/CryptoObject010001.exr b/tests/files/compositor/file_output/exr_passes/CryptoObject010001.exr index ecf3748f9a1..ed7a4f469ca 100644 --- a/tests/files/compositor/file_output/exr_passes/CryptoObject010001.exr +++ b/tests/files/compositor/file_output/exr_passes/CryptoObject010001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7b9a8b64352552eb4ec36622371b91401ca6b9dbfaad32e096b39452acc4688 -size 933 +oid sha256:c6d88b9cfcf3ca76e914dff25dbf49510dee68965e7cfa7970d9e1ec8de616e8 +size 1020 diff --git a/tests/files/compositor/file_output/exr_passes/Depth0001.exr b/tests/files/compositor/file_output/exr_passes/Depth0001.exr index 7c7713edf59..3625457094d 100644 --- a/tests/files/compositor/file_output/exr_passes/Depth0001.exr +++ b/tests/files/compositor/file_output/exr_passes/Depth0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f95d38150c46aed3a694b94a24423bf26cf3882262d5350f0c67b7a4e51a7979 -size 1016 +oid sha256:b67885a17096613890e965503c06a5435e99a813576d6304dcf3cb7ca199590b +size 1103 diff --git a/tests/files/compositor/file_output/exr_passes/DiffCol0001.exr b/tests/files/compositor/file_output/exr_passes/DiffCol0001.exr index 1975aa6c4d2..e425ef79817 100644 --- a/tests/files/compositor/file_output/exr_passes/DiffCol0001.exr +++ b/tests/files/compositor/file_output/exr_passes/DiffCol0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9853545c0bcf5d11a117caa3cd24b2ad97a699ad9cfacc0b116be4512e38a170 -size 1384 +oid sha256:fd2600725a154b187b4c8f6716c1cd7df4155fc4b108fb9d28dac2b085a1110d +size 1483 diff --git a/tests/files/compositor/file_output/exr_passes/Image0001.exr b/tests/files/compositor/file_output/exr_passes/Image0001.exr index 43f05ee2eda..40fa1396f33 100644 --- a/tests/files/compositor/file_output/exr_passes/Image0001.exr +++ b/tests/files/compositor/file_output/exr_passes/Image0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d9b1befc5b7a4963e18e47d622713f83aa14905917adf4d8c3051e50d99cd567 -size 1269 +oid sha256:386b2efd1827ea030652cfc7fa62f0fe39fc13ade3d91f932fa14a2d73c28dab +size 1368 diff --git a/tests/files/compositor/file_output/exr_passes/Normal0001.exr b/tests/files/compositor/file_output/exr_passes/Normal0001.exr index 90ee1d3d53a..73243c9a90f 100644 --- a/tests/files/compositor/file_output/exr_passes/Normal0001.exr +++ b/tests/files/compositor/file_output/exr_passes/Normal0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a6970b8a8fdb68d6f0bb15760707c6177cfb8c51ac012f54a9637e566bba398 -size 891 +oid sha256:4341f0d4ce4c51b8faeab4e65d853ca8d69076fb5782b1119b208164f98cf713 +size 974 diff --git a/tests/files/compositor/file_output/exr_passes/Vector0001.exr b/tests/files/compositor/file_output/exr_passes/Vector0001.exr index 378a2df78ec..e5a6e802c77 100644 --- a/tests/files/compositor/file_output/exr_passes/Vector0001.exr +++ b/tests/files/compositor/file_output/exr_passes/Vector0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3f3b334ddcb4344bea4c60a3c81fa30353bf427a650875f98318c2d5396b7e1 -size 741 +oid sha256:a16fa50f07c36345a709c693e4d005dbb0efa5a1e0505df0ca21b2eefaebdf7b +size 800 diff --git a/tests/files/compositor/file_output/exr_png_group_multilayer_passes/0001.exr b/tests/files/compositor/file_output/exr_png_group_multilayer_passes/0001.exr index 2aa01ef4803..d68b47c1c83 100644 --- a/tests/files/compositor/file_output/exr_png_group_multilayer_passes/0001.exr +++ b/tests/files/compositor/file_output/exr_png_group_multilayer_passes/0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba83c83d58289939878e38f7f817b633142486b6cf41e8aeb5fdcb884041e903 -size 5358 +oid sha256:a23f8ee6212a93ed1cbde581cf304c4e4770e9c97342d2854ffe1cf85d48bc11 +size 5418 diff --git a/tests/files/compositor/file_output/png_exr_single/Image0001.exr b/tests/files/compositor/file_output/png_exr_single/Image0001.exr index 7053d581f07..abca15e793a 100644 --- a/tests/files/compositor/file_output/png_exr_single/Image0001.exr +++ b/tests/files/compositor/file_output/png_exr_single/Image0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8980ebd995d0130588b2ce7559299393ef6ddafec432028a51ea63e6347e6bb -size 1020 +oid sha256:fcfd55de11a82bd4f866ceaec85b0a37388dddd7afb79ea7f056920fee864ed0 +size 1107 diff --git a/tests/files/compositor/file_output/png_to_exr/A0001.exr b/tests/files/compositor/file_output/png_to_exr/A0001.exr index ec653b6c9b7..d237486c9ed 100644 --- a/tests/files/compositor/file_output/png_to_exr/A0001.exr +++ b/tests/files/compositor/file_output/png_to_exr/A0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4954992682b73f5b3befac12dc18a3545004cba509014ed61ef06a6a33e5829b -size 18458 +oid sha256:92d962e07e1f7076ffe38188ff3863717a25cdf4c4a56af1b2300867e02235b0 +size 18545 diff --git a/tests/files/compositor/file_output/png_to_exr/B0001.exr b/tests/files/compositor/file_output/png_to_exr/B0001.exr index 21b7963f0f6..766d304e08d 100644 --- a/tests/files/compositor/file_output/png_to_exr/B0001.exr +++ b/tests/files/compositor/file_output/png_to_exr/B0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f963680479f0989552c0797203ffb0222a40b0c872b55371720524619ba9125d -size 117989 +oid sha256:c63ff23ffc3c736e6c831e20c582bf7f715a801f7d09e7c4223ab62cbf4bca2f +size 118076 diff --git a/tests/files/compositor/file_output/png_to_exr/G0001.exr b/tests/files/compositor/file_output/png_to_exr/G0001.exr index b0ec59f05c8..6a0ed8e4c02 100644 --- a/tests/files/compositor/file_output/png_to_exr/G0001.exr +++ b/tests/files/compositor/file_output/png_to_exr/G0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a847c32415bbd75ea3c0b69f53b62057201153ec3c0a4202e262e025487191f1 -size 117599 +oid sha256:f1fe073cc3d1652ee28e75d76102426220aaa0c748d2b865f82bb04baec71f16 +size 117686 diff --git a/tests/files/compositor/file_output/png_to_exr/Image0001.exr b/tests/files/compositor/file_output/png_to_exr/Image0001.exr index 14cb317a747..16fd9ed731d 100644 --- a/tests/files/compositor/file_output/png_to_exr/Image0001.exr +++ b/tests/files/compositor/file_output/png_to_exr/Image0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9b480dffdc7231b142a47e19151bf703cce61b10f37d709d06a798caa7854387 -size 146870 +oid sha256:4ba51fc86559fcdf1a04a4ed35f31ce10c00a4f667521cf52bc6d571ba2edd5a +size 146969 diff --git a/tests/files/compositor/file_output/png_to_exr/R0001.exr b/tests/files/compositor/file_output/png_to_exr/R0001.exr index 42eafe4628e..fd3b4939b14 100644 --- a/tests/files/compositor/file_output/png_to_exr/R0001.exr +++ b/tests/files/compositor/file_output/png_to_exr/R0001.exr @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fe8a325cd37cb1b68d169162e5a8c374b5dde404ae9e695c7d46f84692c3c624 -size 118257 +oid sha256:9525dd70ad7d925f151a4c613c2e7dff6f0e9b782f4d915ab0c0b018ee4539b5 +size 118344