From: Unknown (AN) Date: Wed, 9 Dec 1998 16:37:12 +0000 (+0000) Subject: dec 9, 1998 wxImage related changes X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/e7003166c3bf8f8cbca313addc9d07fa7c21f484 dec 9, 1998 wxImage related changes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1141 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index 9d8228fea9..cbb71c3f2e 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -30,6 +30,7 @@ #include "wx/bitmap.h" #include "wx/icon.h" #endif +#include "wx/image.h" #include "wx/msw/private.h" #include "wx/log.h" @@ -76,8 +77,9 @@ wxBitmapRefData::~wxBitmapRefData(void) m_hBitmap = 0 ; if (m_bitmapMask) - delete m_bitmapMask; +// delete m_bitmapMask; // this line cause an exception m_bitmapMask = NULL; + } wxList wxBitmap::sm_handlers; @@ -941,3 +943,230 @@ static long freeDIB(LPBITMAPINFO lpDIBHeader) } +//----------------------------------------------------------------------------- +// also implemented here from wxImage +//----------------------------------------------------------------------------- + +/* +class wxImage : wxGDIObject +{ + wxImage( const wxBitmap &bitmap ); + wxBitmap ConvertToBitmap() const; +} +*/ + + +wxBitmap wxImage::ConvertToBitmap() const +{ + + wxBitmap bitmap; + wxCHECK_MSG( Ok(), bitmap, "invalid image" ); + int width = GetWidth(); + int height = GetHeight(); + bitmap.SetWidth( width ); + bitmap.SetHeight( height ); + bitmap.SetDepth( wxDisplayDepth() ); + + int headersize = sizeof(BITMAPINFOHEADER); + LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); + wxCHECK_MSG( lpDIBh, bitmap, "could not allocate memory for DIB header" ); + +// Fill in the DIB header + lpDIBh->bmiHeader.biSize = headersize; + lpDIBh->bmiHeader.biWidth = width; + lpDIBh->bmiHeader.biHeight = -height; + lpDIBh->bmiHeader.biSizeImage = width * height * 3; + + lpDIBh->bmiHeader.biPlanes = 1; + lpDIBh->bmiHeader.biBitCount = 24; + lpDIBh->bmiHeader.biCompression = BI_RGB; + lpDIBh->bmiHeader.biClrUsed = 0; + +// These seem not needed for our purpose here. +// lpDIBh->bmiHeader.biClrImportant = 0; +// lpDIBh->bmiHeader.biXPelsPerMeter = 0; +// lpDIBh->bmiHeader.biYPelsPerMeter = 0; + + unsigned char *lpBits = (unsigned char *) malloc( width*height*3 ); + if( !lpBits ) + { + wxFAIL_MSG( "could not allocate memory for DIB" ); + free( lpDIBh ); + return bitmap; + } + + unsigned char *data = GetData(); + + unsigned char *ptdata = data, *ptbits = lpBits; + for( int i=0; ibmiHeader), CBM_INIT, lpBits, lpDIBh, DIB_RGB_COLORS ); + +// The above line is equivalent to the following two lines. +// hbitmap = ::CreateCompatibleBitmap( hdc, width, height ); +// ::SetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS); +// or the following lines +// hbitmap = ::CreateCompatibleBitmap( hdc, width, height ); +// HDC memdc = ::CreateCompatibleDC( hdc ); +// ::SelectObject( memdc, hbitmap); +// ::SetDIBitsToDevice( memdc, 0, 0, width, height,\ +// 0, 0, 0, height, (void *)lpBits, lpDIBh, DIB_RGB_COLORS); +// ::SelectObject( memdc, 0 ); +// ::DeleteDC( memdc ); + + bitmap.SetHBITMAP( (WXHBITMAP) hbitmap ); + + if( HasMask() ) + { + unsigned char r = GetMaskRed(); + unsigned char g = GetMaskGreen(); + unsigned char b = GetMaskBlue(); + unsigned char zero = 0, one = 255; + ptdata = data; + ptbits = lpBits; + for( int i=0; ibmiHeader.biSize = headersize; + lpDIBh->bmiHeader.biWidth = width; + lpDIBh->bmiHeader.biHeight = -height; + lpDIBh->bmiHeader.biSizeImage = width * height * 3; + + lpDIBh->bmiHeader.biPlanes = 1; + lpDIBh->bmiHeader.biBitCount = 24; + lpDIBh->bmiHeader.biCompression = BI_RGB; + lpDIBh->bmiHeader.biClrUsed = 0; + +// These seem not needed for our purpose here. +// lpDIBh->bmiHeader.biClrImportant = 0; +// lpDIBh->bmiHeader.biXPelsPerMeter = 0; +// lpDIBh->bmiHeader.biYPelsPerMeter = 0; + + unsigned char *lpBits = (unsigned char *) malloc( width*height*3 ); + if( !lpBits ) + { + wxFAIL_MSG( "could not allocate data for DIB" ); + free( data ); + free( lpDIBh ); + return; + } + + HBITMAP hbitmap; + hbitmap = (HBITMAP) bitmap.GetHBITMAP(); + HDC hdc = ::GetDC(NULL); + ::GetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); + + unsigned char *ptdata = data, *ptbits = lpBits; + for( int i=0; iGetMaskBitmap() ) + { + hbitmap = (HBITMAP) bitmap.GetMask()->GetMaskBitmap(); + 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 ); + unsigned char r=16, g=16, b=16; // background set to RGB(16,16,16) + ptdata = data; + ptbits = lpBits; + for( int i=0; i