X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0cbff1201aa47e2b73ec90a97886f18e88270ea6..f2616db56739e4962f683f59ac9e207756efe23c:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index cae9668ac8..721a1fb3c7 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -42,6 +42,7 @@ #include "wx/sysopt.h" #include "wx/dcprint.h" +#include "wx/module.h" #include #include @@ -1704,30 +1705,25 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, HBITMAP buffer_bmap ; #if wxUSE_DC_CACHEING - if (CacheEnabled()) - { - // create a temp buffer bitmap and DCs to access it and the mask - wxDCCacheEntry* dcCacheEntry1 = FindDCInCache(NULL, source->GetHDC()); - dc_mask = (HDC) dcCacheEntry1->m_dc; - - wxDCCacheEntry* dcCacheEntry2 = FindDCInCache(dcCacheEntry1, dest->GetHDC()); - dc_buffer = (HDC) dcCacheEntry2->m_dc; - - wxDCCacheEntry* bitmapCacheEntry = FindBitmapInCache(dest->GetHDC(), - width, height); - - buffer_bmap = (HBITMAP) bitmapCacheEntry->m_bitmap; - } - else -#endif - { - // create a temp buffer bitmap and DCs to access it and the mask - dc_mask = ::CreateCompatibleDC(GetHdcOf(*source)); - dc_buffer = ::CreateCompatibleDC(GetHdc()); - buffer_bmap = ::CreateCompatibleBitmap(GetHdc(), width, height); - ::SelectObject(dc_mask, (HBITMAP) mask->GetMaskBitmap()); - ::SelectObject(dc_buffer, buffer_bmap); - } + // create a temp buffer bitmap and DCs to access it and the mask + wxDCCacheEntry* dcCacheEntry1 = FindDCInCache(NULL, source->GetHDC()); + dc_mask = (HDC) dcCacheEntry1->m_dc; + + wxDCCacheEntry* dcCacheEntry2 = FindDCInCache(dcCacheEntry1, GetHDC()); + dc_buffer = (HDC) dcCacheEntry2->m_dc; + + wxDCCacheEntry* bitmapCacheEntry = FindBitmapInCache(GetHDC(), + width, height); + + buffer_bmap = (HBITMAP) bitmapCacheEntry->m_bitmap; +#else // !wxUSE_DC_CACHEING + // create a temp buffer bitmap and DCs to access it and the mask + dc_mask = ::CreateCompatibleDC(GetHdcOf(*source)); + dc_buffer = ::CreateCompatibleDC(GetHdc()); + buffer_bmap = ::CreateCompatibleBitmap(GetHdc(), width, height); + ::SelectObject(dc_mask, (HBITMAP) mask->GetMaskBitmap()); + ::SelectObject(dc_buffer, buffer_bmap); +#endif // wxUSE_DC_CACHEING/!wxUSE_DC_CACHEING // copy dest to buffer if ( !::BitBlt(dc_buffer, 0, 0, (int)width, (int)height, @@ -1776,14 +1772,13 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, ::SelectObject(dc_mask, 0); ::SelectObject(dc_buffer, 0); -#if wxUSE_DC_CACHEING - if (!CacheEnabled()) -#endif +#if !wxUSE_DC_CACHEING { ::DeleteDC(dc_mask); ::DeleteDC(dc_buffer); ::DeleteObject(buffer_bmap); } +#endif } } else // no mask, just BitBlt() it @@ -1986,6 +1981,19 @@ void wxDC::ClearCache() sm_dcCache.DeleteContents(FALSE); } +// Clean up cache at app exit +class wxDCModule : public wxModule +{ +public: + virtual bool OnInit() { return TRUE; } + virtual void OnExit() { wxDC::ClearCache(); } + +private: + DECLARE_DYNAMIC_CLASS(wxDCModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxDCModule, wxModule) + #endif // wxUSE_DC_CACHEING