Fixes to osg::Image's handling of compressed formats.
This commit is contained in:
@@ -172,24 +172,37 @@ unsigned int Image::computeNumComponents(GLenum pixelFormat)
|
|||||||
|
|
||||||
unsigned int Image::computePixelSizeInBits(GLenum format,GLenum type)
|
unsigned int Image::computePixelSizeInBits(GLenum format,GLenum type)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(format & 0x80F0) /* DXT* compressed formats */
|
switch(format)
|
||||||
{
|
{
|
||||||
switch(format)
|
case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT): return 4;
|
||||||
{
|
case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): return 4;
|
||||||
case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT): return 4;
|
case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): return 8;
|
||||||
|
case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): return 8;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): return 4;
|
// note, haven't yet added proper handling of the ARB GL_COMPRESSRED_* pathways
|
||||||
|
// yet, no clear size for these since its probably implementation dependent
|
||||||
case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): return 8;
|
// which raises the question of how to actually querry for these sizes...
|
||||||
|
// will need to revisit this issue, for now just report an error.
|
||||||
case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): return 8;
|
// this is possible a bit of mute point though as since the ARB compressed formats
|
||||||
default:
|
// arn't yet used for storing images to disk, so its likely that users wont have
|
||||||
{
|
// osg::Image's for pixel formats set the ARB compressed formats, just using these
|
||||||
notify(WARN)<<"error format = "<<format<<std::endl;
|
// compressed formats as internal texture modes. This is very much speculation though
|
||||||
return 0;
|
// if get the below error then its time to revist this issue :-)
|
||||||
}
|
// Robert Osfield, Jan 2005.
|
||||||
}
|
switch(format)
|
||||||
|
{
|
||||||
|
case(GL_COMPRESSED_ALPHA):
|
||||||
|
case(GL_COMPRESSED_LUMINANCE):
|
||||||
|
case(GL_COMPRESSED_LUMINANCE_ALPHA):
|
||||||
|
case(GL_COMPRESSED_INTENSITY):
|
||||||
|
case(GL_COMPRESSED_RGB):
|
||||||
|
case(GL_COMPRESSED_RGBA):
|
||||||
|
notify(WARN)<<"Image::computePixelSizeInBits(format,type) : cannot compute correct size of compressed format ("<<format<<") returning 0."<<std::endl;
|
||||||
|
return 0;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(type)
|
switch(type)
|
||||||
@@ -281,14 +294,17 @@ unsigned int Image::getTotalSizeInBytesIncludingMipmaps() const
|
|||||||
if (t==0) t=1;
|
if (t==0) t=1;
|
||||||
if (r==0) r=1;
|
if (r==0) r=1;
|
||||||
|
|
||||||
unsigned int sizeOfLastMipMap;
|
unsigned int sizeOfLastMipMap = computeRowWidthInBytes(s,_pixelFormat,_dataType,_packing)* r*t;
|
||||||
if(_pixelFormat & 0x80F0)
|
switch(_pixelFormat)
|
||||||
{
|
{
|
||||||
unsigned int blockSize = (_pixelFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
|
case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT):
|
||||||
sizeOfLastMipMap = maximum(computeRowWidthInBytes(s,_pixelFormat,_dataType,_packing)* r*t, blockSize);
|
case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT):
|
||||||
|
sizeOfLastMipMap = maximum(sizeOfLastMipMap, 8u); // block size of 8
|
||||||
|
case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT):
|
||||||
|
case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT):
|
||||||
|
sizeOfLastMipMap = maximum(sizeOfLastMipMap, 16u); // block size of 16
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
sizeOfLastMipMap = computeRowWidthInBytes(s,_pixelFormat,_dataType,_packing)* r*t;
|
|
||||||
|
|
||||||
// notify(INFO)<<"sizeOfLastMipMap="<<sizeOfLastMipMap<<"\ts="<<s<<"\tt="<<t<<"\tr"<<r<<std::endl;
|
// notify(INFO)<<"sizeOfLastMipMap="<<sizeOfLastMipMap<<"\ts="<<s<<"\tt="<<t<<"\tr"<<r<<std::endl;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user