Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-07-17 21:46:04 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-07-17 21:55:53 +0300
commiteee46769cefe47c9edcc2ac430f212c1e31e7ad5 (patch)
tree58637e3f5a5ae1d7b2765e7cc0a6c654d8001b7f
parent709f126e8143da4fa28a08a94e13581c68ab6b29 (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.cpp27
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,