X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/70b7bcd12120a640ef6144a5c604aa94bc52aa70..fbc1d11bde64cc1cc826fecea7acf99ff288ca2d:/src/os2/region.cpp diff --git a/src/os2/region.cpp b/src/os2/region.cpp index c742b392a4..039534285e 100644 --- a/src/os2/region.cpp +++ b/src/os2/region.cpp @@ -39,6 +39,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 +77,7 @@ public: }; #define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion) +#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion) //----------------------------------------------------------------------------- // wxRegion @@ -277,58 +279,7 @@ 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 // @@ -339,42 +290,67 @@ bool wxRegion::Combine( , 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 +390,7 @@ void wxRegion::GetBox( ,&vRect ); x = vRect.xLeft; - y = vRect.yTop; + y = vRect.yBottom; vWidth = vRect.xRight - vRect.xLeft; vHeight = vRect.yTop - vRect.yBottom; } @@ -463,7 +439,6 @@ wxRegionContain wxRegion::Contains( , wxCoord y ) const { - bool bOK = FALSE; POINTL vPoint; vPoint.x = x; @@ -579,6 +554,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 +630,7 @@ void wxRegionIterator::Reset( ) { m_lCurrent = 0; + m_lNumRects = 0; m_vRegion = rRegion; if (m_pRects) @@ -668,6 +645,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 +665,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 +678,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 } } }