]> git.saurik.com Git - wxWidgets.git/blob - src/generic/dcbuffer.cpp
Added wxBufferedDC class.
[wxWidgets.git] / src / generic / dcbuffer.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: dcbuffer.cpp
3 // Purpose: wxBufferedDC class
4 // Author: Ron Lee <ron@debian.org>
5 // Modified by:
6 // Created: 16/03/02
7 // RCS-ID: $Id$
8 // Copyright: (c) Ron Lee
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12
13 #ifdef __GNUG__
14 #pragma implementation "dcbuffer.h"
15 #endif
16
17 #ifdef __BORLANDC__
18 #pragma hdrstop
19 #endif
20
21 #include "wx/dcbuffer.h"
22
23
24 // ==============================================================
25 // Double buffering helper.
26 // --------------------------------------------------------------
27
28 wxBufferedDC::wxBufferedDC( wxDC *dc, const wxBitmap &buffer )
29 : m_dc( dc )
30 , m_buffer( buffer )
31 {
32 SelectObject( m_buffer );
33 }
34
35 wxBufferedDC::wxBufferedDC( wxDC *dc, const wxSize &area )
36 : m_dc( dc )
37 , m_buffer( area.GetWidth(), area.GetHeight() )
38 {
39 SelectObject( m_buffer );
40 }
41
42 wxBufferedDC::~wxBufferedDC()
43 {
44 if( m_dc != 0 )
45 {
46 UnMask();
47 }
48 }
49
50 void wxBufferedDC::Init( wxDC *dc, const wxBitmap &buffer )
51 {
52 wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
53 _T("wxBufferedDC already initialised") );
54
55 m_dc = dc;
56 m_buffer = buffer;
57 SelectObject( m_buffer );
58 }
59
60 void wxBufferedDC::Init( wxDC *dc, const wxSize &area )
61 {
62 wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
63 _T("wxBufferedDC already initialised") );
64
65 m_dc = dc;
66 m_buffer = wxBitmap( area.GetWidth(), area.GetHeight() );
67 SelectObject( m_buffer );
68 }
69
70 void wxBufferedDC::UnMask()
71 {
72 wxASSERT_MSG( m_dc != 0, _T("No low level DC associated with buffer (anymore)") );
73
74 m_dc->Blit( 0, 0, m_buffer.GetWidth(), m_buffer.GetHeight(), this, 0, 0 );
75 m_dc = 0;
76 }
77
78
79 // ==============================================================
80 // Double buffered PaintDC.
81 // --------------------------------------------------------------
82
83 wxBufferedPaintDC::wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer )
84 : m_paintdc( window )
85 {
86 window->PrepareDC( m_paintdc );
87
88 if( buffer != wxNullBitmap )
89 Init( &m_paintdc, buffer );
90 else
91 Init( &m_paintdc, window->GetClientSize() );
92 }
93
94 wxBufferedPaintDC::~wxBufferedPaintDC()
95 {
96 // We must UnMask here, else by the time the base class
97 // does it, the PaintDC will have already been destroyed.
98
99 UnMask();
100 }
101
102
103 // vi:sts=4:sw=4:et