mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 16:44:36 +00:00
Expanded Features
Added ability to set format dynamically on read from stream. Added other formats to write to a stream.
This commit is contained in:
parent
106346630d
commit
43c2c918c7
3 changed files with 68 additions and 23 deletions
|
|
@ -1254,7 +1254,7 @@ bool GBitmap::writeBitmapStream(const String& bmType, Stream& ioStream, U32 comp
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return regInfo->writeStreamFunc(ioStream, this, (compressionLevel == U32_MAX) ? regInfo->defaultCompression : compressionLevel);
|
return regInfo->writeStreamFunc(bmType, ioStream, this, (compressionLevel == U32_MAX) ? regInfo->defaultCompression : compressionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> void *Resource<GBitmap>::create(const Torque::Path &path)
|
template<> void *Resource<GBitmap>::create(const Torque::Path &path)
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ public:
|
||||||
typedef bool(*ReadStreamFunc)(Stream& stream, GBitmap* bitmap, U32 len);
|
typedef bool(*ReadStreamFunc)(Stream& stream, GBitmap* bitmap, U32 len);
|
||||||
/// The write functions prototype. Compression levels are image-specific - see their registration declaration for details.
|
/// The write functions prototype. Compression levels are image-specific - see their registration declaration for details.
|
||||||
typedef bool(*WriteFunc)(const Torque::Path& path, GBitmap* bitmap, U32 compressionLevel);
|
typedef bool(*WriteFunc)(const Torque::Path& path, GBitmap* bitmap, U32 compressionLevel);
|
||||||
typedef bool(*WriteStreamFunc)(Stream& stream, GBitmap* bitmap, U32 compressionLevel);
|
typedef bool(*WriteStreamFunc)(const String& bmType, Stream& stream, GBitmap* bitmap, U32 compressionLevel);
|
||||||
|
|
||||||
/// Used to sort the registrations so that
|
/// Used to sort the registrations so that
|
||||||
/// lookups occur in a fixed order.
|
/// lookups occur in a fixed order.
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,15 @@ static bool sReadSTB(const Torque::Path& path, GBitmap* bitmap);
|
||||||
static bool sReadStreamSTB(Stream& stream, GBitmap* bitmap, U32 len);
|
static bool sReadStreamSTB(Stream& stream, GBitmap* bitmap, U32 len);
|
||||||
|
|
||||||
static bool sWriteSTB(const Torque::Path& path, GBitmap* bitmap, U32 compressionLevel);
|
static bool sWriteSTB(const Torque::Path& path, GBitmap* bitmap, U32 compressionLevel);
|
||||||
static bool sWriteStreamSTB(Stream& stream, GBitmap* bitmap, U32 compressionLevel);
|
static bool sWriteStreamSTB(const String& bmType, Stream& stream, GBitmap* bitmap, U32 compressionLevel);
|
||||||
|
|
||||||
|
// stbi_write callback / rextimmy.
|
||||||
|
static void stbiWriteFunc(void* context, void* data, int size)
|
||||||
|
{
|
||||||
|
Stream* stream = static_cast<Stream*>(context);
|
||||||
|
stream->write(size);
|
||||||
|
stream->write(size, data);
|
||||||
|
}
|
||||||
|
|
||||||
static struct _privateRegisterSTB
|
static struct _privateRegisterSTB
|
||||||
{
|
{
|
||||||
|
|
@ -209,8 +217,21 @@ bool sReadStreamSTB(Stream& stream, GBitmap* bitmap, U32 len)
|
||||||
stream.read(len, data);
|
stream.read(len, data);
|
||||||
|
|
||||||
S32 width, height, comp = 0;
|
S32 width, height, comp = 0;
|
||||||
|
if (stbi_info_from_memory(data, len, &width, &height, &comp))
|
||||||
|
{
|
||||||
|
const char* stbErr = stbi_failure_reason();
|
||||||
|
|
||||||
|
if (!stbErr)
|
||||||
|
stbErr = "Unknown Error!";
|
||||||
|
|
||||||
|
Con::errorf("STB failed to get image info: %s", stbErr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
S32 reqCom = comp;
|
||||||
|
|
||||||
|
unsigned char* pixelData = stbi_load_from_memory((const U8*)data, (int)len, &width, &height, &comp, reqCom);
|
||||||
|
|
||||||
unsigned char* pixelData = stbi_load_from_memory((const U8*)data, (int)len, &width, &height, &comp, 1);
|
|
||||||
if (!pixelData)
|
if (!pixelData)
|
||||||
{
|
{
|
||||||
const char* stbErr = stbi_failure_reason();
|
const char* stbErr = stbi_failure_reason();
|
||||||
|
|
@ -218,12 +239,22 @@ bool sReadStreamSTB(Stream& stream, GBitmap* bitmap, U32 len)
|
||||||
if (!stbErr)
|
if (!stbErr)
|
||||||
stbErr = "Unknown Error!";
|
stbErr = "Unknown Error!";
|
||||||
|
|
||||||
Con::printf("sReadStreamSTB Error: %s", stbErr);
|
Con::errorf("sReadStreamSTB Error: %s", stbErr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bitmap->deleteImage();
|
bitmap->deleteImage();
|
||||||
|
|
||||||
bitmap->allocateBitmap(256, 256, false, GFXFormatA8);
|
//work out what format we need to use - todo floating point?
|
||||||
|
GFXFormat fmt = GFXFormat_FIRST;
|
||||||
|
switch (comp)
|
||||||
|
{
|
||||||
|
case 1: fmt = GFXFormatA8; break;
|
||||||
|
case 2: fmt = GFXFormatA8L8; break; //todo check this
|
||||||
|
case 3: fmt = GFXFormatR8G8B8; break;
|
||||||
|
case 4: fmt = GFXFormatR8G8B8A8; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bitmap->allocateBitmap(width, height, false, GFXFormatA8);
|
||||||
|
|
||||||
U8* pBase = bitmap->getWritableBits(0);
|
U8* pBase = bitmap->getWritableBits(0);
|
||||||
U32 rowBytes = bitmap->getByteSize();
|
U32 rowBytes = bitmap->getByteSize();
|
||||||
|
|
@ -311,27 +342,41 @@ bool sWriteSTB(const Torque::Path& path, GBitmap* bitmap, U32 compressionLevel)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sWriteStreamSTB(Stream& stream, GBitmap* bitmap, U32 compressionLevel)
|
bool sWriteStreamSTB(const String& bmType, Stream& stream, GBitmap* bitmap, U32 compressionLevel)
|
||||||
{
|
{
|
||||||
S32 len;
|
PROFILE_SCOPE(sWriteStreamSTB);
|
||||||
const U8* pData = bitmap->getBits();
|
|
||||||
|
|
||||||
unsigned char* png = stbi_write_png_to_mem(pData, 0, bitmap->getWidth(), bitmap->getHeight(), 1, &len);
|
S32 width = bitmap->getWidth();
|
||||||
|
S32 height = bitmap->getHeight();
|
||||||
|
const U8* pPixelData = bitmap->getBits();
|
||||||
|
S32 channels = bitmap->getBytesPerPixel();
|
||||||
|
|
||||||
if (!png)
|
if (bmType == String("png"))
|
||||||
{
|
{
|
||||||
const char* stbErr = stbi_failure_reason();
|
stbi_write_png_compression_level = compressionLevel;
|
||||||
|
if (stbi_write_png_to_func(stbiWriteFunc, &stream, width, height, channels, pPixelData, width * channels))
|
||||||
if (!stbErr)
|
return true;
|
||||||
stbErr = "Unknown Error!";
|
}
|
||||||
|
else if (bmType == String("tga"))
|
||||||
Con::printf("sReadStreamSTB Error: %s", stbErr);
|
{
|
||||||
return false;
|
if (stbi_write_tga_to_func(stbiWriteFunc, &stream, width, height, channels, pPixelData))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (bmType == String("bmp"))
|
||||||
|
{
|
||||||
|
if (stbi_write_bmp_to_func(stbiWriteFunc, &stream, width, height, channels, pPixelData))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (bmType == String("jpg") || bmType == String("jpeg"))
|
||||||
|
{
|
||||||
|
if (stbi_write_jpg_to_func(stbiWriteFunc, &stream, width, height, channels, pPixelData, compressionLevel))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (bmType == String("hdr"))
|
||||||
|
{
|
||||||
|
if (stbi_write_hdr_to_func(stbiWriteFunc, &stream, width, height, channels, (const F32*)pPixelData))
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream.write(len);
|
return false;
|
||||||
stream.write(len, png);
|
|
||||||
|
|
||||||
dFree(png);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue