+ if (format == wxBMP_24BPP) // 3 bytes per pixel red,green,blue
+ {
+ for (x = 0; x < width; x++)
+ {
+ pixel = 3*(y*width + x);
+
+ buffer[3*x ] = data[pixel+2];
+ buffer[3*x + 1] = data[pixel+1];
+ buffer[3*x + 2] = data[pixel];
+ }
+ }
+ else if ((format == wxBMP_8BPP) || // 1 byte per pixel in color
+ (format == wxBMP_8BPP_PALETTE))
+ {
+ for (x = 0; x < width; x++)
+ {
+ pixel = 3*(y*width + x);
+#if wxUSE_PALETTE
+ buffer[x] = palette->GetPixel( data[pixel],
+ data[pixel+1],
+ data[pixel+2] );
+#else
+ // FIXME: what should this be? use some std palette maybe?
+ buffer[x] = 0;
+#endif // wxUSE_PALETTE
+ }
+ }
+ else if (format == wxBMP_8BPP_GREY) // 1 byte per pix, rgb ave to grey
+ {
+ for (x = 0; x < width; x++)
+ {
+ pixel = 3*(y*width + x);
+ buffer[x] = (wxUint8)(.299*data[pixel] +
+ .587*data[pixel+1] +
+ .114*data[pixel+2]);
+ }
+ }
+ else if (format == wxBMP_8BPP_RED) // 1 byte per pixel, red as greys
+ {
+ for (x = 0; x < width; x++)
+ {
+ buffer[x] = (wxUint8)data[3*(y*width + x)];
+ }
+ }
+ else if (format == wxBMP_4BPP) // 4 bpp in color
+ {
+ for (x = 0; x < width; x+=2)
+ {
+ pixel = 3*(y*width + x);
+
+ // fill buffer, ignore if > width
+#if wxUSE_PALETTE
+ buffer[x/2] =
+ ((wxUint8)palette->GetPixel(data[pixel],
+ data[pixel+1],
+ data[pixel+2]) << 4) |
+ (((x+1) > width)
+ ? 0
+ : ((wxUint8)palette->GetPixel(data[pixel+3],
+ data[pixel+4],
+ data[pixel+5]) ));
+#else
+ // FIXME: what should this be? use some std palette maybe?
+ buffer[x/2] = 0;
+#endif // wxUSE_PALETTE
+ }
+ }
+ else if (format == wxBMP_1BPP) // 1 bpp in "color"
+ {
+ for (x = 0; x < width; x+=8)
+ {
+ pixel = 3*(y*width + x);
+
+#if wxUSE_PALETTE
+ buffer[x/8] = ((wxUint8)palette->GetPixel(data[pixel], data[pixel+1], data[pixel+2]) << 7) |
+ (((x+1) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+3], data[pixel+4], data[pixel+5]) << 6)) |
+ (((x+2) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+6], data[pixel+7], data[pixel+8]) << 5)) |
+ (((x+3) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+9], data[pixel+10], data[pixel+11]) << 4)) |
+ (((x+4) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+12], data[pixel+13], data[pixel+14]) << 3)) |
+ (((x+5) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+15], data[pixel+16], data[pixel+17]) << 2)) |
+ (((x+6) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+18], data[pixel+19], data[pixel+20]) << 1)) |
+ (((x+7) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+21], data[pixel+22], data[pixel+23]) ));
+#else
+ // FIXME: what should this be? use some std palette maybe?
+ buffer[x/8] = 0;
+#endif // wxUSE_PALETTE
+ }
+ }
+ else if (format == wxBMP_1BPP_BW) // 1 bpp B&W colormap from red color ONLY
+ {
+ for (x = 0; x < width; x+=8)
+ {
+ pixel = 3*(y*width + x);
+
+ buffer[x/8] =
+ (((wxUint8)(data[pixel] /128.)) << 7) |
+ ( ((x+1) > width) ? 0 : (((wxUint8)(data[pixel+3] /128.)) << 6)) |
+ ( ((x+2) > width) ? 0 : (((wxUint8)(data[pixel+6] /128.)) << 5)) |
+ ( ((x+3) > width) ? 0 : (((wxUint8)(data[pixel+9] /128.)) << 4)) |
+ ( ((x+4) > width) ? 0 : (((wxUint8)(data[pixel+12]/128.)) << 3)) |
+ ( ((x+5) > width) ? 0 : (((wxUint8)(data[pixel+15]/128.)) << 2)) |
+ ( ((x+6) > width) ? 0 : (((wxUint8)(data[pixel+18]/128.)) << 1)) |
+ ( ((x+7) > width) ? 0 : (((wxUint8)(data[pixel+21]/128.)) ));
+ }
+ }
+
+ if (!stream.Write(buffer, row_width))
+ {
+ if (verbose)
+ wxLogError(_("BMP: Couldn't write data."));
+ delete[] buffer;
+#if wxUSE_PALETTE
+ delete palette;
+#endif // wxUSE_PALETTE
+ delete q_image;
+ return FALSE;
+ }