X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e11f2e1645e5322b8f44112733bd663927cf7783..2ac013b1a5d8210ab0c53f7eb9687399b9312162:/src/msw/dcprint.cpp diff --git a/src/msw/dcprint.cpp b/src/msw/dcprint.cpp index ed38d9fe64..9ae94b59e1 100644 --- a/src/msw/dcprint.cpp +++ b/src/msw/dcprint.cpp @@ -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_DIB_FOR_BITMAP + if(bmp.GetHFileMap()) // we already have a dib + { + DIBSECTION dib; + if ( ::GetObject(GetHbitmapOf(bmp), + sizeof(dib), + &dib) == sizeof(dib) ) + { + 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 ) ); #if wxUSE_DRAWBITMAP_24BITS - int iBitsSize = ((width + 3 ) & ~3 ) * height * 3; + int iBitsSize = (((width * 3) + 3 ) & ~3 ) * height; #else - int iBitsSize = ((width + 3 ) & ~3 ) * height ; + int iBitsSize = ((width + 3 ) & ~3 ) * height ; #endif - void* bits = malloc( iBitsSize ); + void* bits = malloc( iBitsSize ); - info->bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); - info->bmiHeader.biWidth = width; - info->bmiHeader.biHeight = height; - info->bmiHeader.biPlanes = 1; + 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; + 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 ) + 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) ) { - wxLogLastError(wxT("StretchDIBits")); + 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); + 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(); +#if wxUSE_DIB_FOR_BITMAP + if(bmp.GetHFileMap()) // we already have a dib + { + DIBSECTION dib; + if( ::GetObject(GetHbitmapOf(bmp), + sizeof(dib), + &dib) == sizeof(dib) ) + { + 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 - BITMAPINFO *info = (BITMAPINFO *) malloc( sizeof( BITMAPINFOHEADER ) + 256 * sizeof(RGBQUAD ) ); - int iBitsSize = ((width + 3 ) & ~3 ) * height; - - void* bits = malloc( iBitsSize ); + void* bits = malloc( iBitsSize ); - memset( info , 0 , sizeof( BITMAPINFOHEADER ) ); + 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; + 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")); + ScreenHDC display; + if ( !::GetDIBits(display, GetHbitmapOf(bmp), 0, + height, bits, info, DIB_RGB_COLORS) ) + { + wxLogLastError(wxT("GetDIBits")); - success = FALSE; - } + 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 ) + if ( success ) { - wxLogLastError(wxT("StretchDIBits")); + 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); + 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);