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