]> git.saurik.com Git - wxWidgets.git/blame - include/wx/region.h
Deallocate wxThreadSpecificInfo when wxThread ends.
[wxWidgets.git] / include / wx / region.h
CommitLineData
99d80019
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/region.h
3// Purpose: Base header for wxRegion
4// Author: Julian Smart
5// Modified by:
6// Created:
99d80019
JS
7// Copyright: (c) Julian Smart
8// Licence: wxWindows Licence
9/////////////////////////////////////////////////////////////////////////////
10
34138703
JS
11#ifndef _WX_REGION_H_BASE_
12#define _WX_REGION_H_BASE_
c801d85f 13
8a16d737
VZ
14#include "wx/gdiobj.h"
15#include "wx/gdicmn.h"
c87beb79 16
b5dbe15d
VS
17class WXDLLIMPEXP_FWD_CORE wxBitmap;
18class WXDLLIMPEXP_FWD_CORE wxColour;
19class WXDLLIMPEXP_FWD_CORE wxRegion;
8a16d737
VZ
20
21// ----------------------------------------------------------------------------
22// constants
23// ----------------------------------------------------------------------------
24
25// result of wxRegion::Contains() call
be2001fe
VS
26enum wxRegionContain
27{
28 wxOutRegion = 0,
29 wxPartRegion = 1,
30 wxInRegion = 2
31};
32
8a16d737
VZ
33// these constants are used with wxRegion::Combine() in the ports which have
34// this method
35enum wxRegionOp
36{
37 // Creates the intersection of the two combined regions.
38 wxRGN_AND,
39
40 // Creates a copy of the region
41 wxRGN_COPY,
42
43 // Combines the parts of first region that are not in the second one
44 wxRGN_DIFF,
45
46 // Creates the union of two combined regions.
47 wxRGN_OR,
48
49 // Creates the union of two regions except for any overlapping areas.
50 wxRGN_XOR
51};
52
53// ----------------------------------------------------------------------------
54// wxRegionBase defines wxRegion API
55// ----------------------------------------------------------------------------
56
53a2db12 57class WXDLLIMPEXP_CORE wxRegionBase : public wxGDIObject
8a16d737
VZ
58{
59public:
60 // ctors
61 // -----
62
63 // none are defined here but the following should be available:
64#if 0
65 wxRegion();
66 wxRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h);
67 wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight);
68 wxRegion(const wxRect& rect);
94a007ec 69 wxRegion(size_t n, const wxPoint *points, wxPolygonFillMode fillStyle = wxODDEVEN_RULE);
8a16d737
VZ
70 wxRegion(const wxBitmap& bmp);
71 wxRegion(const wxBitmap& bmp, const wxColour& transp, int tolerance = 0);
72#endif // 0
73
74 // operators
75 // ---------
76
77 bool operator==(const wxRegion& region) const { return IsEqual(region); }
78 bool operator!=(const wxRegion& region) const { return !(*this == region); }
79
80
81 // accessors
82 // ---------
83
8a16d737
VZ
84 // Is region empty?
85 virtual bool IsEmpty() const = 0;
86 bool Empty() const { return IsEmpty(); }
87
88 // Is region equal (i.e. covers the same area as another one)?
89 bool IsEqual(const wxRegion& region) const;
90
91 // Get the bounding box
92 bool GetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const
93 { return DoGetBox(x, y, w, h); }
94 wxRect GetBox() const
95 {
96 wxCoord x, y, w, h;
97 return DoGetBox(x, y, w, h) ? wxRect(x, y, w, h) : wxRect();
98 }
99
100 // Test if the given point or rectangle is inside this region
101 wxRegionContain Contains(wxCoord x, wxCoord y) const
102 { return DoContainsPoint(x, y); }
103 wxRegionContain Contains(const wxPoint& pt) const
104 { return DoContainsPoint(pt.x, pt.y); }
105 wxRegionContain Contains(wxCoord x, wxCoord y, wxCoord w, wxCoord h) const
106 { return DoContainsRect(wxRect(x, y, w, h)); }
107 wxRegionContain Contains(const wxRect& rect) const
108 { return DoContainsRect(rect); }
109
110
111 // operations
112 // ----------
113
114 virtual void Clear() = 0;
115
116 // Move the region
117 bool Offset(wxCoord x, wxCoord y)
118 { return DoOffset(x, y); }
119 bool Offset(const wxPoint& pt)
120 { return DoOffset(pt.x, pt.y); }
121
122 // Union rectangle or region with this region.
123 bool Union(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
124 { return DoUnionWithRect(wxRect(x, y, w, h)); }
125 bool Union(const wxRect& rect)
126 { return DoUnionWithRect(rect); }
127 bool Union(const wxRegion& region)
128 { return DoUnionWithRegion(region); }
129
130#if wxUSE_IMAGE
131 // Use the non-transparent pixels of a wxBitmap for the region to combine
132 // with this region. First version takes transparency from bitmap's mask,
133 // second lets the user specify the colour to be treated as transparent
134 // along with an optional tolerance value.
135 // NOTE: implemented in common/rgncmn.cpp
136 bool Union(const wxBitmap& bmp);
137 bool Union(const wxBitmap& bmp, const wxColour& transp, int tolerance = 0);
138#endif // wxUSE_IMAGE
139
140 // Intersect rectangle or region with this one.
8e7cb70c 141 bool Intersect(wxCoord x, wxCoord y, wxCoord w, wxCoord h);
8a16d737
VZ
142 bool Intersect(const wxRect& rect);
143 bool Intersect(const wxRegion& region)
144 { return DoIntersect(region); }
145
146 // Subtract rectangle or region from this:
147 // Combines the parts of 'this' that are not part of the second region.
8e7cb70c 148 bool Subtract(wxCoord x, wxCoord y, wxCoord w, wxCoord h);
8a16d737
VZ
149 bool Subtract(const wxRect& rect);
150 bool Subtract(const wxRegion& region)
151 { return DoSubtract(region); }
152
153 // XOR: the union of two combined regions except for any overlapping areas.
8e7cb70c 154 bool Xor(wxCoord x, wxCoord y, wxCoord w, wxCoord h);
8a16d737
VZ
155 bool Xor(const wxRect& rect);
156 bool Xor(const wxRegion& region)
157 { return DoXor(region); }
158
159
160 // Convert the region to a B&W bitmap with the white pixels being inside
161 // the region.
162 wxBitmap ConvertToBitmap() const;
163
164protected:
165 virtual bool DoIsEqual(const wxRegion& region) const = 0;
166 virtual bool DoGetBox(wxCoord& x, wxCoord& y, wxCoord& w, wxCoord& h) const = 0;
167 virtual wxRegionContain DoContainsPoint(wxCoord x, wxCoord y) const = 0;
168 virtual wxRegionContain DoContainsRect(const wxRect& rect) const = 0;
169
170 virtual bool DoOffset(wxCoord x, wxCoord y) = 0;
171
172 virtual bool DoUnionWithRect(const wxRect& rect) = 0;
173 virtual bool DoUnionWithRegion(const wxRegion& region) = 0;
174
175 virtual bool DoIntersect(const wxRegion& region) = 0;
176 virtual bool DoSubtract(const wxRegion& region) = 0;
177 virtual bool DoXor(const wxRegion& region) = 0;
178};
179
180// some ports implement a generic Combine() function while others only
181// implement individual wxRegion operations, factor out the common code for the
182// ports with Combine() in this class
bd362275 183#if defined(__WXMSW__) || \
5398a2e0 184 ( defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON ) || \
8a16d737
VZ
185 defined(__WXPM__)
186
187#define wxHAS_REGION_COMBINE
188
53a2db12 189class WXDLLIMPEXP_CORE wxRegionWithCombine : public wxRegionBase
8a16d737
VZ
190{
191public:
192 // these methods are not part of public API as they're not implemented on
193 // all ports
194 bool Combine(wxCoord x, wxCoord y, wxCoord w, wxCoord h, wxRegionOp op);
195 bool Combine(const wxRect& rect, wxRegionOp op);
196 bool Combine(const wxRegion& region, wxRegionOp op)
197 { return DoCombine(region, op); }
198
199
200protected:
201 // the real Combine() method, to be defined in the derived class
202 virtual bool DoCombine(const wxRegion& region, wxRegionOp op) = 0;
203
204 // implement some wxRegionBase pure virtuals in terms of Combine()
c16b9bfe
PC
205 virtual bool DoUnionWithRect(const wxRect& rect);
206 virtual bool DoUnionWithRegion(const wxRegion& region);
207 virtual bool DoIntersect(const wxRegion& region);
208 virtual bool DoSubtract(const wxRegion& region);
209 virtual bool DoXor(const wxRegion& region);
8a16d737
VZ
210};
211
212#endif // ports with wxRegion::Combine()
213
bd362275 214#if defined(__WXMSW__)
c87beb79 215 #include "wx/msw/region.h"
1be7a35c 216#elif defined(__WXGTK20__)
c87beb79 217 #include "wx/gtk/region.h"
1be7a35c
MR
218#elif defined(__WXGTK__)
219 #include "wx/gtk1/region.h"
c87beb79
VZ
220#elif defined(__WXMOTIF__) || defined(__WXX11__)
221 #include "wx/x11/region.h"
b3c86150
VS
222#elif defined(__WXDFB__)
223 #include "wx/dfb/region.h"
34138703 224#elif defined(__WXMAC__)
ef0e9220 225 #include "wx/osx/region.h"
e64df9bc 226#elif defined(__WXCOCOA__)
c87beb79 227 #include "wx/cocoa/region.h"
1777b9bb 228#elif defined(__WXPM__)
c87beb79 229 #include "wx/os2/region.h"
c801d85f
KB
230#endif
231
8a16d737
VZ
232// ----------------------------------------------------------------------------
233// inline functions implementation
234// ----------------------------------------------------------------------------
235
236// NB: these functions couldn't be defined in the class declaration as they use
237// wxRegion and so can be only defined after including the header declaring
238// the real class
239
240inline bool wxRegionBase::Intersect(const wxRect& rect)
241{
242 return DoIntersect(wxRegion(rect));
243}
244
245inline bool wxRegionBase::Subtract(const wxRect& rect)
246{
247 return DoSubtract(wxRegion(rect));
248}
249
250inline bool wxRegionBase::Xor(const wxRect& rect)
251{
252 return DoXor(wxRegion(rect));
253}
254
8e7cb70c
PC
255// ...and these functions are here because they call the ones above, and its
256// not really proper to call an inline function before its defined inline.
257
258inline bool wxRegionBase::Intersect(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
259{
260 return Intersect(wxRect(x, y, w, h));
261}
262
263inline bool wxRegionBase::Subtract(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
264{
265 return Subtract(wxRect(x, y, w, h));
266}
267
268inline bool wxRegionBase::Xor(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
269{
270 return Xor(wxRect(x, y, w, h));
271}
272
8a16d737
VZ
273#ifdef wxHAS_REGION_COMBINE
274
275inline bool wxRegionWithCombine::Combine(wxCoord x,
276 wxCoord y,
277 wxCoord w,
278 wxCoord h,
279 wxRegionOp op)
280{
281 return DoCombine(wxRegion(x, y, w, h), op);
282}
283
284inline bool wxRegionWithCombine::Combine(const wxRect& rect, wxRegionOp op)
285{
286 return DoCombine(wxRegion(rect), op);
287}
288
289#endif // wxHAS_REGION_COMBINE
290
291#endif // _WX_REGION_H_BASE_