]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/region.cpp
Add wxGrid::Render() for drawing the grid to any wxDC.
[wxWidgets.git] / src / msw / region.cpp
index 38d3267d4404e6b3189a1f84a9f5bc0280737775..fece55e9c5e9357e0ceeec86bc44efa420e60191 100644 (file)
@@ -1,11 +1,11 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:      msw/region.cpp
+// Name:      src/msw/region.cpp
 // Purpose:   wxRegion implementation using Win32 API
-// Author:    Markus Holzem, Vadim Zeitlin
+// Author:    Vadim Zeitlin
 // Modified by:
 // Created:   Fri Oct 24 10:46:34 MET 1997
 // RCS-ID:    $Id$
-// Copyright: (c) 1997-2002 wxWindows team
+// Copyright: (c) 1997-2002 wxWidgets team
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "region.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #include "wx/region.h"
-#include "wx/gdicmn.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/gdicmn.h"
+#endif
 
 #include "wx/msw/private.h"
 
@@ -48,9 +47,9 @@ public:
         m_region = 0;
     }
 
-    wxRegionRefData(const wxRegionRefData& data)
+    wxRegionRefData(const wxRegionRefData& data) : wxGDIRefData()
     {
-#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
         DWORD noBytes = ::GetRegionData(data.m_region, 0, NULL);
         RGNDATA *rgnData = (RGNDATA*) new char[noBytes];
         ::GetRegionData(data.m_region, noBytes, rgnData);
@@ -73,7 +72,7 @@ public:
 
 private:
 // Cannot use
-//  DECLARE_NO_COPY_CLASS(wxRegionRefData)
+//  wxDECLARE_NO_COPY_CLASS(wxRegionRefData);
 // because copy constructor is explicitly declared above;
 // but no copy assignment operator is defined, so declare
 // it private to prevent the compiler from defining it:
@@ -93,7 +92,7 @@ private:
 
 wxRegion::wxRegion()
 {
-    m_refData = (wxRegionRefData *)NULL;
+    m_refData = NULL;
 }
 
 wxRegion::wxRegion(WXHRGN hRegion)
@@ -120,9 +119,12 @@ wxRegion::wxRegion(const wxRect& rect)
     M_REGION = ::CreateRectRgn(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height);
 }
 
-wxRegion::wxRegion(size_t n, const wxPoint *points, int fillStyle)
+wxRegion::wxRegion(size_t n, const wxPoint *points, wxPolygonFillMode fillStyle)
 {
-#ifdef __WXMICROWIN__
+#if defined(__WXMICROWIN__) || defined(__WXWINCE__)
+    wxUnusedVar(n);
+    wxUnusedVar(points);
+    wxUnusedVar(fillStyle);
     m_refData = NULL;
     M_REGION = NULL;
 #else
@@ -141,12 +143,12 @@ wxRegion::~wxRegion()
     // m_refData unrefed in ~wxObject
 }
 
-wxObjectRefData *wxRegion::CreateRefData() const
+wxGDIRefData *wxRegion::CreateGDIRefData() const
 {
     return new wxRegionRefData;
 }
 
-wxObjectRefData *wxRegion::CloneRefData(const wxObjectRefData *data) const
+wxGDIRefData *wxRegion::CloneGDIRefData(const wxGDIRefData *data) const
 {
     return new wxRegionRefData(*(wxRegionRefData *)data);
 }
@@ -161,30 +163,31 @@ void wxRegion::Clear()
     UnRef();
 }
 
