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);
}
, 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
//
, 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;
}
, 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
}
}
}