X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c801d85f158c4cba50b588807daabdcbd0ed3853..41dee9d0ce93989c03848ebd7fc21fb402d4c247:/src/gtk/region.cpp diff --git a/src/gtk/region.cpp b/src/gtk/region.cpp index d7da03c61f..5e199e76a0 100644 --- a/src/gtk/region.cpp +++ b/src/gtk/region.cpp @@ -2,9 +2,8 @@ // Name: region.cpp // Purpose: // Author: Robert Roebling -// Created: 01/02/98 -// Id: -// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem +// Id: $Id$ +// Copyright: (c) 1998 Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,17 +28,26 @@ class wxRegionRefData: public wxObjectRefData public: GdkRegion *m_region; + wxList m_rects; }; wxRegionRefData::wxRegionRefData(void) { - m_region = NULL; -}; + m_region = (GdkRegion *) NULL; +} wxRegionRefData::~wxRegionRefData(void) { if (m_region) gdk_region_destroy( m_region ); -}; + + wxNode *node = m_rects.First(); + while (node) + { + wxRect *r = (wxRect*)node->Data(); + delete r; + node = node->Next(); + } +} //----------------------------------------------------------------------------- @@ -58,7 +66,8 @@ wxRegion::wxRegion( long x, long y, long w, long h ) rect.height = h; M_REGIONDATA->m_region = gdk_region_union_with_rect( reg, &rect ); gdk_region_destroy( reg ); -}; + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(x,y,w,h) ); +} wxRegion::wxRegion( const wxPoint& topLeft, const wxPoint& bottomRight ) { @@ -71,7 +80,8 @@ wxRegion::wxRegion( const wxPoint& topLeft, const wxPoint& bottomRight ) rect.height = bottomRight.y - rect.y; M_REGIONDATA->m_region = gdk_region_union_with_rect( reg, &rect ); gdk_region_destroy( reg ); -}; + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(topLeft,bottomRight) ); +} wxRegion::wxRegion( const wxRect& rect ) { @@ -84,24 +94,32 @@ wxRegion::wxRegion( const wxRect& rect ) g_rect.height = rect.height; M_REGIONDATA->m_region = gdk_region_union_with_rect( reg, &g_rect ); gdk_region_destroy( reg ); -}; + + wxNode *node = M_REGIONDATA->m_rects.First(); + while (node) + { + wxRect *r = (wxRect*)node->Data(); + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(r->x,r->y,r->width,r->height) ); + node = node->Next(); + } +} wxRegion::wxRegion(void) { m_refData = new wxRegionRefData(); M_REGIONDATA->m_region = gdk_region_new(); -}; +} wxRegion::~wxRegion(void) { -}; +} void wxRegion::Clear(void) { UnRef(); m_refData = new wxRegionRefData(); M_REGIONDATA->m_region = gdk_region_new(); -}; +} bool wxRegion::Union( long x, long y, long width, long height ) { @@ -113,8 +131,9 @@ bool wxRegion::Union( long x, long y, long width, long height ) GdkRegion *reg = gdk_region_union_with_rect( M_REGIONDATA->m_region, &rect ); gdk_region_destroy( M_REGIONDATA->m_region ); M_REGIONDATA->m_region = reg; + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(x,y,width,height) ); return TRUE; -}; +} bool wxRegion::Union( const wxRect& rect ) { @@ -126,30 +145,40 @@ bool wxRegion::Union( const wxRect& rect ) GdkRegion *reg = gdk_region_union_with_rect( M_REGIONDATA->m_region, &g_rect ); gdk_region_destroy( M_REGIONDATA->m_region ); M_REGIONDATA->m_region = reg; + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(rect.x,rect.y,rect.width,rect.height) ); return TRUE; -}; +} bool wxRegion::Union( const wxRegion& region ) { GdkRegion *reg = gdk_regions_union( M_REGIONDATA->m_region, region.GetRegion() ); gdk_region_destroy( M_REGIONDATA->m_region ); M_REGIONDATA->m_region = reg; + + wxNode *node = region.GetRectList()->First(); + while (node) + { + wxRect *r = (wxRect*)node->Data(); + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(r->x,r->y,r->width,r->height) ); + node = node->Next(); + } + return TRUE; -}; +} bool wxRegion::Intersect( long x, long y, long width, long height ) { wxRegion reg( x, y, width, height ); Intersect( reg ); return TRUE; -}; +} bool wxRegion::Intersect( const wxRect& rect ) { wxRegion reg( rect ); Intersect( reg ); return TRUE; -}; +} bool wxRegion::Intersect( const wxRegion& region ) { @@ -157,21 +186,21 @@ bool wxRegion::Intersect( const wxRegion& region ) gdk_region_destroy( M_REGIONDATA->m_region ); M_REGIONDATA->m_region = reg; return TRUE; -}; +} bool wxRegion::Subtract( long x, long y, long width, long height ) { wxRegion reg( x, y, width, height ); Subtract( reg ); return TRUE; -}; +} bool wxRegion::Subtract( const wxRect& rect ) { wxRegion reg( rect ); Subtract( reg ); return TRUE; -}; +} bool wxRegion::Subtract( const wxRegion& region ) { @@ -179,29 +208,38 @@ bool wxRegion::Subtract( const wxRegion& region ) gdk_region_destroy( M_REGIONDATA->m_region ); M_REGIONDATA->m_region = reg; return TRUE; -}; +} bool wxRegion::Xor( long x, long y, long width, long height ) { wxRegion reg( x, y, width, height ); Xor( reg ); return TRUE; -}; +} bool wxRegion::Xor( const wxRect& rect ) { wxRegion reg( rect ); Xor( reg ); return TRUE; -}; +} bool wxRegion::Xor( const wxRegion& region ) { GdkRegion *reg = gdk_regions_xor( M_REGIONDATA->m_region, region.GetRegion() ); gdk_region_destroy( M_REGIONDATA->m_region ); M_REGIONDATA->m_region = reg; + + wxNode *node = region.GetRectList()->First(); + while (node) + { + wxRect *r = (wxRect*)node->Data(); + M_REGIONDATA->m_rects.Append( (wxObject*) new wxRect(r->x,r->y,r->width,r->height) ); + node = node->Next(); + } + return TRUE; -}; +} void wxRegion::GetBox( long& x, long& y, long&w, long &h ) const { @@ -209,17 +247,56 @@ void wxRegion::GetBox( long& x, long& y, long&w, long &h ) const y = 0; w = -1; h = -1; -}; + wxNode *node = GetRectList()->First(); + while (node) + { + wxRect *r = (wxRect*)node->Data(); + if (node == GetRectList()->First()) + { + x = r->x; + y = r->y; + w = r->width; + h = r->height; + } + else + { + if (r->x < x) + { + x = r->x; + w += x - r->x; + } + if (r->y < y) + { + y = r->y; + h += y - r->y; + } + if (r->width+r->x > x+w) + { + w = r->x + r->width - x; + } + if (r->height+r->y > y+h) + { + h = r->y + r->height - y; + } + } + node = node->Next(); + } +} wxRect wxRegion::GetBox(void) const { - return wxRect( 0, 0, -1, -1 ); -}; + long x = 0; + long y = 0; + long w = -1; + long h = -1; + GetBox( x, y, w, h ); + return wxRect( x, y, w, h ); +} bool wxRegion::Empty(void) const { return gdk_region_empty( M_REGIONDATA->m_region ); -}; +} wxRegionContain wxRegion::Contains( long x, long y ) const { @@ -227,7 +304,7 @@ wxRegionContain wxRegion::Contains( long x, long y ) const return wxInRegion; else return wxOutRegion; -}; +} wxRegionContain wxRegion::Contains( long x, long y, long w, long h ) const { @@ -242,12 +319,103 @@ wxRegionContain wxRegion::Contains( long x, long y, long w, long h ) const case GDK_OVERLAP_RECTANGLE_IN: return wxInRegion; case GDK_OVERLAP_RECTANGLE_OUT: return wxOutRegion; case GDK_OVERLAP_RECTANGLE_PART: return wxPartRegion; - }; + } return wxOutRegion; -}; +} + +wxRegionContain wxRegion::Contains(const wxPoint& pt) const +{ + return Contains( pt.x, pt.y ); +} + +wxRegionContain wxRegion::Contains(const wxRect& rect) const +{ + return Contains( rect.x, rect.y, rect.width, rect.height ); +} GdkRegion *wxRegion::GetRegion(void) const { return M_REGIONDATA->m_region; -}; +} + +wxList *wxRegion::GetRectList() const +{ + return &(M_REGIONDATA->m_rects); +} + +//----------------------------------------------------------------------------- +// wxRegion +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator,wxObject); + +wxRegionIterator::wxRegionIterator(void) +{ + m_current = 0; +} + +wxRegionIterator::wxRegionIterator( const wxRegion& region ) +{ + m_region = region; + m_current = 0; +} + +void wxRegionIterator::Reset( const wxRegion& region ) +{ + m_region = region; + m_current = 0; +} + +wxRegionIterator::operator bool (void) const +{ + return m_current < m_region.GetRectList()->Number(); +} + +bool wxRegionIterator::HaveRects(void) const +{ + return m_current < m_region.GetRectList()->Number(); +} + +void wxRegionIterator::operator ++ (void) +{ + if (m_current < m_region.GetRectList()->Number()) ++m_current; +} + +void wxRegionIterator::operator ++ (int) +{ + if (m_current < m_region.GetRectList()->Number()) ++m_current; +} + +long wxRegionIterator::GetX(void) const +{ + wxNode *node = m_region.GetRectList()->Nth( m_current ); + if (!node) return 0; + wxRect *r = (wxRect*)node->Data(); + return r->x; +} + +long wxRegionIterator::GetY(void) const +{ + wxNode *node = m_region.GetRectList()->Nth( m_current ); + if (!node) return 0; + wxRect *r = (wxRect*)node->Data(); + return r->y; +} + +long wxRegionIterator::GetW(void) const +{ + wxNode *node = m_region.GetRectList()->Nth( m_current ); + if (!node) return 0; + wxRect *r = (wxRect*)node->Data(); + return r->width; +} + +long wxRegionIterator::GetH(void) const +{ + wxNode *node = m_region.GetRectList()->Nth( m_current ); + if (!node) return 0; + wxRect *r = (wxRect*)node->Data(); + return r->height; +} +