X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c78e7c70271608b076b1dbed201b1204e6898d4..f97d84a63b21fffcc830390e5bc3fe0eedb6e15b:/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 + + 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; +}