Remove RGB images from the map file format

Cherry-picked from https://github.com/teeworlds/teeworlds/pull/2822.

CC https://github.com/teeworlds/teeworlds/issues/2812
CC https://github.com/teeworlds/teeworlds/issues/962

Since DDNet never saved these kinds of images, this should cause no
issues.
This commit is contained in:
heinrich5991 2024-05-07 13:18:06 +02:00
parent df30321f52
commit 8a64feabc3
4 changed files with 22 additions and 16 deletions

View file

@ -109,7 +109,6 @@ void CMapImages::OnMapLoadImpl(class CLayers *pLayers, IMap *pMap)
{ {
const int LoadFlag = (((m_aTextureUsedByTileOrQuadLayerFlag[i] & 1) != 0) ? TextureLoadFlag : 0) | (((m_aTextureUsedByTileOrQuadLayerFlag[i] & 2) != 0) ? 0 : (Graphics()->HasTextureArraysSupport() ? IGraphics::TEXLOAD_NO_2D_TEXTURE : 0)); const int LoadFlag = (((m_aTextureUsedByTileOrQuadLayerFlag[i] & 1) != 0) ? TextureLoadFlag : 0) | (((m_aTextureUsedByTileOrQuadLayerFlag[i] & 2) != 0) ? 0 : (Graphics()->HasTextureArraysSupport() ? IGraphics::TEXLOAD_NO_2D_TEXTURE : 0));
const CMapItemImage_v2 *pImg = (CMapItemImage_v2 *)pMap->GetItem(Start + i); const CMapItemImage_v2 *pImg = (CMapItemImage_v2 *)pMap->GetItem(Start + i);
const CImageInfo::EImageFormat Format = pImg->m_Version < CMapItemImage_v2::CURRENT_VERSION ? CImageInfo::FORMAT_RGBA : CImageInfo::ImageFormatFromInt(pImg->m_Format);
const char *pName = pMap->GetDataString(pImg->m_ImageName); const char *pName = pMap->GetDataString(pImg->m_ImageName);
if(pName == nullptr || pName[0] == '\0') if(pName == nullptr || pName[0] == '\0')
@ -123,18 +122,25 @@ void CMapImages::OnMapLoadImpl(class CLayers *pLayers, IMap *pMap)
pName = "(error)"; pName = "(error)";
} }
if(pImg->m_Version > 1 && pImg->m_MustBe1 != 1)
{
log_error("mapimages", "Failed to load map image %d '%s': invalid map image type.", i, pName);
ShowWarning = true;
continue;
}
if(pImg->m_External) if(pImg->m_External)
{ {
char aPath[IO_MAX_PATH_LENGTH]; char aPath[IO_MAX_PATH_LENGTH];
str_format(aPath, sizeof(aPath), "mapres/%s.png", pName); str_format(aPath, sizeof(aPath), "mapres/%s.png", pName);
m_aTextures[i] = Graphics()->LoadTexture(aPath, IStorage::TYPE_ALL, LoadFlag); m_aTextures[i] = Graphics()->LoadTexture(aPath, IStorage::TYPE_ALL, LoadFlag);
} }
else if(Format == CImageInfo::FORMAT_RGBA) else
{ {
CImageInfo ImageInfo; CImageInfo ImageInfo;
ImageInfo.m_Width = pImg->m_Width; ImageInfo.m_Width = pImg->m_Width;
ImageInfo.m_Height = pImg->m_Height; ImageInfo.m_Height = pImg->m_Height;
ImageInfo.m_Format = Format; ImageInfo.m_Format = CImageInfo::FORMAT_RGBA;
ImageInfo.m_pData = static_cast<uint8_t *>(pMap->GetData(pImg->m_ImageData)); ImageInfo.m_pData = static_cast<uint8_t *>(pMap->GetData(pImg->m_ImageData));
char aTexName[IO_MAX_PATH_LENGTH]; char aTexName[IO_MAX_PATH_LENGTH];
str_format(aTexName, sizeof(aTexName), "embedded: %s", pName); str_format(aTexName, sizeof(aTexName), "embedded: %s", pName);

View file

@ -508,8 +508,14 @@ bool CEditorMap::Load(const char *pFileName, int StorageType, const std::functio
else else
str_copy(pImg->m_aName, pName); str_copy(pImg->m_aName, pName);
const CImageInfo::EImageFormat Format = pItem->m_Version < CMapItemImage_v2::CURRENT_VERSION ? CImageInfo::FORMAT_RGBA : CImageInfo::ImageFormatFromInt(pItem->m_Format); if(pItem->m_Version > 1 && pItem->m_MustBe1 != 1)
if(pImg->m_External || (Format != CImageInfo::FORMAT_RGB && Format != CImageInfo::FORMAT_RGBA)) {
char aBuf[128];
str_format(aBuf, sizeof(aBuf), "Error: Unsupported image type of image %d '%s'.", i, pImg->m_aName);
ErrorHandler(aBuf);
}
if(pImg->m_External || (pItem->m_Version > 1 && pItem->m_MustBe1 != 1))
{ {
char aBuf[IO_MAX_PATH_LENGTH]; char aBuf[IO_MAX_PATH_LENGTH];
str_format(aBuf, sizeof(aBuf), "mapres/%s.png", pImg->m_aName); str_format(aBuf, sizeof(aBuf), "mapres/%s.png", pImg->m_aName);
@ -534,7 +540,7 @@ bool CEditorMap::Load(const char *pFileName, int StorageType, const std::functio
{ {
pImg->m_Width = pItem->m_Width; pImg->m_Width = pItem->m_Width;
pImg->m_Height = pItem->m_Height; pImg->m_Height = pItem->m_Height;
pImg->m_Format = Format; pImg->m_Format = CImageInfo::FORMAT_RGBA;
// copy image data // copy image data
void *pData = DataFile.GetData(pItem->m_ImageData); void *pData = DataFile.GetData(pItem->m_ImageData);

View file

@ -277,7 +277,7 @@ struct CMapItemImage_v2 : public CMapItemImage_v1
CURRENT_VERSION = 2, CURRENT_VERSION = 2,
}; };
int m_Format; // Default before this version is CImageInfo::FORMAT_RGBA int m_MustBe1;
}; };
typedef CMapItemImage_v1 CMapItemImage; typedef CMapItemImage_v1 CMapItemImage;

View file

@ -61,15 +61,9 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave)
str_format(aBuf, sizeof(aBuf), "%s/%s.png", pPathSave, pName); str_format(aBuf, sizeof(aBuf), "%s/%s.png", pPathSave, pName);
dbg_msg("map_extract", "writing image: %s (%dx%d)", aBuf, pItem->m_Width, pItem->m_Height); dbg_msg("map_extract", "writing image: %s (%dx%d)", aBuf, pItem->m_Width, pItem->m_Height);
const int Format = pItem->m_Version < CMapItemImage_v2::CURRENT_VERSION ? CImageInfo::FORMAT_RGBA : pItem->m_Format; if(pItem->m_Version >= 2 && pItem->m_MustBe1 != 1)
EImageFormat OutputFormat;
if(Format == CImageInfo::FORMAT_RGBA)
OutputFormat = IMAGE_FORMAT_RGBA;
else if(Format == CImageInfo::FORMAT_RGB)
OutputFormat = IMAGE_FORMAT_RGB;
else
{ {
dbg_msg("map_extract", "ignoring image '%s' with unknown format %d", aBuf, Format); log_error("map_extract", "ignoring image '%s' with unknown format %d", aBuf, pItem->m_MustBe1);
continue; continue;
} }
@ -80,7 +74,7 @@ bool Process(IStorage *pStorage, const char *pMapName, const char *pPathSave)
TImageByteBuffer ByteBuffer; TImageByteBuffer ByteBuffer;
SImageByteBuffer ImageByteBuffer(&ByteBuffer); SImageByteBuffer ImageByteBuffer(&ByteBuffer);
if(SavePng(OutputFormat, (const uint8_t *)Reader.GetData(pItem->m_ImageData), ImageByteBuffer, pItem->m_Width, pItem->m_Height)) if(SavePng(IMAGE_FORMAT_RGBA, (const uint8_t *)Reader.GetData(pItem->m_ImageData), ImageByteBuffer, pItem->m_Width, pItem->m_Height))
io_write(File, &ByteBuffer.front(), ByteBuffer.size()); io_write(File, &ByteBuffer.front(), ByteBuffer.size());
io_close(File); io_close(File);
} }