/////////////////////////////////////////////////////////////////////////////
-// 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"
+
#ifndef WX_PRECOMP
-#include "wx/utils.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)
/////////////////////////////////////////////////////////////////////////////
// Memory DC
/////////////////////////////////////////////////////////////////////////////
-wxMemoryDC::wxMemoryDC(void)
+wxMemoryDC::wxMemoryDC(
+ wxDC* pOldDC
+)
{
- ERRORID vError;
- wxString sError;
- HDC hDC;
- HPS hPS;
- DEVOPENSTRUC vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
- SIZEL vSize = {0, 0};
+ CreateCompatible(pOldDC);
+ Init();
+} // end of wxMemoryDC::wxMemoryDC
- //
- // Create a memory device context
- //
- hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
- if (hDC != DEV_ERROR)
- {
- hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
- if (hPS != GPI_ERROR)
- {
- m_hPS = hPS;
- m_hDC = hDC;
- m_ok = TRUE;
- m_bOwnsDC = TRUE;
- SetBrush(*wxWHITE_BRUSH);
- SetPen(*wxBLACK_PEN);
- if (!::GpiCreateLogColorTable( m_hPS
- ,0L
- ,LCOLF_CONSECRGB
- ,0L
- ,(LONG)wxTheColourDatabase->m_nSize
- ,(PLONG)wxTheColourDatabase->m_palTable
- ))
- {
- vError = ::WinGetLastError(vHabmain);
- sError = wxPMErrorToStr(vError);
- wxLogError("Unable to set current color table. Error: %s\n", sError);
- }
- //
- // Set the color table to RGB mode
- //
- if (!::GpiCreateLogColorTable( m_hPS
- ,0L
- ,LCOLF_RGB
- ,0L
- ,0L
- ,NULL
- ))
- {
- vError = ::WinGetLastError(vHabmain);
- sError = wxPMErrorToStr(vError);
- wxLogError("Unable to set current color table. Error: %s\n", sError);
- }
- }
- else
- {
- m_hPS = NULLHANDLE;
- m_hDC = NULLHANDLE;
- m_ok = FALSE;
- m_bOwnsDC = FALSE;
- }
- }
- else
+void wxMemoryDC::Init()
+{
+ if (m_ok)
{
- m_hPS = NULLHANDLE;
- m_hDC = NULLHANDLE;
- m_ok = FALSE;
- m_bOwnsDC = FALSE;
+ SetBrush(*wxWHITE_BRUSH);
+ SetPen(*wxBLACK_PEN);
+
+ // the background mode is only used for text background and is set in
+ // DrawText() to OPAQUE as required, otherwise always TRANSPARENT
+ ::GpiSetBackMix( GetHPS(), BM_LEAVEALONE );
}
-} // end of wxMemoryDC::wxMemoryDC
+ memset(&m_vRclPaint, 0, sizeof(m_vRclPaint));
+} // end of wxMemoryDC::Init
-wxMemoryDC::wxMemoryDC(
- wxDC* pOldDC
-)
+bool wxMemoryDC::CreateCompatible( wxDC* WXUNUSED(pDC) )
{
- HDC hDC;
- HPS hPS;
- DEVOPENSTRUC vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
- SIZEL vSize = {0, 0};
-
- pOldDC->BeginDrawing();
+ HDC hDC;
+ HPS hPS;
+ DEVOPENSTRUC vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+ SIZEL vSize = {0, 0};
//
// Create a memory device context
//
- hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, GetHdcOf(*pOldDC));
+ hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
if (hDC != DEV_ERROR)
{
hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
{
m_hPS = hPS;
m_hDC = hDC;
- m_ok = TRUE;
- m_bOwnsDC = TRUE;
- pOldDC->EndDrawing();
- SetBrush(*wxWHITE_BRUSH);
- SetPen(*wxBLACK_PEN);
+ m_ok = true;
+ m_bOwnsDC = true;
+ //
+ // Set the wxWidgets color table
+ //
+ ::GpiCreateLogColorTable( m_hPS
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ );
+ ::GpiCreateLogColorTable( m_hPS
+ ,0L
+ ,LCOLF_RGB
+ ,0L
+ ,0L
+ ,NULL
+ );
}
else
{
- pOldDC->EndDrawing();
m_hPS = NULLHANDLE;
m_hDC = NULLHANDLE;
- m_ok = FALSE;
- m_bOwnsDC = FALSE;
+ m_ok = false;
+ m_bOwnsDC = false;
}
}
else
{
- pOldDC->EndDrawing();
m_hPS = NULLHANDLE;
m_hDC = NULLHANDLE;
- m_ok = FALSE;
- m_bOwnsDC = FALSE;
+ m_ok = false;
+ m_bOwnsDC = false;
}
-} // end of wxMemoryDC::wxMemoryDC
-wxMemoryDC::~wxMemoryDC()
-{
- if (m_hPS != NULLHANDLE)
- ::GpiDestroyPS(m_hPS);
- if (m_hDC != NULLHANDLE)
- ::DevCloseDC(m_hDC);
-} // end of wxMemoryDC::~wxMemoryDC
+ //
+ // As we created the DC, we must delete it in the dtor
+ //
+ m_bOwnsDC = true;
+ m_ok = m_hDC != 0;
+ return m_ok;
+} // end of wxMemoryDC::CreateCompatible
-void wxMemoryDC::SelectObject(
+void wxMemoryDC::DoSelect(
const wxBitmap& rBitmap
)
{
(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 = m_vSelectedBitmap.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(
*pWidth = m_vSelectedBitmap.GetWidth();
*pHeight = m_vSelectedBitmap.GetHeight();
} // end of wxMemoryDC::DoGetSize
-
-