/////////////////////////////////////////////////////////////////////////////
-// File: region.cpp
+// File: src/os2/region.cpp
// Purpose: Region class
// Author: David Webster
// Modified by:
// 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
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
};
#define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion)
+#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion)
//-----------------------------------------------------------------------------
// wxRegion
return new wxRegionRefData;
}
-wxObjectRefData *wxRegion::CloneData(wxObjectRefData *data) const
+wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const
{
return new wxRegionRefData(*(wxRegionRefData *)data);
}
//# 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();
{
wxLogLastError(_T("OffsetRgn"));
- return FALSE;
+ return false;
}
#endif
- return TRUE;
+ return true;
}
//
, 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(
,&vRect
);
x = vRect.xLeft;
- y = vRect.yTop;
+ y = vRect.yBottom;
vWidth = vRect.xRight - vRect.xLeft;
vHeight = vRect.yTop - vRect.yBottom;
}
//
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
, wxCoord y
) const
{
- bool bOK = FALSE;
POINTL vPoint;
vPoint.x = x;
RGNRECT vRgnData;
PRECTL pRect = NULL;
+ vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS
,((wxRegionRefData*)m_refData)->m_hRegion
,NULL
)
{
m_lCurrent = 0;
+ m_lNumRects = 0;
m_vRegion = rRegion;
if (m_pRects)
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
,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;
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
}
}
}
return m_pRects[m_lCurrent].height;
return 0L;
} // end of wxRegionIterator::GetH
-