]> git.saurik.com Git - wxWidgets.git/blame - src/generic/dcbuffer.cpp
don't crash trying to dereference NULL m_selection (happens when showing a grid witho...
[wxWidgets.git] / src / generic / dcbuffer.cpp
CommitLineData
67e2efca
RL
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
2981a033
RL
17#include "wx/wxprec.h"
18
67e2efca
RL
19#ifdef __BORLANDC__
20 #pragma hdrstop
21#endif
22
2981a033
RL
23#ifndef WX_PRECOMP
24#include "wx/window.h"
25#endif
26
67e2efca
RL
27#include "wx/dcbuffer.h"
28
29
30// ==============================================================
31// Double buffering helper.
32// --------------------------------------------------------------
33
34wxBufferedDC::wxBufferedDC( wxDC *dc, const wxBitmap &buffer )
35 : m_dc( dc )
36 , m_buffer( buffer )
37{
38 SelectObject( m_buffer );
39}
40
41wxBufferedDC::wxBufferedDC( wxDC *dc, const wxSize &area )
42 : m_dc( dc )
43 , m_buffer( area.GetWidth(), area.GetHeight() )
44{
45 SelectObject( m_buffer );
46}
47
48wxBufferedDC::~wxBufferedDC()
49{
50 if( m_dc != 0 )
51 {
52 UnMask();
53 }
54}
55
56void wxBufferedDC::Init( wxDC *dc, const wxBitmap &buffer )
57{
58 wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
59 _T("wxBufferedDC already initialised") );
60
61 m_dc = dc;
62 m_buffer = buffer;
63 SelectObject( m_buffer );
64}
65
66void wxBufferedDC::Init( wxDC *dc, const wxSize &area )
67{
68 wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
69 _T("wxBufferedDC already initialised") );
70
71 m_dc = dc;
72 m_buffer = wxBitmap( area.GetWidth(), area.GetHeight() );
73 SelectObject( m_buffer );
74}
75
76void wxBufferedDC::UnMask()
77{
78 wxASSERT_MSG( m_dc != 0, _T("No low level DC associated with buffer (anymore)") );
79
80 m_dc->Blit( 0, 0, m_buffer.GetWidth(), m_buffer.GetHeight(), this, 0, 0 );
81 m_dc = 0;
82}
83
84
85// ==============================================================
86// Double buffered PaintDC.
87// --------------------------------------------------------------
88
89wxBufferedPaintDC::wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer )
90 : m_paintdc( window )
91{
92 window->PrepareDC( m_paintdc );
93
94 if( buffer != wxNullBitmap )
95 Init( &m_paintdc, buffer );
96 else
97 Init( &m_paintdc, window->GetClientSize() );
98}
99
100wxBufferedPaintDC::~wxBufferedPaintDC()
101{
102 // We must UnMask here, else by the time the base class
103 // does it, the PaintDC will have already been destroyed.
104
105 UnMask();
106}
107
108
109// vi:sts=4:sw=4:et