X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c9a19aabab3a878b565e6c2a5f2a3824277c4dc..01f5f03e7f9c19ca75ae6dbd4050c2b54e52e406:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index c3406621d5..191d5c3396 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -960,6 +960,10 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask { s_triedToLoad = TRUE; + // don't give errors about the DLL being unavailable, we're + // prepared to handle this + wxLogNull nolog; + wxDynamicLibrary dll(_T("msimg32.dll")); if ( dll.IsLoaded() ) { @@ -967,7 +971,8 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask if ( pfnAlphaBlend ) { // we must keep the DLL loaded if we want to be able to - // call AlphaBlend() so just never unload it at all + // call AlphaBlend() so just never unload it at all, not a + // big deal dll.Detach(); } } @@ -1823,13 +1828,14 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, if (!GetHDC()) return FALSE; #endif + const wxBitmap& bmpSrc = source->m_selectedBitmap; + wxMask *mask = NULL; if ( useMask ) { - const wxBitmap& bmp = source->m_selectedBitmap; - mask = bmp.GetMask(); + mask = bmpSrc.GetMask(); - if ( !(bmp.Ok() && mask && mask->GetMaskBitmap()) ) + if ( !(bmpSrc.Ok() && mask && mask->GetMaskBitmap()) ) { // don't give assert here because this would break existing // programs - just silently ignore useMask parameter @@ -1993,36 +1999,79 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, } else // no mask, just BitBlt() it { - // use StretchBlt() if available - if ( ::GetDeviceCaps(GetHdc(), RASTERCAPS) & RC_STRETCHBLT ) + // if we already have a DIB, draw it using StretchDIBits(), otherwise + // use StretchBlt() if available and finally fall back to BitBlt() + const int caps = ::GetDeviceCaps(GetHdc(), RASTERCAPS); + if ( bmpSrc.Ok() && (caps & RC_STRETCHDIB) ) { - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); + DIBSECTION ds; + wxZeroMemory(ds); - success = ::StretchBlt - ( - GetHdc(), - xdest, ydest, width, height, - GetHdcOf(*source), - xsrc, ysrc, width, height, - dwRop - ) != 0; + if ( ::GetObject(GetHbitmapOf(bmpSrc), + sizeof(ds), + &ds) == sizeof(ds) ) + { + StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); + + if ( ::StretchDIBits(GetHdc(), + xdest, ydest, + width, height, + 0, 0, + width, height, + ds.dsBm.bmBits, + (LPBITMAPINFO)&ds.dsBmih, + DIB_RGB_COLORS, + SRCCOPY + ) == (int)GDI_ERROR ) + { + wxLogLastError(wxT("StretchDIBits")); + } + else + { + success = TRUE; + } + } } - else + + if ( !success && (caps & RC_STRETCHBLT) ) { - success = ::BitBlt - ( - GetHdc(), - xdest, ydest, - (int)width, (int)height, - GetHdcOf(*source), - xsrc, ysrc, - dwRop - ) != 0; + StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); + + if ( !::StretchBlt + ( + GetHdc(), + xdest, ydest, width, height, + GetHdcOf(*source), + xsrc, ysrc, width, height, + dwRop + ) ) + { + wxLogLastError(_T("StretchBlt")); + } + else + { + success = TRUE; + } } if ( !success ) { - wxLogLastError(wxT("BitBlt/StretchBlt")); + if ( !::BitBlt + ( + GetHdc(), + xdest, ydest, + (int)width, (int)height, + GetHdcOf(*source), + xsrc, ysrc, + dwRop + ) ) + { + wxLogLastError(_T("BitBlt")); + } + else + { + success = TRUE; + } } } @@ -2137,10 +2186,10 @@ wxDCCacheEntry::~wxDCCacheEntry() wxDCCacheEntry* wxDC::FindBitmapInCache(WXHDC dc, int w, int h) { int depth = ::GetDeviceCaps((HDC) dc, PLANES) * ::GetDeviceCaps((HDC) dc, BITSPIXEL); - wxNode* node = sm_bitmapCache.First(); + wxNode* node = sm_bitmapCache.GetFirst(); while (node) { - wxDCCacheEntry* entry = (wxDCCacheEntry*) node->Data(); + wxDCCacheEntry* entry = (wxDCCacheEntry*) node->GetData(); if (entry->m_depth == depth) { @@ -2158,7 +2207,7 @@ wxDCCacheEntry* wxDC::FindBitmapInCache(WXHDC dc, int w, int h) return entry; } - node = node->Next(); + node = node->GetNext(); } WXHBITMAP hBitmap = (WXHBITMAP) ::CreateCompatibleBitmap((HDC) dc, w, h); if ( !hBitmap) @@ -2173,10 +2222,10 @@ wxDCCacheEntry* wxDC::FindBitmapInCache(WXHDC dc, int w, int h) wxDCCacheEntry* wxDC::FindDCInCache(wxDCCacheEntry* notThis, WXHDC dc) { int depth = ::GetDeviceCaps((HDC) dc, PLANES) * ::GetDeviceCaps((HDC) dc, BITSPIXEL); - wxNode* node = sm_dcCache.First(); + wxNode* node = sm_dcCache.GetFirst(); while (node) { - wxDCCacheEntry* entry = (wxDCCacheEntry*) node->Data(); + wxDCCacheEntry* entry = (wxDCCacheEntry*) node->GetData(); // Don't return the same one as we already have if (!notThis || (notThis != entry)) @@ -2187,7 +2236,7 @@ wxDCCacheEntry* wxDC::FindDCInCache(wxDCCacheEntry* notThis, WXHDC dc) } } - node = node->Next(); + node = node->GetNext(); } WXHDC hDC = (WXHDC) ::CreateCompatibleDC((HDC) dc); if ( !hDC)