first pass of wxUniv merge - nothing works, most parts don't even compile
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10673 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2,15 +2,24 @@
|
||||
// Name: gtk/region.cpp
|
||||
// Purpose:
|
||||
// Author: Robert Roebling
|
||||
// Modified: VZ at 05.10.00: use Unshare(), comparison fixed
|
||||
// Id: $Id$
|
||||
// Copyright: (c) 1998 Robert Roebling
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "region.h"
|
||||
#pragma implementation "region.h"
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include "wx/region.h"
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
@@ -25,15 +34,18 @@
|
||||
#define OLDCODE 0
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxRegion
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "wx/log.h"
|
||||
|
||||
class wxRegionRefData: public wxObjectRefData
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRegionRefData: private class containing the information about the region
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class wxRegionRefData : public wxObjectRefData
|
||||
{
|
||||
public:
|
||||
wxRegionRefData();
|
||||
~wxRegionRefData();
|
||||
wxRegionRefData(const wxRegionRefData& refData);
|
||||
virtual ~wxRegionRefData();
|
||||
|
||||
GdkRegion *m_region;
|
||||
#if OLDCODE
|
||||
@@ -41,11 +53,49 @@ public:
|
||||
#endif
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// macros
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#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);
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRegionRefData
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxRegionRefData::wxRegionRefData()
|
||||
{
|
||||
m_region = (GdkRegion *) NULL;
|
||||
}
|
||||
|
||||
wxRegionRefData::wxRegionRefData(const wxRegionRefData& refData)
|
||||
{
|
||||
#ifdef __WXGTK20__
|
||||
m_region = gdk_region_copy(refData.m_region);
|
||||
#else
|
||||
m_region = gdk_region_new();
|
||||
GdkRegion *regCopy = gdk_regions_union(m_region, refData.m_region);
|
||||
gdk_region_destroy(m_region);
|
||||
m_region = regCopy;
|
||||
#endif
|
||||
|
||||
wxNode *node = refData.m_rects.First();
|
||||
while (node)
|
||||
{
|
||||
wxRect *r = (wxRect*)node->Data();
|
||||
m_rects.Append( (wxObject*) new wxRect(*r) );
|
||||
node = node->Next();
|
||||
}
|
||||
}
|
||||
|
||||
wxRegionRefData::~wxRegionRefData()
|
||||
{
|
||||
if (m_region) gdk_region_destroy( m_region );
|
||||
@@ -61,12 +111,18 @@ wxRegionRefData::~wxRegionRefData()
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRegion construction
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#define M_REGIONDATA ((wxRegionRefData *)m_refData)
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxRegion,wxGDIObject);
|
||||
|
||||
wxRegion::wxRegion()
|
||||
{
|
||||
}
|
||||
|
||||
wxRegion::wxRegion( wxCoord x, wxCoord y, wxCoord w, wxCoord h )
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
@@ -130,24 +186,42 @@ wxRegion::wxRegion( const wxRect& rect )
|
||||
#endif
|
||||
}
|
||||
|
||||
wxRegion::wxRegion()
|
||||
{
|
||||
}
|
||||
|
||||
wxRegion::~wxRegion()
|
||||
{
|
||||
}
|
||||
|
||||
bool wxRegion::operator == ( const wxRegion& region )
|
||||
bool wxRegion::operator==( const wxRegion& region )
|
||||
{
|
||||
return m_refData == region.m_refData;
|
||||
// VZ: compare the regions themselves, not the pointers to ref data!
|
||||
return gdk_region_equal(M_REGIONDATA->m_region,
|
||||
M_REGIONDATA_OF(region)->m_region);
|
||||
}
|
||||
|
||||
bool wxRegion::operator != ( const wxRegion& region )
|
||||
{
|
||||
return m_refData != region.m_refData;
|
||||
return !(*this == region);
|
||||
}
|
||||
|
||||
void wxRegion::Unshare()
|
||||
{
|
||||
if ( !m_refData )
|
||||
{
|
||||
m_refData = new wxRegionRefData;
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
else if ( m_refData->GetRefCount() > 1 )
|
||||
{
|
||||
wxRegionRefData *refData = new wxRegionRefData(*M_REGIONDATA);
|
||||
UnRef();
|
||||
m_refData = refData;
|
||||
}
|
||||
//else: we're not shared
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRegion operations
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxRegion::Clear()
|
||||
{
|
||||
UnRef();
|
||||
@@ -174,6 +248,8 @@ bool wxRegion::Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
||||
}
|
||||
else
|
||||
{
|
||||
Unshare();
|
||||
|
||||
#ifdef __WXGTK20__
|
||||
gdk_region_union_with_rect( M_REGIONDATA->m_region, &rect );
|
||||
#else
|
||||
@@ -182,7 +258,7 @@ bool wxRegion::Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
||||
M_REGIONDATA->m_region = reg;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#if OLDCODE
|
||||
M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(x,y,width,height) );
|
||||
#endif
|
||||
@@ -200,11 +276,7 @@ bool wxRegion::Union( const wxRegion& region )
|
||||
if (region.IsNull())
|
||||
return FALSE;
|
||||
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
Unshare();
|
||||
|
||||
#ifdef __WXGTK20__
|
||||
gdk_region_union( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
@@ -229,27 +301,33 @@ bool wxRegion::Union( const wxRegion& region )
|
||||
|
||||
bool wxRegion::Intersect( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
||||
{
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
wxRegion reg( x, y, width, height );
|
||||
Intersect( reg );
|
||||
return TRUE;
|
||||
|
||||
return Intersect( reg );
|
||||
}
|
||||
|
||||
bool wxRegion::Intersect( const wxRect& rect )
|
||||
{
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
wxRegion reg( rect );
|
||||
Intersect( reg );
|
||||
return Intersect( reg );
|
||||
}
|
||||
|
||||
// this helper function just computes the region intersection without updating
|
||||
// the list of rectangles each region maintaints: this allows us to call it
|
||||
// from Intersect() itself without going into infinite recursion as we would
|
||||
// if we called Intersect() itself recursively
|
||||
bool wxRegion::IntersectRegionOnly(const wxRegion& region)
|
||||
{
|
||||
Unshare();
|
||||
|
||||
#ifdef __WXGTK20__
|
||||
gdk_region_intersect( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
#else
|
||||
GdkRegion *reg = gdk_regions_intersect( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
gdk_region_destroy( M_REGIONDATA->m_region );
|
||||
M_REGIONDATA->m_region = reg;
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -264,41 +342,50 @@ bool wxRegion::Intersect( const wxRegion& region )
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef __WXGTK20__
|
||||
gdk_region_intersect( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
#else
|
||||
GdkRegion *reg = gdk_regions_intersect( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
gdk_region_destroy( M_REGIONDATA->m_region );
|
||||
M_REGIONDATA->m_region = reg;
|
||||
#endif
|
||||
|
||||
if ( !IntersectRegionOnly(region) )
|
||||
{
|
||||
GetRectList()->Clear();
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// we need to update the rect list as well
|
||||
wxList& list = *GetRectList();
|
||||
wxNode *node = list.First();
|
||||
while (node)
|
||||
{
|
||||
wxRect *r = (wxRect*)node->Data();
|
||||
|
||||
wxRegion regCopy = region;
|
||||
if ( regCopy.IntersectRegionOnly(*r) )
|
||||
{
|
||||
// replace the node with the intersection
|
||||
*r = regCopy.GetBox();
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO remove the rect from the list
|
||||
r->width = 0;
|
||||
r->height = 0;
|
||||
}
|
||||
|
||||
node = node->Next();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxRegion::Subtract( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
||||
{
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
wxRegion reg( x, y, width, height );
|
||||
Subtract( reg );
|
||||
return TRUE;
|
||||
return Subtract( reg );
|
||||
}
|
||||
|
||||
bool wxRegion::Subtract( const wxRect& rect )
|
||||
{
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
wxRegion reg( rect );
|
||||
Subtract( reg );
|
||||
return TRUE;
|
||||
return Subtract( reg );
|
||||
}
|
||||
|
||||
bool wxRegion::Subtract( const wxRegion& region )
|
||||
@@ -312,6 +399,8 @@ bool wxRegion::Subtract( const wxRegion& region )
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
Unshare();
|
||||
|
||||
#ifdef __WXGTK20__
|
||||
gdk_region_subtract( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
#else
|
||||
@@ -319,33 +408,20 @@ bool wxRegion::Subtract( const wxRegion& region )
|
||||
gdk_region_destroy( M_REGIONDATA->m_region );
|
||||
M_REGIONDATA->m_region = reg;
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxRegion::Xor( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
||||
{
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
wxRegion reg( x, y, width, height );
|
||||
Xor( reg );
|
||||
return TRUE;
|
||||
return Xor( reg );
|
||||
}
|
||||
|
||||
bool wxRegion::Xor( const wxRect& rect )
|
||||
{
|
||||
if (!m_refData)
|
||||
{
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
|
||||
wxRegion reg( rect );
|
||||
Xor( reg );
|
||||
return TRUE;
|
||||
return Xor( reg );
|
||||
}
|
||||
|
||||
bool wxRegion::Xor( const wxRegion& region )
|
||||
@@ -358,6 +434,10 @@ bool wxRegion::Xor( const wxRegion& region )
|
||||
m_refData = new wxRegionRefData();
|
||||
M_REGIONDATA->m_region = gdk_region_new();
|
||||
}
|
||||
else
|
||||
{
|
||||
Unshare();
|
||||
}
|
||||
|
||||
#ifdef __WXGTK20__
|
||||
gdk_region_xor( M_REGIONDATA->m_region, region.GetRegion() );
|
||||
@@ -380,29 +460,33 @@ bool wxRegion::Xor( const wxRegion& region )
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRegion tests
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxRegion::GetBox( wxCoord &x, wxCoord &y, wxCoord &w, wxCoord &h ) const
|
||||
{
|
||||
x = 0;
|
||||
y = 0;
|
||||
w = -1;
|
||||
h = -1;
|
||||
if (!m_refData)
|
||||
return;
|
||||
|
||||
GdkRectangle rect;
|
||||
gdk_region_get_clipbox( M_REGIONDATA->m_region, &rect );
|
||||
x = rect.x;
|
||||
y = rect.y;
|
||||
w = rect.width;
|
||||
h = rect.height;
|
||||
if ( m_refData )
|
||||
{
|
||||
GdkRectangle rect;
|
||||
gdk_region_get_clipbox( M_REGIONDATA->m_region, &rect );
|
||||
x = rect.x;
|
||||
y = rect.y;
|
||||
w = rect.width;
|
||||
h = rect.height;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = 0;
|
||||
y = 0;
|
||||
w = -1;
|
||||
h = -1;
|
||||
}
|
||||
}
|
||||
|
||||
wxRect wxRegion::GetBox() const
|
||||
{
|
||||
wxCoord x = 0;
|
||||
wxCoord y = 0;
|
||||
wxCoord w = -1;
|
||||
wxCoord h = -1;
|
||||
wxCoord x, y, w, h;
|
||||
GetBox( x, y, w, h );
|
||||
return wxRect( x, y, w, h );
|
||||
}
|
||||
@@ -476,9 +560,9 @@ wxList *wxRegion::GetRectList() const
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxRegionIterator
|
||||
//-----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if OLDCODE
|
||||
|
||||
@@ -563,7 +647,7 @@ wxCoord wxRegionIterator::GetH() const
|
||||
struct _XBox {
|
||||
short x1, x2, y1, y2;
|
||||
};
|
||||
|
||||
|
||||
struct _XRegion {
|
||||
long size , numRects;
|
||||
_XBox *rects, extents;
|
||||
@@ -682,5 +766,16 @@ wxCoord wxRegionIterator::GetH() const
|
||||
return ((wxRIRefData*)m_refData)->m_rects[m_current].height;
|
||||
}
|
||||
|
||||
wxRect wxRegionIterator::GetRect() const
|
||||
{
|
||||
wxRect r;
|
||||
wxNode *node = m_region.GetRectList()->Nth( m_current );
|
||||
|
||||
if (node)
|
||||
r = *((wxRect*)node->Data());
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user