Utility/Image: Fix functions taking a Color
This commit is contained in:
parent
a4b10749f7
commit
cf222941ec
|
|
@ -3,6 +3,7 @@
|
||||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||||
|
|
||||||
#include <Nazara/Utility/Image.hpp>
|
#include <Nazara/Utility/Image.hpp>
|
||||||
|
#include <NazaraUtils/StackArray.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
#include <Nazara/Core/ErrorFlags.hpp>
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
#include <Nazara/Core/StringExt.hpp>
|
#include <Nazara/Core/StringExt.hpp>
|
||||||
|
|
@ -310,10 +311,11 @@ namespace Nz
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
UInt8 bpp = PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format);
|
UInt8 bpp = PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format);
|
||||||
std::unique_ptr<UInt8[]> colorBuffer(new UInt8[bpp]);
|
StackArray<UInt8> colorBuffer = NazaraStackArrayNoInit(UInt8, bpp);
|
||||||
if (!PixelFormatInfo::Convert(PixelFormat::RGBA8, m_sharedImage->format, &color.r, colorBuffer.get()))
|
|
||||||
|
if (!PixelFormatInfo::Convert(PixelFormat::RGBA32F, m_sharedImage->format, &color.r, &colorBuffer[0]))
|
||||||
{
|
{
|
||||||
NazaraErrorFmt("failed to convert RGBA8 to {0}", PixelFormatInfo::GetName(m_sharedImage->format));
|
NazaraErrorFmt("failed to convert RGBA32F to {0}", PixelFormatInfo::GetName(m_sharedImage->format));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -335,7 +337,7 @@ namespace Nz
|
||||||
|
|
||||||
while (ptr < end)
|
while (ptr < end)
|
||||||
{
|
{
|
||||||
std::memcpy(ptr, colorBuffer.get(), bpp);
|
std::memcpy(ptr, &colorBuffer[0], bpp);
|
||||||
ptr += bpp;
|
ptr += bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -388,10 +390,11 @@ namespace Nz
|
||||||
EnsureOwnership();
|
EnsureOwnership();
|
||||||
|
|
||||||
UInt8 bpp = PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format);
|
UInt8 bpp = PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format);
|
||||||
std::unique_ptr<UInt8[]> colorBuffer(new UInt8[bpp]);
|
StackArray<UInt8> colorBuffer = NazaraStackArrayNoInit(UInt8, bpp);
|
||||||
if (!PixelFormatInfo::Convert(PixelFormat::RGBA8, m_sharedImage->format, &color.r, colorBuffer.get()))
|
|
||||||
|
if (!PixelFormatInfo::Convert(PixelFormat::RGBA32F, m_sharedImage->format, &color.r, &colorBuffer[0]))
|
||||||
{
|
{
|
||||||
NazaraErrorFmt("failed to convert RGBA8 to {0}", PixelFormatInfo::GetName(m_sharedImage->format));
|
NazaraErrorFmt("failed to convert RGBA32F to {0}", PixelFormatInfo::GetName(m_sharedImage->format));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -409,7 +412,7 @@ namespace Nz
|
||||||
UInt8* end = facePixels + srcStride;
|
UInt8* end = facePixels + srcStride;
|
||||||
while (start < end)
|
while (start < end)
|
||||||
{
|
{
|
||||||
std::memcpy(start, colorBuffer.get(), bpp);
|
std::memcpy(start, &colorBuffer[0], bpp);
|
||||||
start += bpp;
|
start += bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -460,10 +463,11 @@ namespace Nz
|
||||||
EnsureOwnership();
|
EnsureOwnership();
|
||||||
|
|
||||||
UInt8 bpp = PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format);
|
UInt8 bpp = PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format);
|
||||||
std::unique_ptr<UInt8[]> colorBuffer(new UInt8[bpp]);
|
StackArray<UInt8> colorBuffer = NazaraStackArrayNoInit(UInt8, bpp);
|
||||||
if (!PixelFormatInfo::Convert(PixelFormat::RGBA8, m_sharedImage->format, &color.r, colorBuffer.get()))
|
|
||||||
|
if (!PixelFormatInfo::Convert(PixelFormat::RGBA32F, m_sharedImage->format, &color.r, &colorBuffer[0]))
|
||||||
{
|
{
|
||||||
NazaraErrorFmt("failed to convert RGBA8 to {0}", PixelFormatInfo::GetName(m_sharedImage->format));
|
NazaraErrorFmt("failed to convert RGBA32F to {0}", PixelFormatInfo::GetName(m_sharedImage->format));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -477,7 +481,7 @@ namespace Nz
|
||||||
UInt8* end = dstPixels + srcStride;
|
UInt8* end = dstPixels + srcStride;
|
||||||
while (start < end)
|
while (start < end)
|
||||||
{
|
{
|
||||||
std::memcpy(start, colorBuffer.get(), bpp);
|
std::memcpy(start, &colorBuffer[0], bpp);
|
||||||
start += bpp;
|
start += bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1218,7 +1222,7 @@ namespace Nz
|
||||||
|
|
||||||
UInt8* pixel = GetPixelPtr(m_sharedImage->levels[0].get(), PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format), x, y, z, m_sharedImage->width, m_sharedImage->height);
|
UInt8* pixel = GetPixelPtr(m_sharedImage->levels[0].get(), PixelFormatInfo::GetBytesPerPixel(m_sharedImage->format), x, y, z, m_sharedImage->width, m_sharedImage->height);
|
||||||
|
|
||||||
if (!PixelFormatInfo::Convert(PixelFormat::RGBA8, m_sharedImage->format, &color.r, pixel))
|
if (!PixelFormatInfo::Convert(PixelFormat::RGBA32F, m_sharedImage->format, &color.r, pixel))
|
||||||
{
|
{
|
||||||
NazaraError("failed to convert RGBA8 to image's format");
|
NazaraError("failed to convert RGBA8 to image's format");
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -1370,6 +1370,31 @@ namespace Nz
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**********************************RGBA32F**********************************/
|
||||||
|
template<>
|
||||||
|
UInt8* ConvertPixels<PixelFormat::RGBA32F, PixelFormat::RGBA8>(const UInt8* start, const UInt8* end, UInt8* dst)
|
||||||
|
{
|
||||||
|
while (start < end)
|
||||||
|
{
|
||||||
|
const float* ptr = reinterpret_cast<const float*>(start);
|
||||||
|
|
||||||
|
*dst++ = static_cast<UInt8>(ptr[0] * 255.f);
|
||||||
|
*dst++ = static_cast<UInt8>(ptr[1] * 255.f);
|
||||||
|
*dst++ = static_cast<UInt8>(ptr[2] * 255.f);
|
||||||
|
*dst++ = static_cast<UInt8>(ptr[3] * 255.f);
|
||||||
|
|
||||||
|
start += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
UInt8* ConvertPixels<PixelFormat::RGBA32F, PixelFormat::RGBA8_SRGB>(const UInt8* start, const UInt8* end, UInt8* dst)
|
||||||
|
{
|
||||||
|
return ConvertPixels<PixelFormat::RGBA32F, PixelFormat::RGBA8>(start, end, dst);
|
||||||
|
}
|
||||||
|
|
||||||
template<PixelFormat Format1, PixelFormat Format2>
|
template<PixelFormat Format1, PixelFormat Format2>
|
||||||
void RegisterConverter()
|
void RegisterConverter()
|
||||||
{
|
{
|
||||||
|
|
@ -1775,6 +1800,10 @@ namespace Nz
|
||||||
RegisterConverter<PixelFormat::RGBA8, PixelFormat::RGBA8_SRGB>();
|
RegisterConverter<PixelFormat::RGBA8, PixelFormat::RGBA8_SRGB>();
|
||||||
RegisterConverter<PixelFormat::RGBA8, PixelFormat::RGBA32F>();
|
RegisterConverter<PixelFormat::RGBA8, PixelFormat::RGBA32F>();
|
||||||
|
|
||||||
|
/**********************************RGBA32F**********************************/
|
||||||
|
RegisterConverter<PixelFormat::RGBA32F, PixelFormat::RGBA8>();
|
||||||
|
RegisterConverter<PixelFormat::RGBA32F, PixelFormat::RGBA8_SRGB>();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue