/////////////////////////////////////////////////////////////////////////////
-// File: region.cpp
+// File: src/x11/region.cpp
// Purpose: Region class
-// Author: Markus Holzem, Julian Smart, Robert Roebling
+// Author: Julian Smart, Robert Roebling
// Created: Fri Oct 24 10:46:34 MET 1997
-// RCS-ID: $Id$
-// Copyright: (c) 1997 Markus Holzem, Julian Smart, Robert Roebling
+// RCS-ID: $Id$
+// Copyright: (c) 1997 Julian Smart, Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "region.h"
-#endif
+// for compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
#include "wx/region.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/log.h"
+#endif
+
#include "wx/gdicmn.h"
-#include "wx/log.h"
#ifdef __VMS__
#pragma message disable nosimpint
{
m_region = NULL;
}
-
+
wxRegionRefData(const wxRegionRefData& refData)
{
m_region = XCreateRegion();
XUnionRegion( refData.m_region, m_region, m_region );
}
-
+
~wxRegionRefData()
{
if (m_region)
#define M_REGIONDATA ((wxRegionRefData *)m_refData)
#define M_REGIONDATA_OF(rgn) ((wxRegionRefData *)(rgn.m_refData))
-IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject);
-IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator,wxObject);
+IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator,wxObject)
// ----------------------------------------------------------------------------
// wxRegion construction
void wxRegion::InitRect(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
{
XRectangle rect;
- rect.x = x;
- rect.y = y;
- rect.width = w;
- rect.height = h;
-
+ rect.x = (short)x;
+ rect.y = (short)y;
+ rect.width = (unsigned short)w;
+ rect.height = (unsigned short)h;
+
m_refData = new wxRegionRefData();
-
+
M_REGIONDATA->m_region = XCreateRegion();
XUnionRectWithRegion( &rect, M_REGIONDATA->m_region, M_REGIONDATA->m_region );
}
-wxRegion::wxRegion( size_t n, const wxPoint *points, int fillStyle )
+wxRegion::wxRegion( size_t WXUNUSED(n), const wxPoint *WXUNUSED(points), int WXUNUSED(fillStyle) )
{
#if 0
XPoint *xpoints = new XPoint[n];
// wxRegion comparison
// ----------------------------------------------------------------------------
-bool wxRegion::operator==( const wxRegion& region )
+bool wxRegion::operator==( const wxRegion& region ) const
{
- if (m_refData == region.m_refData) return TRUE;
+ if (m_refData == region.m_refData) return true;
+
+ if (!m_refData || !region.m_refData) return false;
- if (!m_refData || !region.m_refData) return FALSE;
-
// compare the regions themselves, not the pointers to ref data!
return XEqualRegion( M_REGIONDATA->m_region,
- M_REGIONDATA_OF(region)->m_region );
+ M_REGIONDATA_OF(region)->m_region ) == True;
}
// ----------------------------------------------------------------------------
bool wxRegion::Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
{
+ // work around for XUnionRectWithRegion() bug: taking a union with an empty
+ // rect results in an empty region (at least XFree 3.3.6 and 4.0 have this
+ // problem)
+ if ( !width || !height )
+ return true;
+
XRectangle rect;
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
-
+ rect.x = (short)x;
+ rect.y = (short)y;
+ rect.width = (unsigned short)width;
+ rect.height = (unsigned short)height;
+
if (!m_refData)
{
m_refData = new wxRegionRefData();
XUnionRectWithRegion( &rect, M_REGIONDATA->m_region, M_REGIONDATA->m_region );
}
- return TRUE;
+ return true;
}
bool wxRegion::Union( const wxRect& rect )
bool wxRegion::Union( const wxRegion& region )
{
if (region.IsNull())
- return FALSE;
+ return false;
if (!m_refData)
{
{
AllocExclusive();
}
-
+
XUnionRegion( M_REGIONDATA->m_region,
M_REGIONDATA_OF(region)->m_region,
M_REGIONDATA->m_region );
- return TRUE;
+ return true;
}
bool wxRegion::Intersect( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
bool wxRegion::Intersect( const wxRect& rect )
{
wxRegion reg( rect );
-
+
return Intersect( reg );
}
bool wxRegion::Intersect( const wxRegion& region )
{
if (region.IsNull())
- return FALSE;
+ return false;
if (!m_refData)
{
m_refData = new wxRegionRefData();
M_REGIONDATA->m_region = XCreateRegion();
-
- // leave here
- return TRUE;
+
+ // leave here
+ return true;
}
else
{
M_REGIONDATA_OF(region)->m_region,
M_REGIONDATA->m_region );
- return TRUE;
+ return true;
}
bool wxRegion::Subtract( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
bool wxRegion::Subtract( const wxRegion& region )
{
if (region.IsNull())
- return FALSE;
+ return false;
if (!m_refData)
{
M_REGIONDATA_OF(region)->m_region,
M_REGIONDATA->m_region );
- return TRUE;
+ return true;
}
bool wxRegion::Xor( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
bool wxRegion::Xor( const wxRegion& region )
{
if (region.IsNull())
- return FALSE;
+ return false;
if (!m_refData)
{
XXorRegion( M_REGIONDATA->m_region,
M_REGIONDATA_OF(region)->m_region,
M_REGIONDATA->m_region );
-
- return TRUE;
+
+ return true;
}
// ----------------------------------------------------------------------------
bool wxRegion::Offset( wxCoord x, wxCoord y )
{
if (!m_refData)
- return FALSE;
+ return false;
AllocExclusive();
XOffsetRegion( M_REGIONDATA->m_region, x, y );
- return TRUE;
+ return true;
}
bool wxRegion::Empty() const
{
if (!m_refData)
- return TRUE;
+ return true;
- return XEmptyRegion( M_REGIONDATA->m_region );
+ return XEmptyRegion( M_REGIONDATA->m_region ) == True;
}
wxRegionContain wxRegion::Contains( wxCoord x, wxCoord y ) const
wxRIRefData::~wxRIRefData()
{
- delete m_rects;
+ delete [] m_rects;
}
void wxRIRefData::CreateRects( const wxRegion& region )
{
if (m_rects)
- delete m_rects;
+ delete [] m_rects;
m_rects = 0;
m_numRects = 0;
-
+
if (region.IsEmpty()) return;
-
+
Region r = (Region) region.GetX11Region();
if (r)
{
return r;
}
-