From afe46eeb40aa379126db3c564f6e7c25c59afbff Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 22 Mar 2013 09:18:35 +0000 Subject: 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. --- source/blender/imbuf/intern/openexr/openexr_api.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'source/blender/imbuf/intern/openexr/openexr_api.cpp') 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 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; } -- cgit v1.2.3