- ptdata += 3;
- }
- else // masked pixel
- {
- *(ptdata++) = MASK_RED;
- *(ptdata++) = MASK_GREEN;
- *(ptdata++) = MASK_BLUE;
- }
- ptbits += 3;
- }
- ptbits += padding;
- }
-
- image.SetMaskColour( MASK_RED, MASK_GREEN, MASK_BLUE );
- image.SetMask( TRUE );
- }
- else
-#endif
- {
- image.SetMask( FALSE );
- }
-
- // free allocated resources
- ::ReleaseDC(NULL, hdc);
- free(lpDIBh);
-
- // Delete the DIB section
- ::DeleteObject(hBitmapSection);
-
- return image;
-#else
- // the colour used as transparent one in wxImage and the one it is replaced
- // with when it really occurs in the bitmap
- static const int MASK_RED = 1;
- static const int MASK_GREEN = 2;
- static const int MASK_BLUE = 3;
- static const int MASK_BLUE_REPLACEMENT = 2;
-
- wxImage image;
-
- wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
-
- // create an wxImage object
- int width = GetWidth();
- int height = GetHeight();
- image.Create( width, height );
- unsigned char *data = image.GetData();
- if( !data )
- {
- wxFAIL_MSG( wxT("could not allocate data for image") );
- return wxNullImage;
- }
-
- // calc the number of bytes per scanline and padding in the DIB
- int bytePerLine = width*3;
- int sizeDWORD = sizeof( DWORD );
- int lineBoundary = bytePerLine % sizeDWORD;
- int padding = 0;
- if( lineBoundary > 0 )
- {
- padding = sizeDWORD - lineBoundary;
- bytePerLine += padding;
- }
-
- // create a DIB header
- int headersize = sizeof(BITMAPINFOHEADER);
- BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize );
- if( !lpDIBh )
- {
- wxFAIL_MSG( wxT("could not allocate data for DIB header") );
- free( data );
- return wxNullImage;
- }
- // 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( wxT("could not allocate data for DIB") );
- free( data );
- free( lpDIBh );
- return wxNullImage;
- }
-
- // copy data from the device-dependent bitmap to the DIB
- HDC hdc = ::GetDC(NULL);
- HBITMAP hbitmap;
- hbitmap = (HBITMAP) 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( GetMask() && GetMask()->GetMaskBitmap() )
- {
- hbitmap = (HBITMAP) 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 );
- ptdata = data;
- ptbits = lpBits;
- for( i=0; i<height; i++ )
- {
- for( j=0; j<width; j++ )
- {
- // is this pixel transparent?
- if ( *ptbits != 0 )
- {
- if ( (ptdata[0] == MASK_RED) &&
- (ptdata[1] == MASK_GREEN) &&
- (ptdata[2] == MASK_BLUE) )