From: Julian Smart Date: Wed, 11 Jul 2001 20:22:44 +0000 (+0000) Subject: Made DC cacheing less obstrusive X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/aef94d68609474317f4e6ce2394466750e992da9 Made DC cacheing less obstrusive git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10974 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/dc.tex b/docs/latex/wx/dc.tex index d8e91ef275..94354be934 100644 --- a/docs/latex/wx/dc.tex +++ b/docs/latex/wx/dc.tex @@ -104,8 +104,8 @@ and the background colour set to WHITE. This sequence of operations ensures that the source's transparent area need not be black, and logical functions are supported. -{\bf Note:} on Windows, blitting with masks can be speeded up considerably by using -\helpref{DC cacheing}{wxdcenablecache}. You can also influence whether MaskBlt +{\bf Note:} on Windows, blitting with masks can be speeded up considerably by compiling +wxWindows with the wxUSE\_DC\_CACHE option enabled. You can also influence whether MaskBlt or the explicit mask blitting code above is used, by using \helpref{wxSystemOptions}{wxsystemoptions} and setting the {\bf no-maskblt} option to 1. @@ -128,6 +128,7 @@ See \helpref{wxMemoryDC}{wxmemorydc} for typical usage. \helpref{wxMemoryDC}{wxmemorydc}, \helpref{wxBitmap}{wxbitmap}, \helpref{wxMask}{wxmask} +\begin{comment} \membersection{wxDC::CacheEnabled}\label{wxdccacheenabled} \func{static bool}{CacheEnabled}{\void} @@ -143,6 +144,7 @@ wxUSE\_DC\_CACHEING preprocessor symbol for portability. \wxheading{See also} \helpref{wxDC::EnableCache}{wxdcenablecache}, \helpref{wxDC::ClearCache} +\end{comment} \membersection{wxDC::CalcBoundingBox}\label{wxdccalcboundingbox} @@ -162,6 +164,7 @@ Adds the specified point to the bounding box which can be retrieved with Clears the device context using the current background brush. +\begin{comment} \membersection{wxDC::ClearCache}\label{wxdcclearcache} \func{static void}{ClearCache}{\void} @@ -179,6 +182,7 @@ wxUSE\_DC\_CACHEING preprocessor symbol for portability. \wxheading{See also} \helpref{wxDC::EnableCache}{wxdcenablecache}, \helpref{wxDC::CacheEnabled} +\end{comment} \membersection{wxDC::CrossHair}\label{wxdccrosshair} @@ -417,6 +421,7 @@ text more precisely. but it is ignored by wxMSW. Thus, you should avoid using logical functions with this function in portable programs. +\begin{comment} \membersection{wxDC::EnableCache}\label{wxdcenablecache} \func{static void}{EnableCache}{\param{bool}{ enableCache}} @@ -431,6 +436,7 @@ wxUSE\_DC\_CACHEING preprocessor symbol for portability. \wxheading{See also} \helpref{wxDC::CacheEnabled}{wxdccacheenabled}, \helpref{wxDC::ClearCache} +\end{comment} \membersection{wxDC::EndDoc}\label{wxdcenddoc} diff --git a/samples/dragimag/dragimag.cpp b/samples/dragimag/dragimag.cpp index 43a115629f..fd7d182c44 100644 --- a/samples/dragimag/dragimag.cpp +++ b/samples/dragimag/dragimag.cpp @@ -101,9 +101,6 @@ void MyCanvas::OnEraseBackground(wxEraseEvent& event) wxClientDC dc(this); wxGetApp().TileBitmap(rect, dc, wxGetApp().GetBackgroundBitmap()); } -#if wxUSE_DC_CACHEING - wxDC::ClearCache(); -#endif } else event.Skip(); // The official way of doing it @@ -281,9 +278,6 @@ void MyCanvas::DrawShapes(wxDC& dc) shape->Draw(dc); node = node->Next(); } -#if wxUSE_DC_CACHEING - wxDC::ClearCache(); -#endif } void MyCanvas::EraseShape(DragShape* shape, wxDC& dc) @@ -385,12 +379,6 @@ bool MyApp::OnInit() wxImage::AddHandler( new wxPNGHandler ); #endif - // The DC cache is an efficiency measure to be used - // when a lot of masked blitting is done -#if wxUSE_DC_CACHEING - wxDC::EnableCache(TRUE); -#endif - wxImage image; if (image.LoadFile("backgrnd.png", wxBITMAP_TYPE_PNG)) { @@ -445,9 +433,6 @@ bool MyApp::OnInit() int MyApp::OnExit() { -#if wxUSE_DC_CACHEING - wxDC::ClearCache(); -#endif return 0; } diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 7cfe66ae9e..7c9aa3741f 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -1112,6 +1112,14 @@ void wxApp::OnIdle(wxIdleEvent& event) wxLog::FlushActive(); #endif // wxUSE_LOG +#if wxUSE_DC_CACHEING + // automated DC cache management: clear the cached DCs and bitmap + // if it's likely that the app has finished with them, that is, we + // get an idle event and we're not dragging anything. + if (!::GetKeyState(MK_LBUTTON) && !::GetKeyState(MK_MBUTTON) && ::GetKeyState(MK_RBUTTON)) + wxDC::ClearCache(); +#endif // wxUSE_DC_CACHEING + // Send OnIdle events to all windows if ( SendIdleEvents() ) { diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index a9cfabdf12..33417c540a 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 @@ -1985,6 +1986,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