mirror of
https://github.com/raysan5/raylib.git
synced 2025-12-25 10:22:33 -05:00
REVIEWED: rlGetPixelDataSize(), correct compressed data size calculation per blocks #5416
This commit is contained in:
34
src/rlgl.h
34
src/rlgl.h
@ -5224,24 +5224,36 @@ static int rlGetPixelDataSize(int width, int height, int format)
|
|||||||
case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
|
case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB:
|
||||||
case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB:
|
case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB:
|
||||||
case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB:
|
case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB:
|
||||||
case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break;
|
case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: // 8 bytes per each 4x4 block
|
||||||
|
{
|
||||||
|
int blockWidth = (width + 3)/4;
|
||||||
|
int blockHeight = (height + 3)/4;
|
||||||
|
dataSize = blockWidth*blockHeight*8;
|
||||||
|
} break;
|
||||||
case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
|
case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA:
|
||||||
case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
|
case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA:
|
||||||
case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
|
case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA:
|
||||||
case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break;
|
case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: // 16 bytes per each 4x4 block
|
||||||
case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break;
|
{
|
||||||
|
int blockWidth = (width + 3)/4;
|
||||||
|
int blockHeight = (height + 3)/4;
|
||||||
|
dataSize = blockWidth*blockHeight*16;
|
||||||
|
} break;
|
||||||
|
case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: // 4 bytes per each 4x4 block
|
||||||
|
{
|
||||||
|
int blockWidth = (width + 3)/4;
|
||||||
|
int blockHeight = (height + 3)/4;
|
||||||
|
dataSize = blockWidth*blockHeight*4;
|
||||||
|
} break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
double bytesPerPixel = (double)bpp/8.0;
|
// Compute dataSize for uncompressed texture data (no blocks)
|
||||||
dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes
|
if ((format >= RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) &&
|
||||||
|
(format <= RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16))
|
||||||
// Most compressed formats works on 4x4 blocks,
|
|
||||||
// if texture is smaller, minimum dataSize is 8 or 16
|
|
||||||
if ((width <= 4) && (height <= 4))
|
|
||||||
{
|
{
|
||||||
if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA)) dataSize = 8;
|
double bytesPerPixel = (double)bpp/8.0;
|
||||||
else if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) dataSize = 16;
|
dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
return dataSize;
|
return dataSize;
|
||||||
|
|||||||
Reference in New Issue
Block a user