From 7f6b5008e209af2a1ea053ca18c3eabbf6ef84f6 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 10 Aug 2006 11:08:20 +0000 Subject: [PATCH] Added write ppn support, use -O ascii to select ascii ppn output, otherwise binary is chosen. Fixed crash when erroneous pnm files were read. Added -O flip option. --- src/osgPlugins/pnm/ReaderWriterPNM.cpp | 84 ++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/src/osgPlugins/pnm/ReaderWriterPNM.cpp b/src/osgPlugins/pnm/ReaderWriterPNM.cpp index 923a205bd..66e51c36c 100644 --- a/src/osgPlugins/pnm/ReaderWriterPNM.cpp +++ b/src/osgPlugins/pnm/ReaderWriterPNM.cpp @@ -32,7 +32,6 @@ template int ch = fgetc(fp); if (feof(fp) || ferror(fp)) { - fclose(fp); delete [] data; return NULL; } @@ -76,7 +75,6 @@ template ch = fgetc(fp); if (feof(fp) || ferror(fp)) { - fclose(fp); delete [] data; return NULL; } @@ -91,7 +89,6 @@ template ch = fgetc(fp); if (feof(fp) || ferror(fp)) { - fclose(fp); delete [] data; return NULL; } @@ -113,6 +110,11 @@ template T* dst = data; T* end = data + 3*width*height; + osg::notify(osg::NOTICE)<<"Width = "< ch = fgetc(fp); if (feof(fp) || ferror(fp)) { - fclose(fp); + osg::notify(osg::NOTICE)<<"Error 2"<(data); } @@ -390,7 +398,8 @@ class ReaderWriterPNM : public osgDB::ReaderWriter if (data == NULL) { - fclose(fp); + if (fp) + fclose(fp); return ReadResult::FILE_NOT_HANDLED; } @@ -407,8 +416,71 @@ class ReaderWriterPNM : public osgDB::ReaderWriter data, osg::Image::USE_NEW_DELETE); + if (options && options->getOptionString().find("flip")!=std::string::npos) + { + pOsgImage->flipVertical(); + } + return pOsgImage; } + + virtual WriteResult writeImage(const osg::Image& image,std::ostream& fout,const osgDB::ReaderWriter::Options* options) const + { + bool ascii = (options && options->getOptionString().find("ascii")!=std::string::npos); + + if (ascii) + { + // ascii ppm format. + fout<<"P3"<= 0; --row) + { + const unsigned char* ptr = image.data(0,row); + for(int col = 0; col < image.s(); ++col) + { + fout<(*(ptr++)); + fout<<" "<(*(ptr++)); + fout<<" "<(*(ptr++))<<" "; + } + fout<= 0; --row) + { + const unsigned char* ptr = image.data(0,row); + for(int col = 0; col < image.s(); ++col) + { + fout.put(*(ptr++)); + fout.put(*(ptr++)); + fout.put(*(ptr++)); + } + } + } + return WriteResult::FILE_SAVED; + } + + virtual WriteResult writeImage(const osg::Image& image,const std::string& fileName, const osgDB::ReaderWriter::Options* options) const + { + std::string ext = osgDB::getFileExtension(fileName); + if (!acceptsExtension("ppm")) return WriteResult::FILE_NOT_HANDLED; + + // only support rgb images right now. + if (image.getPixelFormat()!=GL_RGB || image.getDataType()!=GL_UNSIGNED_BYTE) return WriteResult("Error image pixel format not supported by pnm writer."); + + std::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary); + if(!fout) return WriteResult::ERROR_IN_WRITING_FILE; + + return writeImage(image,fout,options); + } + + }; // now register with Registry to instantiate the above