Fix wxBitmap ctor from XBM in wxGTK

Width and height were exchanged in the loops, so the conversion code didn't
work correctly and overflowed the pixel buffer (due to extra padding in the
row stride) for non-square bitmaps. It also resulted in a completely wrong
bitmap appearance, but somehow this managed to go unnoticed, unlike the memory
errors.

Closes #17633.
This commit is contained in:
Vadim Zeitlin 2016-08-21 14:46:16 +02:00
parent 3fe7be374d
commit f9740e8180
2 changed files with 8 additions and 6 deletions

View File

@ -108,6 +108,7 @@ wxGTK:
- Implement support for icon locations in wxMimeTypesManager (Hanmac).
- Cosmetic fix for empty wxCheckBoxes display (Chuddah).
- Fix crashes in wxFileSystemWatcher implementation (David Hart).
- Fix wxBitmap ctor from XBM for non-square bitmaps.
wxMSW:

View File

@ -431,17 +431,18 @@ wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
const char* src = bits;
guchar* dst = gdk_pixbuf_get_pixels(pixbuf);
const int stride_src = (width + 7) / 8;
const int rowinc_dst = gdk_pixbuf_get_rowstride(pixbuf) - 3 * width;
for (int j = 0; j < width; j++, src += stride_src, dst += rowinc_dst)
const int stride_dst = gdk_pixbuf_get_rowstride(pixbuf);
for (int j = 0; j < height; j++, src += stride_src, dst += stride_dst)
{
for (int i = 0; i < height; i++)
guchar* d = dst;
for (int i = 0; i < width; i++)
{
guchar c = 0xff;
if (src[i >> 3] & (1 << (i & 7)))
c = 0;
*dst++ = c;
*dst++ = c;
*dst++ = c;
*d++ = c;
*d++ = c;
*d++ = c;
}
}
#else