dec 9, 1998 wxImage related changes
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1141 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
db1b496176
commit
e7003166c3
@ -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; i<width*height; i++ )
|
||||
{
|
||||
*(ptbits++) = *(ptdata+2);
|
||||
*(ptbits++) = *(ptdata+1);
|
||||
*(ptbits++) = *(ptdata );
|
||||
ptdata += 3;
|
||||
}
|
||||
|
||||
HDC hdc = ::GetDC(NULL);
|
||||
|
||||
HBITMAP hbitmap;
|
||||
hbitmap = CreateDIBitmap( hdc, &(lpDIBh->bmiHeader), 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; i<width*height; i++ )
|
||||
{
|
||||
if( (*(ptdata++)!=r) | (*(ptdata++)!=g) | (*(ptdata++)!=b) )
|
||||
{
|
||||
*(ptbits++) = zero;
|
||||
*(ptbits++) = zero;
|
||||
*(ptbits++) = zero;
|
||||
}
|
||||
else
|
||||
{
|
||||
*(ptbits++) = one;
|
||||
*(ptbits++) = one;
|
||||
*(ptbits++) = one;
|
||||
}
|
||||
}
|
||||
hbitmap = ::CreateBitmap( (WORD)width, (WORD)height, 1, 1, NULL );
|
||||
::SetDIBits( hdc, hbitmap, 0, (WORD)height, lpBits, lpDIBh, DIB_RGB_COLORS);
|
||||
wxMask bmpmask;
|
||||
bmpmask.SetMaskBitmap( (WXHBITMAP) hbitmap );
|
||||
bitmap.SetMask( &bmpmask );
|
||||
|
||||
/* The following can also be used but is slow to run
|
||||
wxColour colour( GetMaskRed(), GetMaskGreen(), GetMaskBlue());
|
||||
wxMask bmpmask( bitmap, colour );
|
||||
bitmap.SetMask( &bmpmask );
|
||||
*/
|
||||
}
|
||||
|
||||
::ReleaseDC(NULL, hdc);
|
||||
freeDIB(lpDIBh);
|
||||
free(lpBits);
|
||||
|
||||
if( bitmap.GetHBITMAP() )
|
||||
bitmap.SetOk( TRUE );
|
||||
else
|
||||
bitmap.SetOk( FALSE );
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
|
||||
wxImage::wxImage( const wxBitmap &bitmap )
|
||||
{
|
||||
if( !bitmap.Ok() )
|
||||
{
|
||||
wxFAIL_MSG( "invalid bitmap" );
|
||||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 = 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; i<width*height; i++ )
|
||||
{
|
||||
*(ptdata++) = *(ptbits+2);
|
||||
*(ptdata++) = *(ptbits+1);
|
||||
*(ptdata++) = *(ptbits );
|
||||
ptbits += 3;
|
||||
}
|
||||
|
||||
if( bitmap.GetMask() && bitmap.GetMask()->GetMaskBitmap() )
|
||||
{
|
||||
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<width*height; i++ )
|
||||
{
|
||||
if( *ptbits != 0 )
|
||||
{
|
||||
*(ptdata++) = r;
|
||||
*(ptdata++) = g;
|
||||
*(ptdata++) = b;
|
||||
}
|
||||
ptbits += 3;
|
||||
}
|
||||
SetMaskColour( r, g, b );
|
||||
}
|
||||
|
||||
::ReleaseDC(NULL, hdc);
|
||||
freeDIB(lpDIBh);
|
||||
free(lpBits);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user