/////////////////////////////////////////////////////////////////////////////
-// Name: msw/region.cpp
+// Name: src/msw/region.cpp
// Purpose: wxRegion implementation using Win32 API
// 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"
m_region = 0;
}
- wxRegionRefData(const wxRegionRefData& data)
+ wxRegionRefData(const wxRegionRefData& data) : wxGDIRefData()
{
#if defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
DWORD noBytes = ::GetRegionData(data.m_region, 0, NULL);
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:
wxRegion::wxRegion()
{
- m_refData = (wxRegionRefData *)NULL;
+ m_refData = NULL;
}
wxRegion::wxRegion(WXHRGN hRegion)
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)
{
#if defined(__WXMICROWIN__) || defined(__WXWINCE__)
+ wxUnusedVar(n);
+ wxUnusedVar(points);
+ wxUnusedVar(fillStyle);
m_refData = NULL;
M_REGION = NULL;
#else
// 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);
}
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 )
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
break;
default:
- wxFAIL_MSG( _T("unknown region operation") );
+ wxFAIL_MSG( wxT("unknown region operation") );
// fall through
case wxRGN_COPY:
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;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// 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)
{
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);
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;
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
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);
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
}
}
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;
}
-