X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/70b7bcd12120a640ef6144a5c604aa94bc52aa70..4a2e5ee8f9db480a7522a4dec679647829050c94:/src/os2/region.cpp diff --git a/src/os2/region.cpp b/src/os2/region.cpp index c742b392a4..a0723c0073 100644 --- a/src/os2/region.cpp +++ b/src/os2/region.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// File: region.cpp +// File: src/os2/region.cpp // Purpose: Region class // Author: David Webster // Modified by: @@ -12,15 +12,18 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/app.h" +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/window.h" +#endif + #include "wx/os2/region.h" #include "wx/gdicmn.h" -#include "wx/window.h" #include "wx/os2/private.h" - IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject) - IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject) +IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject) //----------------------------------------------------------------------------- // wxRegionRefData implementation @@ -39,6 +42,7 @@ public: RGNRECT vRgnData; PRECTL pRect = NULL; + vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT; if (::GpiQueryRegionRects( rData.m_hPS // Pres space ,rData.m_hRegion // Handle of region to query ,NULL // Return all RECTs @@ -76,6 +80,7 @@ public: }; #define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion) +#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion) //----------------------------------------------------------------------------- // wxRegion @@ -234,15 +239,12 @@ wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const //# Modify region //----------------------------------------------------------------------------- -bool wxRegion::Offset( - wxCoord x -, wxCoord y -) +bool wxRegion::Offset( wxCoord x, wxCoord y ) { if ( !x && !y ) { // nothing to do - return TRUE; + return true; } AllocExclusive(); @@ -252,10 +254,10 @@ bool wxRegion::Offset( { wxLogLastError(_T("OffsetRgn")); - return FALSE; + return false; } #endif - return TRUE; + return true; } // @@ -277,104 +279,75 @@ bool wxRegion::Combine( , wxRegionOp eOp ) { - AllocExclusive(); - - // - // If ref count is 1, that means it's 'ours' anyway so no action. - // - RECTL vRect; - - vRect.xLeft = x; - vRect.xRight = x + vWidth; - vRect.yBottom = y; - vRect.yTop = y + vHeight; - - HRGN hRgn = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS - ,1 - ,&vRect - ); - LONG lMode = 0L; - - switch (eOp) - { - case wxRGN_AND: - lMode = CRGN_AND; - break; - - case wxRGN_OR: - lMode = CRGN_OR; - break; - - case wxRGN_XOR: - lMode = CRGN_XOR; - break; - - case wxRGN_DIFF: - lMode = CRGN_DIFF; - break; - - case wxRGN_COPY: - default: - lMode = CRGN_COPY; - break; - } - bool bSuccess = ::GpiCombineRegion( ((wxRegionRefData*)m_refData)->m_hPS - ,M_REGION - ,M_REGION - ,hRgn - ,lMode - ); - ::GpiDestroyRegion ( ((wxRegionRefData*)m_refData)->m_hPS - ,hRgn - ); - - return bSuccess; + return Combine(wxRegion(x, y, vWidth, vHeight), eOp); } // end of wxRegion::Combine // // Union region with this. // -bool wxRegion::Combine( - const wxRegion& rRegion -, wxRegionOp eOp -) +bool wxRegion::Combine( const wxRegion& rRegion, wxRegionOp eOp ) { - if (rRegion.Empty()) - return FALSE; - - AllocExclusive(); + // + // We can't use the API functions if we don't have a valid region handle + // + if (!m_refData) + { + // combining with an empty/invalid region works differently depending + // on the operation + switch (eOp) + { + case wxRGN_COPY: + case wxRGN_OR: + case wxRGN_XOR: + *this = rRegion; + break; + + default: + wxFAIL_MSG( _T("unknown region operation") ); + // fall through + + case wxRGN_AND: + case wxRGN_DIFF: + // leave empty/invalid + return false; + } + } + else // we have a valid region + { - LONG lMode = 0; + LONG lMode = 0; - switch (eOp) - { - case wxRGN_AND: - lMode = CRGN_AND; - break; - - case wxRGN_OR: - lMode = CRGN_OR; - break; - - case wxRGN_XOR: - lMode = CRGN_XOR; - break; - - case wxRGN_DIFF: - lMode = CRGN_DIFF; - break; - - case wxRGN_COPY: - default: - lMode = CRGN_COPY; - break; + switch (eOp) + { + case wxRGN_AND: + lMode = CRGN_AND; + break; + + case wxRGN_OR: + lMode = CRGN_OR; + break; + + case wxRGN_XOR: + lMode = CRGN_XOR; + break; + + case wxRGN_DIFF: + lMode = CRGN_DIFF; + break; + + case wxRGN_COPY: + default: + lMode = CRGN_COPY; + break; + } + return (::GpiCombineRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS + ,M_REGION + ,M_REGION + ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion + ,lMode + ) != RGN_ERROR); } - return (::GpiCombineRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS - ,M_REGION - ,M_REGION - ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion - ,lMode - ) != RGN_ERROR); + return true; } // end of wxRegion::Combine bool wxRegion::Combine( @@ -414,7 +387,7 @@ void wxRegion::GetBox( ,&vRect ); x = vRect.xLeft; - y = vRect.yTop; + y = vRect.yBottom; vWidth = vRect.xRight - vRect.xLeft; vHeight = vRect.yTop - vRect.yBottom; } @@ -436,13 +409,13 @@ wxRect wxRegion::GetBox() const // bool wxRegion::Empty() const { - wxCoord x; - wxCoord y; - wxCoord vWidth; - wxCoord vHeight; + wxCoord x; + wxCoord y; + wxCoord vWidth; + wxCoord vHeight; if (M_REGION == 0) - return TRUE; + return true; GetBox( x ,y @@ -463,7 +436,6 @@ wxRegionContain wxRegion::Contains( , wxCoord y ) const { - bool bOK = FALSE; POINTL vPoint; vPoint.x = x; @@ -579,6 +551,7 @@ void wxRegion::SetPS( RGNRECT vRgnData; PRECTL pRect = NULL; + vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT; if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS ,((wxRegionRefData*)m_refData)->m_hRegion ,NULL @@ -654,6 +627,7 @@ void wxRegionIterator::Reset( ) { m_lCurrent = 0; + m_lNumRects = 0; m_vRegion = rRegion; if (m_pRects) @@ -668,6 +642,7 @@ void wxRegionIterator::Reset( RGNRECT vRgnData; PRECTL pRect; + vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT; if (::GpiQueryRegionRects( ((wxRegionRefData*)rRegion.m_refData)->m_hPS // Pres space ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion // Handle of region to query ,NULL // Return all RECTs @@ -687,10 +662,12 @@ void wxRegionIterator::Reset( ,pRect // Will contain the actual RECTS )) { +#if 0 M_REGION = ::GpiCreateRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS ,vRgnData.crcReturned ,pRect ); +#endif for( LONG i = 0; i < m_lNumRects; i++) { m_pRects[i].x = pRect[i].xLeft; @@ -698,7 +675,9 @@ void wxRegionIterator::Reset( m_pRects[i].y = pRect[i].yBottom; m_pRects[i].height = pRect[i].yTop - pRect[i].yBottom; } +#if 0 ((wxRegionRefData*)m_refData)->m_hPS = ((wxRegionRefData*)rRegion.m_refData)->m_hPS; +#endif } } } @@ -751,4 +730,3 @@ wxCoord wxRegionIterator::GetH() const return m_pRects[m_lCurrent].height; return 0L; } // end of wxRegionIterator::GetH -