-bool wxRegion::Offset(wxCoord x, wxCoord y)
+bool wxRegion::DoOffset(wxCoord x, wxCoord y)
 {
-    wxCHECK_MSG( M_REGION, FALSE, _T("invalid wxRegion") );
+    const HRGN hrgn = GetHrgn();
+    wxCHECK_MSG( hrgn, false, wxT("invalid wxRegion") );
 
     if ( !x && !y )
     {
         // nothing to do
-        return TRUE;
+        return true;
     }
 
     AllocExclusive();
 
-    if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
+    if ( ::OffsetRgn(hrgn, x, y) == ERROR )
     {
-        wxLogLastError(_T("OffsetRgn"));
+        wxLogLastError(wxT("OffsetRgn"));
 
-        return FALSE;
+        return false;
     }
 
-    return TRUE;
+    return true;
 }
 
 // combine another region with this one
-bool wxRegion::Combine(const wxRegion& rgn, wxRegionOp op)
+bool wxRegion::DoCombine(const wxRegion& rgn, wxRegionOp op)
 {
     // we can't use the API functions if we don't have a valid region handle
     if ( !m_refData )
@@ -200,13 +203,13 @@ bool wxRegion::Combine(const wxRegion& rgn, wxRegionOp op)
                 break;
 
             default:
-                wxFAIL_MSG( _T("unknown region operation") );
+                wxFAIL_MSG( wxT("unknown region operation") );
                 // fall through
 
             case wxRGN_AND:
             case wxRGN_DIFF:
                 // leave empty/invalid
-                return FALSE;
+                return false;
         }
     }
     else // we have a valid region
@@ -233,7 +236,7 @@ bool wxRegion::Combine(const wxRegion& rgn, wxRegionOp op)
                 break;
 
             default:
-                wxFAIL_MSG( _T("unknown region operation") );
+                wxFAIL_MSG( wxT("unknown region operation") );
                 // fall through
 
             case wxRGN_COPY:
@@ -243,27 +246,13 @@ bool wxRegion::Combine(const wxRegion& rgn, wxRegionOp op)
 
         if ( ::CombineRgn(M_REGION, M_REGION, M_REGION_OF(rgn), mode) == ERROR )
         {
-            wxLogLastError(_T("CombineRgn"));
+            wxLogLastError(wxT("CombineRgn"));
 
-            return FALSE;
+            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)
-{
-    return Combine(wxRegion(x, y, width, height), op);
-}
-
-bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
-{
-    return Combine(rect.GetLeft(), rect.GetTop(),
-                   rect.GetWidth(), rect.GetHeight(), op);
+    return true;
 }
 
 // ----------------------------------------------------------------------------
@@ -271,7 +260,7 @@ bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
 // ----------------------------------------------------------------------------
 
 // Outer bounds of region
-void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const
+bool wxRegion::DoGetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const
 {
     if (m_refData)
     {
@@ -281,22 +270,19 @@ void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const
         y = rect.top;
         w = rect.right - rect.left;
         h = rect.bottom - rect.top;
+
+        return true;
     }
     else
     {
         x = y = w = h = 0;
-    }
-}
 
-wxRect wxRegion::GetBox() const
-{
-    wxCoord x, y, w, h;
-    GetBox(x, y, w, h);
-    return wxRect(x, y, w, h);
+        return false;
+    }
 }
 
 // Is region empty?
-bool wxRegion::Empty() const
+bool wxRegion::IsEmpty() const
 {
     wxCoord x, y, w, h;
     GetBox(x, y, w, h);
@@ -304,12 +290,17 @@ bool wxRegion::Empty() const
     return (w == 0) && (h == 0);
 }
 
+bool wxRegion::DoIsEqual(const wxRegion& region) const
+{
+    return ::EqualRgn(M_REGION, M_REGION_OF(region)) != 0;
+}
+
 // ----------------------------------------------------------------------------
 // wxRegion hit testing
 // ----------------------------------------------------------------------------
 
 // Does the region contain the point (x,y)?
-wxRegionContain wxRegion::Contains(wxCoord x, wxCoord y) const
+wxRegionContain wxRegion::DoContainsPoint(wxCoord x, wxCoord y) const
 {
     if (!m_refData)
         return wxOutRegion;
@@ -317,32 +308,16 @@ wxRegionContain wxRegion::Contains(wxCoord x, wxCoord y) const
     return ::PtInRegion(M_REGION, (int) x, (int) y) ? wxInRegion : wxOutRegion;
 }
 
