+ hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE);
+ hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC);
+ }
+ else
+ hPS = m_hPS;
+
+ if (pMask)
+ {
+ BITMAPINFOHEADER2 vHeader;
+ BITMAPINFO2 vInfo;
+ int nBytesPerLine = rBmp.GetWidth() * 3;
+ unsigned char* pucData;
+ LONG lScans = 0L;
+ LONG alFormats[24]; // Max formats OS/2 PM supports
+ ULONG ulBitcount;
+ HBITMAP hMask = (HBITMAP)pMask->GetMaskBitmap();
+ POINTL vPointMask[4] = { 0, 0, rBmp.GetWidth(), rBmp.GetHeight()
+ ,0, 0, rBmp.GetWidth(), rBmp.GetHeight()
+ };
+
+ ::GpiSetBitmap(hPS, hMask);
+
+ ::GpiQueryDeviceBitmapFormats(hPS, 24, alFormats);
+ ulBitcount = alFormats[1]; // the best one
+ if (ulBitcount > 24) // PM supports a max of 24
+ ulBitcount = 24;
+
+ vInfo.cbFix = 16;
+ vInfo.cx = rBmp.GetWidth();
+ vInfo.cy = rBmp.GetHeight();
+ vInfo.cPlanes = 1;
+ vInfo.cBitCount = ulBitcount;
+ pucData = (unsigned char*)malloc(nBytesPerLine * rBmp.GetHeight());
+ if ((lScans = ::GpiQueryBitmapBits( hPS
+ ,0L
+ ,(LONG)rBmp.GetHeight()
+ ,(PBYTE)pucData
+ ,&vInfo
+ )) == GPI_ALTERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ if ((hBitmapOld = ::GpiSetBitmap(hPS, (HBITMAP)vNewBitmap.GetHBITMAP())) == HBM_ERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ if ((lScans = ::GpiSetBitmapBits( hPS
+ ,0
+ ,(LONG)rBmp.GetHeight()
+ ,(PBYTE)pucData
+ ,&vInfo
+ )) == GPI_ALTERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ if ((hBitmapOld = ::GpiSetBitmap(hPS, NULLHANDLE)) == HBM_ERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ if ((hBitmapOld = ::GpiSetBitmap((HPS)GetHPS(), vNewBitmap.GetHBITMAP())) == HBM_ERROR)
+ {
+ ERRORID vError;
+ wxString sError;
+
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ }
+ ::GpiWCBitBlt( (HPS)GetHPS()
+ ,hBitmap
+ ,4
+ ,vPoint
+ ,ROP_SRCAND
+ ,BBO_IGNORE
+ );
+ }
+ }
+ else
+ {
+ ::GpiWCBitBlt( (HPS)GetHPS()
+ ,hBitmap
+ ,4
+ ,vPoint
+ ,ROP_SRCCOPY
+ ,BBO_IGNORE
+ );
+ }