}
unsigned width = image->GetWidth();
- unsigned row_padding = (4 - int(width*bpp/8.0) % 4) % 4; // # bytes to pad to dword
- unsigned row_width = int(width * bpp/8.0) + row_padding; // # of bytes per row
+ unsigned row_padding = (4 - ((width * bpp + 7) / 8) % 4) % 4; // # bytes to pad to dword
+ unsigned row_width = (width * bpp + 7) / 8 + row_padding; // # of bytes per row
struct
{
CPPUNIT_TEST( SaveAnimatedGIF );
CPPUNIT_TEST( ReadCorruptedTGA );
CPPUNIT_TEST( GIFComment );
+ CPPUNIT_TEST( DibPadding );
CPPUNIT_TEST_SUITE_END();
void LoadFromSocketStream();
void SaveAnimatedGIF();
void ReadCorruptedTGA();
void GIFComment();
+ void DibPadding();
DECLARE_NO_COPY_CLASS(ImageTestCase)
};
if ( testPalette
&& ( !(type == wxBITMAP_TYPE_BMP
|| type == wxBITMAP_TYPE_GIF
+ || type == wxBITMAP_TYPE_ICO
|| type == wxBITMAP_TYPE_PNG)
|| type == wxBITMAP_TYPE_XPM) )
{
}
}
+void ImageTestCase::DibPadding()
+{
+ /*
+ There used to be an error with calculating the DWORD aligned scan line
+ pitch for a BMP/ICO resulting in buffer overwrites (with at least MSVC9
+ Debug this gave a heap corruption assertion when saving the mask of
+ an ICO). Test for it here.
+ */
+ wxImage image("horse.gif");
+ CPPUNIT_ASSERT( image.IsOk() );
+
+ image = image.Scale(99, 99);
+
+ CompareImage(*wxImage::FindHandler(wxBITMAP_TYPE_ICO),
+ image, wxIMAGE_HAVE_PALETTE);
+}
+
#endif //wxUSE_IMAGE