Made DC cacheing less obstrusive

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10974 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2001-07-11 20:22:44 +00:00
parent 2774804745
commit aef94d6860
4 changed files with 30 additions and 17 deletions

View File

@@ -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, This sequence of operations ensures that the source's transparent area need not be black,
and logical functions are supported. and logical functions are supported.
{\bf Note:} on Windows, blitting with masks can be speeded up considerably by using {\bf Note:} on Windows, blitting with masks can be speeded up considerably by compiling
\helpref{DC cacheing}{wxdcenablecache}. You can also influence whether MaskBlt 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 or the explicit mask blitting code above is used, by using \helpref{wxSystemOptions}{wxsystemoptions} and
setting the {\bf no-maskblt} option to 1. 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} \helpref{wxMemoryDC}{wxmemorydc}, \helpref{wxBitmap}{wxbitmap}, \helpref{wxMask}{wxmask}
\begin{comment}
\membersection{wxDC::CacheEnabled}\label{wxdccacheenabled} \membersection{wxDC::CacheEnabled}\label{wxdccacheenabled}
\func{static bool}{CacheEnabled}{\void} \func{static bool}{CacheEnabled}{\void}
@@ -143,6 +144,7 @@ wxUSE\_DC\_CACHEING preprocessor symbol for portability.
\wxheading{See also} \wxheading{See also}
\helpref{wxDC::EnableCache}{wxdcenablecache}, \helpref{wxDC::ClearCache} \helpref{wxDC::EnableCache}{wxdcenablecache}, \helpref{wxDC::ClearCache}
\end{comment}
\membersection{wxDC::CalcBoundingBox}\label{wxdccalcboundingbox} \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. Clears the device context using the current background brush.
\begin{comment}
\membersection{wxDC::ClearCache}\label{wxdcclearcache} \membersection{wxDC::ClearCache}\label{wxdcclearcache}
\func{static void}{ClearCache}{\void} \func{static void}{ClearCache}{\void}
@@ -179,6 +182,7 @@ wxUSE\_DC\_CACHEING preprocessor symbol for portability.
\wxheading{See also} \wxheading{See also}
\helpref{wxDC::EnableCache}{wxdcenablecache}, \helpref{wxDC::CacheEnabled} \helpref{wxDC::EnableCache}{wxdcenablecache}, \helpref{wxDC::CacheEnabled}
\end{comment}
\membersection{wxDC::CrossHair}\label{wxdccrosshair} \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 but it is ignored by wxMSW. Thus, you should avoid using logical functions
with this function in portable programs. with this function in portable programs.
\begin{comment}
\membersection{wxDC::EnableCache}\label{wxdcenablecache} \membersection{wxDC::EnableCache}\label{wxdcenablecache}
\func{static void}{EnableCache}{\param{bool}{ enableCache}} \func{static void}{EnableCache}{\param{bool}{ enableCache}}
@@ -431,6 +436,7 @@ wxUSE\_DC\_CACHEING preprocessor symbol for portability.
\wxheading{See also} \wxheading{See also}
\helpref{wxDC::CacheEnabled}{wxdccacheenabled}, \helpref{wxDC::ClearCache} \helpref{wxDC::CacheEnabled}{wxdccacheenabled}, \helpref{wxDC::ClearCache}
\end{comment}
\membersection{wxDC::EndDoc}\label{wxdcenddoc} \membersection{wxDC::EndDoc}\label{wxdcenddoc}

View File

@@ -101,9 +101,6 @@ void MyCanvas::OnEraseBackground(wxEraseEvent& event)
wxClientDC dc(this); wxClientDC dc(this);
wxGetApp().TileBitmap(rect, dc, wxGetApp().GetBackgroundBitmap()); wxGetApp().TileBitmap(rect, dc, wxGetApp().GetBackgroundBitmap());
} }
#if wxUSE_DC_CACHEING
wxDC::ClearCache();
#endif
} }
else else
event.Skip(); // The official way of doing it event.Skip(); // The official way of doing it
@@ -281,9 +278,6 @@ void MyCanvas::DrawShapes(wxDC& dc)
shape->Draw(dc); shape->Draw(dc);
node = node->Next(); node = node->Next();
} }
#if wxUSE_DC_CACHEING
wxDC::ClearCache();
#endif
} }
void MyCanvas::EraseShape(DragShape* shape, wxDC& dc) void MyCanvas::EraseShape(DragShape* shape, wxDC& dc)
@@ -385,12 +379,6 @@ bool MyApp::OnInit()
wxImage::AddHandler( new wxPNGHandler ); wxImage::AddHandler( new wxPNGHandler );
#endif #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; wxImage image;
if (image.LoadFile("backgrnd.png", wxBITMAP_TYPE_PNG)) if (image.LoadFile("backgrnd.png", wxBITMAP_TYPE_PNG))
{ {
@@ -445,9 +433,6 @@ bool MyApp::OnInit()
int MyApp::OnExit() int MyApp::OnExit()
{ {
#if wxUSE_DC_CACHEING
wxDC::ClearCache();
#endif
return 0; return 0;
} }

View File

@@ -1112,6 +1112,14 @@ void wxApp::OnIdle(wxIdleEvent& event)
wxLog::FlushActive(); wxLog::FlushActive();
#endif // wxUSE_LOG #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 // Send OnIdle events to all windows
if ( SendIdleEvents() ) if ( SendIdleEvents() )
{ {

View File

@@ -42,6 +42,7 @@
#include "wx/sysopt.h" #include "wx/sysopt.h"
#include "wx/dcprint.h" #include "wx/dcprint.h"
#include "wx/module.h"
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
@@ -1985,6 +1986,19 @@ void wxDC::ClearCache()
sm_dcCache.DeleteContents(FALSE); 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 #endif
// wxUSE_DC_CACHEING // wxUSE_DC_CACHEING