diff --git a/src/osgPlugins/ive/DataInputStream.cpp b/src/osgPlugins/ive/DataInputStream.cpp index 098115ed0..1f473b11d 100644 --- a/src/osgPlugins/ive/DataInputStream.cpp +++ b/src/osgPlugins/ive/DataInputStream.cpp @@ -837,6 +837,7 @@ osg::Image* DataInputStream::readImage(IncludeImageMode mode) } break; case IMAGE_INCLUDE_FILE: + case IMAGE_COMPRESS_DATA: // Read image file from stream { std::string filename = readString(); diff --git a/src/osgPlugins/ive/DataOutputStream.cpp b/src/osgPlugins/ive/DataOutputStream.cpp index 88dcac084..eed1cb3f7 100644 --- a/src/osgPlugins/ive/DataOutputStream.cpp +++ b/src/osgPlugins/ive/DataOutputStream.cpp @@ -89,6 +89,7 @@ #include #include +#include using namespace ive; @@ -103,6 +104,8 @@ void DataOutputStream::setOptions(const osgDB::ReaderWriter::Options* options) setIncludeImageMode(IMAGE_REFERENCE_FILE); } else if(_options->getOptionString().find("includeImageFileInIVEFile")!=std::string::npos) { setIncludeImageMode(IMAGE_INCLUDE_FILE); + } else if(_options->getOptionString().find("compressImageData")!=std::string::npos) { + setIncludeImageMode(IMAGE_COMPRESS_DATA); } osg::notify(osg::DEBUG_INFO) << "ive::DataOutpouStream.setIncludeImageMode()=" << getIncludeImageMode() << std::endl; @@ -1057,6 +1060,42 @@ void DataOutputStream::writeImage(IncludeImageMode mode, osg::Image *image) writeInt(0); } break; + case IMAGE_COMPRESS_DATA: + if(image) { + //Get ReaderWriter for jpeg images + osgDB::ReaderWriter *writer = osgDB::Registry::instance()->getReaderWriterForExtension("jpeg"); + + if(writer) { + //Attempt to write the image to an output stream. + //The reason this isn't performed directly on the internal _ostream + //is because the writer might perform seek operations which could + //corrupt the output stream. + std::stringstream outputStream; + osgDB::ReaderWriter::WriteResult wr; + wr = writer->writeImage(*image,outputStream,_options.get()); + + if(wr.success()) { + + //Write file format. Do this for two reasons: + // 1 - Same code can be used to read in as with IMAGE_INCLUDE_FILE mode + // 2 - Maybe in future version user can specify which format to use + writeString(".jpeg"); //Need to add dot so osgDB::getFileExtension will work + + //Write size of stream + int size = outputStream.tellp(); + writeInt(size); + + //Write stream + writeCharArray(outputStream.str().c_str(),size); + + return; + } + } + } + //Image compression failed, write blank data + writeString(""); + writeInt(0); + break; default: throw Exception("DataOutputStream::writeImage(): Invalid IncludeImageMode value."); break; diff --git a/src/osgPlugins/ive/DataTypeSize.h b/src/osgPlugins/ive/DataTypeSize.h index 02643e4e0..f458cc004 100644 --- a/src/osgPlugins/ive/DataTypeSize.h +++ b/src/osgPlugins/ive/DataTypeSize.h @@ -12,7 +12,7 @@ //Don't know where else to put this namespace ive{ -typedef enum IncludeImageMode { IMAGE_REFERENCE_FILE=0,IMAGE_INCLUDE_DATA,IMAGE_INCLUDE_FILE }; +typedef enum IncludeImageMode { IMAGE_REFERENCE_FILE=0,IMAGE_INCLUDE_DATA,IMAGE_INCLUDE_FILE,IMAGE_COMPRESS_DATA }; } #endif