(rBitmap.GetSelectedInto() == this),
wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") );
+ WXHBITMAP hBmp = rBitmap.GetHBITMAP();
+
+ if (!hBmp)
+ {
+ //
+ // Bmps drawn to are upside down, so flip it before committing
+ //
+ POINTL vPoint[4] = { 0, m_vSelectedBitmap.GetHeight(),
+ m_vSelectedBitmap.GetWidth(), 0,
+ 0, 0, m_vSelectedBitmap.GetWidth(), m_vSelectedBitmap.GetHeight()
+ };
+
+
+ ::GpiBitBlt( m_hPS
+ ,m_hPS
+ ,4
+ ,vPoint
+ ,ROP_SRCCOPY
+ ,BBO_IGNORE
+ );
+ m_vSelectedBitmap.SetSelectedInto(NULL);
+ }
m_vSelectedBitmap = rBitmap;
- WXHBITMAP hBmp = rBitmap.GetHBITMAP();
if (!hBmp)
- return;
+ {
+ m_hOldBitmap = (WXHBITMAP)::GpiSetBitmap(m_hPS, NULLHANDLE);
+ return;
+ }
m_vSelectedBitmap.SetSelectedInto(this);
- hBmp = (WXHBITMAP)::GpiSetBitmap(m_hPS, (HBITMAP)hBmp);
+ m_hOldBitmap = (WXHBITMAP)::GpiSetBitmap(m_hPS, (HBITMAP)hBmp);
- if (hBmp == HBM_ERROR)
+ if (m_hOldBitmap == 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(
*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;
-
- vError = ::WinGetLastError(vHabmain);
- sError = wxPMErrorToStr(vError);
- }
- free(pucData);
- }
- }
-} // end of wxMemoryDC::DoDrawRectangle
-