support for using DIBs for wxBitmap implementation (patch 649866)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18524 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-01-02 23:28:56 +00:00
parent f178ab7e82
commit 0becd47010
5 changed files with 326 additions and 105 deletions

View File

@@ -431,45 +431,78 @@ void wxPrinterDC::DoDrawBitmap(const wxBitmap &bmp,
if ( ::GetDeviceCaps(GetHdc(), RASTERCAPS) & RC_STRETCHDIB )
{
BITMAPINFO *info = (BITMAPINFO *) malloc( sizeof( BITMAPINFOHEADER ) + 256 * sizeof(RGBQUAD ) );
memset( info, 0, sizeof( BITMAPINFOHEADER ) );
#if wxUSE_DRAWBITMAP_24BITS
int iBitsSize = (((width * 3) + 3 ) & ~3 ) * height;
#else
int iBitsSize = ((width + 3 ) & ~3 ) * height ;
#endif
void* bits = malloc( iBitsSize );
info->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
info->bmiHeader.biWidth = width;
info->bmiHeader.biHeight = height;
info->bmiHeader.biPlanes = 1;
#if wxUSE_DRAWBITMAP_24BITS
info->bmiHeader.biBitCount = 24;
#else
info->bmiHeader.biBitCount = 8;
#endif
info->bmiHeader.biCompression = BI_RGB;
ScreenHDC display;
if ( GetDIBits(display, GetHbitmapOf(bmp), 0,
bmp.GetHeight(), bits, info,
DIB_RGB_COLORS) )
#if wxUSE_DIB_FOR_BITMAP
if(bmp.GetHFileMap()) // we already have a dib
{
if ( ::StretchDIBits(GetHdc(), x, y,
width, height,
0 , 0, width, height,
bits, info,
DIB_RGB_COLORS, SRCCOPY) == GDI_ERROR )
DIBSECTION dib;
if ( ::GetObject(GetHbitmapOf(bmp),
sizeof(dib),
&dib) == sizeof(dib) )
{
wxLogLastError(wxT("StretchDIBits"));
if ( ::StretchDIBits
(
GetHdc(),
x, y,
width, height,
0, 0,
width, height,
dib.dsBm.bmBits,
(LPBITMAPINFO)&dib.dsBmih,
DIB_RGB_COLORS,
SRCCOPY
) == GDI_ERROR )
{
wxLogLastError(wxT("StretchDIBits"));
}
}
else
{
wxLogLastError(wxT("GetObject"));
}
}
else
#endif // wxUSE_DIB_FOR_BITMAP
{
BITMAPINFO *info = (BITMAPINFO *) malloc( sizeof( BITMAPINFOHEADER ) + 256 * sizeof(RGBQUAD ) );
memset( info, 0, sizeof( BITMAPINFOHEADER ) );
free(bits);
free(info);
#if wxUSE_DRAWBITMAP_24BITS
int iBitsSize = (((width * 3) + 3 ) & ~3 ) * height;
#else
int iBitsSize = ((width + 3 ) & ~3 ) * height ;
#endif
void* bits = malloc( iBitsSize );
info->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
info->bmiHeader.biWidth = width;
info->bmiHeader.biHeight = height;
info->bmiHeader.biPlanes = 1;
#if wxUSE_DRAWBITMAP_24BITS
info->bmiHeader.biBitCount = 24;
#else
info->bmiHeader.biBitCount = 8;
#endif
info->bmiHeader.biCompression = BI_RGB;
ScreenHDC display;
if ( GetDIBits(display, GetHbitmapOf(bmp), 0,
bmp.GetHeight(), bits, info,
DIB_RGB_COLORS) )
{
if ( ::StretchDIBits(GetHdc(), x, y,
width, height,
0 , 0, width, height,
bits, info,
DIB_RGB_COLORS, SRCCOPY) == GDI_ERROR )
{
wxLogLastError(wxT("StretchDIBits"));
}
}
free(bits);
free(info);
}
}
else // no support for StretchDIBits()
{
@@ -493,9 +526,8 @@ bool wxPrinterDC::DoBlit(wxCoord xdest, wxCoord ydest,
if ( useMask )
{
// If we are printing source colours are screen colours
// not printer colours and so we need copy the bitmap
// pixel by pixel.
// If we are printing source colours are screen colours not printer
// colours and so we need copy the bitmap pixel by pixel.
RECT rect;
HDC dc_src = GetHdcOf(*source);
HDC dc_mask = ::CreateCompatibleDC(dc_src);
@@ -528,58 +560,97 @@ bool wxPrinterDC::DoBlit(wxCoord xdest, wxCoord ydest,
wxBitmap& bmp = source->GetSelectedBitmap();
int width = bmp.GetWidth(),
height = bmp.GetHeight();
BITMAPINFO *info = (BITMAPINFO *) malloc( sizeof( BITMAPINFOHEADER ) + 256 * sizeof(RGBQUAD ) );
int iBitsSize = ((width + 3 ) & ~3 ) * height;
void* bits = malloc( iBitsSize );
memset( info , 0 , sizeof( BITMAPINFOHEADER ) );
info->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
info->bmiHeader.biWidth = width;
info->bmiHeader.biHeight = height;
info->bmiHeader.biPlanes = 1;
info->bmiHeader.biBitCount = 8;
info->bmiHeader.biCompression = BI_RGB;
ScreenHDC display;
if ( !::GetDIBits(display, GetHbitmapOf(bmp), 0,
height, bits, info, DIB_RGB_COLORS) )
#if wxUSE_DIB_FOR_BITMAP
if(bmp.GetHFileMap()) // we already have a dib
{
wxLogLastError(wxT("GetDIBits"));
success = FALSE;
}
if ( success )
{
success = ::StretchDIBits(GetHdc(), xdest, ydest,
width, height,
xsrc, ysrc,
width, height,
bits, info ,
DIB_RGB_COLORS,
SRCCOPY) != GDI_ERROR;
if ( !success )
DIBSECTION dib;
if( ::GetObject(GetHbitmapOf(bmp),
sizeof(dib),
&dib) == sizeof(dib) )
{
wxLogLastError(wxT("StretchDIBits"));
if ( ::StretchDIBits
(
GetHdc(),
xdest, ydest,
width, height,
xsrc, ysrc,
width, height,
dib.dsBm.bmBits,
(LPBITMAPINFO)&dib.dsBmih,
DIB_RGB_COLORS,
SRCCOPY
) == GDI_ERROR )
{
wxLogLastError(wxT("StretchDIBits"));
}
}
else
{
wxLogLastError(wxT("GetObject"));
}
}
else
#endif // wxUSE_DIB_FOR_BITMAP
{
BITMAPINFO *info = (BITMAPINFO *) malloc( sizeof( BITMAPINFOHEADER ) + 256 * sizeof(RGBQUAD ) );
#if wxUSE_DRAWBITMAP_24BITS
int iBitsSize = (((width * 3) + 3 ) & ~3 ) * height;
#else
int iBitsSize = ((width + 3 ) & ~3 ) * height ;
#endif
free(bits);
free(info);
void* bits = malloc( iBitsSize );
memset( info , 0 , sizeof( BITMAPINFOHEADER ) );
info->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
info->bmiHeader.biWidth = width;
info->bmiHeader.biHeight = height;
info->bmiHeader.biPlanes = 1;
#if wxUSE_DRAWBITMAP_24BITS
info->bmiHeader.biBitCount = 24;
#else
info->bmiHeader.biBitCount = 8;
#endif
info->bmiHeader.biCompression = BI_RGB;
ScreenHDC display;
if ( !::GetDIBits(display, GetHbitmapOf(bmp), 0,
height, bits, info, DIB_RGB_COLORS) )
{
wxLogLastError(wxT("GetDIBits"));
success = FALSE;
}
if ( success )
{
success = ::StretchDIBits(GetHdc(), xdest, ydest,
width, height,
xsrc, ysrc,
width, height,
bits, info ,
DIB_RGB_COLORS,
SRCCOPY) != GDI_ERROR;
if ( !success )
{
wxLogLastError(wxT("StretchDIBits"));
}
}
free(bits);
free(info);
}
}
else // no support for StretchDIBits
{
// as we are printing, source colours are screen colours not printer
// colours and so we need copy the bitmap pixel by pixel.
// as we are printing, source colours are screen colours not
// printer colours and so we need copy the bitmap pixel by pixel.
HDC dc_src = GetHdcOf(*source);
RECT rect;
for (int y = 0; y < height; y++)
{
// This is Stefan Csomor's optimisation, where identical adjacent
// pixels are drawn together.
// optimization: draw identical adjacent pixels together.
for (int x = 0; x < width; x++)
{
COLORREF col = ::GetPixel(dc_src, x, y);