diff --git a/src/osgPlugins/ive/ReaderWriterIVE.cpp b/src/osgPlugins/ive/ReaderWriterIVE.cpp index 20ef66dbc..bc3b155a3 100644 --- a/src/osgPlugins/ive/ReaderWriterIVE.cpp +++ b/src/osgPlugins/ive/ReaderWriterIVE.cpp @@ -24,6 +24,20 @@ class IVEReaderWriter : public ReaderWriter { return readNode(file, options); } + + virtual ReadResult readImage(const std::string& file, const Options* options) const + { + std::string ext = osgDB::getLowerCaseFileExtension(file); + if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; + std::string fileName = osgDB::findDataFile(file, options); + if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; + + // code for setting up the database path so that internally referenced files are searched for on relative paths. + osg::ref_ptr local_opt = options ? static_cast(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options; + local_opt->setDatabasePath(osgDB::getFilePath(fileName)); + std::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary); + return readImage(istream, local_opt.get()); + } virtual ReadResult readNode(const std::string& file, const Options* options) const { @@ -45,6 +59,20 @@ class IVEReaderWriter : public ReaderWriter { return readNode(fin, options); } + + virtual ReadResult readImage(std::istream& fin, const Options* options) const + { + try{ + ive::DataInputStream in(&fin); + in.setOptions(options); + return in.readImage(ive::IMAGE_INCLUDE_DATA); + } + catch(ive::Exception e) + { + osg::notify(osg::NOTICE)<<"Error reading image: "<(&object); if (node) return writeNode( *node, fileName, options ); + const Image* image = dynamic_cast(&object); + if (image) return writeImage(*image, fileName, options); return WriteResult::FILE_NOT_HANDLED; } + virtual WriteResult writeImage(const Image& image,const std::string& fileName, const osgDB::ReaderWriter::Options* options) const + { + std::string ext = getFileExtension(fileName); + if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED; + // code for setting up the database path so that internally referenced file are searched for on relative paths. + osg::ref_ptr local_opt = options ? static_cast(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options; + if(local_opt->getDatabasePathList().empty()) + local_opt->setDatabasePath(osgDB::getFilePath(fileName)); + std::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary); + if (!fout) return WriteResult::ERROR_IN_WRITING_FILE; + WriteResult result = writeImage(image, fout, local_opt.get()); + fout.close(); + return result; + } + virtual WriteResult writeNode(const Node& node,const std::string& fileName, const osgDB::ReaderWriter::Options* options) const { std::string ext = getFileExtension(fileName); @@ -93,6 +138,25 @@ class IVEReaderWriter : public ReaderWriter { const Node* node = dynamic_cast(&object); if (node) return writeNode( *node, fout, options ); + const Image* image = dynamic_cast(&object); + if (image) return writeImage(*image, fout, options); + return WriteResult::FILE_NOT_HANDLED; + } + + virtual WriteResult writeImage(const Image& image,std::ostream& fout, const osgDB::ReaderWriter::Options* options) const + { + try + { + ive::DataOutputStream out(&fout); + out.setOptions(options); + out.writeImage(ive::IMAGE_INCLUDE_DATA, const_cast(&image)); + if (fout.fail()) return WriteResult::ERROR_IN_WRITING_FILE; + return WriteResult::FILE_SAVED; + } + catch(ive::Exception e) + { + osg::notify(osg::WARN)<<"Error writing IVE image: "<< e.getError() << std::endl; + } return WriteResult::FILE_NOT_HANDLED; }