Default constructor.
-\func{}{wxRegion}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}}
+\func{}{wxRegion}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Constructs a rectangular region with the given position and size.
\membersection{wxRegion::Intersect}\label{wxregionintersect}
-\func{bool}{Intersect}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}}
+\func{bool}{Intersect}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Finds the intersection of this region and another, rectangular region, specified using position and size.
\wxheading{Return value}
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks}
\constfunc{bool}{IsEmpty}{\void}
-Returns TRUE if the region is empty, FALSE otherwise.
+Returns {\tt TRUE} if the region is empty, {\tt FALSE} otherwise.
\membersection{wxRegion::Subtract}\label{wxregionsubstract}
\wxheading{Return value}
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks}
This operation combines the parts of 'this' region that are not part of the second region.
The result is stored in this region.
+\membersection{wxRegion::Offset}\label{wxregionoffset}
+
+\func{bool}{Offset}{\param{wxCoord}{ x}, \param{wxCoord}{ y}}
+
+Moves the region by the specified offsets in horizontal and vertical
+directions.
+
+\wxheading{Return value}
+
+{\tt TRUE} if successful, {\tt FALSE} otherwise (the region is unchanged then).
+
\membersection{wxRegion::Union}\label{wxregionunion}
-\func{bool}{Union}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}}
+\func{bool}{Union}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Finds the union of this region and another, rectangular region, specified using position and size.
\wxheading{Return value}
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks}
\membersection{wxRegion::Xor}\label{wxregionxor}
-\func{bool}{Xor}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}}
+\func{bool}{Xor}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Finds the Xor of this region and another, rectangular region, specified using position and size.
\wxheading{Return value}
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks}
\membersection{wxRegionIterator::GetX}
-\constfunc{long}{GetX}{\void}
+\constfunc{wxCoord}{GetX}{\void}
Returns the x value for the current region.
\membersection{wxRegionIterator::GetY}
-\constfunc{long}{GetY}{\void}
+\constfunc{wxCoord}{GetY}{\void}
Returns the y value for the current region.
\membersection{wxRegionIterator::GetW}
-\constfunc{long}{GetW}{\void}
+\constfunc{wxCoord}{GetW}{\void}
An alias for GetWidth.
\membersection{wxRegionIterator::GetWidth}
-\constfunc{long}{GetWidth}{\void}
+\constfunc{wxCoord}{GetWidth}{\void}
Returns the width value for the current region.
\membersection{wxRegionIterator::GetH}
-\constfunc{long}{GetH}{\void}
+\constfunc{wxCoord}{GetH}{\void}
An alias for GetHeight.
\membersection{wxRegionIterator::GetHeight}
-\constfunc{long}{GetWidth}{\void}
+\constfunc{wxCoord}{GetWidth}{\void}
Returns the width value for the current region.
\constfunc{bool}{HaveRects}{\void}
-Returns TRUE if there are still some rectangles; otherwise returns FALSE.
+Returns {\tt TRUE} if there are still some rectangles; otherwise returns {\tt FALSE}.
\membersection{wxRegionIterator::Reset}
\constfunc{}{operator bool}{\void}
-Returns TRUE if there are still some rectangles; otherwise returns FALSE.
+Returns {\tt TRUE} if there are still some rectangles; otherwise returns {\tt FALSE}.
You can use this to test the iterator object as if it were of type bool.
{ Ref(r); return (*this); }
// Modify region
+ // -------------
+
// Clear current region
- void Clear(void);
+ void Clear();
+
+ // Move the region
+ bool Offset(wxCoord x, wxCoord y);
// Union rectangle or region with this.
- inline bool Union(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_OR); }
- inline bool Union(const wxRect& rect) { return Combine(rect, wxRGN_OR); }
- inline bool Union(const wxRegion& region) { return Combine(region, wxRGN_OR); }
+ bool Union(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_OR); }
+ bool Union(const wxRect& rect) { return Combine(rect, wxRGN_OR); }
+ bool Union(const wxRegion& region) { return Combine(region, wxRGN_OR); }
// Intersect rectangle or region with this.
- inline bool Intersect(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_AND); }
- inline bool Intersect(const wxRect& rect) { return Combine(rect, wxRGN_AND); }
- inline bool Intersect(const wxRegion& region) { return Combine(region, wxRGN_AND); }
+ bool Intersect(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_AND); }
+ bool Intersect(const wxRect& rect) { return Combine(rect, wxRGN_AND); }
+ bool Intersect(const wxRegion& region) { return Combine(region, wxRGN_AND); }
// Subtract rectangle or region from this:
// Combines the parts of 'this' that are not part of the second region.
- inline bool Subtract(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_DIFF); }
- inline bool Subtract(const wxRect& rect) { return Combine(rect, wxRGN_DIFF); }
- inline bool Subtract(const wxRegion& region) { return Combine(region, wxRGN_DIFF); }
+ bool Subtract(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_DIFF); }
+ bool Subtract(const wxRect& rect) { return Combine(rect, wxRGN_DIFF); }
+ bool Subtract(const wxRegion& region) { return Combine(region, wxRGN_DIFF); }
// XOR: the union of two combined regions except for any overlapping areas.
- inline bool Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_XOR); }
- inline bool Xor(const wxRect& rect) { return Combine(rect, wxRGN_XOR); }
- inline bool Xor(const wxRegion& region) { return Combine(region, wxRGN_XOR); }
+ bool Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_XOR); }
+ bool Xor(const wxRect& rect) { return Combine(rect, wxRGN_XOR); }
+ bool Xor(const wxRegion& region) { return Combine(region, wxRGN_XOR); }
// Information on region
+ // ---------------------
+
// Outer bounds of region
void GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const;
wxRect GetBox(void) const ;
// Get internal region handle
WXHRGN GetHRGN() const;
- DECLARE_DYNAMIC_CLASS(wxRegion);
+protected:
+ virtual wxObjectRefData *CreateData() const;
+ virtual wxObjectRefData *CloneData(wxObjectRefData *data) const;
+
friend class WXDLLEXPORT wxRegionIterator;
+
+ DECLARE_DYNAMIC_CLASS(wxRegion)
};
class WXDLLEXPORT wxRegionIterator : public wxObject
// m_refData unrefed in ~wxObject
}
+wxObjectRefData *wxRegion::CreateData() const
+{
+ return new wxRegionRefData;
+}
+
+wxObjectRefData *wxRegion::CloneData(wxObjectRefData *data) const
+{
+ return new wxRegionRefData(*(wxRegionRefData *)data);
+}
+
//-----------------------------------------------------------------------------
// Modify region
//-----------------------------------------------------------------------------
UnRef();
}
+bool wxRegion::Offset(wxCoord x, wxCoord y)
+{
+ if ( !x && !y )
+ {
+ // nothing to do
+ return TRUE;
+ }
+
+ AllocExclusive();
+
+ if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
+ {
+ wxLogLastError(_T("OffsetRgn"));
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
// Combine rectangle (x, y, w, h) with this.
bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRegionOp op)
{
- // Don't change shared data
- if (!m_refData) {
- m_refData = new wxRegionRefData();
- } else if (m_refData->GetRefCount() > 1) {
- wxRegionRefData* ref = (wxRegionRefData*)m_refData;
- UnRef();
- m_refData = new wxRegionRefData(*ref);
- }
- // If ref count is 1, that means it's 'ours' anyway so no action.
+ AllocExclusive();
HRGN rectRegion = ::CreateRectRgn(x, y, x + width, y + height);
mode = RGN_COPY; break ;
}
- bool success = (ERROR != ::CombineRgn(M_REGION, M_REGION, rectRegion, mode));
+ bool success = ::CombineRgn(M_REGION, M_REGION, rectRegion, mode) != ERROR;
+ if ( !success )
+ {
+ wxLogLastError(_T("CombineRgn"));
+ }
::DeleteObject(rectRegion);
if (region.Empty())
return FALSE;
- // Don't change shared data
- if (!m_refData) {
- m_refData = new wxRegionRefData();
- } else if (m_refData->GetRefCount() > 1) {
- wxRegionRefData* ref = (wxRegionRefData*)m_refData;
- UnRef();
- m_refData = new wxRegionRefData(*ref);
- }
+ AllocExclusive();
int mode = 0;
switch (op)