-// Does the region contain the point pt?
-wxRegionContain wxRegion::Contains(const wxPoint& pt) const
-{
-    return Contains(pt.x, pt.y);
-}
-
 // Does the region contain the rectangle (x, y, w, h)?
-wxRegionContain wxRegion::Contains(wxCoord x, wxCoord y,
-                                   wxCoord w, wxCoord h) const
+wxRegionContain wxRegion::DoContainsRect(const wxRect& rect) const
 {
     if (!m_refData)
         return wxOutRegion;
 
-    RECT rect;
-    rect.left = x;
-    rect.top = y;
-    rect.right = x + w;
-    rect.bottom = y + h;
-
-    return ::RectInRegion(M_REGION, &rect) ? wxInRegion : wxOutRegion;
-}
+    RECT rc;
+    wxCopyRectToRECT(rect, rc);
 
-// Does the region contain the rectangle rect
-wxRegionContain wxRegion::Contains(const wxRect& rect) const
-{
-    return Contains(rect.x, rect.y, rect.width, rect.height);
+    return ::RectInRegion(M_REGION, &rc) ? wxInRegion : wxOutRegion;
 }
 
 // Get internal region handle
@@ -410,18 +385,12 @@ void wxRegionIterator::Reset(const wxRegion& region)
     m_current = 0;
     m_region = region;
 
-    if (m_rects)
-    {
-        delete[] m_rects;
-
-        m_rects = NULL;
-    }
+    wxDELETEA(m_rects);
 
     if (m_region.Empty())
         m_numRects = 0;
     else
     {
-#if defined(__WIN32__)
         DWORD noBytes = ::GetRegionData(((wxRegionRefData*)region.m_refData)->m_region, 0, NULL);
         RGNDATA *rgnData = (RGNDATA*) new char[noBytes];
         ::GetRegionData(((wxRegionRefData*)region.m_refData)->m_region, noBytes, rgnData);
@@ -442,17 +411,6 @@ void wxRegionIterator::Reset(const wxRegion& region)
         m_numRects = header->nCount;
 
         delete[] (char*) rgnData;
-#else // Win16
-        RECT rect;
-        ::GetRgnBox(((wxRegionRefData*)region.m_refData)->m_region, &rect);
-        m_rects = new wxRect[1];
-        m_rects[0].x = rect.left;
-        m_rects[0].y = rect.top;
-        m_rects[0].width = rect.right - rect.left;
-        m_rects[0].height = rect.bottom - rect.top;
-
-        m_numRects = 1;
-#endif // Win32/16
     }
 }
 
@@ -479,29 +437,28 @@ wxRegionIterator wxRegionIterator::operator ++ (int)
 
 wxCoord wxRegionIterator::GetX() const
 {
-    wxCHECK_MSG( m_current < m_numRects, 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( m_current < m_numRects, 0, wxT("invalid wxRegionIterator") );
 
     return m_rects[m_current].x;
 }
 
 wxCoord wxRegionIterator::GetY() const
 {
-    wxCHECK_MSG( m_current < m_numRects, 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( m_current < m_numRects, 0, wxT("invalid wxRegionIterator") );
 
     return m_rects[m_current].y;
 }
 
 wxCoord wxRegionIterator::GetW() const
 {
-    wxCHECK_MSG( m_current < m_numRects, 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( m_current < m_numRects, 0, wxT("invalid wxRegionIterator") );
 
     return m_rects[m_current].width;
 }
 
 wxCoord wxRegionIterator::GetH() const
 {
-    wxCHECK_MSG( m_current < m_numRects, 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( m_current < m_numRects, 0, wxT("invalid wxRegionIterator") );
 
     return m_rects[m_current].height;
 }
-