X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/161f4f7380e945b0769ad5f7122df55b8777396a..5e3841bf8069fbcc2b1da3ef36af4f569c604265:/src/msw/dcprint.cpp diff --git a/src/msw/dcprint.cpp b/src/msw/dcprint.cpp index 6394049218..adc0e85930 100644 --- a/src/msw/dcprint.cpp +++ b/src/msw/dcprint.cpp @@ -41,7 +41,7 @@ #include "wx/dcprint.h" #include "math.h" -#if wxUSE_COMMON_DIALOGS || defined(__WXWINE__) +#if wxUSE_COMMON_DIALOGS #include #endif @@ -194,7 +194,7 @@ bool wxPrinterDC::StartDoc(const wxString& message) if (ret <= 0) { DWORD lastError = GetLastError(); - wxLogDebug(wxT("wxDC::StartDoc failed with error: %d\n"), lastError); + wxLogDebug(wxT("wxDC::StartDoc failed with error: %ld\n"), lastError); } #endif @@ -416,6 +416,10 @@ WXHDC WXDLLEXPORT wxGetPrinterDC(const wxPrintData& printDataConst) #define GDI_ERROR -1 #endif +// Just in case we want to go back to using 8 bits for +// any reason: set this to 0 for 8 bits. +#define wxUSE_DRAWBITMAP_24BITS 1 + void wxPrinterDC::DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask) @@ -427,37 +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.IsDIB() ) + { + 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 ) ); - int iBitsSize = ((width + 3 ) & ~3 ) * height; +#if wxUSE_DRAWBITMAP_24BITS + int iBitsSize = (((width * 3) + 3 ) & ~3 ) * height; +#else + 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.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, - 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 ) + 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() { @@ -474,15 +519,15 @@ bool wxPrinterDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, - int WXUNUSED(rop), bool useMask) + int WXUNUSED(rop), bool useMask, + wxCoord WXUNUSED(xsrcMask), wxCoord WXUNUSED(ysrcMask)) { bool success = TRUE; 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); @@ -515,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.IsDIB() ) + { + 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);