]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/region.cpp
Added wxRichTextXMLHandler::RegisterNodeName so custom content classes can be added...
[wxWidgets.git] / src / gtk / region.cpp
index 91eecba5e4bd3dae81ff755a7ccb85626bdedbdd..92ec47f1e790cf18884d97512405345fee55a8d4 100644 (file)
@@ -32,7 +32,7 @@
 // wxRegionRefData: private class containing the information about the region
 // ----------------------------------------------------------------------------
 
-class wxRegionRefData : public wxObjectRefData
+class wxRegionRefData : public wxGDIRefData
 {
 public:
     wxRegionRefData()
@@ -41,7 +41,7 @@ public:
     }
 
     wxRegionRefData(const wxRegionRefData& refData)
-        : wxObjectRefData()
+        : wxGDIRefData()
     {
         m_region = gdk_region_copy(refData.m_region);
     }
@@ -90,7 +90,8 @@ wxRegion::wxRegion( GdkRegion *region )
     M_REGIONDATA->m_region = gdk_region_copy( region );
 }
 
-wxRegion::wxRegion( size_t n, const wxPoint *points, int fillStyle )
+wxRegion::wxRegion( size_t n, const wxPoint *points,
+                    wxPolygonFillMode fillStyle )
 {
     GdkPoint *gdkpoints = new GdkPoint[n];
     for ( size_t i = 0 ; i < n ; i++ )
@@ -119,12 +120,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);
 }
