InputFile::InputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is, int numThreads): _data (new Data (numThreads)) { _data->_streamData=NULL; _data->_deleteStream=false; try { readMagicNumberAndVersionField(is, _data->version); // // Backward compatibility to read multpart file. // if (isMultiPart(_data->version)) { compatibilityInitialize(is); } else { _data->_streamData = new InputStreamMutex(); _data->_streamData->is = &is; _data->header.readFrom (*_data->_streamData->is, _data->version); // fix type attribute in single part regular image types // (may be wrong if an old version of OpenEXR converts // a tiled image to scanline or vice versa) if(!isNonImage(_data->version) && !isMultiPart(_data->version) && _data->header.hasType()) { _data->header.setType(isTiled(_data->version) ? TILEDIMAGE : SCANLINEIMAGE); } _data->header.sanityCheck (isTiled (_data->version)); initialize(); } } catch (IEX_NAMESPACE::BaseExc &e) { if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; _data=NULL; REPLACE_EXC (e, "Cannot read image file " "\"" << is.fileName() << "\". " << e.what()); throw; } catch (...) { if (_data && !_data->multiPartBackwardSupport && _data->_streamData) delete _data->_streamData; if (_data) delete _data; _data=NULL; throw; } }
MultiPartInputFile::MultiPartInputFile (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int numThreads, bool reconstructChunkOffsetTable): _data(new Data(false, numThreads, reconstructChunkOffsetTable)) { try { _data->is = &is; initialize(); } catch (IEX_NAMESPACE::BaseExc &e) { delete _data; REPLACE_EXC (e, "Cannot read image file " "\"" << is.fileName() << "\". " << e); throw; } catch (...) { delete _data; throw; } }