Added Image::GetSize (returning the image's dimensions)

Renamed original Image::GetSize to GetMemoryImage


Former-commit-id: a2b54f171353b8197639b5f2b3911e4b3f2a8db2
This commit is contained in:
Lynix 2015-01-05 13:41:56 +01:00
parent 5daf09e41b
commit b2b18a9f51
2 changed files with 51 additions and 37 deletions

View File

@ -75,10 +75,11 @@ class NAZARA_API NzImage : public NzResource
unsigned int GetHeight(nzUInt8 level = 0) const; unsigned int GetHeight(nzUInt8 level = 0) const;
nzUInt8 GetLevelCount() const; nzUInt8 GetLevelCount() const;
nzUInt8 GetMaxLevel() const; nzUInt8 GetMaxLevel() const;
unsigned int GetMemoryUsage() const;
unsigned int GetMemoryUsage(nzUInt8 level) const;
NzColor GetPixelColor(unsigned int x, unsigned int y = 0, unsigned int z = 0) const; NzColor GetPixelColor(unsigned int x, unsigned int y = 0, unsigned int z = 0) const;
nzUInt8* GetPixels(unsigned int x = 0, unsigned int y = 0, unsigned int z = 0, nzUInt8 level = 0); nzUInt8* GetPixels(unsigned int x = 0, unsigned int y = 0, unsigned int z = 0, nzUInt8 level = 0);
unsigned int GetSize() const; NzVector3ui GetSize(nzUInt8 level = 0) const;
unsigned int GetSize(nzUInt8 level) const;
nzImageType GetType() const; nzImageType GetType() const;
unsigned int GetWidth(nzUInt8 level = 0) const; unsigned int GetWidth(nzUInt8 level = 0) const;

View File

@ -680,6 +680,49 @@ nzUInt8 NzImage::GetMaxLevel() const
return GetMaxLevel(m_sharedImage->type, m_sharedImage->width, m_sharedImage->height, m_sharedImage->depth); return GetMaxLevel(m_sharedImage->type, m_sharedImage->width, m_sharedImage->height, m_sharedImage->depth);
} }
unsigned int NzImage::GetMemoryUsage() const
{
unsigned int width = m_sharedImage->width;
unsigned int height = m_sharedImage->height;
unsigned int depth = m_sharedImage->depth;
unsigned int size = 0;
for (unsigned int i = 0; i < m_sharedImage->levelCount; ++i)
{
size += width * height * depth;
if (width > 1)
width >>= 1;
if (height > 1)
height >>= 1;
if (depth > 1)
depth >>= 1;
}
if (m_sharedImage->type == nzImageType_Cubemap)
size *= 6;
return size * NzPixelFormat::GetBytesPerPixel(m_sharedImage->format);
}
unsigned int NzImage::GetMemoryUsage(nzUInt8 level) const
{
#if NAZARA_UTILITY_SAFE
if (level >= m_sharedImage->levelCount)
{
NazaraError("Level out of bounds (" + NzString::Number(level) + " >= " + NzString::Number(m_sharedImage->levelCount) + ')');
return 0;
}
#endif
return (GetLevelSize(m_sharedImage->width, level)) *
(GetLevelSize(m_sharedImage->height, level)) *
((m_sharedImage->type == nzImageType_Cubemap) ? 6 : GetLevelSize(m_sharedImage->depth, level)) *
NzPixelFormat::GetBytesPerPixel(m_sharedImage->format);
}
NzColor NzImage::GetPixelColor(unsigned int x, unsigned int y, unsigned int z) const NzColor NzImage::GetPixelColor(unsigned int x, unsigned int y, unsigned int z) const
{ {
#if NAZARA_UTILITY_SAFE #if NAZARA_UTILITY_SAFE
@ -776,34 +819,7 @@ nzUInt8* NzImage::GetPixels(unsigned int x, unsigned int y, unsigned int z, nzUI
return GetPixelPtr(m_sharedImage->pixels[level], NzPixelFormat::GetBytesPerPixel(m_sharedImage->format), x, y, z, width, height); return GetPixelPtr(m_sharedImage->pixels[level], NzPixelFormat::GetBytesPerPixel(m_sharedImage->format), x, y, z, width, height);
} }
unsigned int NzImage::GetSize() const NzVector3ui NzImage::GetSize(nzUInt8 level) const
{
unsigned int width = m_sharedImage->width;
unsigned int height = m_sharedImage->height;
unsigned int depth = m_sharedImage->depth;
unsigned int size = 0;
for (unsigned int i = 0; i < m_sharedImage->levelCount; ++i)
{
size += width * height * depth;
if (width > 1)
width >>= 1;
if (height > 1)
height >>= 1;
if (depth > 1)
depth >>= 1;
}
if (m_sharedImage->type == nzImageType_Cubemap)
size *= 6;
return size * NzPixelFormat::GetBytesPerPixel(m_sharedImage->format);
}
unsigned int NzImage::GetSize(nzUInt8 level) const
{ {
#if NAZARA_UTILITY_SAFE #if NAZARA_UTILITY_SAFE
if (level >= m_sharedImage->levelCount) if (level >= m_sharedImage->levelCount)
@ -813,10 +829,7 @@ unsigned int NzImage::GetSize(nzUInt8 level) const
} }
#endif #endif
return (GetLevelSize(m_sharedImage->width, level)) * return NzVector3ui(GetLevelSize(m_sharedImage->width, level), GetLevelSize(m_sharedImage->height, level), GetLevelSize(m_sharedImage->depth, level));
(GetLevelSize(m_sharedImage->height, level)) *
((m_sharedImage->type == nzImageType_Cubemap) ? 6 : GetLevelSize(m_sharedImage->depth, level)) *
NzPixelFormat::GetBytesPerPixel(m_sharedImage->format);
} }
nzImageType NzImage::GetType() const nzImageType NzImage::GetType() const
@ -1122,7 +1135,7 @@ void NzImage::SetLevelCount(nzUInt8 levelCount)
nzUInt8 oldLevelCount = m_sharedImage->levelCount; nzUInt8 oldLevelCount = m_sharedImage->levelCount;
nzUInt8 maxLevelCount = std::max(levelCount, oldLevelCount); nzUInt8 maxLevelCount = std::max(levelCount, oldLevelCount);
m_sharedImage->levelCount = levelCount; // Pour faire fonctionner GetSize m_sharedImage->levelCount = levelCount; // Pour faire fonctionner GetMemoryUsage
nzUInt8** pixels = new nzUInt8*[levelCount]; nzUInt8** pixels = new nzUInt8*[levelCount];
for (unsigned int i = 0; i < maxLevelCount; ++i) for (unsigned int i = 0; i < maxLevelCount; ++i)
@ -1130,7 +1143,7 @@ void NzImage::SetLevelCount(nzUInt8 levelCount)
if (i < oldLevelCount) if (i < oldLevelCount)
pixels[i] = m_sharedImage->pixels[i]; pixels[i] = m_sharedImage->pixels[i];
else if (i < levelCount) else if (i < levelCount)
pixels[i] = new nzUInt8[GetSize(i)]; pixels[i] = new nzUInt8[GetMemoryUsage(i)];
else else
delete[] m_sharedImage->pixels[i]; delete[] m_sharedImage->pixels[i];
} }
@ -1434,7 +1447,7 @@ void NzImage::EnsureOwnership()
nzUInt8** pixels = new nzUInt8*[m_sharedImage->levelCount]; nzUInt8** pixels = new nzUInt8*[m_sharedImage->levelCount];
for (unsigned int i = 0; i < m_sharedImage->levelCount; ++i) for (unsigned int i = 0; i < m_sharedImage->levelCount; ++i)
{ {
unsigned int size = GetSize(i); unsigned int size = GetMemoryUsage(i);
pixels[i] = new nzUInt8[size]; pixels[i] = new nzUInt8[size];
std::memcpy(pixels[i], m_sharedImage->pixels[i], size); std::memcpy(pixels[i], m_sharedImage->pixels[i], size);
} }