@@ -178,26 +179,24 @@ bool wxRegion::DoUnionWithRect(const wxRect& r)
 
 bool wxRegion::DoUnionWithRegion( const wxRegion& region )
 {
-    wxCHECK_MSG( region.Ok(), false, _T("invalid region") );
+    wxCHECK_MSG( region.IsOk(), false, wxT("invalid region") );
 
     if (!m_refData)
     {
-        m_refData = new wxRegionRefData();
-        M_REGIONDATA->m_region = gdk_region_new();
+        m_refData = new wxRegionRefData(*M_REGIONDATA_OF(region));
     }
     else
     {
         AllocExclusive();
+        gdk_region_union( M_REGIONDATA->m_region, region.GetRegion() );
     }
 
-    gdk_region_union( M_REGIONDATA->m_region, region.GetRegion() );
-
     return true;
 }
 
 bool wxRegion::DoIntersect( const wxRegion& region )
 {
-    wxCHECK_MSG( region.Ok(), false, _T("invalid region") );
+    wxCHECK_MSG( region.IsOk(), false, wxT("invalid region") );
 
     if (!m_refData)
     {
@@ -214,7 +213,7 @@ bool wxRegion::DoIntersect( const wxRegion& region )
 
 bool wxRegion::DoSubtract( const wxRegion& region )
 {
-    wxCHECK_MSG( region.Ok(), false, _T("invalid region") );
+    wxCHECK_MSG( region.IsOk(), false, wxT("invalid region") );
 
     if (!m_refData)
     {
@@ -231,24 +230,27 @@ bool wxRegion::DoSubtract( const wxRegion& region )
 
 bool wxRegion::DoXor( const wxRegion& region )
 {
-    wxCHECK_MSG( region.Ok(), false, _T("invalid region") );
+    wxCHECK_MSG( region.IsOk(), false, wxT("invalid region") );
 
     if (!m_refData)
     {
-        return false;
+        // XOR-ing with an invalid region is the same as XOR-ing with an empty
+        // one, i.e. it is simply a copy.
+        m_refData = new wxRegionRefData(*M_REGIONDATA_OF(region));
     }
+    else
+    {
+        AllocExclusive();
 
-    AllocExclusive();
-
-    gdk_region_xor( M_REGIONDATA->m_region, region.GetRegion() );
+        gdk_region_xor( M_REGIONDATA->m_region, region.GetRegion() );
+    }
 
     return true;
 }
 
 bool wxRegion::DoOffset( wxCoord x, wxCoord y )
 {
-    if (!m_refData)
-        return false;
+    wxCHECK_MSG( m_refData, false, wxS("invalid region") );
 
     AllocExclusive();
 
@@ -327,7 +329,7 @@ wxRegionContain wxRegion::DoContainsRect(const wxRect& r) const
 GdkRegion *wxRegion::GetRegion() const
 {
     if (!m_refData)
-        return (GdkRegion*) NULL;
+        return NULL;
 
     return M_REGIONDATA->m_region;
 }
@@ -336,44 +338,45 @@ GdkRegion *wxRegion::GetRegion() const
 // wxRegionIterator
 // ----------------------------------------------------------------------------
 
-class wxRIRefData: public wxObjectRefData
+wxRegionIterator::wxRegionIterator()
 {
-public:
-    wxRIRefData() { Init(); }
-    virtual ~wxRIRefData();
-
-    void CreateRects( const wxRegion& r );
-
-    void Init() { m_rects = NULL; m_numRects = 0; }
+    Init();
+    Reset();
+}
 
-    wxRect *m_rects;
-    size_t  m_numRects;
-};
+wxRegionIterator::wxRegionIterator( const wxRegion& region )
+{
+    Init();
+    Reset(region);
+}
 
-wxRIRefData::~wxRIRefData()
+void wxRegionIterator::Init()
 {
-    delete [] m_rects;
+    m_rects = NULL;
+    m_numRects = 0;
 }
 
-void wxRIRefData::CreateRects( const wxRegion& region )
+wxRegionIterator::~wxRegionIterator()
 {
-    delete [] m_rects;
+    wxDELETEA(m_rects);
+}
 
-    Init();
+void wxRegionIterator::CreateRects( const wxRegion& region )
+{
+    wxDELETEA(m_rects);
+    m_numRects = 0;
 
     GdkRegion *gdkregion = region.GetRegion();
     if (!gdkregion)
         return;
 
-    GdkRectangle *gdkrects = NULL;
-    gint numRects = 0;
-    gdk_region_get_rectangles( gdkregion, &gdkrects, &numRects );
+    GdkRectangle* gdkrects;
+    gdk_region_get_rectangles(gdkregion, &gdkrects, &m_numRects);
 
-    m_numRects = numRects;
-    if (numRects)
+    if (m_numRects)
     {
         m_rects = new wxRect[m_numRects];
-        for (size_t i=0; i < m_numRects; ++i)
+        for (int i = 0; i < m_numRects; ++i)
         {
             GdkRectangle &gr = gdkrects[i];
             wxRect &wr = m_rects[i];
@@ -386,28 +389,16 @@ void wxRIRefData::CreateRects( const wxRegion& region )
     g_free( gdkrects );
 }
 
-wxRegionIterator::wxRegionIterator()
-{
-    m_refData = new wxRIRefData();
-    Reset();
-}
-
-wxRegionIterator::wxRegionIterator( const wxRegion& region )
-{
-    m_refData = new wxRIRefData();
-    Reset(region);
-}
-
 void wxRegionIterator::Reset( const wxRegion& region )
 {
     m_region = region;
-    ((wxRIRefData*)m_refData)->CreateRects(region);
+    CreateRects(region);
     Reset();
 }
 
 bool wxRegionIterator::HaveRects() const
 {
-    return m_current < ((wxRIRefData*)m_refData)->m_numRects;
+    return m_current < m_numRects;
 }
 
 wxRegionIterator& wxRegionIterator::operator ++ ()
@@ -421,6 +412,7 @@ wxRegionIterator& wxRegionIterator::operator ++ ()
 wxRegionIterator wxRegionIterator::operator ++ (int)
 {
     wxRegionIterator tmp = *this;
+
     if (HaveRects())
         ++m_current;
 
@@ -429,37 +421,54 @@ wxRegionIterator wxRegionIterator::operator ++ (int)
 
 wxCoord wxRegionIterator::GetX() const
 {
-    wxCHECK_MSG( HaveRects(), 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( HaveRects(), 0, wxT("invalid wxRegionIterator") );
 
-    return ((wxRIRefData*)m_refData)->m_rects[m_current].x;
+    return m_rects[m_current].x;
 }
 
 wxCoord wxRegionIterator::GetY() const
 {
-    wxCHECK_MSG( HaveRects(), 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( HaveRects(), 0, wxT("invalid wxRegionIterator") );
 
-    return ((wxRIRefData*)m_refData)->m_rects[m_current].y;
+    return m_rects[m_current].y;
 }
 
 wxCoord wxRegionIterator::GetW() const
 {
-    wxCHECK_MSG( HaveRects(), 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( HaveRects(), 0, wxT("invalid wxRegionIterator") );
 
-    return ((wxRIRefData*)m_refData)->m_rects[m_current].width;
+    return m_rects[m_current].width;
 }
 
 wxCoord wxRegionIterator::GetH() const
 {
-    wxCHECK_MSG( HaveRects(), 0, _T("invalid wxRegionIterator") );
+    wxCHECK_MSG( HaveRects(), 0, wxT("invalid wxRegionIterator") );
 
-    return ((wxRIRefData*)m_refData)->m_rects[m_current].height;
+    return m_rects[m_current].height;
 }
 
 wxRect wxRegionIterator::GetRect() const
 {
     wxRect r;
     if( HaveRects() )
-        r = ((wxRIRefData*)m_refData)->m_rects[m_current];
+        r = m_rects[m_current];
 
     return r;
 }
+
+wxRegionIterator& wxRegionIterator::operator=(const wxRegionIterator& ri)
+{
+    if (this != &ri)
+    {
+        wxDELETEA(m_rects);
+
+        m_current = ri.m_current;
+        m_numRects = ri.m_numRects;
+        if ( m_numRects )
+        {
+            m_rects = new wxRect[m_numRects];
+            memcpy(m_rects, ri.m_rects, m_numRects * sizeof m_rects[0]);
+        }
+    }
+    return *this;
+}