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:
@@ -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);
|
||||
|
Reference in New Issue
Block a user