diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-07-17 21:46:04 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-07-17 21:55:53 +0300 |
commit | eee46769cefe47c9edcc2ac430f212c1e31e7ad5 (patch) | |
tree | 58637e3f5a5ae1d7b2765e7cc0a6c654d8001b7f | |
parent | 709f126e8143da4fa28a08a94e13581c68ab6b29 (diff) |
Fix T66515, T67112, T61607: failure to read EXR files with single, named layer
Like Blender renders without a Z channel. The single layer case assume that channel
names are just R/G/B/A without any layer name prefix, and would not read channels
like "Image.R".
Carefully tested for regressions with the openexr project tests images, so this
should be safe.
-rw-r--r-- | source/blender/imbuf/intern/openexr/openexr_api.cpp | 27 |
1 files changed, 3 insertions, 24 deletions
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index 69dec88e727..c9883d5df86 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -1762,32 +1762,11 @@ static bool imb_exr_is_multilayer_file(MultiPartInputFile &file) const ChannelList &channels = file.header(0).channels(); std::set<std::string> layerNames; - /* will not include empty layer names */ + /* This will not include empty layer names, so files with just R/G/B/A + * channels without a layer name will be single layer. */ channels.layers(layerNames); - if (layerNames.size() > 1) { - return true; - } - - if (layerNames.size()) { - /* if layerNames is not empty, it means at least one layer is non-empty, - * but it also could be layers without names in the file and such case - * shall be considered a multilayer exr - * - * that's what we do here: test whether they're empty layer names together - * with non-empty ones in the file - */ - for (ChannelList::ConstIterator i = channels.begin(); i != channels.end(); i++) { - std::string layerName = i.name(); - size_t pos = layerName.rfind('.'); - - if (pos == std::string::npos) { - return true; - } - } - } - - return false; + return (layerNames.size() > 0); } static void imb_exr_type_by_channels(ChannelList &channels, |