]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented wxRegion::Offset() for MSW and documented it
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 31 Jan 2002 16:00:13 +0000 (16:00 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 31 Jan 2002 16:00:13 +0000 (16:00 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13936 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/region.tex
include/wx/msw/region.h
src/msw/region.cpp

index a5c3001478b3e92649fb6aa1fb04e95d389c9b83..dbffb944659a914425abd783bcd00def3bfb6f84 100644 (file)
@@ -24,7 +24,7 @@ reference counting, so copying and assignment operations are fast.
 
 Default constructor.
 
 
 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.
 
 
 Constructs a rectangular region with the given position and size.
 
@@ -97,7 +97,7 @@ Returns the outer bounds of the region.
 
 \membersection{wxRegion::Intersect}\label{wxregionintersect}
 
 
 \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.
 
 
 Finds the intersection of this region and another, rectangular region, specified using position and size.
 
@@ -111,7 +111,7 @@ Finds the intersection of this region and another region.
 
 \wxheading{Return value}
 
 
 \wxheading{Return value}
 
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
 
 \wxheading{Remarks}
 
 
 \wxheading{Remarks}
 
@@ -122,7 +122,7 @@ is stored in this region.
 
 \constfunc{bool}{IsEmpty}{\void}
 
 
 \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}
 
 
 \membersection{wxRegion::Subtract}\label{wxregionsubstract}
 
@@ -136,16 +136,27 @@ Subtracts a region from this region.
 
 \wxheading{Return value}
 
 
 \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.
 
 
 \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}
 
 \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.
 
 
 Finds the union of this region and another, rectangular region, specified using position and size.
 
@@ -159,7 +170,7 @@ Finds the union of this region and another region.
 
 \wxheading{Return value}
 
 
 \wxheading{Return value}
 
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
 
 \wxheading{Remarks}
 
 
 \wxheading{Remarks}
 
@@ -168,7 +179,7 @@ The result is stored in this region.
 
 \membersection{wxRegion::Xor}\label{wxregionxor}
 
 
 \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.
 
 
 Finds the Xor of this region and another, rectangular region, specified using position and size.
 
@@ -182,7 +193,7 @@ Finds the Xor of this region and another region.
 
 \wxheading{Return value}
 
 
 \wxheading{Return value}
 
-TRUE if successful, FALSE otherwise.
+{\tt TRUE} if successful, {\tt FALSE} otherwise.
 
 \wxheading{Remarks}
 
 
 \wxheading{Remarks}
 
@@ -231,37 +242,37 @@ Creates an iterator object given a region.
 
 \membersection{wxRegionIterator::GetX}
 
 
 \membersection{wxRegionIterator::GetX}
 
-\constfunc{long}{GetX}{\void}
+\constfunc{wxCoord}{GetX}{\void}
 
 Returns the x value for the current region.
 
 \membersection{wxRegionIterator::GetY}
 
 
 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}
 
 
 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}
 
 
 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}
 
 
 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}
 
 
 An alias for GetHeight.
 
 \membersection{wxRegionIterator::GetHeight}
 
-\constfunc{long}{GetWidth}{\void}
+\constfunc{wxCoord}{GetWidth}{\void}
 
 Returns the width value for the current region.
 
 
 Returns the width value for the current region.
 
@@ -275,7 +286,7 @@ Returns the current rectangle.
 
 \constfunc{bool}{HaveRects}{\void}
 
 
 \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}
 
 
 \membersection{wxRegionIterator::Reset}
 
@@ -299,7 +310,7 @@ Increment operator. Increments the iterator to the next region.
 
 \constfunc{}{operator bool}{\void}
 
 
 \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.
 
 
 You can use this to test the iterator object as if it were of type bool.
 
index 58c4d94baa1054b58e745faf5047962155cb7d11..ae99e4a5d624e3988f60e1504f85f86d3a27be6a 100644 (file)
@@ -59,31 +59,38 @@ public:
         { Ref(r); return (*this); }
 
     // Modify region
         { Ref(r); return (*this); }
 
     // Modify region
+    // -------------
+
     // Clear current region
     // Clear current region
-    void Clear(void);
+    void Clear();
+
+    // Move the region
+    bool Offset(wxCoord x, wxCoord y);
 
     // Union rectangle or region with this.
 
     // 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.
 
     // 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.
 
     // 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.
 
     // 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
 
     // Information on region
+    // ---------------------
+
     // Outer bounds of region
     void GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const;
     wxRect GetBox(void) const ;
     // Outer bounds of region
     void GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const;
     wxRect GetBox(void) const ;
@@ -110,8 +117,13 @@ public:
     // Get internal region handle
     WXHRGN GetHRGN() 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;
     friend class WXDLLEXPORT wxRegionIterator;
+
+    DECLARE_DYNAMIC_CLASS(wxRegion)
 };
 
 class WXDLLEXPORT wxRegionIterator : public wxObject
 };
 
 class WXDLLEXPORT wxRegionIterator : public wxObject
index c91f27635009bc17bebb451f20f0efdaf3e3c967..d0336daaff5599ea84e01de4e487ef594a92951c 100644 (file)
@@ -127,6 +127,16 @@ wxRegion::~wxRegion()
     // m_refData unrefed in ~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
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // Modify region
 //-----------------------------------------------------------------------------
@@ -137,18 +147,30 @@ void wxRegion::Clear()
     UnRef();
 }
 
     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)
 {
 // 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);
 
 
     HRGN rectRegion = ::CreateRectRgn(x, y, x + width, y + height);
 
@@ -164,7 +186,11 @@ bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRe
             mode = RGN_COPY; break ;
     }
 
             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);
 
 
     ::DeleteObject(rectRegion);
 
@@ -177,14 +203,7 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
     if (region.Empty())
         return FALSE;
 
     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)
 
     int mode = 0;
     switch (op)