X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/19193a2c85987b595932957e73013e7ea100f0e8..22026088535d0c7dafaae15133a8d1078195a366:/src/os2/region.cpp?ds=sidebyside diff --git a/src/os2/region.cpp b/src/os2/region.cpp index 733998bbf7..c56301d723 100644 --- a/src/os2/region.cpp +++ b/src/os2/region.cpp @@ -76,6 +76,7 @@ public: }; #define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion) +#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion) //----------------------------------------------------------------------------- // wxRegion @@ -220,10 +221,44 @@ wxRegion::~wxRegion() { } // end of wxRegion::~wxRegion +wxObjectRefData *wxRegion::CreateData() const +{ + return new wxRegionRefData; +} + +wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const +{ + return new wxRegionRefData(*(wxRegionRefData *)data); +} + //----------------------------------------------------------------------------- //# Modify region //----------------------------------------------------------------------------- +bool wxRegion::Offset( + wxCoord x +, wxCoord y +) +{ + if ( !x && !y ) + { + // nothing to do + return TRUE; + } + + AllocExclusive(); + +#if 0 + if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR ) + { + wxLogLastError(_T("OffsetRgn")); + + return FALSE; + } +#endif + return TRUE; +} + // // Clear current region // @@ -243,71 +278,7 @@ bool wxRegion::Combine( , wxRegionOp eOp ) { - // - // Don't change shared data - // - if (!m_refData) - { - m_refData = new wxRegionRefData(); - } - else if (m_refData->GetRefCount() > 1) - { - wxRegionRefData* pRef = (wxRegionRefData*)m_refData; - - UnRef(); - m_refData = new wxRegionRefData(*pRef); - } - - // - // 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 // @@ -318,55 +289,67 @@ bool wxRegion::Combine( , wxRegionOp eOp ) { - if (rRegion.Empty()) - return FALSE; - // - // Don't change shared data + // We can't use the API functions if we don't have a valid region handle // if (!m_refData) { - m_refData = new wxRegionRefData(); + // 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 if (m_refData->GetRefCount() > 1) + else // we have a valid region { - wxRegionRefData* pRef = (wxRegionRefData*)m_refData; - UnRef(); - m_refData = new wxRegionRefData(*pRef); - } + 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( @@ -406,7 +389,7 @@ void wxRegion::GetBox( ,&vRect ); x = vRect.xLeft; - y = vRect.yTop; + y = vRect.yBottom; vWidth = vRect.xRight - vRect.xLeft; vHeight = vRect.yTop - vRect.yBottom; }