1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Base header for wxRegion
4 // Author: Julian Smart
7 // Copyright: (c) Julian Smart
8 // Licence: wxWindows Licence
9 /////////////////////////////////////////////////////////////////////////////
11 #ifndef _WX_REGION_H_BASE_
12 #define _WX_REGION_H_BASE_
14 #include "wx/gdiobj.h"
15 #include "wx/gdicmn.h"
17 class WXDLLIMPEXP_FWD_CORE wxBitmap
;
18 class WXDLLIMPEXP_FWD_CORE wxColour
;
19 class WXDLLIMPEXP_FWD_CORE wxRegion
;
21 // ----------------------------------------------------------------------------
23 // ----------------------------------------------------------------------------
25 // result of wxRegion::Contains() call
33 // these constants are used with wxRegion::Combine() in the ports which have
37 // Creates the intersection of the two combined regions.
40 // Creates a copy of the region
43 // Combines the parts of first region that are not in the second one
46 // Creates the union of two combined regions.
49 // Creates the union of two regions except for any overlapping areas.
53 // ----------------------------------------------------------------------------
54 // wxRegionBase defines wxRegion API
55 // ----------------------------------------------------------------------------
57 class WXDLLIMPEXP_CORE wxRegionBase
: public wxGDIObject
63 // none are defined here but the following should be available:
66 wxRegion(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
);
67 wxRegion(const wxPoint
& topLeft
, const wxPoint
& bottomRight
);
68 wxRegion(const wxRect
& rect
);
69 wxRegion(size_t n
, const wxPoint
*points
, wxPolygonFillMode fillStyle
= wxODDEVEN_RULE
);
70 wxRegion(const wxBitmap
& bmp
);
71 wxRegion(const wxBitmap
& bmp
, const wxColour
& transp
, int tolerance
= 0);
77 bool operator==(const wxRegion
& region
) const { return IsEqual(region
); }
78 bool operator!=(const wxRegion
& region
) const { return !(*this == region
); }
85 virtual bool IsEmpty() const = 0;
86 bool Empty() const { return IsEmpty(); }
88 // Is region equal (i.e. covers the same area as another one)?
89 bool IsEqual(const wxRegion
& region
) const;
91 // Get the bounding box
92 bool GetBox(wxCoord
& x
, wxCoord
& y
, wxCoord
& w
, wxCoord
& h
) const
93 { return DoGetBox(x
, y
, w
, h
); }
97 return DoGetBox(x
, y
, w
, h
) ? wxRect(x
, y
, w
, h
) : wxRect();
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
); }
114 virtual void Clear() = 0;
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
); }
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
); }
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
140 // Intersect rectangle or region with this one.
141 bool Intersect(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
);
142 bool Intersect(const wxRect
& rect
);
143 bool Intersect(const wxRegion
& region
)
144 { return DoIntersect(region
); }
146 // Subtract rectangle or region from this:
147 // Combines the parts of 'this' that are not part of the second region.
148 bool Subtract(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
);
149 bool Subtract(const wxRect
& rect
);
150 bool Subtract(const wxRegion
& region
)
151 { return DoSubtract(region
); }
153 // XOR: the union of two combined regions except for any overlapping areas.
154 bool Xor(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
);
155 bool Xor(const wxRect
& rect
);
156 bool Xor(const wxRegion
& region
)
157 { return DoXor(region
); }
160 // Convert the region to a B&W bitmap with the white pixels being inside
162 wxBitmap
ConvertToBitmap() const;
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;
170 virtual bool DoOffset(wxCoord x
, wxCoord y
) = 0;
172 virtual bool DoUnionWithRect(const wxRect
& rect
) = 0;
173 virtual bool DoUnionWithRegion(const wxRegion
& region
) = 0;
175 virtual bool DoIntersect(const wxRegion
& region
) = 0;
176 virtual bool DoSubtract(const wxRegion
& region
) = 0;
177 virtual bool DoXor(const wxRegion
& region
) = 0;
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
183 #if defined(__WXMSW__) || \
184 ( defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON ) || \
187 #define wxHAS_REGION_COMBINE
189 class WXDLLIMPEXP_CORE wxRegionWithCombine
: public wxRegionBase
192 // these methods are not part of public API as they're not implemented on
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
); }
201 // the real Combine() method, to be defined in the derived class
202 virtual bool DoCombine(const wxRegion
& region
, wxRegionOp op
) = 0;
204 // implement some wxRegionBase pure virtuals in terms of Combine()
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
);
212 #endif // ports with wxRegion::Combine()
214 #if defined(__WXMSW__)
215 #include "wx/msw/region.h"
216 #elif defined(__WXGTK20__)
217 #include "wx/gtk/region.h"
218 #elif defined(__WXGTK__)
219 #include "wx/gtk1/region.h"
220 #elif defined(__WXMOTIF__) || defined(__WXX11__)
221 #include "wx/x11/region.h"
222 #elif defined(__WXDFB__)
223 #include "wx/dfb/region.h"
224 #elif defined(__WXMAC__)
225 #include "wx/osx/region.h"
226 #elif defined(__WXCOCOA__)
227 #include "wx/cocoa/region.h"
228 #elif defined(__WXPM__)
229 #include "wx/os2/region.h"
232 // ----------------------------------------------------------------------------
233 // inline functions implementation
234 // ----------------------------------------------------------------------------
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
240 inline bool wxRegionBase::Intersect(const wxRect
& rect
)
242 return DoIntersect(wxRegion(rect
));
245 inline bool wxRegionBase::Subtract(const wxRect
& rect
)
247 return DoSubtract(wxRegion(rect
));
250 inline bool wxRegionBase::Xor(const wxRect
& rect
)
252 return DoXor(wxRegion(rect
));
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.
258 inline bool wxRegionBase::Intersect(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
)
260 return Intersect(wxRect(x
, y
, w
, h
));
263 inline bool wxRegionBase::Subtract(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
)
265 return Subtract(wxRect(x
, y
, w
, h
));
268 inline bool wxRegionBase::Xor(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
)
270 return Xor(wxRect(x
, y
, w
, h
));
273 #ifdef wxHAS_REGION_COMBINE
275 inline bool wxRegionWithCombine::Combine(wxCoord x
,
281 return DoCombine(wxRegion(x
, y
, w
, h
), op
);
284 inline bool wxRegionWithCombine::Combine(const wxRect
& rect
, wxRegionOp op
)
286 return DoCombine(wxRegion(rect
), op
);
289 #endif // wxHAS_REGION_COMBINE
291 #endif // _WX_REGION_H_BASE_