git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9727 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
191 lines
5.1 KiB
C++
191 lines
5.1 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: dcmemory.cpp
|
|
// Purpose: wxMemoryDC class
|
|
// Author: David Webster
|
|
// Modified by:
|
|
// Created: 10/14/99
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) David Webster
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/utils.h"
|
|
#endif
|
|
|
|
#include "wx/os2/private.h"
|
|
|
|
#include "wx/dcmemory.h"
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Memory DC
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
wxMemoryDC::wxMemoryDC(void)
|
|
{
|
|
CreateCompatible(NULL);
|
|
Init();
|
|
} // end of wxMemoryDC::wxMemoryDC
|
|
|
|
wxMemoryDC::wxMemoryDC(
|
|
wxDC* pOldDC
|
|
)
|
|
{
|
|
pOldDC->BeginDrawing();
|
|
CreateCompatible(pOldDC);
|
|
pOldDC->EndDrawing();
|
|
Init();
|
|
} // end of wxMemoryDC::wxMemoryDC
|
|
|
|
void wxMemoryDC::Init()
|
|
{
|
|
if (m_ok)
|
|
{
|
|
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::Init
|
|
|
|
bool wxMemoryDC::CreateCompatible(
|
|
wxDC* pDC
|
|
)
|
|
{
|
|
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, 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;
|
|
//
|
|
// Set the wxWindows 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
|
|
{
|
|
m_hPS = NULLHANDLE;
|
|
m_hDC = NULLHANDLE;
|
|
m_ok = FALSE;
|
|
m_bOwnsDC = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_hPS = NULLHANDLE;
|
|
m_hDC = NULLHANDLE;
|
|
m_ok = FALSE;
|
|
m_bOwnsDC = FALSE;
|
|
}
|
|
|
|
//
|
|
// 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(
|
|
const wxBitmap& rBitmap
|
|
)
|
|
{
|
|
//
|
|
// 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 = m_vSelectedBitmap.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);
|
|
} // end of wxMemoryDC::DoDrawRectangle
|