mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-09 09:38:19 +00:00
Merge pull request #8667 from Robyt3/Client-Graphics-Image-Checks-Refactoring
Refactor `IGraphics::CheckImageDivisibility` and `IsImageFormatRGBA` functions
This commit is contained in:
commit
3ff3802867
|
@ -651,61 +651,58 @@ bool CGraphics_Threaded::LoadPng(CImageInfo &Image, const char *pFilename, int S
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGraphics_Threaded::CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize)
|
bool CGraphics_Threaded::CheckImageDivisibility(const char *pContextName, CImageInfo &Image, int DivX, int DivY, bool AllowResize)
|
||||||
{
|
{
|
||||||
dbg_assert(DivX != 0 && DivY != 0, "Passing 0 to this function is not allowed.");
|
dbg_assert(DivX != 0 && DivY != 0, "Passing 0 to this function is not allowed.");
|
||||||
bool ImageIsValid = true;
|
bool ImageIsValid = true;
|
||||||
bool WidthBroken = Img.m_Width == 0 || (Img.m_Width % DivX) != 0;
|
bool WidthBroken = Image.m_Width == 0 || (Image.m_Width % DivX) != 0;
|
||||||
bool HeightBroken = Img.m_Height == 0 || (Img.m_Height % DivY) != 0;
|
bool HeightBroken = Image.m_Height == 0 || (Image.m_Height % DivY) != 0;
|
||||||
if(WidthBroken || HeightBroken)
|
if(WidthBroken || HeightBroken)
|
||||||
{
|
{
|
||||||
SWarning NewWarning;
|
SWarning NewWarning;
|
||||||
str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg), Localize("The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs."), pFileName, DivX, DivY);
|
char aContextNameQuoted[128];
|
||||||
|
str_format(aContextNameQuoted, sizeof(aContextNameQuoted), "\"%s\"", pContextName);
|
||||||
|
str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg),
|
||||||
|
Localize("The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs."), aContextNameQuoted, DivX, DivY);
|
||||||
m_vWarnings.emplace_back(NewWarning);
|
m_vWarnings.emplace_back(NewWarning);
|
||||||
|
|
||||||
ImageIsValid = false;
|
ImageIsValid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(AllowResize && !ImageIsValid && Img.m_Width > 0 && Img.m_Height > 0)
|
if(AllowResize && !ImageIsValid && Image.m_Width > 0 && Image.m_Height > 0)
|
||||||
{
|
{
|
||||||
int NewWidth = DivX;
|
int NewWidth = DivX;
|
||||||
int NewHeight = DivY;
|
int NewHeight = DivY;
|
||||||
if(WidthBroken)
|
if(WidthBroken)
|
||||||
{
|
{
|
||||||
NewWidth = maximum<int>(HighestBit(Img.m_Width), DivX);
|
NewWidth = maximum<int>(HighestBit(Image.m_Width), DivX);
|
||||||
NewHeight = (NewWidth / DivX) * DivY;
|
NewHeight = (NewWidth / DivX) * DivY;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NewHeight = maximum<int>(HighestBit(Img.m_Height), DivY);
|
NewHeight = maximum<int>(HighestBit(Image.m_Height), DivY);
|
||||||
NewWidth = (NewHeight / DivY) * DivX;
|
NewWidth = (NewHeight / DivY) * DivX;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *pNewImg = ResizeImage(Img.m_pData, Img.m_Width, Img.m_Height, NewWidth, NewHeight, Img.PixelSize());
|
uint8_t *pNewImage = ResizeImage(Image.m_pData, Image.m_Width, Image.m_Height, NewWidth, NewHeight, Image.PixelSize());
|
||||||
free(Img.m_pData);
|
free(Image.m_pData);
|
||||||
Img.m_pData = pNewImg;
|
Image.m_pData = pNewImage;
|
||||||
Img.m_Width = NewWidth;
|
Image.m_Width = NewWidth;
|
||||||
Img.m_Height = NewHeight;
|
Image.m_Height = NewHeight;
|
||||||
ImageIsValid = true;
|
ImageIsValid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ImageIsValid;
|
return ImageIsValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CGraphics_Threaded::IsImageFormatRGBA(const char *pFileName, CImageInfo &Img)
|
bool CGraphics_Threaded::IsImageFormatRgba(const char *pContextName, const CImageInfo &Image)
|
||||||
{
|
{
|
||||||
if(Img.m_Format != CImageInfo::FORMAT_RGBA)
|
if(Image.m_Format != CImageInfo::FORMAT_RGBA)
|
||||||
{
|
{
|
||||||
SWarning NewWarning;
|
SWarning NewWarning;
|
||||||
char aText[128];
|
char aContextNameQuoted[128];
|
||||||
aText[0] = '\0';
|
str_format(aContextNameQuoted, sizeof(aContextNameQuoted), "\"%s\"", pContextName);
|
||||||
if(pFileName)
|
|
||||||
{
|
|
||||||
str_format(aText, sizeof(aText), "\"%s\"", pFileName);
|
|
||||||
}
|
|
||||||
str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg),
|
str_format(NewWarning.m_aWarningMsg, sizeof(NewWarning.m_aWarningMsg),
|
||||||
Localize("The format of texture %s is not RGBA which will cause visual bugs."), aText);
|
Localize("The format of texture %s is not RGBA which will cause visual bugs."), aContextNameQuoted);
|
||||||
m_vWarnings.emplace_back(NewWarning);
|
m_vWarnings.emplace_back(NewWarning);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -983,8 +983,8 @@ public:
|
||||||
IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) override;
|
IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) override;
|
||||||
bool LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) override;
|
bool LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) override;
|
||||||
|
|
||||||
bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) override;
|
bool CheckImageDivisibility(const char *pContextName, CImageInfo &Image, int DivX, int DivY, bool AllowResize) override;
|
||||||
bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) override;
|
bool IsImageFormatRgba(const char *pContextName, const CImageInfo &Image) override;
|
||||||
|
|
||||||
void CopyTextureBufferSub(uint8_t *pDestBuffer, const CImageInfo &SourceImage, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) override;
|
void CopyTextureBufferSub(uint8_t *pDestBuffer, const CImageInfo &SourceImage, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) override;
|
||||||
void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, const CImageInfo &SourceImage, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) override;
|
void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, const CImageInfo &SourceImage, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) override;
|
||||||
|
|
|
@ -331,8 +331,8 @@ public:
|
||||||
|
|
||||||
virtual bool LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) = 0;
|
virtual bool LoadPng(CImageInfo &Image, const char *pFilename, int StorageType) = 0;
|
||||||
|
|
||||||
virtual bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) = 0;
|
virtual bool CheckImageDivisibility(const char *pContextName, CImageInfo &Image, int DivX, int DivY, bool AllowResize) = 0;
|
||||||
virtual bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) = 0;
|
virtual bool IsImageFormatRgba(const char *pContextName, const CImageInfo &Image) = 0;
|
||||||
|
|
||||||
// destination and source buffer require to have the same width and height
|
// destination and source buffer require to have the same width and height
|
||||||
virtual void CopyTextureBufferSub(uint8_t *pDestBuffer, const CImageInfo &SourceImage, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) = 0;
|
virtual void CopyTextureBufferSub(uint8_t *pDestBuffer, const CImageInfo &SourceImage, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) = 0;
|
||||||
|
|
|
@ -157,7 +157,7 @@ const CSkin *CSkins::LoadSkin(const char *pName, CImageInfo &Info)
|
||||||
log_error("skins", "Skin failed image divisibility: %s", pName);
|
log_error("skins", "Skin failed image divisibility: %s", pName);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if(!Graphics()->IsImageFormatRGBA(pName, Info))
|
if(!Graphics()->IsImageFormatRgba(pName, Info))
|
||||||
{
|
{
|
||||||
log_error("skins", "Skin format is not RGBA: %s", pName);
|
log_error("skins", "Skin format is not RGBA: %s", pName);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -3032,7 +3032,7 @@ void CGameClient::LoadGameSkin(const char *pPath, bool AsDir)
|
||||||
else
|
else
|
||||||
LoadGameSkin(pPath, true);
|
LoadGameSkin(pPath, true);
|
||||||
}
|
}
|
||||||
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRGBA(aPath, ImgInfo))
|
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HEALTH_FULL].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo))
|
||||||
{
|
{
|
||||||
m_GameSkin.m_SpriteHealthFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_FULL]);
|
m_GameSkin.m_SpriteHealthFull = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_FULL]);
|
||||||
m_GameSkin.m_SpriteHealthEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_EMPTY]);
|
m_GameSkin.m_SpriteHealthEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HEALTH_EMPTY]);
|
||||||
|
@ -3193,7 +3193,7 @@ void CGameClient::LoadEmoticonsSkin(const char *pPath, bool AsDir)
|
||||||
else
|
else
|
||||||
LoadEmoticonsSkin(pPath, true);
|
LoadEmoticonsSkin(pPath, true);
|
||||||
}
|
}
|
||||||
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRGBA(aPath, ImgInfo))
|
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_OOP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo))
|
||||||
{
|
{
|
||||||
for(int i = 0; i < 16; ++i)
|
for(int i = 0; i < 16; ++i)
|
||||||
m_EmoticonsSkin.m_aSpriteEmoticons[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_OOP + i]);
|
m_EmoticonsSkin.m_aSpriteEmoticons[i] = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_OOP + i]);
|
||||||
|
@ -3247,7 +3247,7 @@ void CGameClient::LoadParticlesSkin(const char *pPath, bool AsDir)
|
||||||
else
|
else
|
||||||
LoadParticlesSkin(pPath, true);
|
LoadParticlesSkin(pPath, true);
|
||||||
}
|
}
|
||||||
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRGBA(aPath, ImgInfo))
|
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SLICE].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo))
|
||||||
{
|
{
|
||||||
m_ParticlesSkin.m_SpriteParticleSlice = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SLICE]);
|
m_ParticlesSkin.m_SpriteParticleSlice = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SLICE]);
|
||||||
m_ParticlesSkin.m_SpriteParticleBall = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_BALL]);
|
m_ParticlesSkin.m_SpriteParticleBall = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_BALL]);
|
||||||
|
@ -3336,7 +3336,7 @@ void CGameClient::LoadHudSkin(const char *pPath, bool AsDir)
|
||||||
else
|
else
|
||||||
LoadHudSkin(pPath, true);
|
LoadHudSkin(pPath, true);
|
||||||
}
|
}
|
||||||
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRGBA(aPath, ImgInfo))
|
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_HUD_AIRJUMP].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo))
|
||||||
{
|
{
|
||||||
m_HudSkin.m_SpriteHudAirjump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP]);
|
m_HudSkin.m_SpriteHudAirjump = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP]);
|
||||||
m_HudSkin.m_SpriteHudAirjumpEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP_EMPTY]);
|
m_HudSkin.m_SpriteHudAirjumpEmpty = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_HUD_AIRJUMP_EMPTY]);
|
||||||
|
@ -3411,7 +3411,7 @@ void CGameClient::LoadExtrasSkin(const char *pPath, bool AsDir)
|
||||||
else
|
else
|
||||||
LoadExtrasSkin(pPath, true);
|
LoadExtrasSkin(pPath, true);
|
||||||
}
|
}
|
||||||
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRGBA(aPath, ImgInfo))
|
else if(PngLoaded && Graphics()->CheckImageDivisibility(aPath, ImgInfo, g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE].m_pSet->m_Gridy, true) && Graphics()->IsImageFormatRgba(aPath, ImgInfo))
|
||||||
{
|
{
|
||||||
m_ExtrasSkin.m_SpriteParticleSnowflake = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE]);
|
m_ExtrasSkin.m_SpriteParticleSnowflake = Graphics()->LoadSpriteTexture(ImgInfo, &g_pData->m_aSprites[SPRITE_PART_SNOWFLAKE]);
|
||||||
m_ExtrasSkin.m_aSpriteParticles[0] = m_ExtrasSkin.m_SpriteParticleSnowflake;
|
m_ExtrasSkin.m_aSpriteParticles[0] = m_ExtrasSkin.m_SpriteParticleSnowflake;
|
||||||
|
|
Loading…
Reference in a new issue