From 9c5774defb4f182d07d9797f1f334767b1721b1e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 29 Feb 2012 10:22:56 +0000 Subject: [PATCH] Improved the handling of endian swap of osg::Array --- include/osgDB/InputStream | 7 +-- include/osgDB/StreamOperator | 4 +- src/osgDB/InputStream.cpp | 57 ++++++++++------------- src/osgDB/StreamOperator.cpp | 22 +++++++++ src/osgPlugins/osg/BinaryStreamOperator.h | 4 +- 5 files changed, 54 insertions(+), 40 deletions(-) diff --git a/include/osgDB/InputStream b/include/osgDB/InputStream index 3ea247004..d59abc259 100644 --- a/include/osgDB/InputStream +++ b/include/osgDB/InputStream @@ -129,6 +129,7 @@ public: void advanceToCurrentEndBracket() { _in->advanceToCurrentEndBracket(); } void readWrappedString( std::string& str ) { _in->readWrappedString(str); checkStream(); } void readCharArray( char* s, unsigned int size ) { _in->readCharArray(s, size); } + void readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes) { _in->readComponentArray( s, numElements, numComponentsPerElements, componentSizeInBytes); } // readSize() use unsigned int for all sizes. unsigned int readSize() { unsigned int size; *this>>size; return size; } @@ -140,9 +141,6 @@ public: osg::Object* readObject( osg::Object* existingObj=0 ); osg::Object* readObjectFields( const std::string& className, unsigned int id, osg::Object* existingObj=0); - void setByteSwap(int byteSwap) { _byteSwap = byteSwap; } - int getByteSwap() const { return _byteSwap; } - /// set an input iterator, used directly when not using InputStream with a traditional file releated stream. void setInputIterator( InputIterator* ii ) { _in = ii; } @@ -164,13 +162,12 @@ protected: void setWrapperSchema( const std::string& name, const std::string& properties ); template - void readArrayImplementation( T* a, int read_size, bool useByteSwap=false ); + void readArrayImplementation( T* a, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes ); ArrayMap _arrayMap; IdentifierMap _identifierMap; int _fileVersion; - int _byteSwap; bool _useSchemaData; bool _forceReadingImage; std::vector _fields; diff --git a/include/osgDB/StreamOperator b/include/osgDB/StreamOperator index fdcb979a0..3169d5f25 100644 --- a/include/osgDB/StreamOperator +++ b/include/osgDB/StreamOperator @@ -22,7 +22,7 @@ public: void setStream( std::ostream* ostream ) { _out = ostream; } std::ostream* getStream() { return _out; } const std::ostream* getStream() const { return _out; } - + virtual bool isBinary() const = 0; virtual void writeBool( bool b ) = 0; @@ -115,6 +115,8 @@ public: void throwException( const std::string& msg ); + void readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes); + protected: std::istream* _in; osgDB::InputStream* _inputStream; diff --git a/src/osgDB/InputStream.cpp b/src/osgDB/InputStream.cpp index 5bc63e4e6..5d17d2bec 100644 --- a/src/osgDB/InputStream.cpp +++ b/src/osgDB/InputStream.cpp @@ -24,7 +24,7 @@ using namespace osgDB; static std::string s_lastSchema; InputStream::InputStream( const osgDB::Options* options ) - : _fileVersion(0), _byteSwap(0), _useSchemaData(false), _forceReadingImage(false), _dataDecompress(0) + : _fileVersion(0), _useSchemaData(false), _forceReadingImage(false), _dataDecompress(0) { if ( !options ) return; _options = options; @@ -240,147 +240,147 @@ osg::Array* InputStream::readArray() case ID_BYTE_ARRAY: { osg::ByteArray* ba = new osg::ByteArray; - readArrayImplementation( ba, CHAR_SIZE, true ); + readArrayImplementation( ba, 1, CHAR_SIZE); array = ba; } break; case ID_UBYTE_ARRAY: { osg::UByteArray* uba = new osg::UByteArray; - readArrayImplementation( uba, CHAR_SIZE, true ); + readArrayImplementation( uba, 1, CHAR_SIZE ); array = uba; } break; case ID_SHORT_ARRAY: { osg::ShortArray* sa = new osg::ShortArray; - readArrayImplementation( sa, SHORT_SIZE, true ); + readArrayImplementation( sa, 1, SHORT_SIZE ); array = sa; } break; case ID_USHORT_ARRAY: { osg::UShortArray* usa = new osg::UShortArray; - readArrayImplementation( usa, SHORT_SIZE, true ); + readArrayImplementation( usa, 1, SHORT_SIZE ); array = usa; } break; case ID_INT_ARRAY: { osg::IntArray* ia = new osg::IntArray; - readArrayImplementation( ia, INT_SIZE, true ); + readArrayImplementation( ia, 1, INT_SIZE ); array = ia; } break; case ID_UINT_ARRAY: { osg::UIntArray* uia = new osg::UIntArray; - readArrayImplementation( uia, INT_SIZE, true ); + readArrayImplementation( uia, 1, INT_SIZE ); array = uia; } break; case ID_FLOAT_ARRAY: { osg::FloatArray* fa = new osg::FloatArray; - readArrayImplementation( fa, FLOAT_SIZE, true ); + readArrayImplementation( fa, 1, FLOAT_SIZE ); array = fa; } break; case ID_DOUBLE_ARRAY: { osg::DoubleArray* da = new osg::DoubleArray; - readArrayImplementation( da, DOUBLE_SIZE, true ); + readArrayImplementation( da, 1, DOUBLE_SIZE ); array = da; } break; case ID_VEC2B_ARRAY: { osg::Vec2bArray* va = new osg::Vec2bArray; - readArrayImplementation( va, 2*CHAR_SIZE ); + readArrayImplementation( va, 2, CHAR_SIZE ); array = va; } break; case ID_VEC3B_ARRAY: { osg::Vec3bArray* va = new osg::Vec3bArray; - readArrayImplementation( va, 3*CHAR_SIZE ); + readArrayImplementation( va, 3, CHAR_SIZE ); array = va; } break; case ID_VEC4B_ARRAY: { osg::Vec4bArray* va = new osg::Vec4bArray; - readArrayImplementation( va, 4*CHAR_SIZE ); + readArrayImplementation( va, 4, CHAR_SIZE ); array = va; } break; case ID_VEC4UB_ARRAY: { osg::Vec4ubArray* va = new osg::Vec4ubArray; - readArrayImplementation( va, 4*CHAR_SIZE ); + readArrayImplementation( va, 4, CHAR_SIZE ); array = va; } break; case ID_VEC2S_ARRAY: { osg::Vec2sArray* va = new osg::Vec2sArray; - readArrayImplementation( va, 2*SHORT_SIZE ); + readArrayImplementation( va, 2, SHORT_SIZE ); array = va; } break; case ID_VEC3S_ARRAY: { osg::Vec3sArray* va = new osg::Vec3sArray; - readArrayImplementation( va, 3*SHORT_SIZE ); + readArrayImplementation( va, 3, SHORT_SIZE ); array = va; } break; case ID_VEC4S_ARRAY: { osg::Vec4sArray* va = new osg::Vec4sArray; - readArrayImplementation( va, 4*SHORT_SIZE ); + readArrayImplementation( va, 4, SHORT_SIZE ); array = va; } break; case ID_VEC2_ARRAY: { osg::Vec2Array* va = new osg::Vec2Array; - readArrayImplementation( va, 2*FLOAT_SIZE ); + readArrayImplementation( va, 2, FLOAT_SIZE ); array = va; } break; case ID_VEC3_ARRAY: { osg::Vec3Array* va = new osg::Vec3Array; - readArrayImplementation( va, 3*FLOAT_SIZE ); + readArrayImplementation( va, 3, FLOAT_SIZE ); array = va; } break; case ID_VEC4_ARRAY: { osg::Vec4Array* va = new osg::Vec4Array; - readArrayImplementation( va, 4*FLOAT_SIZE ); + readArrayImplementation( va, 4, FLOAT_SIZE ); array = va; } break; case ID_VEC2D_ARRAY: { osg::Vec2dArray* va = new osg::Vec2dArray; - readArrayImplementation( va, 2*DOUBLE_SIZE ); + readArrayImplementation( va, 2, DOUBLE_SIZE ); array = va; } break; case ID_VEC3D_ARRAY: { osg::Vec3dArray* va = new osg::Vec3dArray; - readArrayImplementation( va, 3*DOUBLE_SIZE ); + readArrayImplementation( va, 3, DOUBLE_SIZE ); array = va; } break; case ID_VEC4D_ARRAY: { osg::Vec4dArray* va = new osg::Vec4dArray; - readArrayImplementation( va, 4*DOUBLE_SIZE ); + readArrayImplementation( va, 4, DOUBLE_SIZE ); array = va; } break; @@ -683,9 +683,6 @@ InputStream::ReadType InputStream::start( InputIterator* inIterator ) { _fields.clear(); _fields.push_back( "Start" ); - - OSG_INFO<<"InputStream::start( InputIterator* inIterator ) calling setByteSwap("<getByteSwap()<<")"<getByteSwap()); ReadType type = READ_UNKNOWN; _in = inIterator; @@ -806,7 +803,7 @@ void InputStream::resetSchema() } template -void InputStream::readArrayImplementation( T* a, int read_size, bool useByteSwap ) +void InputStream::readArrayImplementation( T* a, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes ) { int size = 0; *this >> size >> BEGIN_BRACKET; @@ -815,12 +812,8 @@ void InputStream::readArrayImplementation( T* a, int read_size, bool useByteSwap a->resize( size ); if ( isBinary() ) { - readCharArray( (char*)&((*a)[0]), read_size*size ); checkStream(); - if ( useByteSwap && _byteSwap ) - { - for ( int i=0; i0 ) + { + readCharArray( s, size); + + if (_byteSwap && componentSizeInBytes>1) + { + char* ptr = s; + for(unsigned int i=0; ithrowException(msg); diff --git a/src/osgPlugins/osg/BinaryStreamOperator.h b/src/osgPlugins/osg/BinaryStreamOperator.h index ae0881de2..7519462f3 100644 --- a/src/osgPlugins/osg/BinaryStreamOperator.h +++ b/src/osgPlugins/osg/BinaryStreamOperator.h @@ -209,8 +209,8 @@ public: virtual void readMark( osgDB::ObjectMark& mark ) {} virtual void readCharArray( char* s, unsigned int size ) - { if ( size>0 ) _in->read( s, size ); } - + { if ( size>0 ) _in->read( s, size ); } + virtual void readWrappedString( std::string& str ) { readString( str ); }