mac updates and msw bitmapdrawing on printer

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5371 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2000-01-13 11:07:58 +00:00
parent d47ebd1e05
commit 8208e181cb
42 changed files with 863 additions and 248 deletions

View File

@@ -600,19 +600,63 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
if (!bmp.Ok())
return;
bool needsPixelCopy = false ;
bool isPrinter = false ;
if (IsKindOf(CLASSINFO(wxPrinterDC)) )
{
isPrinter = true ;
if ( ::GetDeviceCaps((HDC) m_hDC, RASTERCAPS) & RC_STRETCHDIB )
{
}
else
{
needsPixelCopy = true ;
}
}
// If we're not drawing transparently, and not drawing to a printer,
// optimize this function to use Windows functions.
if (!useMask && !IsKindOf(CLASSINFO(wxPrinterDC)))
if (!useMask && !needsPixelCopy)
{
HDC cdc = GetHdc();
HDC memdc = ::CreateCompatibleDC( cdc );
HBITMAP hbitmap = (HBITMAP) bmp.GetHBITMAP( );
if ( isPrinter )
{
BITMAPINFO *info = (BITMAPINFO *) malloc( sizeof( BITMAPINFOHEADER ) + 256 * sizeof(RGBQUAD ) ) ;
int iBitsSize = ((bmp.GetWidth() + 3 ) & ~3 ) * bmp.GetHeight() ;
void* bits = malloc( iBitsSize ) ;
memset( info , 0 , sizeof( BITMAPINFOHEADER ) ) ;
info->bmiHeader.biSize = sizeof( BITMAPINFOHEADER ) ;
info->bmiHeader.biWidth = bmp.GetWidth() ;
info->bmiHeader.biHeight = bmp.GetHeight() ;
info->bmiHeader.biPlanes = 1 ;
info->bmiHeader.biBitCount = 8 ;
info->bmiHeader.biCompression = BI_RGB ;
HDC display = GetDC( NULL ) ;
if ( GetDIBits( display , (HBITMAP) bmp.GetHBITMAP( ) , 0 , bmp.GetHeight() , bits , info , DIB_RGB_COLORS ) )
{
StretchDIBits( (HDC) m_hDC,
x, y, bmp.GetWidth(), bmp.GetHeight() ,
0 , 0 ,bmp.GetWidth(), bmp.GetHeight() ,
bits , info , DIB_RGB_COLORS , SRCCOPY ) ;
}
ReleaseDC( NULL , display ) ;
free ( bits ) ;
free( info ) ;
}
else
{
HDC cdc = GetHdc();
HDC memdc = ::CreateCompatibleDC( cdc );
HBITMAP hbitmap = (HBITMAP) bmp.GetHBITMAP( );
wxASSERT_MSG( hbitmap, wxT("bitmap is ok but HBITMAP is NULL?") );
wxASSERT_MSG( hbitmap, wxT("bitmap is ok but HBITMAP is NULL?") );
::SelectObject( memdc, hbitmap );
::BitBlt( cdc, x, y, bmp.GetWidth(), bmp.GetHeight(), memdc, 0, 0, SRCCOPY);
::DeleteDC( memdc );
::SelectObject( memdc, hbitmap );
::BitBlt( cdc, x, y, bmp.GetWidth(), bmp.GetHeight(), memdc, 0, 0, SRCCOPY);
::DeleteDC( memdc );
}
}
else
{