Merging r6383 through r6403 from trunk to ogl-es branch
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6404 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
@@ -84,7 +84,7 @@ public:
|
||||
}
|
||||
|
||||
//! Returns image data size in bytes
|
||||
u32 getImageDataSizeInBytes() const
|
||||
size_t getImageDataSizeInBytes() const
|
||||
{
|
||||
return getDataSizeFromFormat(Format, Size.Width, Size.Height);
|
||||
}
|
||||
@@ -295,7 +295,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
u32 dataSize = 0;
|
||||
size_t dataSize = 0;
|
||||
u32 width = Size.Width;
|
||||
u32 height = Size.Height;
|
||||
|
||||
@@ -445,43 +445,57 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
//! calculate image data size in bytes for selected format, width and height.
|
||||
static u32 getDataSizeFromFormat(ECOLOR_FORMAT format, u32 width, u32 height)
|
||||
//! You should not create images where the result of getDataSizeFromFormat doesn't pass this function
|
||||
/** Note that CImage does not yet check for this, but going beyond this limit is not supported well.
|
||||
Image loaders should check for this.
|
||||
If you don't have the format yet then checking width*height*bytes_per_pixel is mostly fine, but make
|
||||
sure to work with size_t so it doesn't clip the result to u32 too early.
|
||||
\return true when dataSize is small enough that it should be fine. */
|
||||
static bool checkDataSizeLimit(size_t dataSize)
|
||||
{
|
||||
u32 imageSize = 0;
|
||||
// 2gb for now. Could be we could do more on some platforms, but we still will run into
|
||||
// problems right now then for example in then color converter (which currently still uses
|
||||
// s32 for sizes).
|
||||
return (size_t)(s32)(dataSize) == dataSize;
|
||||
}
|
||||
|
||||
//! calculate image data size in bytes for selected format, width and height.
|
||||
static size_t getDataSizeFromFormat(ECOLOR_FORMAT format, u32 width, u32 height)
|
||||
{
|
||||
size_t imageSize = 0;
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case ECF_DXT1:
|
||||
imageSize = ((width + 3) / 4) * ((height + 3) / 4) * 8;
|
||||
imageSize = (size_t)((width + 3) / 4) * ((height + 3) / 4) * 8;
|
||||
break;
|
||||
case ECF_DXT2:
|
||||
case ECF_DXT3:
|
||||
case ECF_DXT4:
|
||||
case ECF_DXT5:
|
||||
imageSize = ((width + 3) / 4) * ((height + 3) / 4) * 16;
|
||||
imageSize = (size_t)((width + 3) / 4) * ((height + 3) / 4) * 16;
|
||||
break;
|
||||
case ECF_PVRTC_RGB2:
|
||||
case ECF_PVRTC_ARGB2:
|
||||
imageSize = (core::max_<u32>(width, 16) * core::max_<u32>(height, 8) * 2 + 7) / 8;
|
||||
imageSize = ((size_t)core::max_<u32>(width, 16) * core::max_<u32>(height, 8) * 2 + 7) / 8;
|
||||
break;
|
||||
case ECF_PVRTC_RGB4:
|
||||
case ECF_PVRTC_ARGB4:
|
||||
imageSize = (core::max_<u32>(width, 8) * core::max_<u32>(height, 8) * 4 + 7) / 8;
|
||||
imageSize = ((size_t)core::max_<u32>(width, 8) * core::max_<u32>(height, 8) * 4 + 7) / 8;
|
||||
break;
|
||||
case ECF_PVRTC2_ARGB2:
|
||||
imageSize = core::ceil32(width / 8.0f) * core::ceil32(height / 4.0f) * 8;
|
||||
imageSize = (size_t)core::ceil32(width / 8.0f) * core::ceil32(height / 4.0f) * 8;
|
||||
break;
|
||||
case ECF_PVRTC2_ARGB4:
|
||||
case ECF_ETC1:
|
||||
case ECF_ETC2_RGB:
|
||||
imageSize = core::ceil32(width / 4.0f) * core::ceil32(height / 4.0f) * 8;
|
||||
imageSize = (size_t)core::ceil32(width / 4.0f) * core::ceil32(height / 4.0f) * 8;
|
||||
break;
|
||||
case ECF_ETC2_ARGB:
|
||||
imageSize = core::ceil32(width / 4.0f) * core::ceil32(height / 4.0f) * 16;
|
||||
imageSize = (size_t)core::ceil32(width / 4.0f) * core::ceil32(height / 4.0f) * 16;
|
||||
break;
|
||||
default: // uncompressed formats
|
||||
imageSize = getBitsPerPixelFromFormat(format) / 8 * width;
|
||||
imageSize = (size_t)getBitsPerPixelFromFormat(format) / 8 * width;
|
||||
imageSize *= height;
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user