mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-26 05:51:20 +00:00
- use stb-image to handle PNGs with 16 bit color channels.
It is still not recommended to use this format - images tend to be huge and setup time is normally prohibitive - but at least they work now.
This commit is contained in:
parent
8bb36bd479
commit
a3a65f184f
2 changed files with 44 additions and 8 deletions
|
@ -74,6 +74,7 @@ protected:
|
||||||
uint32_t StartOfPalette = 0;
|
uint32_t StartOfPalette = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FImageSource* StbImage_TryCreate(FileReader& file, int lumpnum);
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
@ -127,6 +128,46 @@ FImageSource *PNGImage_TryCreate(FileReader & data, int lumpnum)
|
||||||
}
|
}
|
||||||
if (!((1 << bitdepth) & 0x116))
|
if (!((1 << bitdepth) & 0x116))
|
||||||
{
|
{
|
||||||
|
// Try STBImage for 16 bit PNGs.
|
||||||
|
auto tex = StbImage_TryCreate(data, lumpnum);
|
||||||
|
if (tex)
|
||||||
|
{
|
||||||
|
// STBImage does not handle grAb, so do that here and insert the data into the texture.
|
||||||
|
data.Seek(33, FileReader::SeekSet);
|
||||||
|
|
||||||
|
int len = data.ReadInt32BE();
|
||||||
|
int id = data.ReadInt32();
|
||||||
|
while (id != MAKE_ID('I', 'D', 'A', 'T') && id != MAKE_ID('I', 'E', 'N', 'D'))
|
||||||
|
{
|
||||||
|
if (id != MAKE_ID('g', 'r', 'A', 'b'))
|
||||||
|
{
|
||||||
|
data.Seek(len, FileReader::SeekCur);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int ihotx = data.ReadInt32BE();
|
||||||
|
int ihoty = data.ReadInt32BE();
|
||||||
|
if (ihotx < -32768 || ihotx > 32767)
|
||||||
|
{
|
||||||
|
Printf("X-Offset for PNG texture %s is bad: %d (0x%08x)\n", fileSystem.GetFileFullName(lumpnum), ihotx, ihotx);
|
||||||
|
ihotx = 0;
|
||||||
|
}
|
||||||
|
if (ihoty < -32768 || ihoty > 32767)
|
||||||
|
{
|
||||||
|
Printf("Y-Offset for PNG texture %s is bad: %d (0x%08x)\n", fileSystem.GetFileFullName(lumpnum), ihoty, ihoty);
|
||||||
|
ihoty = 0;
|
||||||
|
}
|
||||||
|
tex->SetOffsets(ihotx, ihoty);
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Seek(4, FileReader::SeekCur); // Skip CRC
|
||||||
|
len = data.ReadInt32BE();
|
||||||
|
id = MAKE_ID('I', 'E', 'N', 'D');
|
||||||
|
id = data.ReadInt32();
|
||||||
|
}
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
|
||||||
Printf(TEXTCOLOR_YELLOW"WARNING: failed to load PNG %s: the bit-depth (%u) is not supported!\n", fileSystem.GetFileFullName(lumpnum), bitdepth);
|
Printf(TEXTCOLOR_YELLOW"WARNING: failed to load PNG %s: the bit-depth (%u) is not supported!\n", fileSystem.GetFileFullName(lumpnum), bitdepth);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -185,13 +226,8 @@ FPNGTexture::FPNGTexture (FileReader &lump, int lumpnum, int width, int height,
|
||||||
case MAKE_ID('g','r','A','b'):
|
case MAKE_ID('g','r','A','b'):
|
||||||
// This is like GRAB found in an ILBM, except coordinates use 4 bytes
|
// This is like GRAB found in an ILBM, except coordinates use 4 bytes
|
||||||
{
|
{
|
||||||
uint32_t hotx, hoty;
|
int ihotx = lump.ReadInt32BE();
|
||||||
int ihotx, ihoty;
|
int ihoty = lump.ReadInt32BE();
|
||||||
|
|
||||||
lump.Read(&hotx, 4);
|
|
||||||
lump.Read(&hoty, 4);
|
|
||||||
ihotx = BigLong((int)hotx);
|
|
||||||
ihoty = BigLong((int)hoty);
|
|
||||||
if (ihotx < -32768 || ihotx > 32767)
|
if (ihotx < -32768 || ihotx > 32767)
|
||||||
{
|
{
|
||||||
Printf ("X-Offset for PNG texture %s is bad: %d (0x%08x)\n", fileSystem.GetFileFullName (lumpnum), ihotx, ihotx);
|
Printf ("X-Offset for PNG texture %s is bad: %d (0x%08x)\n", fileSystem.GetFileFullName (lumpnum), ihotx, ihotx);
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#define STBI_NO_STDIO
|
#define STBI_NO_STDIO
|
||||||
// Undefine formats we do not want to support here.
|
// Undefine formats we do not want to support here.
|
||||||
#define STBI_NO_JPEG
|
#define STBI_NO_JPEG
|
||||||
#define STBI_NO_PNG
|
//#define STBI_NO_PNG we need PNG for 16 bit channel images. Regular ones still use our own, more flexible decoder.
|
||||||
#define STBI_NO_TGA
|
#define STBI_NO_TGA
|
||||||
#define STBI_NO_PSD
|
#define STBI_NO_PSD
|
||||||
#define STBI_NO_HDR
|
#define STBI_NO_HDR
|
||||||
|
|
Loading…
Reference in a new issue