Skip to content

Commit

Permalink
Merge pull request ddnet#8658 from Robyt3/Client-Image-Non-Rgba-Leak
Browse files Browse the repository at this point in the history
Fix memory leak of non-RGBA image data, clear all image info
  • Loading branch information
def- authored Jul 27, 2024
2 parents 6911944 + fb832b4 commit 1d92b5a
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 10 deletions.
5 changes: 4 additions & 1 deletion src/engine/client/graphics_threaded.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,9 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRawMove(CImageInfo &Ima
if(Image.m_Format != CImageInfo::FORMAT_RGBA)
{
// Moving not possible, texture needs to be converted
return LoadTextureRaw(Image, Flags, pTexName);
IGraphics::CTextureHandle TextureHandle = LoadTextureRaw(Image, Flags, pTexName);
Image.Free();
return TextureHandle;
}

LoadTextureAddWarning(Image.m_Width, Image.m_Height, Flags, pTexName, m_vWarnings);
Expand All @@ -486,6 +488,7 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRawMove(CImageInfo &Ima
CCommandBuffer::SCommand_Texture_Create Cmd = LoadTextureCreateCommand(TextureHandle.Id(), Image.m_Width, Image.m_Height, Flags);
Cmd.m_pData = Image.m_pData;
Image.m_pData = nullptr;
Image.Free();
AddCmd(Cmd);

return TextureHandle;
Expand Down
1 change: 0 additions & 1 deletion src/game/client/components/menus_browser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2001,7 +2001,6 @@ void CMenus::LoadCommunityIconFinish(const char *pCommunityId, CImageInfo &Info,
pData[i * Step + 2] = v;
}
CommunityIcon.m_GreyTexture = Graphics()->LoadTextureRawMove(Info, 0, pCommunityId);
Info.m_pData = nullptr;

auto ExistingIcon = std::find_if(m_vCommunityIcons.begin(), m_vCommunityIcons.end(), [pCommunityId](const SCommunityIcon &Element) {
return str_comp(Element.m_aCommunityId, pCommunityId) == 0;
Expand Down
16 changes: 9 additions & 7 deletions src/game/editor/editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5140,11 +5140,13 @@ void CEditor::RenderFileDialog()
{
char aBuffer[IO_MAX_PATH_LENGTH];
str_format(aBuffer, sizeof(aBuffer), "%s/%s", m_pFileDialogPath, m_vpFilteredFileList[m_FilesSelectedIndex]->m_aFilename);
if(Graphics()->LoadPng(m_FilePreviewImageInfo, aBuffer, m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType))
CImageInfo PreviewImageInfo;
if(Graphics()->LoadPng(PreviewImageInfo, aBuffer, m_vpFilteredFileList[m_FilesSelectedIndex]->m_StorageType))
{
Graphics()->UnloadTexture(&m_FilePreviewImage);
m_FilePreviewImage = Graphics()->LoadTextureRawMove(m_FilePreviewImageInfo, 0, aBuffer);
m_FilePreviewImageInfo.m_pData = nullptr;
m_FilePreviewImageWidth = PreviewImageInfo.m_Width;
m_FilePreviewImageHeight = PreviewImageInfo.m_Height;
m_FilePreviewImage = Graphics()->LoadTextureRawMove(PreviewImageInfo, 0, aBuffer);
m_FilePreviewState = PREVIEW_LOADED;
}
else
Expand All @@ -5167,11 +5169,11 @@ void CEditor::RenderFileDialog()
Preview.Margin(10.0f, &Preview);
if(m_FilePreviewState == PREVIEW_LOADED)
{
int w = m_FilePreviewImageInfo.m_Width;
int h = m_FilePreviewImageInfo.m_Height;
if(m_FilePreviewImageInfo.m_Width > Preview.w)
int w = m_FilePreviewImageWidth;
int h = m_FilePreviewImageHeight;
if(m_FilePreviewImageWidth > Preview.w)
{
h = m_FilePreviewImageInfo.m_Height * Preview.w / m_FilePreviewImageInfo.m_Width;
h = m_FilePreviewImageHeight * Preview.w / m_FilePreviewImageWidth;
w = Preview.w;
}
if(h > Preview.h)
Expand Down
3 changes: 2 additions & 1 deletion src/game/editor/editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,8 @@ class CEditor : public IEditor
IGraphics::CTextureHandle m_FilePreviewImage;
int m_FilePreviewSound;
EPreviewState m_FilePreviewState;
CImageInfo m_FilePreviewImageInfo;
int m_FilePreviewImageWidth;
int m_FilePreviewImageHeight;
bool m_FileDialogOpening;

int m_ToolbarPreviewSound;
Expand Down

0 comments on commit 1d92b5a

Please sign in to comment.