- wxFAIL_MSG( wxT("could not create a DIB section") );
- return wxNullImage;
- }
-
- // Copy the image from the DDB to the DIBSection
- // Need to copy the supplied bitmap onto the newly created DIBsection
- HDC hMemDC = CreateCompatibleDC(hdc);
- HDC hCopyDC = CreateCompatibleDC(hdc);
-
- if (! hMemDC || ! hCopyDC)
- {
- wxFAIL_MSG( wxT("unable to create compatible DCs") );
- return wxNullImage;
- }
-
-#if 0
- if (m_hPal)
- {
- SelectPalette(hMemDC, m_hPal, FALSE); RealizePalette(hMemDC);
- SelectPalette(hCopyDC, m_hPal, FALSE); RealizePalette(hCopyDC);
- }
-#endif
-
- HBITMAP hOldMemBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);
- HBITMAP hOldCopyBitmap = (HBITMAP) SelectObject(hCopyDC, hBitmapSection);
-
- BitBlt(hCopyDC, 0, 0, GetWidth(), GetHeight(), hMemDC, 0, 0, SRCCOPY);
-
- SelectObject(hMemDC, hOldMemBitmap);
- SelectObject(hCopyDC, hOldCopyBitmap);
- DeleteDC(hMemDC);
- DeleteDC(hCopyDC);
-
-#if 0
- if (m_hPal)
- {
- HGDIOBJ hObj = ::GetStockObject(DEFAULT_PALETTE);
- SelectObject(hMemDC, hObj);
- SelectObject(hCopyDC, hObj);
- }
-#endif
-
- ReleaseDC(NULL, hdc);
-
- // copy DIB data into the wxImage object
- int i, j;
- unsigned char *ptdata = data;
- unsigned char *ptbits = (unsigned char*) 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;
- }
-
- // TODO
-#if 0
- // 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) )
- {
- // we have to fudge the colour a bit to prevent this
- // pixel from appearing transparent
- ptdata[2] = MASK_BLUE_REPLACEMENT;
- }
- 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++ )