]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/region.cpp
unload msimg32.dll earlier (before static cleanup time) to avoid lockups when wx...
[wxWidgets.git] / src / mgl / region.cpp
index 78b688a6cb41bdeba3833be88d571aab198b2ded..2604513a1eba60c5de1eedf5116e95dc3b14fd53 100644 (file)
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #include "wx/region.h"
 
 #endif
 
 #include "wx/region.h"
 
-#include "wx/gdicmn.h"
+#ifndef WX_PRECOMP
+    #include "wx/gdicmn.h"
+    #include "wx/module.h"
+#endif
+
 #include "wx/thread.h"
 #include "wx/thread.h"
-#include "wx/module.h"
 
 #include <mgraph.hpp>
 
 
 #include <mgraph.hpp>
 
@@ -42,7 +45,7 @@ public:
         m_region = data.m_region;
     }
 
         m_region = data.m_region;
     }
 
-    ~wxRegionRefData() {}
+    virtual ~wxRegionRefData() {}
 
     MGLRegion m_region;
 };
 
     MGLRegion m_region;
 };
@@ -99,6 +102,24 @@ wxRegion::wxRegion(const MGLRegion& region)
     M_REGION = region;
 }
 
     M_REGION = region;
 }
 
+wxRegion::wxRegion(size_t n, const wxPoint *points, int WXUNUSED(fillStyle))
+{
+    m_refData = new wxRegionRefData;
+    point_t *pts = new point_t[n];
+
+    for (size_t i = 0; i < n; i++)
+    {
+        pts[i].x = points[i].x;
+        pts[i].y = points[i].y;
+    }
+
+    region_t* rgn = MGL_rgnPolygon(n, pts, 1, 0, 0);
+
+    M_REGION = rgn;
+
+    delete [] pts;
+}
+
 wxRegion::~wxRegion()
 {
     // m_refData unrefed in ~wxObject
 wxRegion::~wxRegion()
 {
     // m_refData unrefed in ~wxObject
@@ -124,8 +145,15 @@ void wxRegion::Clear()
 // Information on region
 //-----------------------------------------------------------------------------
 
 // Information on region
 //-----------------------------------------------------------------------------
 
+bool wxRegion::DoIsEqual(const wxRegion& WXUNUSED(region)) const
+{
+    wxFAIL_MSG( _T("not implemented") );
+
+    return false;
+}
+
 // Outer bounds of region
 // 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)
     {
 {
     if (m_refData)
     {
@@ -135,22 +163,18 @@ void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const
         y = rect.top;
         w = rect.right - rect.left;
         h = rect.bottom - rect.top;
         y = rect.top;
         w = rect.right - rect.left;
         h = rect.bottom - rect.top;
+
+        return true;
     }
     else
     {
         x = y = w = h = 0;
     }
     else
     {
         x = y = w = h = 0;
+        return false;
     }
 }
 
     }
 }
 
-wxRect wxRegion::GetBox() const
-{
-    wxCoord x, y, w, h;
-    GetBox(x, y, w, h);
-    return wxRect(x, y, w, h);
-}
-
 // Is region empty?
 // Is region empty?
-bool wxRegion::Empty() const
+bool wxRegion::IsEmpty() const
 {
     if (!m_refData)
         return true;
 {
     if (!m_refData)
         return true;
@@ -162,7 +186,7 @@ bool wxRegion::Empty() const
 // Modifications
 //-----------------------------------------------------------------------------
 
 // Modifications
 //-----------------------------------------------------------------------------
 
-bool wxRegion::Offset(wxCoord x, wxCoord y)
+bool wxRegion::DoOffset(wxCoord x, wxCoord y)
 {
     AllocExclusive();
     M_REGION.offset(x, y);
 {
     AllocExclusive();
     M_REGION.offset(x, y);
@@ -170,63 +194,35 @@ bool wxRegion::Offset(wxCoord x, wxCoord y)
 }
 
 // Union rectangle or region with this.
 }
 
 // Union rectangle or region with this.
-bool wxRegion::Union(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+bool wxRegion::DoUnionWithRect(const wxRect& r)
 {
     AllocExclusive();
 {
     AllocExclusive();
-    M_REGION += MGLRect(x, y, x + width, y + height);
+    M_REGION += MGLRect(r.x, r.y, r.GetRight() + 1, r.GetHeight() + 1);
     return true;
 }
 
     return true;
 }
 
-bool wxRegion::Union(const wxRegion& region)
+bool wxRegion::DoUnionWithRegion(const wxRegion& region)
 {
     AllocExclusive();
     M_REGION += M_REGION_OF(region);
     return true;
 }
 
 {
     AllocExclusive();
     M_REGION += M_REGION_OF(region);
     return true;
 }
 
-// Intersect rectangle or region with this.
-bool wxRegion::Intersect(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
-{
-    AllocExclusive();
-    M_REGION &= MGLRect(x, y, x + width, y + height);
-    return true;
-}
-
-bool wxRegion::Intersect(const wxRegion& region)
+bool wxRegion::DoIntersect(const wxRegion& region)
 {
     AllocExclusive();
     M_REGION &= M_REGION_OF(region);
     return true;
 }
 
 {
     AllocExclusive();
     M_REGION &= M_REGION_OF(region);
     return true;
 }
 
-// Subtract rectangle or region from this:
-// Combines the parts of 'this' that are not part of the second region.
-bool wxRegion::Subtract(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
-{
-    AllocExclusive();
-    M_REGION -= MGLRect(x, y, x + width, y + height);
-    return true;
-}
-
-bool wxRegion::Subtract(const wxRegion& region)
+bool wxRegion::DoSubtract(const wxRegion& region)
 {
     AllocExclusive();
     M_REGION -= M_REGION_OF(region);
     return true;
 }
 
 {
     AllocExclusive();
     M_REGION -= M_REGION_OF(region);
     return true;
 }
 
-// XOR: the union of two combined regions except for any overlapping areas.
-bool wxRegion::Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
-{
-    AllocExclusive();
-    MGLRect rect(x, y, x + width, y + height);
-    MGLRegion rg1 = M_REGION + rect,
-              rg2 = M_REGION & rect;
-    M_REGION = rg1 - rg2;
-    return true;
-}
-
-bool wxRegion::Xor(const wxRegion& region)
+bool wxRegion::DoXor(const wxRegion& region)
 {
     AllocExclusive();
     MGLRegion rg1 = M_REGION + M_REGION_OF(region),
 {
     AllocExclusive();
     MGLRegion rg1 = M_REGION + M_REGION_OF(region),
@@ -241,7 +237,7 @@ bool wxRegion::Xor(const wxRegion& region)
 //-----------------------------------------------------------------------------
 
 // Does the region contain the point (x,y)?
 //-----------------------------------------------------------------------------
 
 // 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;
 {
     if (!m_refData)
         return wxOutRegion;
@@ -252,40 +248,29 @@ wxRegionContain wxRegion::Contains(wxCoord x, wxCoord y) const
         return wxOutRegion;
 }
 
         return 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)?
 // 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& r) const
 {
     if (!m_refData)
         return wxOutRegion;
 
 {
     if (!m_refData)
         return wxOutRegion;
 
-    MGLRect rect(x, y, x + w, y + h);
+    MGLRect rect(r.x, r.y, r.GetRight() + 1, r.GetBottom() + 1);
     MGLRegion rg;
 
     // 1) is the rectangle entirely covered by the region?
     rg = MGLRegion(rect) - M_REGION;
     MGLRegion rg;
 
     // 1) is the rectangle entirely covered by the region?
     rg = MGLRegion(rect) - M_REGION;
-    if (rg.isEmpty()) return wxInRegion;
+    if (rg.isEmpty())
+        return wxInRegion;
 
     // 2) is the rectangle completely outside the region?
     rg = M_REGION & rect; // intersection
 
     // 2) is the rectangle completely outside the region?
     rg = M_REGION & rect; // intersection
-    if (rg.isEmpty()) return wxOutRegion;
+    if (rg.isEmpty())
+        return wxOutRegion;
 
     // 3) neither case happened => it is partially covered:
     return wxPartRegion;
 }
 
 
     // 3) neither case happened => it is partially covered:
     return wxPartRegion;
 }
 
-// Does the region contain the rectangle rect
-wxRegionContain wxRegion::Contains(const wxRect& rect) const
-{
-    return Contains(rect.x, rect.y, rect.width, rect.height);
-}
-
-
 ///////////////////////////////////////////////////////////////////////////////
 //                               wxRegionIterator                                 //
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 //                               wxRegionIterator                                 //
 ///////////////////////////////////////////////////////////////////////////////