/////////////////////////////////////////////////////////////////////////////
-// Name: dcmemory.cpp
+// Name: src/os2/dcmemory.cpp
// Purpose: wxMemoryDC class
// Author: David Webster
// Modified by:
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#include "wx/dcmemory.h"
+#include "wx/os2/dcmemory.h"
+
#ifndef WX_PRECOMP
-#include "wx/utils.h"
-#include "wx/app.h"
-#include "wx/log.h"
+ #include "wx/utils.h"
+ #include "wx/app.h"
+ #include "wx/log.h"
#endif
#include "wx/os2/private.h"
-#include "wx/dcmemory.h"
-
-IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
-
-extern void wxLoadBitmapWithData( HPS hPS
- ,HBITMAP hBitmap
- ,int nWidth
- ,int nHeight
- );
+IMPLEMENT_ABSTRACT_CLASS(wxMemoryDCImpl, wxPMDCImpl)
/////////////////////////////////////////////////////////////////////////////
// Memory DC
/////////////////////////////////////////////////////////////////////////////
-wxMemoryDC::wxMemoryDC(void)
+wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner )
+ : wxPMDCImpl( owner )
{
- CreateCompatible(NULL);
- Init();
-} // end of wxMemoryDC::wxMemoryDC
+ CreateCompatible(NULL);
+ Init();
+}
-wxMemoryDC::wxMemoryDC(
- wxDC* pOldDC
-)
+wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner, wxBitmap& bitmap )
+ : wxPMDCImpl( owner )
+{
+ CreateCompatible(NULL);
+ Init();
+ DoSelect(bitmap);
+}
+
+wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner, wxDC *pOldDC)
+ : wxPMDCImpl( owner )
{
- pOldDC->BeginDrawing();
+ wxCHECK_RET( pOldDC, _T("NULL dc in wxMemoryDC ctor") );
+
CreateCompatible(pOldDC);
- pOldDC->EndDrawing();
Init();
} // end of wxMemoryDC::wxMemoryDC
-void wxMemoryDC::Init()
+void wxMemoryDCImpl::Init()
{
if (m_ok)
{
memset(&m_vRclPaint, 0, sizeof(m_vRclPaint));
} // end of wxMemoryDC::Init
-bool wxMemoryDC::CreateCompatible(
- wxDC* pDC
-)
+bool wxMemoryDCImpl::CreateCompatible( wxDC* WXUNUSED(pDC) )
{
- HDC hDC;
- HPS hPS;
- DEVOPENSTRUC vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
- SIZEL vSize = {0, 0};
+ HDC hDC;
+ HPS hPS;
+ DEVOPENSTRUC vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+ SIZEL vSize = {0, 0};
//
// Create a memory device context
{
m_hPS = hPS;
m_hDC = hDC;
- m_ok = TRUE;
- m_bOwnsDC = TRUE;
+ m_ok = true;
+ m_bOwnsDC = true;
//
- // Set the wxWindows color table
+ // Set the wxWidgets color table
//
::GpiCreateLogColorTable( m_hPS
,0L
{
m_hPS = NULLHANDLE;
m_hDC = NULLHANDLE;
- m_ok = FALSE;
- m_bOwnsDC = FALSE;
+ m_ok = false;
+ m_bOwnsDC = false;
}
}
else
{
m_hPS = NULLHANDLE;
m_hDC = NULLHANDLE;
- m_ok = FALSE;
- m_bOwnsDC = FALSE;
+ m_ok = false;
+ m_bOwnsDC = false;
}
//
// As we created the DC, we must delete it in the dtor
//
- m_bOwnsDC = TRUE;
+ m_bOwnsDC = true;
m_ok = m_hDC != 0;
return m_ok;
} // end of wxMemoryDC::CreateCompatible
-void wxMemoryDC::SelectObject(
+void wxMemoryDCImpl::DoSelect(
const wxBitmap& rBitmap
)
{
// Check for whether the bitmap is already selected into a device context
//
wxCHECK_RET( !rBitmap.GetSelectedInto() ||
- (rBitmap.GetSelectedInto() == this),
+ (rBitmap.GetSelectedInto() == GetOwner()),
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_vSelectedBitmap.SetSelectedInto(this);
- hBmp = (WXHBITMAP)::GpiSetBitmap(m_hPS, (HBITMAP)hBmp);
+ m_hOldBitmap = (WXHBITMAP)::GpiSetBitmap(m_hPS, NULLHANDLE);
+ return;
+ }
+ m_vSelectedBitmap.SetSelectedInto(GetOwner());
+ 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(
+void wxMemoryDCImpl::DoGetSize(
int* pWidth
, int* pHeight
) const
*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);
-
- wxLoadBitmapWithData( m_hPS
- ,(HBITMAP)m_vSelectedBitmap.GetHBITMAP()
- ,m_vSelectedBitmap.GetWidth()
- ,m_vSelectedBitmap.GetHeight()
- );
-} // end of wxMemoryDC::DoDrawRectangle
-
-void wxMemoryDC::DoDrawRoundedRectangle(
- wxCoord vX
-, wxCoord vY
-, wxCoord vWidth
-, wxCoord vHeight
-, double dRadius
-)
-{
- wxDC::DoDrawRoundedRectangle(vX, vY, vWidth, vHeight, dRadius);
-
- wxLoadBitmapWithData( m_hPS
- ,(HBITMAP)m_vSelectedBitmap.GetHBITMAP()
- ,m_vSelectedBitmap.GetWidth()
- ,m_vSelectedBitmap.GetHeight()
- );
-} // end of wxMemoryDC::DoDrawRoundedRectangle
-
-void wxMemoryDC::DoDrawText(
- const wxString& rsText
-, wxCoord vX
-, wxCoord vY
-)
-{
- wxDC::DoDrawText(rsText, vX, vY);
-
- wxLoadBitmapWithData( m_hPS
- ,(HBITMAP)m_vSelectedBitmap.GetHBITMAP()
- ,m_vSelectedBitmap.GetWidth()
- ,m_vSelectedBitmap.GetHeight()
- );
-} // end of wxMemoryDC::DoDrawRectangle
-
-void wxMemoryDC::DoDrawLine(
- wxCoord vX1
-, wxCoord vY1
-, wxCoord vX2
-, wxCoord vY2
-)
-{
- wxDC::DoDrawLine(vX1, vY1, vX2, vY2);
-
- wxLoadBitmapWithData( m_hPS
- ,(HBITMAP)m_vSelectedBitmap.GetHBITMAP()
- ,m_vSelectedBitmap.GetWidth()
- ,m_vSelectedBitmap.GetHeight()
- );
-} // end of wxMemoryDC::DoDrawRoundedRectangle
-
-void wxLoadBitmapWithData(
- HPS hPS
-, HBITMAP hBitmap
-, int nWidth
-, int nHeight
-)
-{
- BITMAPINFOHEADER2 vHeader;
- BITMAPINFO2 vInfo;
-
- vHeader.cbFix = 16L;
- if (::GpiQueryBitmapInfoHeader(hBitmap, &vHeader))
- {
- unsigned char* pucData = NULL;
- unsigned char* pucBits;
- int nBytesPerLine = nWidth * 3;
- LONG lScans = 0L;
- POINTL vPoint;
- LONG lColor;
-
- vInfo.cbFix = 16;
- vInfo.cx = vHeader.cx;
- vInfo.cy = vHeader.cy;
- vInfo.cPlanes = vHeader.cPlanes;
- vInfo.cBitCount = 24;
- pucData = (unsigned char*)malloc(nBytesPerLine * nHeight);
- pucBits = pucData;
- for (int i = 0; i < nHeight; i++)
- {
- for (int j = 0; j < nWidth; j++)
- {
- vPoint.x = j; vPoint.y = i;
- lColor = ::GpiQueryPel(hPS, &vPoint);
- *(pucBits++) = (unsigned char)lColor;
- *(pucBits++) = (unsigned char)(lColor >> 8);
- *(pucBits++) = (unsigned char)(lColor >> 16);
- }
- }
- if ((lScans = ::GpiSetBitmapBits( hPS
- ,0
- ,(LONG)nHeight
- ,(PBYTE)pucData
- ,&vInfo
- )) == GPI_ALTERROR)
- {
- ERRORID vError;
- wxString sError;
-
- vError = ::WinGetLastError(vHabmain);
- sError = wxPMErrorToStr(vError);
- }
- free(pucData);
- }
-}