+ //
+ // Select old bitmap out of the device context
+ //
+ if (m_hOldBitmap)
+ {
+ ::GpiSetBitmap(m_hPS, NULLHANDLE);
+ if (m_vSelectedBitmap.Ok())
+ {
+ m_vSelectedBitmap.SetSelectedInto(NULL);
+ m_vSelectedBitmap = wxNullBitmap;
+ }
+ }
+
+ //
+ // Check for whether the bitmap is already selected into a device context
+ //
+ wxCHECK_RET( !rBitmap.GetSelectedInto() ||
+ (rBitmap.GetSelectedInto() == this),
+ wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") );
+
+ m_vSelectedBitmap = rBitmap;
+
+ WXHBITMAP hBmp = rBitmap.GetHBITMAP();
+
+ if (!hBmp)
+ return;
+
+ m_vSelectedBitmap.SetSelectedInto(this);
+ hBmp = (WXHBITMAP)::GpiSetBitmap(m_hPS, (HBITMAP)hBmp);
+
+ if (hBmp == HBM_ERROR)
+ {
+ wxLogLastError(wxT("SelectObject(memDC, bitmap)"));
+ wxFAIL_MSG(wxT("Couldn't select a bitmap into wxMemoryDC"));
+ }
+ else if (!m_hOldBitmap)
+ {
+ m_hOldBitmap = hBmp;
+ }
+} // end of wxMemoryDC::SelectObject
+
+void wxMemoryDC::DoGetSize(
+ int* pWidth
+, int* pHeight
+) const
+{
+ if (!m_vSelectedBitmap.Ok())
+ {
+ *pWidth = 0;
+ *pHeight = 0;
+ return;
+ }
+ *pWidth = m_vSelectedBitmap.GetWidth();
+ *pHeight = m_vSelectedBitmap.GetHeight();
+} // end of wxMemoryDC::DoGetSize
+
+void wxMemoryDC::DoDrawRectangle(
+ wxCoord vX
+, wxCoord vY
+, wxCoord vWidth
+, wxCoord vHeight
+)
+{
+ wxDC::DoDrawRectangle(vX, vY, vWidth, vHeight);
+
+ //
+ // Debug testing:
+ //
+ if (m_vSelectedBitmap.GetHBITMAP() != NULLHANDLE)
+ {
+ BITMAPINFOHEADER2 vHeader;
+ BITMAPINFO2 vInfo;
+
+ vHeader.cbFix = 16L;
+ if (::GpiQueryBitmapInfoHeader(m_vSelectedBitmap.GetHBITMAP(), &vHeader))
+ {
+ unsigned char* pucData = NULL;
+ unsigned char* pucBits;
+ int nBytesPerLine = m_vSelectedBitmap.GetWidth() * 3;
+ LONG lScans = 0L;
+ POINTL vPoint;
+ LONG lColor;
+ LONG alFormats[24]; // Max formats OS/2 PM supports
+ ULONG ulBitcount;
+
+ ::GpiQueryDeviceBitmapFormats(m_hPS, 24, alFormats);
+ ulBitcount = alFormats[1]; // the best one for the device
+ if (ulBitcount > 24)
+ ulBitcount = 24; // MAX bits supported by PM
+ vInfo.cbFix = 16;
+ vInfo.cx = vHeader.cx;
+ vInfo.cy = vHeader.cy;
+ vInfo.cPlanes = vHeader.cPlanes;
+ vInfo.cBitCount = ulBitcount;
+ pucData = (unsigned char*)malloc(nBytesPerLine * m_vSelectedBitmap.GetHeight());
+ if ((lScans = ::GpiQueryBitmapBits( m_hPS
+ ,0L
+ ,(LONG)m_vSelectedBitmap.GetHeight()
+ ,(PBYTE)pucData
+ ,&vInfo
+ )) == GPI_ALTERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ pucBits = pucData;
+ for (int i = 0; i < m_vSelectedBitmap.GetHeight(); i++)
+ {
+ for (int j = 0; j < m_vSelectedBitmap.GetWidth(); j++)
+ {
+ vPoint.x = j; vPoint.y = i;
+ lColor = ::GpiQueryPel(m_hPS, &vPoint);
+ *(pucBits++) = (unsigned char)lColor;
+ *(pucBits++) = (unsigned char)(lColor >> 8);
+ *(pucBits++) = (unsigned char)(lColor >> 16);
+ }
+ }
+ if ((lScans = ::GpiSetBitmapBits( m_hPS
+ ,0
+ ,(LONG)m_vSelectedBitmap.GetHeight()
+ ,(PBYTE)pucData
+ ,&vInfo
+ )) == GPI_ALTERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ free(pucData);
+ }
+ }
+} // end of wxMemoryDC::DoDrawRectangle
+
+void wxMemoryDC::DoDrawRoundedRectangle(
+ wxCoord vX
+, wxCoord vY
+, wxCoord vWidth
+, wxCoord vHeight
+, double dRadius
+)
+{
+ wxDC::DoDrawRoundedRectangle(vX, vY, vWidth, vHeight, dRadius);
+
+ //
+ // Debug testing:
+ //
+ if (m_vSelectedBitmap.GetHBITMAP() != NULLHANDLE)
+ {
+ BITMAPINFOHEADER2 vHeader;
+ BITMAPINFO2 vInfo;
+
+ vHeader.cbFix = 16L;
+ if (::GpiQueryBitmapInfoHeader(m_vSelectedBitmap.GetHBITMAP(), &vHeader))
+ {
+ unsigned char* pucData = NULL;
+ unsigned char* pucBits;
+ int nBytesPerLine = m_vSelectedBitmap.GetWidth() * 3;
+ LONG lScans = 0L;
+ POINTL vPoint;
+ LONG lColor;
+ LONG alFormats[24]; // Max formats OS/2 PM supports
+ ULONG ulBitcount;
+
+ ::GpiQueryDeviceBitmapFormats(m_hPS, 24, alFormats);
+ ulBitcount = alFormats[1]; // the best one for the device
+ if (ulBitcount > 24)
+ ulBitcount = 24; // MAX bits supported by PM
+ vInfo.cbFix = 16;
+ vInfo.cx = vHeader.cx;
+ vInfo.cy = vHeader.cy;
+ vInfo.cPlanes = vHeader.cPlanes;
+ vInfo.cBitCount = ulBitcount;
+ pucData = (unsigned char*)malloc(nBytesPerLine * m_vSelectedBitmap.GetHeight());
+ if ((lScans = ::GpiQueryBitmapBits( m_hPS
+ ,0L
+ ,(LONG)m_vSelectedBitmap.GetHeight()
+ ,(PBYTE)pucData
+ ,&vInfo
+ )) == GPI_ALTERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ pucBits = pucData;
+ for (int i = 0; i < m_vSelectedBitmap.GetHeight(); i++)
+ {
+ for (int j = 0; j < m_vSelectedBitmap.GetWidth(); j++)
+ {
+ vPoint.x = j; vPoint.y = i;
+ lColor = ::GpiQueryPel(m_hPS, &vPoint);
+ *(pucBits++) = (unsigned char)lColor;
+ *(pucBits++) = (unsigned char)(lColor >> 8);
+ *(pucBits++) = (unsigned char)(lColor >> 16);
+ }
+ }
+ if ((lScans = ::GpiSetBitmapBits( m_hPS
+ ,0
+ ,(LONG)m_vSelectedBitmap.GetHeight()
+ ,(PBYTE)pucData
+ ,&vInfo
+ )) == GPI_ALTERROR)
+ {
+ ERRORID vError;
+ wxString sError;