// Author: David Webster
// Modified by:
// Created: 10/15/99
-// RCS-ID: $Id$
+// RCS-ID: $Id$
// Copyright: (c) Davdi Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#include "wx/app.h"
#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
wxRegionRefData()
{
m_hRegion = 0;
+ m_hPS = 0;
}
wxRegionRefData(const wxRegionRefData& rData)
} // end of wxRegion::wxRegion
wxRegion::wxRegion(
- WXHRGN hRegion
+ WXHRGN hRegion,
+ WXHDC hPS
)
{
m_refData = new wxRegionRefData;
M_REGION = (HRGN) hRegion;
+ (((wxRegionRefData*)m_refData)->m_hPS) = hPS;
} // end of wxRegion::wxRegion
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
//
, 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);
- }
+ AllocExclusive();
//
// If ref count is 1, that means it's 'ours' anyway so no action.
if (rRegion.Empty())
return FALSE;
- //
- // 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);
- }
+ AllocExclusive();
LONG lMode = 0;
if (m_refData)
{
RECTL vRect;
+ APIRET rc;
- ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
+ rc = ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
,M_REGION
,&vRect
);
return (WXHRGN) M_REGION;
}
+//
+// Set a new PS, this means we have to recreate the old region in the new
+// PS
+//
+void wxRegion::SetPS(
+ HPS hPS
+)
+{
+ RGNRECT vRgnData;
+ PRECTL pRect = NULL;
+
+ if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS
+ ,((wxRegionRefData*)m_refData)->m_hRegion
+ ,NULL
+ ,&vRgnData
+ ,NULL
+ ))
+ {
+ pRect = new RECTL[vRgnData.crcReturned];
+ vRgnData.crc = vRgnData.crcReturned;
+ vRgnData.ircStart = 1;
+ if (::GpiQueryRegionRects( ((wxRegionRefData*)m_refData)->m_hPS
+ ,((wxRegionRefData*)m_refData)->m_hRegion
+ ,NULL
+ ,&vRgnData
+ ,pRect
+ ))
+ {
+ //
+ // First destroy the region out of the old PS
+ // and then create it in the new and set the new to current
+ //
+ ::GpiDestroyRegion( ((wxRegionRefData*)m_refData)->m_hPS
+ ,M_REGION
+ );
+ ((wxRegionRefData*)m_refData)->m_hRegion = ::GpiCreateRegion( hPS
+ ,vRgnData.crcReturned
+ ,pRect
+ );
+ ((wxRegionRefData*)m_refData)->m_hPS = hPS;
+ }
+ delete [] pRect;
+ }
+} // end of wxRegion::SetPS
+
///////////////////////////////////////////////////////////////////////////////
// //
// wxRegionIterator //