- }
- for( i=0; i< padding; i++ ) *(ptbits++) = zero;
- }
- ::StretchDIBits( memdc, 0, origin, width, height,\
- 0, 0, width, height, lpBits, lpDIBh, DIB_RGB_COLORS, SRCCOPY);
- origin += height;
- }
-// create a wxMask object
- wxMask *mask = new wxMask();
- mask->SetMaskBitmap( (WXHBITMAP) hbitmap );
- bitmap.SetMask( mask );
-// It will be deleted when the wxBitmap object is deleted (as of 01/1999)
-/* The following can also be used but is slow to run
- wxColour colour( GetMaskRed(), GetMaskGreen(), GetMaskBlue());
- wxMask *mask = new wxMask( bitmap, colour );
- bitmap.SetMask( mask );
-*/
- }
-
-// free allocated resources
- ::SelectObject( memdc, 0 );
- ::DeleteDC( memdc );
- ::ReleaseDC(NULL, hdc);
- free(lpDIBh);
- free(lpBits);
-
-// check the wxBitmap object
- if( bitmap.GetHBITMAP() )
- bitmap.SetOk( TRUE );
- else
- bitmap.SetOk( FALSE );
-
- return bitmap;
-}
-
-wxImage::wxImage( const wxBitmap &bitmap )
-{
-// check the bitmap
- if( !bitmap.Ok() )
- {
- wxFAIL_MSG( "invalid bitmap" );
- return;
- }
-
-// create an wxImage object
- int width = bitmap.GetWidth();
- int height = bitmap.GetHeight();
- Create( width, height );
- unsigned char *data = GetData();
- if( !data )
- {
- wxFAIL_MSG( "could not allocate data for image" );
- return;
- }
-
-// calc the number of bytes per scanline and padding in the DIB
- int bytePerLine = width*3;
- int sizeDWORD = sizeof( DWORD );
- div_t lineBoundary = div( bytePerLine, sizeDWORD );
- int padding = 0;
- if( lineBoundary.rem > 0 )
- {
- padding = sizeDWORD - lineBoundary.rem;
- bytePerLine += padding;
- }
-
-// create a DIB header
- int headersize = sizeof(BITMAPINFOHEADER);
- LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize );
- if( !lpDIBh )
- {
- wxFAIL_MSG( "could not allocate data for DIB header" );
- free( data );
- return;
- }
-// Fill in the DIB header
- lpDIBh->bmiHeader.biSize = headersize;
- lpDIBh->bmiHeader.biWidth = width;
- lpDIBh->bmiHeader.biHeight = -height;
- lpDIBh->bmiHeader.biSizeImage = bytePerLine * height;
- lpDIBh->bmiHeader.biPlanes = 1;
- lpDIBh->bmiHeader.biBitCount = 24;
- lpDIBh->bmiHeader.biCompression = BI_RGB;
- lpDIBh->bmiHeader.biClrUsed = 0;
-// These seem not really needed for our purpose here.
- lpDIBh->bmiHeader.biClrImportant = 0;
- lpDIBh->bmiHeader.biXPelsPerMeter = 0;
- lpDIBh->bmiHeader.biYPelsPerMeter = 0;
-// memory for DIB data
- unsigned char *lpBits;
- lpBits = (unsigned char *) malloc( lpDIBh->bmiHeader.biSizeImage );
- if( !lpBits )
- {
- wxFAIL_MSG( "could not allocate data for DIB" );
- free( data );
- free( lpDIBh );
- return;
- }
-
-// copy data from the device-dependent bitmap to the DIB
- HDC hdc = ::GetDC(NULL);
- HBITMAP hbitmap;
- hbitmap = (HBITMAP) bitmap.GetHBITMAP();
- ::GetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS );
-
-// copy DIB data into the wxImage object
- int i, j;
- unsigned char *ptdata = data;
- unsigned char *ptbits = lpBits;
- for( i=0; i<height; i++ )
- {
- for( j=0; j<width; j++ )
- {
- *(ptdata++) = *(ptbits+2);
- *(ptdata++) = *(ptbits+1);
- *(ptdata++) = *(ptbits );
- ptbits += 3;
- }
- ptbits += padding;
- }
-
-// similarly, set data according to the possible mask bitmap
- if( bitmap.GetMask() && bitmap.GetMask()->GetMaskBitmap() )
- {
- hbitmap = (HBITMAP) bitmap.GetMask()->GetMaskBitmap();
- // memory DC created, color set, data copied, and memory DC deleted
- HDC memdc = ::CreateCompatibleDC( hdc );
- ::SetTextColor( memdc, RGB( 0, 0, 0 ) );
- ::SetBkColor( memdc, RGB( 255, 255, 255 ) );
- ::GetDIBits( memdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS );
- ::DeleteDC( memdc );
-// background color set to RGB(16,16,16) in consistent with wxGTK
- unsigned char r=16, g=16, b=16;
- ptdata = data;
- ptbits = lpBits;
- for( i=0; i<height; i++ )
- {
- for( j=0; j<width; j++ )
- {
- if( *ptbits != 0 )
- ptdata += 3;
- else
- {
- *(ptdata++) = r;
- *(ptdata++) = g;
- *(ptdata++) = b;
- }
- ptbits += 3;
- }
- ptbits += padding;
- }
- SetMaskColour( r, g, b );
- SetMask( TRUE );
- }
- else
- {
- SetMask( FALSE );
- }
-// free allocated resources
- ::ReleaseDC(NULL, hdc);
- free(lpDIBh);
- free(lpBits);
-}
-
-#endif
-
-#ifdef __WXGTK__
-
-#include "gtk/gtk.h"
-#include "gdk/gdk.h"
-#include "gdk/gdkx.h"
-
-wxBitmap wxImage::ConvertToBitmap() const
-{
- wxBitmap bitmap;
-
- wxCHECK_MSG( Ok(), bitmap, "invalid image" );
-
- int width = GetWidth();
- int height = GetHeight();
-
- bitmap.SetHeight( height );
- bitmap.SetWidth( width );
-
- // Create picture
-
- GdkImage *data_image =
- gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), width, height );
-
- bitmap.SetPixmap( gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, -1 ) );
-
- // Create mask
-
- GdkImage *mask_image = (GdkImage*) NULL;
-
- if (HasMask())
- {
- unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
-
- mask_image = gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height );
-
- wxMask *mask = new wxMask();
- mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
-
- bitmap.SetMask( mask );
- }
-
- // Retrieve depth
-
- GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
- if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
- int bpp = visual->depth;
-
- bitmap.SetDepth( bpp );
-
- if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
- if (bpp < 8) bpp = 8;