diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-03-22 13:18:35 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-03-22 13:18:35 +0400 |
commit | afe46eeb40aa379126db3c564f6e7c25c59afbff (patch) | |
tree | af52029523d21803d221d29c2106662f0435aa53 /source | |
parent | 516af2e2a79292a879fab439be1fa3095ed1b68c (diff) |
Fix #34689: Multilayer EXRs don't load correctly if one layer is named and the other is not
OpenEXR's ChannelList.layers() will not include empty layer names,
which caused the issue. Made it so if there's one non-empty layer
name, check for empty names happens.
If there's empty layer name in case one non-empty layer name, file
will be considered multilayer now.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/imbuf/intern/openexr/openexr_api.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index 043bb8da83c..defbfcd3e99 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -1105,11 +1105,29 @@ static int exr_is_multilayer(InputFile *file) const ChannelList &channels = file->header().channels(); std::set <std::string> layerNames; + /* will not include empty layer names */ channels.layers(layerNames); if (comments || layerNames.size() > 1) return 1; + 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 there'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 1; + } + } + return 0; } |