X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c78e7c70271608b076b1dbed201b1204e6898d4..b0a6bb75bcd4b5a4873d766a9208ac6376fe8625:/src/qt/region.cpp

diff --git a/src/qt/region.cpp b/src/qt/region.cpp
index 987ddeed60..7945594c99 100644
--- a/src/qt/region.cpp
+++ b/src/qt/region.cpp
@@ -1,163 +1,371 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        region.cpp
-// Purpose:
-// Author:      Robert Roebling
-// Created:     01/02/98
-// Id:
-// Copyright:   (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
-// Licence:   	wxWindows licence
+// File:      region.cpp
+// Purpose:   Region class
+// Author:    Markus Holzem/Julian Smart/AUTHOR
+// Created:   Fri Oct 24 10:46:34 MET 1997
+// RCS-ID:	  $Id$
+// Copyright: (c) 1997 Markus Holzem/Julian Smart/AUTHOR
+// Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-
 #ifdef __GNUG__
 #pragma implementation "region.h"
 #endif
 
-#include "wx/region.h"
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#include "wx/msw/region.h"
+#include "wx/gdicmn.h"
+
+#include <windows.h>
+
+	IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+	IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
 
 //-----------------------------------------------------------------------------
-// wxRegion
+// wxRegionRefData implementation
 //-----------------------------------------------------------------------------
 
-class wxRegionRefData: public wxObjectRefData
-{
-  public:
-  
-    wxRegionRefData(void);
-    ~wxRegionRefData(void);
-  
-  public:    
+class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
+public:
+	wxRegionRefData()
+	{
+	}
 
-};
+	wxRegionRefData(const wxRegionRefData& data)
+	{
+        // TODO
+	}
 
-wxRegionRefData::wxRegionRefData(void)
-{
-};
+	~wxRegionRefData()
+	{
+        // TODO
+	}
 
-wxRegionRefData::~wxRegionRefData(void)
-{
+	HRGN m_region;
 };
 
-//-----------------------------------------------------------------------------
 
-#define M_REGIONDATA ((wxRegionRefData *)m_refData)
+//-----------------------------------------------------------------------------
+// wxRegion
+//-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxRegion,wxGDIObject);
-  
-wxRegion::wxRegion( long x, long y, long w, long h )
+/*!
+ * Create an empty region.
+ */
+wxRegion::wxRegion()
 {
-  m_refData = new wxRegionRefData();
-};
+    m_refData = new wxRegionRefData;
+    // TODO create empty region
+}
 
-wxRegion::wxRegion( const wxPoint& topLeft, const wxPoint& bottomRight )
+wxRegion::wxRegion(long x, long y, long w, long h)
 {
-  m_refData = new wxRegionRefData();
-};
+    m_refData = new wxRegionRefData;
+    // TODO create rect region
+}
 
-wxRegion::wxRegion( const wxRect& rect )
+wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
 {
-  m_refData = new wxRegionRefData();
-};
+    m_refData = new wxRegionRefData;
+    // TODO create rect region
+}
 
-wxRegion::wxRegion(void)
+wxRegion::wxRegion(const wxRect& rect)
 {
-  m_refData = new wxRegionRefData();
-};
-
-wxRegion::~wxRegion(void)
+    m_refData = new wxRegionRefData;
+    // TODO create rect region
+}
+
+/*!
+ * Destroy the region.
+ */
+wxRegion::~wxRegion()
 {
-};
+    // m_refData unrefed in ~wxObject
+}
 
-void wxRegion::Clear(void)
-{
-  UnRef();
-  m_refData = new wxRegionRefData();
-};
+//-----------------------------------------------------------------------------
+//# Modify region
+//-----------------------------------------------------------------------------
 
-bool wxRegion::Union( long x, long y, long width, long height )
+//! Clear current region
+void wxRegion::Clear()
 {
-  return TRUE;
-};
+    UnRef();
+}
 
-bool wxRegion::Union( const wxRect& rect )
+//! Combine rectangle (x, y, w, h) with this.
+bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
 {
-  return TRUE;
-};
-
-bool wxRegion::Union( const wxRegion& region )
+	// Don't change shared data
+	if (!m_refData) {
+		m_refData = new wxRegionRefData();
+	} else if (m_refData->GetRefCount() > 1) {
+		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
+		UnRef();
+		m_refData = new wxRegionRefData(*ref);
+	}
+    // If ref count is 1, that means it's 'ours' anyway so no action.
+
+    // TODO create rect region
+
+    int mode = 0; // TODO platform-specific code
+    switch (op)
+    {
+        case wxRGN_AND:
+            // TODO
+            break ;
+        case wxRGN_OR:
+            // TODO
+            break ;
+        case wxRGN_XOR:
+            // TODO
+            break ;
+        case wxRGN_DIFF:
+            // TODO
+            break ;
+        case wxRGN_COPY:
+        default:
+            // TODO
+            break ;
+    }
+
+    // TODO do combine region
+
+    return FALSE;
+}
+
+//! Union /e region with this.
+bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
 {
-  return TRUE;
-};
-
-bool wxRegion::Intersect( long x, long y, long width, long height )
+	if (region.Empty())
+		return FALSE;
+
+	// Don't change shared data
+	if (!m_refData) {
+		m_refData = new wxRegionRefData();
+	} else	if (m_refData->GetRefCount() > 1) {
+		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
+		UnRef();
+		m_refData = new wxRegionRefData(*ref);
+	}
+
+    int mode = 0; // TODO platform-specific code
+    switch (op)
+    {
+        case wxRGN_AND:
+            // TODO
+            break ;
+        case wxRGN_OR:
+            // TODO
+            break ;
+        case wxRGN_XOR:
+            // TODO
+            break ;
+        case wxRGN_DIFF:
+            // TODO
+            break ;
+        case wxRGN_COPY:
+        default:
+            // TODO
+            break ;
+    }
+
+    // TODO combine region
+
+	return FALSE;
+}
+
+bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
 {
-  return TRUE;
-};
+    return Combine(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight(), op);
+}
 
