diff --git a/include/osg/Image b/include/osg/Image index 292115473..8d422f2e9 100644 --- a/include/osg/Image +++ b/include/osg/Image @@ -74,25 +74,27 @@ class SG_EXPORT Image : public Object /** Depth of image.*/ inline const int r() const { return _r; } - inline const GLint internalTextureFormat() const { return _internalTextureFormat; } + void setInternalTextureFormat(GLint internalFormat); + inline const GLint getInternalTextureFormat() const { return _internalTextureFormat; } - inline const GLenum pixelFormat() const { return _pixelFormat; } + void setPixelFormat(const GLenum format); + inline const GLenum getPixelFormat() const { return _pixelFormat; } - inline const GLenum dataType() const { return _dataType; } + inline const GLenum getDataType() const { return _dataType; } - inline const unsigned int packing() const { return _packing; } + inline const unsigned int getPacking() const { return _packing; } /** return the numbers of bits required for each pixel.*/ - inline const unsigned int pixelSizeInBits() const { return computePixelSizeInBits(_pixelFormat,_dataType); } + inline const unsigned int getPixelSizeInBits() const { return computePixelSizeInBits(_pixelFormat,_dataType); } /** return the numbers of bytes each row of pixels occupies once it has been packed.*/ - inline const unsigned int rowSizeInBytes() const { return computeRowWidthInBytes(_s,_pixelFormat,_dataType,_packing); } + inline const unsigned int getRowSizeInBytes() const { return computeRowWidthInBytes(_s,_pixelFormat,_dataType,_packing); } /** return the numbers of bytes each image (_s*_t) of pixels occupies..*/ - inline const unsigned int imageSizeInBytes() const { return rowSizeInBytes()*_t; } + inline const unsigned int getImageSizeInBytes() const { return getRowSizeInBytes()*_t; } /** return the numbers of bytes the whole row/image/volume of pixels occupies.*/ - inline const unsigned int totalSizeInBytes() const { return imageSizeInBytes()*_r; } + inline const unsigned int getTotalSizeInBytes() const { return getImageSizeInBytes()*_r; } /** raw image data.*/ inline unsigned char *data() { return _data; } @@ -104,7 +106,7 @@ class SG_EXPORT Image : public Object unsigned char* data(int column, int row=0,int image=0) { if (!_data) return NULL; - return _data+(column*pixelSizeInBits())/8+row*rowSizeInBytes()+image*imageSizeInBytes(); + return _data+(column*getPixelSizeInBits())/8+row*getRowSizeInBytes()+image*getImageSizeInBytes(); } diff --git a/src/osg/DrawPixels.cpp b/src/osg/DrawPixels.cpp index f2deb622e..920e2cdfe 100644 --- a/src/osg/DrawPixels.cpp +++ b/src/osg/DrawPixels.cpp @@ -85,15 +85,15 @@ void DrawPixels::drawImmediateMode(State&) { const GLvoid* pixels = _image->data(); glDrawPixels(_width,_height, - (GLenum)_image->pixelFormat(), - (GLenum)_image->dataType(), + (GLenum)_image->getPixelFormat(), + (GLenum)_image->getDataType(), pixels); } else { glDrawPixels(_image->s(), _image->t(), - (GLenum)_image->pixelFormat(), - (GLenum)_image->dataType(), + (GLenum)_image->getPixelFormat(), + (GLenum)_image->getDataType(), _image->data() ); } } diff --git a/src/osg/Image.cpp b/src/osg/Image.cpp index 1d95b560c..b6ece3b41 100644 --- a/src/osg/Image.cpp +++ b/src/osg/Image.cpp @@ -163,6 +163,29 @@ const unsigned int Image::computeRowWidthInBytes(int width,GLenum format,GLenum } +void Image::setInternalTextureFormat(GLint internalFormat) +{ + // won't do any sanity checking right now, leave it to + // OpenGL to make the call. + _internalTextureFormat = internalFormat; +} + +void Image::setPixelFormat(const GLenum format) +{ + if (_pixelFormat==format) return; // do nothing if the same. + + if (computeNumComponents(_pixelFormat)==computeNumComponents(format)) + { + // if the two formats have the same number of componets then + // we can do a straight swap. + _pixelFormat = format; + } + else + { + notify(WARN)<<"Image::setPixelFormat(..) - warning, attempt to reset the pixel format with a different number of components."<0)?_subloadWidth:_image->s(), (_subloadHeight>0)?_subloadHeight:_image->t(), - (GLenum) _image->pixelFormat(), (GLenum) _image->dataType(), + (GLenum) _image->getPixelFormat(), (GLenum) _image->getDataType(), _image->data()); // update the modified flag to show that the image has been loaded. modifiedTag = _image->getModifiedTag(); @@ -333,23 +333,23 @@ void Texture::applyTexImage(GLenum target, Image* image, State& state) const if (_subloadMode == OFF) image->ensureValidSizeForTexturing(); - glPixelStorei(GL_UNPACK_ALIGNMENT,image->packing()); + glPixelStorei(GL_UNPACK_ALIGNMENT,image->getPacking()); static bool s_ARB_Compression = isGLExtensionSupported("GL_ARB_texture_compression"); static bool s_S3TC_Compression = isGLExtensionSupported("GL_EXT_texture_compression_s3tc"); // select the internalFormat required for the texture. - int internalFormat = image->internalTextureFormat(); + GLint internalFormat = image->getInternalTextureFormat(); switch(_internalFormatMode) { case(USE_IMAGE_DATA_FORMAT): - internalFormat = image->internalTextureFormat(); + internalFormat = image->getInternalTextureFormat(); break; case(USE_ARB_COMPRESSION): if (s_ARB_Compression) { - switch(image->pixelFormat()) + switch(image->getPixelFormat()) { case(1): internalFormat = GL_COMPRESSED_ALPHA_ARB; break; case(2): internalFormat = GL_COMPRESSED_LUMINANCE_ALPHA_ARB; break; @@ -363,52 +363,52 @@ void Texture::applyTexImage(GLenum target, Image* image, State& state) const case(GL_INTENSITY): internalFormat = GL_COMPRESSED_INTENSITY_ARB; break; } } - else internalFormat = image->internalTextureFormat(); + else internalFormat = image->getInternalTextureFormat(); break; case(USE_S3TC_DXT1_COMPRESSION): if (s_S3TC_Compression) { - switch(image->pixelFormat()) + switch(image->getPixelFormat()) { case(3): internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; case(4): internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; case(GL_RGB): internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; case(GL_RGBA): internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; - default: internalFormat = image->internalTextureFormat(); break; + default: internalFormat = image->getInternalTextureFormat(); break; } } - else internalFormat = image->internalTextureFormat(); + else internalFormat = image->getInternalTextureFormat(); break; case(USE_S3TC_DXT3_COMPRESSION): if (s_S3TC_Compression) { - switch(image->pixelFormat()) + switch(image->getPixelFormat()) { case(3): case(GL_RGB): internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; case(4): case(GL_RGBA): internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; - default: internalFormat = _image->internalTextureFormat(); break; + default: internalFormat = _image->getInternalTextureFormat(); break; } } - else internalFormat = image->internalTextureFormat(); + else internalFormat = image->getInternalTextureFormat(); break; case(USE_S3TC_DXT5_COMPRESSION): if (s_S3TC_Compression) { - switch(image->pixelFormat()) + switch(image->getPixelFormat()) { case(3): case(GL_RGB): internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; case(4): case(GL_RGBA): internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; - default: internalFormat = image->internalTextureFormat(); break; + default: internalFormat = image->getInternalTextureFormat(); break; } } - else internalFormat = image->internalTextureFormat(); + else internalFormat = image->getInternalTextureFormat(); break; case(USE_USER_DEFINED_FORMAT): @@ -427,8 +427,8 @@ void Texture::applyTexImage(GLenum target, Image* image, State& state) const { glTexImage2D( target, 0, internalFormat, image->s(), image->t(), 0, - (GLenum)image->pixelFormat(), - (GLenum)image->dataType(), + (GLenum)image->getPixelFormat(), + (GLenum)image->getDataType(), image->data() ); // just estimate estimate it right now.. @@ -441,7 +441,7 @@ void Texture::applyTexImage(GLenum target, Image* image, State& state) const gluBuild2DMipmaps( target, internalFormat, image->s(),image->t(), - (GLenum)image->pixelFormat(), (GLenum)image->dataType(), + (GLenum)image->getPixelFormat(), (GLenum)image->getDataType(), image->data() ); // just estimate size it right now.. @@ -477,13 +477,13 @@ void Texture::applyTexImage(GLenum target, Image* image, State& state) const // reserve appropriate texture memory glTexImage2D(target, 0, internalFormat, _textureWidth, _textureHeight, 0, - (GLenum) image->pixelFormat(), (GLenum) image->dataType(), + (GLenum) image->getPixelFormat(), (GLenum) image->getDataType(), NULL); glTexSubImage2D(target, 0, _subloadOffsX, _subloadOffsY, width, height, - (GLenum) image->pixelFormat(), (GLenum) image->dataType(), + (GLenum) image->getPixelFormat(), (GLenum) image->getDataType(), image->data()); } diff --git a/src/osg/TextureCubeMap.cpp b/src/osg/TextureCubeMap.cpp index 75f7f2048..e5f532863 100644 --- a/src/osg/TextureCubeMap.cpp +++ b/src/osg/TextureCubeMap.cpp @@ -206,7 +206,7 @@ void TextureCubeMap::apply(State& state) const glTexSubImage2D(faceTarget[n], 0, _subloadOffsX, _subloadOffsY, (_subloadWidth>0)?_subloadWidth:_images[n]->s(), (_subloadHeight>0)?_subloadHeight:_images[n]->t(), - (GLenum) _images[n]->pixelFormat(), (GLenum) _images[n]->dataType(), + (GLenum) _images[n]->getPixelFormat(), (GLenum) _images[n]->getDataType(), _images[n]->data()); // update the modified flag to show that the image has been loaded. modifiedTag += _images[n]->getModifiedTag(); diff --git a/src/osgPlugins/dx/DXWriter.cpp b/src/osgPlugins/dx/DXWriter.cpp index ad71eeabe..aca78e85d 100644 --- a/src/osgPlugins/dx/DXWriter.cpp +++ b/src/osgPlugins/dx/DXWriter.cpp @@ -1433,8 +1433,8 @@ std::string DXWriter::WriteImage( const osg::Image &image ) field.AddComponent( "connections", conn_name.c_str() ); // Generate colors - unsigned int pixel_fmt = image.pixelFormat(); // A user-friendly int_fmt - unsigned int data_type = image.dataType(); // Sample data type + unsigned int pixel_fmt = image.getPixelFormat(); // A user-friendly int_fmt + unsigned int data_type = image.getDataType(); // Sample data type const unsigned char *data = image.data(); int r_dim = image.r(); diff --git a/src/osgPlugins/flt/flt2osg.cpp b/src/osgPlugins/flt/flt2osg.cpp index e1eb5cca1..1dc9b5b7b 100644 --- a/src/osgPlugins/flt/flt2osg.cpp +++ b/src/osgPlugins/flt/flt2osg.cpp @@ -911,7 +911,7 @@ void ConvertFromFLT::visitFace(GeoSetBuilder* pBuilder, FaceRecord* rec) if (osgTexture) { osg::Image* osgImage = osgTexture->getImage(); - switch (osgImage->pixelFormat()) + switch (osgImage->getPixelFormat()) { case GL_LUMINANCE_ALPHA: case GL_RGBA: diff --git a/src/osgPlugins/pfb/ConvertToPerformer.cpp b/src/osgPlugins/pfb/ConvertToPerformer.cpp index c9bc8ab38..ef20034c7 100644 --- a/src/osgPlugins/pfb/ConvertToPerformer.cpp +++ b/src/osgPlugins/pfb/ConvertToPerformer.cpp @@ -521,10 +521,10 @@ pfGeoState* ConvertToPerformer::visitStateSet(osg::StateSet* stateset) int ns = img->s(); int nt = img->t(); int ncomp = - img->pixelFormat() == GL_LUMINANCE ? 1 : - img->pixelFormat() == GL_LUMINANCE_ALPHA ? 2 : - img->pixelFormat() == GL_RGB ? 3 : - img->pixelFormat() == GL_RGBA ? 4 : 3; + img->getPixelFormat() == GL_LUMINANCE ? 1 : + img->getPixelFormat() == GL_LUMINANCE_ALPHA ? 2 : + img->getPixelFormat() == GL_RGB ? 3 : + img->getPixelFormat() == GL_RGBA ? 4 : 3; uint *uim = (uint *)pfMalloc( ns * nt * ncomp, pfGetSharedArena() );