+
+ wxCHECK_MSG( x_image, wxNullImage, wxT("couldn't create image") );
+
+ image.Create( GetWidth(), GetHeight() );
+ char unsigned *data = image.GetData();
+
+ if (!data)
+ {
+ XDestroyImage( x_image );
+ wxFAIL_MSG( wxT("couldn't create image") );
+ return wxNullImage;
+ }
+
+ XImage *x_image_mask = NULL;
+ if (GetMask())
+ {
+ x_image_mask = XGetImage( xdisplay, (Pixmap) GetMask()->GetBitmap(),
+ 0, 0,
+ GetWidth(), GetHeight(),
+ AllPlanes, ZPixmap );
+
+ image.SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable
+ }
+
+ int red_shift_right = 0;
+ int green_shift_right = 0;
+ int blue_shift_right = 0;
+ int red_shift_left = 0;
+ int green_shift_left = 0;
+ int blue_shift_left = 0;
+ bool use_shift = false;
+
+ if (GetPixmap())
+ {
+ wxXVisualInfo* vi = wxTheApp->GetVisualInfo(M_BMPDATA->m_display);
+
+ red_shift_right = vi->m_visualRedShift;
+ red_shift_left = 8 - vi->m_visualRedPrec;
+ green_shift_right = vi->m_visualGreenShift;
+ green_shift_left = 8 - vi->m_visualGreenPrec;
+ blue_shift_right = vi->m_visualBlueShift;
+ blue_shift_left = 8 - vi->m_visualBluePrec;
+
+ use_shift = (vi->m_visualType == GrayScale) ||
+ (vi->m_visualType != PseudoColor);
+ }
+
+ if (GetBitmap())
+ {
+ bpp = 1;
+ }
+
+ XColor *colors = (XColor*)wxTheApp->
+ GetVisualInfo(M_BMPDATA->m_display)->m_visualColormap;
+
+ int width = GetWidth();
+ int height = GetHeight();
+ long pos = 0;
+ for (int j = 0; j < height; j++)
+ {
+ for (int i = 0; i < width; i++)
+ {
+ unsigned long pixel = XGetPixel( x_image, i, j );
+ if (bpp == 1)
+ {
+ if (pixel == 0)
+ {
+ data[pos] = 0;
+ data[pos+1] = 0;
+ data[pos+2] = 0;
+ }
+ else
+ {
+ data[pos] = 255;
+ data[pos+1] = 255;
+ data[pos+2] = 255;
+ }
+ }
+ else if (use_shift)
+ {
+ data[pos] = (unsigned char)((pixel >> red_shift_right) << red_shift_left);
+ data[pos+1] = (unsigned char)((pixel >> green_shift_right) << green_shift_left);
+ data[pos+2] = (unsigned char)((pixel >> blue_shift_right) << blue_shift_left);
+ }
+ else if (colors)
+ {
+ data[pos] = (unsigned char)(colors[pixel].red >> 8);
+ data[pos+1] = (unsigned char)(colors[pixel].green >> 8);
+ data[pos+2] = (unsigned char)(colors[pixel].blue >> 8);
+ }
+ else
+ {
+ wxFAIL_MSG( wxT("Image conversion failed. Unknown visual type.") );
+ }
+
+ if (x_image_mask)
+ {
+ int mask_pixel = XGetPixel( x_image_mask, i, j );
+ if (mask_pixel == 0)
+ {
+ data[pos] = 16;
+ data[pos+1] = 16;
+ data[pos+2] = 16;
+ }
+ }
+
+ pos += 3;
+ }
+ }
+
+ XDestroyImage( x_image );
+ if (x_image_mask) XDestroyImage( x_image_mask );
+ return image;
+#endif
+ // wxUSE_NANOX
+}
+
+wxBitmap::wxBitmap( const wxString &filename, wxBitmapType type )
+{
+ LoadFile( filename, type );
+}
+
+wxBitmap::wxBitmap( const char bits[], int width, int height, int depth )
+{
+ m_refData = new wxBitmapRefData;
+
+ (void) Create(bits, wxBITMAP_TYPE_XBM_DATA, width, height, depth);
+}
+
+wxBitmap::~wxBitmap()
+{
+}
+
+bool wxBitmap::operator == ( const wxBitmap& bmp ) const
+{
+ return m_refData == bmp.m_refData;
+}
+
+bool wxBitmap::operator != ( const wxBitmap& bmp ) const
+{
+ return m_refData != bmp.m_refData;