]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/qt/region.cpp
more reasonable default size
[wxWidgets.git] / src / qt / region.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// File: region.cpp
3// Purpose: Region class
4// Author: Markus Holzem/Julian Smart/AUTHOR
5// Created: Fri Oct 24 10:46:34 MET 1997
6// RCS-ID: $Id$
7// Copyright: (c) 1997 Markus Holzem/Julian Smart/AUTHOR
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11#ifdef __GNUG__
12#pragma implementation "region.h"
13#endif
14
15#include "wx/wxprec.h"
16
17#ifdef __BORLANDC__
18#pragma hdrstop
19#endif
20
21#include "wx/msw/region.h"
22#include "wx/gdicmn.h"
23
24#include <windows.h>
25
26#if !USE_SHARED_LIBRARY
27 IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
28 IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
29#endif
30
31//-----------------------------------------------------------------------------
32// wxRegionRefData implementation
33//-----------------------------------------------------------------------------
34
35class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
36public:
37 wxRegionRefData()
38 {
39 }
40
41 wxRegionRefData(const wxRegionRefData& data)
42 {
43 // TODO
44 }
45
46 ~wxRegionRefData()
47 {
48 // TODO
49 }
50
51 HRGN m_region;
52};
53
54
55//-----------------------------------------------------------------------------
56// wxRegion
57//-----------------------------------------------------------------------------
58
59/*!
60 * Create an empty region.
61 */
62wxRegion::wxRegion()
63{
64 m_refData = new wxRegionRefData;
65 // TODO create empty region
66}
67
68wxRegion::wxRegion(long x, long y, long w, long h)
69{
70 m_refData = new wxRegionRefData;
71 // TODO create rect region
72}
73
74wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
75{
76 m_refData = new wxRegionRefData;
77 // TODO create rect region
78}
79
80wxRegion::wxRegion(const wxRect& rect)
81{
82 m_refData = new wxRegionRefData;
83 // TODO create rect region
84}
85
86/*!
87 * Destroy the region.
88 */
89wxRegion::~wxRegion()
90{
91 // m_refData unrefed in ~wxObject
92}
93
94//-----------------------------------------------------------------------------
95//# Modify region
96//-----------------------------------------------------------------------------
97
98//! Clear current region
99void wxRegion::Clear()
100{
101 UnRef();
102}
103
104//! Combine rectangle (x, y, w, h) with this.
105bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
106{
107 // Don't change shared data
108 if (!m_refData) {
109 m_refData = new wxRegionRefData();
110 } else if (m_refData->GetRefCount() > 1) {
111 wxRegionRefData* ref = (wxRegionRefData*)m_refData;
112 UnRef();
113 m_refData = new wxRegionRefData(*ref);
114 }
115 // If ref count is 1, that means it's 'ours' anyway so no action.
116
117 // TODO create rect region
118
119 int mode = 0; // TODO platform-specific code
120 switch (op)
121 {
122 case wxRGN_AND:
123 // TODO
124 break ;
125 case wxRGN_OR:
126 // TODO
127 break ;
128 case wxRGN_XOR:
129 // TODO
130 break ;
131 case wxRGN_DIFF:
132 // TODO
133 break ;
134 case wxRGN_COPY:
135 default:
136 // TODO
137 break ;
138 }
139
140 // TODO do combine region
141
142 return FALSE;
143}
144
145//! Union /e region with this.
146bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
147{
148 if (region.Empty())
149 return FALSE;
150
151 // Don't change shared data
152 if (!m_refData) {
153 m_refData = new wxRegionRefData();
154 } else if (m_refData->GetRefCount() > 1) {
155 wxRegionRefData* ref = (wxRegionRefData*)m_refData;
156 UnRef();
157 m_refData = new wxRegionRefData(*ref);
158 }
159
160 int mode = 0; // TODO platform-specific code
161 switch (op)
162 {
163 case wxRGN_AND:
164 // TODO
165 break ;
166 case wxRGN_OR:
167 // TODO
168 break ;
169 case wxRGN_XOR:
170 // TODO
171 break ;
172 case wxRGN_DIFF:
173 // TODO
174 break ;
175 case wxRGN_COPY:
176 default:
177 // TODO
178 break ;
179 }
180
181 // TODO combine region
182
183 return FALSE;
184}
185
186bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
187{
188 return Combine(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight(), op);
189}
190
191//-----------------------------------------------------------------------------
192//# Information on region
193//-----------------------------------------------------------------------------
194
195// Outer bounds of region
196void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
197{
198 if (m_refData) {
199 // TODO get box
200 } else {
201 x = y = w = h = 0;
202 }
203}
204
205wxRect wxRegion::GetBox() const
206{
207 long x, y, w, h;
208 GetBox(x, y, w, h);
209 return wxRect(x, y, w, h);
210}
211
212// Is region empty?
213bool wxRegion::Empty() const
214{
215 // TODO
216 return FALSE;
217}
218
219//-----------------------------------------------------------------------------
220//# Tests
221//-----------------------------------------------------------------------------
222
223// Does the region contain the point (x,y)?
224wxRegionContain wxRegion::Contains(long x, long y) const
225{
226 if (!m_refData)
227 return wxOutRegion;
228
229 // TODO. Return wxInRegion if within region.
230 if (0)
231 return wxInRegion;
232 return wxOutRegion;
233}
234
235// Does the region contain the point pt?
236wxRegionContain wxRegion::Contains(const wxPoint& pt) const
237{
238 if (!m_refData)
239 return wxOutRegion;
240
241 // TODO. Return wxInRegion if within region.
242 if (0)
243 return wxInRegion;
244 else
245 return wxOutRegion;
246}
247
248// Does the region contain the rectangle (x, y, w, h)?
249wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
250{
251 if (!m_refData)
252 return wxOutRegion;
253
254 // TODO. Return wxInRegion if within region.
255 if (0)
256 return wxInRegion;
257 else
258 return wxOutRegion;
259}
260
261// Does the region contain the rectangle rect
262wxRegionContain wxRegion::Contains(const wxRect& rect) const
263{
264 if (!m_refData)
265 return wxOutRegion;
266
267 long x, y, w, h;
268 x = rect.x;
269 y = rect.y;
270 w = rect.GetWidth();
271 h = rect.GetHeight();
272 return Contains(x, y, w, h);
273}
274
275///////////////////////////////////////////////////////////////////////////////
276// //
277// wxRegionIterator //
278// //
279///////////////////////////////////////////////////////////////////////////////
280
281/*!
282 * Initialize empty iterator
283 */
284wxRegionIterator::wxRegionIterator() : m_current(0), m_numRects(0), m_rects(NULL)
285{
286}
287
288wxRegionIterator::~wxRegionIterator()
289{
290 if (m_rects)
291 delete[] m_rects;
292}
293
294/*!
295 * Initialize iterator for region
296 */
297wxRegionIterator::wxRegionIterator(const wxRegion& region)
298{
299 m_rects = NULL;
300
301 Reset(region);
302}
303
304/*!
305 * Reset iterator for a new /e region.
306 */
307void wxRegionIterator::Reset(const wxRegion& region)
308{
309 m_current = 0;
310 m_region = region;
311
312 if (m_rects)
313 delete[] m_rects;
314
315 m_rects = NULL;
316
317 if (m_region.Empty())
318 m_numRects = 0;
319 else
320 {
321 // TODO create m_rects and fill with rectangles for this region
322 m_numRects = 0;
323 }
324}
325
326/*!
327 * Increment iterator. The rectangle returned is the one after the
328 * incrementation.
329 */
330void wxRegionIterator::operator ++ ()
331{
332 if (m_current < m_numRects)
333 ++m_current;
334}
335
336/*!
337 * Increment iterator. The rectangle returned is the one before the
338 * incrementation.
339 */
340void wxRegionIterator::operator ++ (int)
341{
342 if (m_current < m_numRects)
343 ++m_current;
344}
345
346long wxRegionIterator::GetX() const
347{
348 if (m_current < m_numRects)
349 return m_rects[m_current].x;
350 return 0;
351}
352
353long wxRegionIterator::GetY() const
354{
355 if (m_current < m_numRects)
356 return m_rects[m_current].y;
357 return 0;
358}
359
360long wxRegionIterator::GetW() const
361{
362 if (m_current < m_numRects)
363 return m_rects[m_current].width ;
364 return 0;
365}
366
367long wxRegionIterator::GetH() const
368{
369 if (m_current < m_numRects)
370 return m_rects[m_current].height;
371 return 0;
372}
373