]> git.saurik.com Git - wxWidgets.git/blobdiff - src/qt/region.cpp
wxWindow::Fit() infinite loop bug fixed
[wxWidgets.git] / src / qt / region.cpp
index 987ddeed60c04d8097ea952918868974afa555cf..d03d8e802027250b9d813305f4505227f36c2f39 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// 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>
+
+#if !USE_SHARED_LIBRARY
+       IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+       IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
+#endif
 
 //-----------------------------------------------------------------------------
-// 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;
+}