Fix bug 77333

This commit is contained in:
Oleg Korshul
2025-10-09 17:03:01 +03:00
parent c5a047f83a
commit 8795539c20
2 changed files with 57 additions and 10 deletions

View File

@ -195,7 +195,10 @@ bool CPictFile::DecodeData()
bool is_pix_data = false;
if (!m_oImgData.m_pPixelData)
{
m_oImgData.m_pPixelData = (BYTE*) malloc(m_oImgData.m_nWidth * m_oImgData.m_nHeight * 4);
memset(m_oImgData.m_pPixelData, 255, m_oImgData.m_nWidth * m_oImgData.m_nHeight * 4);
}
for (int code = 0; feof(m_pFile) == 0; )
{
@ -231,9 +234,8 @@ bool CPictFile::DecodeData()
return false;
if (((frame.GetLeft() & 0x8000) != 0) || ((frame.GetTop() & 0x8000) != 0))
break;
m_oImgData.m_nHeight = frame.Height;
m_oImgData.m_nWidth = frame.Width;
m_oImgData.m_pPixelData = (BYTE*)realloc(m_oImgData.m_pPixelData, m_oImgData.m_nHeight * m_oImgData.m_nWidth * 4);
m_oImgData.Realloc(frame.Width, frame.Height);
break;
}
case 0x11:
@ -924,9 +926,7 @@ bool CPictFile::DecodeData()
{
if (m_oImgData.m_nHeight <= tile_image.m_nHeight && m_oImgData.m_nWidth <= tile_image.m_nWidth)
{
m_oImgData.m_nHeight = tile_image.m_nHeight;
m_oImgData.m_nWidth = tile_image.m_nWidth;
m_oImgData.m_pPixelData = (BYTE*)realloc(m_oImgData.m_pPixelData, m_oImgData.m_nHeight * m_oImgData.m_nWidth * 4);
m_oImgData.Realloc(tile_image.m_nWidth, tile_image.m_nHeight, false);
memcpy(m_oImgData.m_pPixelData, tile_image.m_pPixelData, m_oImgData.m_nHeight * m_oImgData.m_nWidth * 4);
}
else
@ -1091,7 +1091,10 @@ void CPictFile::SetImageAlpha(Image* img, const BYTE alpha)
bool status = true;
if (!img->m_pPixelData)
{
img->m_pPixelData = (BYTE*)malloc(4 * img->m_nHeight * img->m_nWidth);
memset(img->m_pPixelData, 255, 4 * img->m_nHeight * img->m_nWidth);
}
img->m_eAlphaTrait = BlendPixelTrait;
img->m_pChannelMap[AlphaPixelChannel].traits = UpdatePixelTrait;

View File

@ -157,12 +157,56 @@ struct Image
if (other.m_pColormap)
{
m_pColormap = new PixelInfo[m_nColors + 1];
memcpy(m_pColormap, other.m_pColormap, m_nColors + 1);
memcpy(m_pColormap, other.m_pColormap, (m_nColors + 1) * sizeof(PixelInfo));
}
memcpy(m_pChannelMap, other.m_pChannelMap, 65);
memcpy(m_pChannelMap, other.m_pChannelMap, 65 * sizeof(PixelChannelMap));
return *this;
}
void Realloc(const size_t& w, const size_t& h, const bool& isCopy = true)
{
size_t oldSize = 4 * m_nWidth * m_nHeight;
size_t newSize = 4 * w * h;
m_nWidth = w;
m_nHeight = h;
if (0 == newSize)
{
if (m_pPixelData)
free(m_pPixelData);
m_pPixelData = nullptr;
return;
}
if (oldSize == newSize)
return;
BYTE* oldPixels = m_pPixelData;
if (oldSize > newSize || !m_pPixelData)
{
m_pPixelData = (BYTE*)malloc(newSize);
if (isCopy && oldPixels)
memcpy(m_pPixelData, oldPixels, newSize);
if (oldPixels)
free(oldPixels);
}
else
{
m_pPixelData = (BYTE*)realloc(oldPixels, newSize);
if (NULL == m_pPixelData)
{
m_pPixelData = (BYTE*)malloc(newSize);
if (isCopy && oldPixels)
memcpy(m_pPixelData, oldPixels, oldSize);
if (oldPixels)
free(oldPixels);
}
}
}
};
class CPictFile
@ -221,8 +265,8 @@ private:
std::wstring m_wsFontName{};
Aggplus::Point m_oPenPoint{};
Aggplus::Point m_oTextPoint{};
Aggplus::Point m_oPenPoint{0, 0};
Aggplus::Point m_oTextPoint{0, 0};
Aggplus::Rect m_oLastRect{};
Aggplus::Rect m_oLastRoundRect{};