diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp
index a43038c4c..a293e4a0f 100644
--- a/src/engine/client/graphics_threaded.cpp
+++ b/src/engine/client/graphics_threaded.cpp
@@ -2,6 +2,7 @@
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#include
+#include
#include
#if defined(CONF_FAMILY_UNIX)
@@ -551,7 +552,7 @@ bool CGraphics_Threaded::UpdateTextTexture(CTextureHandle TextureID, int x, int
return true;
}
-int CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType)
+bool CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType)
{
char aCompleteFilename[IO_MAX_PATH_LENGTH];
IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType, aCompleteFilename, sizeof(aCompleteFilename));
@@ -574,17 +575,17 @@ int CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int Sto
int PngliteIncompatible;
if(::LoadPNG(ImageByteBuffer, pFilename, PngliteIncompatible, pImg->m_Width, pImg->m_Height, pImgBuffer, ImageFormat))
{
- pImg->m_pData = pImgBuffer;
-
- if(ImageFormat == IMAGE_FORMAT_RGB) // ignore_convention
+ if(ImageFormat == IMAGE_FORMAT_RGB)
pImg->m_Format = CImageInfo::FORMAT_RGB;
- else if(ImageFormat == IMAGE_FORMAT_RGBA) // ignore_convention
+ else if(ImageFormat == IMAGE_FORMAT_RGBA)
pImg->m_Format = CImageInfo::FORMAT_RGBA;
else
{
free(pImgBuffer);
- return 0;
+ log_error("game/png", "image had unsupported image format. filename='%s' format='%d'", pFilename, (int)ImageFormat);
+ return false;
}
+ pImg->m_pData = pImgBuffer;
if(m_WarnPngliteIncompatibleImages && PngliteIncompatible != 0)
{
@@ -612,17 +613,17 @@ int CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int Sto
}
else
{
- dbg_msg("game/png", "image had unsupported image format. filename='%s'", pFilename);
- return 0;
+ log_error("game/png", "failed to load file. filename='%s'", pFilename);
+ return false;
}
}
else
{
- dbg_msg("game/png", "failed to open file. filename='%s'", pFilename);
- return 0;
+ log_error("game/png", "failed to open file. filename='%s'", pFilename);
+ return false;
}
- return 1;
+ return true;
}
void CGraphics_Threaded::FreePNG(CImageInfo *pImg)
diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h
index 03ca8dba9..514680749 100644
--- a/src/engine/client/graphics_threaded.h
+++ b/src/engine/client/graphics_threaded.h
@@ -965,7 +965,7 @@ public:
// simple uncompressed RGBA loaders
IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) override;
- int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) override;
+ bool LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) override;
void FreePNG(CImageInfo *pImg) override;
bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) override;
diff --git a/src/engine/gfx/image_loader.cpp b/src/engine/gfx/image_loader.cpp
index 76ac23205..eefb597cd 100644
--- a/src/engine/gfx/image_loader.cpp
+++ b/src/engine/gfx/image_loader.cpp
@@ -59,12 +59,15 @@ static EImageFormat LibPNGGetImageFormat(int ColorChannelCount)
{
case 1:
return IMAGE_FORMAT_R;
+ case 2:
+ return IMAGE_FORMAT_RA;
case 3:
return IMAGE_FORMAT_RGB;
case 4:
return IMAGE_FORMAT_RGBA;
default:
- return IMAGE_FORMAT_RGBA;
+ dbg_assert(false, "ColorChannelCount invalid");
+ dbg_break();
}
}
@@ -276,14 +279,20 @@ static void FlushPNGWrite(png_structp png_ptr) {}
static int ImageLoaderHelperFormatToColorChannel(EImageFormat Format)
{
- if(Format == IMAGE_FORMAT_R)
+ switch(Format)
+ {
+ case IMAGE_FORMAT_R:
return 1;
- else if(Format == IMAGE_FORMAT_RGB)
+ case IMAGE_FORMAT_RA:
+ return 2;
+ case IMAGE_FORMAT_RGB:
return 3;
- else if(Format == IMAGE_FORMAT_RGBA)
+ case IMAGE_FORMAT_RGBA:
return 4;
-
- return 4;
+ default:
+ dbg_assert(false, "Format invalid");
+ dbg_break();
+ }
}
bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuffer &WrittenBytes, int Width, int Height)
diff --git a/src/engine/gfx/image_loader.h b/src/engine/gfx/image_loader.h
index 72a176e4e..0da2474a0 100644
--- a/src/engine/gfx/image_loader.h
+++ b/src/engine/gfx/image_loader.h
@@ -8,6 +8,7 @@
enum EImageFormat
{
IMAGE_FORMAT_R = 0,
+ IMAGE_FORMAT_RA,
IMAGE_FORMAT_RGB,
IMAGE_FORMAT_RGBA,
};
diff --git a/src/engine/graphics.h b/src/engine/graphics.h
index dac4a3107..67043c5b3 100644
--- a/src/engine/graphics.h
+++ b/src/engine/graphics.h
@@ -320,7 +320,7 @@ public:
virtual const TTWGraphicsGPUList &GetGPUs() const = 0;
- virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) = 0;
+ virtual bool LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) = 0;
virtual void FreePNG(CImageInfo *pImg) = 0;
virtual bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) = 0;
diff --git a/src/tools/map_replace_image.cpp b/src/tools/map_replace_image.cpp
index a1c755e5b..b67ce18ae 100644
--- a/src/tools/map_replace_image.cpp
+++ b/src/tools/map_replace_image.cpp
@@ -23,7 +23,7 @@ int g_NewDataID = -1;
int g_NewDataSize = 0;
void *g_pNewData = nullptr;
-int LoadPNG(CImageInfo *pImg, const char *pFilename)
+bool LoadPNG(CImageInfo *pImg, const char *pFilename)
{
IOHANDLE File = io_open(pFilename, IOFLAG_READ);
if(File)
@@ -48,23 +48,23 @@ int LoadPNG(CImageInfo *pImg, const char *pFilename)
{
pImg->m_pData = pImgBuffer;
- if(ImageFormat == IMAGE_FORMAT_RGB) // ignore_convention
+ if(ImageFormat == IMAGE_FORMAT_RGB)
pImg->m_Format = CImageInfo::FORMAT_RGB;
- else if(ImageFormat == IMAGE_FORMAT_RGBA) // ignore_convention
+ else if(ImageFormat == IMAGE_FORMAT_RGBA)
pImg->m_Format = CImageInfo::FORMAT_RGBA;
else
{
free(pImgBuffer);
- return 0;
+ return false;
}
}
}
else
- return 0;
+ return false;
}
else
- return 0;
- return 1;
+ return false;
+ return true;
}
void *ReplaceImageItem(int Index, CMapItemImage *pImgItem, const char *pImgName, const char *pImgFile, CMapItemImage *pNewImgItem)