+ wxImage image;
+
+ wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
+
+ Display *xdisplay = (Display*) M_BMPDATA->m_display;
+ wxASSERT_MSG( xdisplay, wxT("No display") );
+
+#if wxUSE_NANOX
+ //int bpp = DefaultDepth(xdisplay, xscreen);
+ wxGetImageFromDrawable((Pixmap) GetPixmap(), 0, 0, GetWidth(), GetHeight(), image);
+ return image;
+#else
+ // !wxUSE_NANOX
+ int bpp = wxTheApp->GetVisualInfo(M_BMPDATA->m_display)->m_visualDepth;
+ XImage *x_image = NULL;
+ if (GetPixmap())
+ {
+ x_image = XGetImage( xdisplay, (Pixmap) GetPixmap(),
+ 0, 0,
+ GetWidth(), GetHeight(),
+ AllPlanes, ZPixmap );
+ } else
+ if (GetBitmap())
+ {
+ x_image = XGetImage( xdisplay, (Pixmap) GetBitmap(),
+ 0, 0,
+ GetWidth(), GetHeight(),
+ AllPlanes, ZPixmap );
+ } else
+ {
+ wxFAIL_MSG( wxT("Ill-formed bitmap") );
+ }
+
+ 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] = (pixel >> red_shift_right) << red_shift_left;
+ data[pos+1] = (pixel >> green_shift_right) << green_shift_left;
+ data[pos+2] = (pixel >> blue_shift_right) << blue_shift_left;
+ }
+ else if (colors)
+ {
+ data[pos] = colors[pixel].red >> 8;
+ data[pos+1] = colors[pixel].green >> 8;
+ data[pos+2] = 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