virtual and implement them like any other method in the wxDC classes, not only in the their files but somehow belonging to the wxDCBase class. This is required for plugging in differnt DC backends with different conversions. Ideally (and absolutely possible ) all these methods should be removed and just the one in wxDCBase should stay using values set in the various derived classes. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45741 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
189 lines
4.8 KiB
C++
189 lines
4.8 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: dc.cpp
|
|
// Purpose:
|
|
// Author: Robert Roebling
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 1998 Robert Roebling
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#include "wx/dc.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxDC
|
|
//-----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_ABSTRACT_CLASS(wxDC, wxDCBase)
|
|
|
|
wxDC::wxDC()
|
|
{
|
|
m_ok = FALSE;
|
|
|
|
m_mm_to_pix_x = (double)wxGetDisplaySize().GetWidth() /
|
|
(double)wxGetDisplaySizeMM().GetWidth();
|
|
m_mm_to_pix_y = (double)wxGetDisplaySize().GetHeight() /
|
|
(double)wxGetDisplaySizeMM().GetHeight();
|
|
|
|
m_needComputeScaleX = FALSE; /* not used yet */
|
|
m_needComputeScaleY = FALSE; /* not used yet */
|
|
|
|
m_logicalFunction = wxCOPY;
|
|
|
|
m_pen = *wxBLACK_PEN;
|
|
m_font = *wxNORMAL_FONT;
|
|
m_brush = *wxWHITE_BRUSH;
|
|
}
|
|
|
|
void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
|
|
{
|
|
m_clipping = TRUE;
|
|
m_clipX1 = x;
|
|
m_clipY1 = y;
|
|
m_clipX2 = x + width;
|
|
m_clipY2 = y + height;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// get DC capabilities
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void wxDC::DoGetSizeMM( int* width, int* height ) const
|
|
{
|
|
int w = 0;
|
|
int h = 0;
|
|
GetSize( &w, &h );
|
|
if (width) *width = int( double(w) / (m_userScaleX*m_mm_to_pix_x) );
|
|
if (height) *height = int( double(h) / (m_userScaleY*m_mm_to_pix_y) );
|
|
}
|
|
|
|
// Resolution in pixels per logical inch
|
|
wxSize wxDC::GetPPI() const
|
|
{
|
|
// TODO (should probably be pure virtual)
|
|
return wxSize(0, 0);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// set various DC parameters
|
|
// ---------------------------------------------------------------------------
|
|
|
|
wxCoord wxDC::DeviceToLogicalX(wxCoord x) const
|
|
{
|
|
return wxRound((x - m_deviceOriginX) / m_scaleX) * m_signX + m_logicalOriginX;
|
|
}
|
|
|
|
wxCoord wxDC::DeviceToLogicalY(wxCoord y) const
|
|
{
|
|
return wxRound((y - m_deviceOriginY) / m_scaleY) * m_signY + m_logicalOriginY;
|
|
}
|
|
|
|
wxCoord wxDC::DeviceToLogicalXRel(wxCoord x) const
|
|
{
|
|
return wxRound(x / m_scaleX);
|
|
}
|
|
|
|
wxCoord wxDC::DeviceToLogicalYRel(wxCoord y) const
|
|
{
|
|
return wxRound(y / m_scaleY);
|
|
}
|
|
|
|
wxCoord wxDC::LogicalToDeviceX(wxCoord x) const
|
|
{
|
|
return wxRound((x - m_logicalOriginX) * m_scaleX) * m_signX + m_deviceOriginX;
|
|
}
|
|
|
|
wxCoord wxDC::LogicalToDeviceY(wxCoord y) const
|
|
{
|
|
return wxRound((y - m_logicalOriginY) * m_scaleY) * m_signY + m_deviceOriginY;
|
|
}
|
|
|
|
wxCoord wxDC::LogicalToDeviceXRel(wxCoord x) const
|
|
{
|
|
return wxRound(x * m_scaleX);
|
|
}
|
|
|
|
wxCoord wxDC::LogicalToDeviceYRel(wxCoord y) const
|
|
{
|
|
return wxRound(y * m_scaleY);
|
|
}
|
|
|
|
void wxDC::ComputeScaleAndOrigin()
|
|
{
|
|
m_scaleX = m_logicalScaleX * m_userScaleX;
|
|
m_scaleY = m_logicalScaleY * m_userScaleY;
|
|
}
|
|
|
|
void wxDC::SetMapMode( int mode )
|
|
{
|
|
switch (mode)
|
|
{
|
|
case wxMM_TWIPS:
|
|
SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
|
|
break;
|
|
case wxMM_POINTS:
|
|
SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
|
|
break;
|
|
case wxMM_METRIC:
|
|
SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
|
|
break;
|
|
case wxMM_LOMETRIC:
|
|
SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
|
|
break;
|
|
default:
|
|
case wxMM_TEXT:
|
|
SetLogicalScale( 1.0, 1.0 );
|
|
break;
|
|
}
|
|
m_mappingMode = mode;
|
|
|
|
/* we don't do this mega optimisation
|
|
if (mode != wxMM_TEXT)
|
|
{
|
|
m_needComputeScaleX = TRUE;
|
|
m_needComputeScaleY = TRUE;
|
|
}
|
|
*/
|
|
}
|
|
|
|
void wxDC::SetUserScale( double x, double y )
|
|
{
|
|
// allow negative ? -> no
|
|
m_userScaleX = x;
|
|
m_userScaleY = y;
|
|
ComputeScaleAndOrigin();
|
|
}
|
|
|
|
void wxDC::SetLogicalScale( double x, double y )
|
|
{
|
|
// allow negative ?
|
|
m_logicalScaleX = x;
|
|
m_logicalScaleY = y;
|
|
ComputeScaleAndOrigin();
|
|
}
|
|
|
|
void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y )
|
|
{
|
|
m_logicalOriginX = x * m_signX; // is this still correct ?
|
|
m_logicalOriginY = y * m_signY;
|
|
ComputeScaleAndOrigin();
|
|
}
|
|
|
|
void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y )
|
|
{
|
|
// only wxPostScripDC has m_signX = -1, we override SetDeviceOrigin there
|
|
m_deviceOriginX = x;
|
|
m_deviceOriginY = y;
|
|
ComputeScaleAndOrigin();
|
|
}
|
|
|
|
void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
|
|
{
|
|
// only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
|
|
m_signX = (xLeftRight ? 1 : -1);
|
|
m_signY = (yBottomUp ? -1 : 1);
|
|
ComputeScaleAndOrigin();
|
|
}
|