-bool wxRegion::Intersect( const wxRect& rect )
-{
-  return TRUE;
-};
+//-----------------------------------------------------------------------------
+//# Information on region
+//-----------------------------------------------------------------------------
 
-bool wxRegion::Intersect( const wxRegion& region )
+// Outer bounds of region
+void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
 {
-  return TRUE;
-};
-
-bool wxRegion::Subtract( long x, long y, long width, long height )
+	if (m_refData) {
+        // TODO get box
+	} else {
+		x = y = w = h = 0;
+	}
+}
+
+wxRect wxRegion::GetBox() const
 {
-  return TRUE;
-};
+    long x, y, w, h;
+    GetBox(x, y, w, h);
+    return wxRect(x, y, w, h);
+}
 
-bool wxRegion::Subtract( const wxRect& rect )
+// Is region empty?
+bool wxRegion::Empty() const
 {
-  return TRUE;
-};
+    // TODO
+    return FALSE;
+}
 
-bool wxRegion::Subtract( const wxRegion& region )
-{
-  return TRUE;
-};
+//-----------------------------------------------------------------------------
+//# Tests
+//-----------------------------------------------------------------------------
 
-bool wxRegion::Xor( long x, long y, long width, long height )
+// Does the region contain the point (x,y)?
+wxRegionContain wxRegion::Contains(long x, long y) const
 {
-  return TRUE;
-};
+	if (!m_refData)
+		return wxOutRegion;
 
-bool wxRegion::Xor( const wxRect& rect )
+    // TODO. Return wxInRegion if within region.
+    if (0)
+        return wxInRegion;
+    return wxOutRegion;
+}
+
+// Does the region contain the point pt?
+wxRegionContain wxRegion::Contains(const wxPoint& pt) const
 {
-  return TRUE;
-};
+	if (!m_refData)
+		return wxOutRegion;
+
+    // TODO. Return wxInRegion if within region.
+    if (0)
+        return wxInRegion;
+    else
+        return wxOutRegion;
+}
+
+// Does the region contain the rectangle (x, y, w, h)?
+wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
+{
+	if (!m_refData)
+		return wxOutRegion;
+
+    // TODO. Return wxInRegion if within region.
+    if (0)
+        return wxInRegion;
+    else
+        return wxOutRegion;
+}
+
+// Does the region contain the rectangle rect
+wxRegionContain wxRegion::Contains(const wxRect& rect) const
+{
+	if (!m_refData)
+		return wxOutRegion;
+
+    long x, y, w, h;
+    x = rect.x;
+    y = rect.y;
+    w = rect.GetWidth();
+    h = rect.GetHeight();
+    return Contains(x, y, w, h);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//																			 //
+//							   wxRegionIterator								 //
+//																			 //
+///////////////////////////////////////////////////////////////////////////////
+
+/*!
+ * Initialize empty iterator
+ */
+wxRegionIterator::wxRegionIterator() : m_current(0), m_numRects(0), m_rects(NULL)
+{
+}
 
-bool wxRegion::Xor( const wxRegion& region )
+wxRegionIterator::~wxRegionIterator()
 {
-  return TRUE;
-};
+    if (m_rects)
+        delete[] m_rects;
+}
+
+/*!
+ * Initialize iterator for region
+ */
+wxRegionIterator::wxRegionIterator(const wxRegion& region)
+{
+    m_rects = NULL;
+
+	Reset(region);
+}
 
-void wxRegion::GetBox( long& x, long& y, long&w, long &h ) const
+/*!
+ * Reset iterator for a new /e region.
+ */
+void wxRegionIterator::Reset(const wxRegion& region)
 {
-  x = 0;
-  y = 0;
-  w = -1;
-  h = -1;
-};
+	m_current = 0;
+	m_region = region;
+
+    if (m_rects)
+        delete[] m_rects;
+
+    m_rects = NULL;
+
+	if (m_region.Empty())
+		m_numRects = 0;
+	else
+    {
+        // TODO create m_rects and fill with rectangles for this region
+        m_numRects = 0;
+    }
+}
+
+/*!
+ * Increment iterator. The rectangle returned is the one after the
+ * incrementation.
+ */
+void wxRegionIterator::operator ++ ()
+{
+	if (m_current < m_numRects)
+		++m_current;
+}
+
+/*!
+ * Increment iterator. The rectangle returned is the one before the
+ * incrementation.
+ */
+void wxRegionIterator::operator ++ (int)
+{
+	if (m_current < m_numRects)
+		++m_current;
+}
 
-wxRect wxRegion::GetBox(void) const
+long wxRegionIterator::GetX() const
 {
-  return wxRect( 0, 0, -1, -1 );
-};
+	if (m_current < m_numRects)
+		return m_rects[m_current].x;
+	return 0;
+}
 
-bool wxRegion::Empty(void) const
+long wxRegionIterator::GetY() const
 {
-};
+	if (m_current < m_numRects)
+		return m_rects[m_current].y;
+	return 0;
+}
 
-wxRegionContain wxRegion::Contains( long x, long y ) const
+long wxRegionIterator::GetW() const
 {
-  return wxOutRegion;
-};
+	if (m_current < m_numRects)
+		return m_rects[m_current].width ;
+	return 0;
+}
 
-wxRegionContain wxRegion::Contains( long x, long y, long w, long h ) const
+long wxRegionIterator::GetH() const
 {
-  return wxOutRegion;
-};
+	if (m_current < m_numRects)
+		return m_rects[m_current].height;
+	return 0;
+}