| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/dcbuffer.h
- // Purpose: wxBufferedDC class
- // Author: Ron Lee <ron@debian.org>
- // Modified by: Vadim Zeitlin (refactored, added bg preservation)
- // Created: 16/03/02
- // Copyright: (c) Ron Lee
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_DCBUFFER_H_
- #define _WX_DCBUFFER_H_
- #include "wx/dcmemory.h"
- #include "wx/dcclient.h"
- #include "wx/window.h"
- // Split platforms into two groups - those which have well-working
- // double-buffering by default, and those which do not.
- #if defined(__WXMAC__) || defined(__WXGTK20__) || defined(__WXDFB__)
- #define wxALWAYS_NATIVE_DOUBLE_BUFFER 1
- #else
- #define wxALWAYS_NATIVE_DOUBLE_BUFFER 0
- #endif
- // ----------------------------------------------------------------------------
- // Double buffering helper.
- // ----------------------------------------------------------------------------
- // Assumes the buffer bitmap covers the entire scrolled window,
- // and prepares the window DC accordingly
- #define wxBUFFER_VIRTUAL_AREA 0x01
- // Assumes the buffer bitmap only covers the client area;
- // does not prepare the window DC
- #define wxBUFFER_CLIENT_AREA 0x02
- // Set when not using specific buffer bitmap. Note that this
- // is private style and not returned by GetStyle.
- #define wxBUFFER_USES_SHARED_BUFFER 0x04
- class WXDLLIMPEXP_CORE wxBufferedDC : public wxMemoryDC
- {
- public:
- // Default ctor, must subsequently call Init for two stage construction.
- wxBufferedDC()
- : m_dc(NULL),
- m_buffer(NULL),
- m_style(0)
- {
- }
- // Construct a wxBufferedDC using a user supplied buffer.
- wxBufferedDC(wxDC *dc,
- wxBitmap& buffer = wxNullBitmap,
- int style = wxBUFFER_CLIENT_AREA)
- : m_dc(NULL), m_buffer(NULL)
- {
- Init(dc, buffer, style);
- }
- // Construct a wxBufferedDC with an internal buffer of 'area'
- // (where area is usually something like the size of the window
- // being buffered)
- wxBufferedDC(wxDC *dc, const wxSize& area, int style = wxBUFFER_CLIENT_AREA)
- : m_dc(NULL), m_buffer(NULL)
- {
- Init(dc, area, style);
- }
- // The usually desired action in the dtor is to blit the buffer.
- virtual ~wxBufferedDC()
- {
- if ( m_dc )
- UnMask();
- }
- // These reimplement the actions of the ctors for two stage creation
- void Init(wxDC *dc,
- wxBitmap& buffer = wxNullBitmap,
- int style = wxBUFFER_CLIENT_AREA)
- {
- InitCommon(dc, style);
- m_buffer = &buffer;
- UseBuffer();
- }
- void Init(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA)
- {
- InitCommon(dc, style);
- UseBuffer(area.x, area.y);
- }
- // Blits the buffer to the dc, and detaches the dc from the buffer (so it
- // can be effectively used once only).
- //
- // Usually called in the dtor or by the dtor of derived classes if the
- // BufferedDC must blit before the derived class (which may own the dc it's
- // blitting to) is destroyed.
- void UnMask();
- // Set and get the style
- void SetStyle(int style) { m_style = style; }
- int GetStyle() const { return m_style & ~wxBUFFER_USES_SHARED_BUFFER; }
- private:
- // common part of Init()s
- void InitCommon(wxDC *dc, int style)
- {
- wxASSERT_MSG( !m_dc, wxT("wxBufferedDC already initialised") );
- m_dc = dc;
- m_style = style;
- }
- // check that the bitmap is valid and use it
- void UseBuffer(wxCoord w = -1, wxCoord h = -1);
- // the underlying DC to which we copy everything drawn on this one in
- // UnMask()
- //
- // NB: Without the existence of a wxNullDC, this must be a pointer, else it
- // could probably be a reference.
- wxDC *m_dc;
- // the buffer (selected in this DC), initially invalid
- wxBitmap *m_buffer;
- // the buffering style
- int m_style;
- wxSize m_area;
-
- DECLARE_DYNAMIC_CLASS(wxBufferedDC)
- wxDECLARE_NO_COPY_CLASS(wxBufferedDC);
- };
- // ----------------------------------------------------------------------------
- // Double buffered PaintDC.
- // ----------------------------------------------------------------------------
- // Creates a double buffered wxPaintDC, optionally allowing the
- // user to specify their own buffer to use.
- class WXDLLIMPEXP_CORE wxBufferedPaintDC : public wxBufferedDC
- {
- public:
- // If no bitmap is supplied by the user, a temporary one will be created.
- wxBufferedPaintDC(wxWindow *window, wxBitmap& buffer, int style = wxBUFFER_CLIENT_AREA)
- : m_paintdc(window)
- {
- // If we're buffering the virtual window, scale the paint DC as well
- if (style & wxBUFFER_VIRTUAL_AREA)
- window->PrepareDC( m_paintdc );
- if( buffer.IsOk() )
- Init(&m_paintdc, buffer, style);
- else
- Init(&m_paintdc, GetBufferedSize(window, style), style);
- }
- // If no bitmap is supplied by the user, a temporary one will be created.
- wxBufferedPaintDC(wxWindow *window, int style = wxBUFFER_CLIENT_AREA)
- : m_paintdc(window)
- {
- // If we're using the virtual window, scale the paint DC as well
- if (style & wxBUFFER_VIRTUAL_AREA)
- window->PrepareDC( m_paintdc );
- Init(&m_paintdc, GetBufferedSize(window, style), style);
- }
- // default copy ctor ok.
- virtual ~wxBufferedPaintDC()
- {
- // We must UnMask here, else by the time the base class
- // does it, the PaintDC will have already been destroyed.
- UnMask();
- }
- protected:
- // return the size needed by the buffer: this depends on whether we're
- // buffering just the currently shown part or the total (scrolled) window
- static wxSize GetBufferedSize(wxWindow *window, int style)
- {
- return style & wxBUFFER_VIRTUAL_AREA ? window->GetVirtualSize()
- : window->GetClientSize();
- }
- private:
- wxPaintDC m_paintdc;
- DECLARE_ABSTRACT_CLASS(wxBufferedPaintDC)
- wxDECLARE_NO_COPY_CLASS(wxBufferedPaintDC);
- };
- //
- // wxAutoBufferedPaintDC is a wxPaintDC in toolkits which have double-
- // buffering by default. Otherwise it is a wxBufferedPaintDC. Thus,
- // you can only expect it work with a simple constructor that
- // accepts single wxWindow* argument.
- //
- #if wxALWAYS_NATIVE_DOUBLE_BUFFER
- #define wxAutoBufferedPaintDCBase wxPaintDC
- #else
- #define wxAutoBufferedPaintDCBase wxBufferedPaintDC
- #endif
- class WXDLLIMPEXP_CORE wxAutoBufferedPaintDC : public wxAutoBufferedPaintDCBase
- {
- public:
- wxAutoBufferedPaintDC(wxWindow* win)
- : wxAutoBufferedPaintDCBase(win)
- {
- wxASSERT_MSG( win->GetBackgroundStyle() == wxBG_STYLE_PAINT,
- "You need to call SetBackgroundStyle(wxBG_STYLE_PAINT) in ctor, "
- "and also, if needed, paint the background in wxEVT_PAINT handler."
- );
- }
- virtual ~wxAutoBufferedPaintDC() { }
- private:
- wxDECLARE_NO_COPY_CLASS(wxAutoBufferedPaintDC);
- };
- // Check if the window is natively double buffered and will return a wxPaintDC
- // if it is, a wxBufferedPaintDC otherwise. It is the caller's responsibility
- // to delete the wxDC pointer when finished with it.
- inline wxDC* wxAutoBufferedPaintDCFactory(wxWindow* window)
- {
- if ( window->IsDoubleBuffered() )
- return new wxPaintDC(window);
- else
- return new wxBufferedPaintDC(window);
- }
- #endif // _WX_DCBUFFER_H_
|