1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/overlaycmn.cpp
3 // Purpose: common wxOverlay code
4 // Author: Stefan Csomor
5 // Modified by:
6 // Created: 2006-10-20
7 // Copyright: (c) wxWidgets team
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21
22
23 #include "wx/overlay.h"
24 #include "wx/private/overlay.h"
25 #include "wx/dcclient.h"
26 #include "wx/dcmemory.h"
27
28 // ============================================================================
29 // implementation
30 // ============================================================================
31
32 // ----------------------------------------------------------------------------
33 // wxOverlay
34 // ----------------------------------------------------------------------------
35
wxOverlay()36 wxOverlay::wxOverlay()
37 {
38 m_impl = new wxOverlayImpl();
39 m_inDrawing = false;
40 }
41
~wxOverlay()42 wxOverlay::~wxOverlay()
43 {
44 delete m_impl;
45 }
46
IsOk()47 bool wxOverlay::IsOk()
48 {
49 return m_impl->IsOk();
50 }
51
Init(wxDC * dc,int x,int y,int width,int height)52 void wxOverlay::Init( wxDC* dc, int x , int y , int width , int height )
53 {
54 m_impl->Init(dc, x, y, width, height);
55 }
56
BeginDrawing(wxDC * dc)57 void wxOverlay::BeginDrawing( wxDC* dc)
58 {
59 m_impl->BeginDrawing(dc);
60 m_inDrawing = true ;
61 }
62
EndDrawing(wxDC * dc)63 void wxOverlay::EndDrawing( wxDC* dc)
64 {
65 m_impl->EndDrawing(dc);
66 m_inDrawing = false ;
67 }
68
Clear(wxDC * dc)69 void wxOverlay::Clear( wxDC* dc)
70 {
71 m_impl->Clear(dc);
72 }
73
Reset()74 void wxOverlay::Reset()
75 {
76 wxASSERT_MSG(m_inDrawing==false,wxT("cannot reset overlay during drawing"));
77 m_impl->Reset();
78 }
79
80
81 // ----------------------------------------------------------------------------
82 // wxDCOverlay
83 // ----------------------------------------------------------------------------
84
wxDCOverlay(wxOverlay & overlay,wxDC * dc,int x,int y,int width,int height)85 wxDCOverlay::wxDCOverlay(wxOverlay &overlay, wxDC *dc, int x , int y , int width , int height) :
86 m_overlay(overlay)
87 {
88 Init(dc, x, y, width, height);
89 }
90
wxDCOverlay(wxOverlay & overlay,wxDC * dc)91 wxDCOverlay::wxDCOverlay(wxOverlay &overlay, wxDC *dc) :
92 m_overlay(overlay)
93 {
94 const wxSize size(dc->GetSize());
95
96 const wxCoord logicalLeft = dc->DeviceToLogicalX(0);
97 const wxCoord logicalTop = dc->DeviceToLogicalY(0);
98 const wxCoord logicalRight = dc->DeviceToLogicalX(size.GetWidth());
99 const wxCoord logicalBottom = dc->DeviceToLogicalY(size.GetHeight());
100
101 Init(dc,
102 logicalLeft,
103 logicalTop,
104 logicalRight - logicalLeft,
105 logicalBottom - logicalTop);
106 }
107
~wxDCOverlay()108 wxDCOverlay::~wxDCOverlay()
109 {
110 m_overlay.EndDrawing(m_dc);
111 }
112
Init(wxDC * dc,int x,int y,int width,int height)113 void wxDCOverlay::Init(wxDC *dc, int x , int y , int width , int height )
114 {
115 m_dc = dc ;
116 if ( !m_overlay.IsOk() )
117 {
118 m_overlay.Init(dc,x,y,width,height);
119 }
120 m_overlay.BeginDrawing(dc);
121 }
122
Clear()123 void wxDCOverlay::Clear()
124 {
125 m_overlay.Clear(m_dc);
126 }
127
128 // ----------------------------------------------------------------------------
129 // generic implementation of wxOverlayImpl
130 // ----------------------------------------------------------------------------
131
132 #ifndef wxHAS_NATIVE_OVERLAY
133
wxOverlayImpl()134 wxOverlayImpl::wxOverlayImpl()
135 {
136 m_window = NULL ;
137 m_x = m_y = m_width = m_height = 0 ;
138 }
139
~wxOverlayImpl()140 wxOverlayImpl::~wxOverlayImpl()
141 {
142 }
143
IsOk()144 bool wxOverlayImpl::IsOk()
145 {
146 return m_bmpSaved.IsOk() ;
147 }
148
Init(wxDC * dc,int x,int y,int width,int height)149 void wxOverlayImpl::Init( wxDC* dc, int x , int y , int width , int height )
150 {
151 m_window = dc->GetWindow();
152 wxMemoryDC dcMem ;
153 m_bmpSaved.Create( width, height );
154 dcMem.SelectObject( m_bmpSaved );
155 m_x = x ;
156 m_y = y ;
157 m_width = width ;
158 m_height = height ;
159 dcMem.Blit(0, 0, m_width, m_height,
160 dc, x, y);
161 dcMem.SelectObject( wxNullBitmap );
162 }
163
Clear(wxDC * dc)164 void wxOverlayImpl::Clear(wxDC* dc)
165 {
166 wxMemoryDC dcMem ;
167 dcMem.SelectObject( m_bmpSaved );
168 dc->Blit( m_x, m_y, m_width, m_height , &dcMem , 0 , 0 );
169 dcMem.SelectObject( wxNullBitmap );
170 }
171
Reset()172 void wxOverlayImpl::Reset()
173 {
174 m_bmpSaved = wxBitmap();
175 }
176
BeginDrawing(wxDC * WXUNUSED (dc))177 void wxOverlayImpl::BeginDrawing(wxDC* WXUNUSED(dc))
178 {
179 }
180
EndDrawing(wxDC * WXUNUSED (dc))181 void wxOverlayImpl::EndDrawing(wxDC* WXUNUSED(dc))
182 {
183 }
184
185 #endif // !wxHAS_NATIVE_OVERLAY
186
187
188