** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: sgp.cpp,v 1.12 2000/08/31 08:38:58 kevin Exp $
+** $Id: sgp.cpp,v 1.18 2000/12/16 06:12:47 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
int SGP::s_iRGBColorCount = sizeof(s_aRGBColor) / sizeof(class RGBColor);
#ifdef HAVE_WXWINDOWS
-SGPDriver::SGPDriver (wxDC* pDC, int xsize = 640, int ysize = 480)
+SGPDriver::SGPDriver (wxDC* pDC, int xsize, int ysize)
: m_iPhysicalXSize(xsize), m_iPhysicalYSize(ysize), m_idDriver(0), m_pDC(pDC)
{
m_idDriver |= SGPDRIVER_WXWINDOWS;
}
#endif
-SGPDriver::SGPDriver (const char* szWinTitle = "", int xsize = 640, int ysize = 480)
+SGPDriver::SGPDriver (const char* szWinTitle, int xsize, int ysize)
: m_iPhysicalXSize(xsize), m_iPhysicalYSize(ysize), m_sWindowTitle(szWinTitle), m_idDriver(0)
{
#ifdef HAVE_G2_H
SGPDriver::~SGPDriver ()
{
+#if HAVE_G2_H
if (isG2())
g2_close (m_idG2);
+#endif
}
// SGP::SGP Constructor for Simple Graphics Package
SGP::SGP (const SGPDriver& driver)
- : m_driver (driver)
+ : m_driver (driver)
{
m_iPhysicalXSize = m_driver.getPhysicalXSize();
m_iPhysicalYSize = m_driver.getPhysicalYSize();
#if HAVE_WXWINDOWS
m_pen.SetWidth(1);
m_pen.SetStyle(wxSOLID);
+
+ if (m_driver.isWX()) {
+ static const double dScreenDPI = 82;
+ static const double dPointsPerInch = 72.;
+ m_dPointsPerPixel = dPointsPerInch / dScreenDPI;
+ const int iTestPointSize = 72;
+ m_font.SetPointSize (iTestPointSize);
+ m_driver.idWX()->SetFont(m_font);
+ double dTestCharHeight = m_driver.idWX()->GetCharHeight();
+ m_dPointsPerPixel = iTestPointSize / dTestCharHeight;
+ }
#endif
setWindow (0., 0., 1., 1.);
setViewport (0., 0., 1., 1.);
moveAbs (0., 0.);
stylusNDC (0., 0., false);
-
+
setTextAngle (0.);
- setTextSize (1. / 25.);
+ setTextPointSize (12);
setColor (C_BLACK);
}
if (beam) {
#if HAVE_WXWINDOWS
- if (m_driver.isWX())
- m_driver.idWX()->DrawLine (m_iCurrentPhysicalX, m_iCurrentPhysicalY, xp, yp);
+ if (m_driver.isWX())
+ m_driver.idWX()->DrawLine (m_iCurrentPhysicalX, m_iCurrentPhysicalY, xp, yp);
#endif
#if HAVE_G2_H
- if (m_driver.isG2())
- g2_line (m_driver.idG2(), m_iCurrentPhysicalX, m_iCurrentPhysicalY, xp, yp);
+ if (m_driver.isG2())
+ g2_line (m_driver.idG2(), m_iCurrentPhysicalX, m_iCurrentPhysicalY, xp, yp);
#endif
}
m_iCurrentPhysicalX = xp;
ymax = yv_max;
}
+void
+SGP::getWindow (double& xmin, double& ymin, double& xmax, double& ymax)
+{
+ xmin = xw_min;
+ ymin = yw_min;
+ xmax = xw_max;
+ ymax = yw_max;
+}
+
// NAME
// frameViewport draw box around viewport
moveAbs (x + m_dCurrentWorldX, y + m_dCurrentWorldY);
}
+
+// Height is in master coordinates
void
SGP::setTextSize (double height)
{
+ height /= (xw_max - xw_min);
+#if HAVE_G2_H
if (m_driver.isG2())
g2_set_font_size(m_driver.idG2(), (height * m_iPhysicalYSize));
+#endif
+#if HAVE_WXWINDOWS
+ if (m_driver.isWX()) {
+ double dHeightPixels = height * m_iPhysicalYSize;
+ double dHeightPoints = dHeightPixels * m_dPointsPerPixel;
+ m_font.SetPointSize (nearest<int>(dHeightPoints));
+ m_driver.idWX()->SetFont (m_font);
+ }
+#endif
+}
+
+void
+SGP::setTextNDCSize (double height)
+{
+ double dHeightPixels = height * m_iPhysicalYSize;
+#if HAVE_G2_H
+ if (m_driver.isG2())
+ g2_set_font_size(m_driver.idG2(), nearest<int>(dHeightPixels));
+#endif
+#if HAVE_WXWINDOWS
+ if (m_driver.isWX()) {
+ double dHeightPoints = dHeightPixels * m_dPointsPerPixel;
+ m_font.SetPointSize (nearest<int>(dHeightPoints));
+ m_driver.idWX()->SetFont (m_font);
+ }
+#endif
+}
+
+void
+SGP::setTextPointSize (double height)
+{
+#if HAVE_G2_H
+ // if (m_driver.isG2())
+ // g2_set_font_size(m_driver.idG2(), (height * m_iPhysicalYSize));
+#endif
+#if HAVE_WXWINDOWS
+ if (m_driver.isWX()) {
+ m_font.SetPointSize (static_cast<int>(height+0.5));
+ m_driver.idWX()->SetFont (m_font);
+ }
+#endif
}
void
m_driver.idWX()->GetTextExtent (sText, &deviceW, &deviceH);
*worldW = static_cast<double>(deviceW) / static_cast<double>(m_iPhysicalXSize);;
*worldH = static_cast<double>(deviceH) / static_cast<double>(m_iPhysicalYSize);
- // cout << deviceW << ", " << deviceH << ", " << *worldW << ", " << *worldH << endl;
*worldW *= (xw_max - xw_min);
*worldH *= (yw_max - yw_min);
}
#if HAVE_WXWINDOWS
if (m_driver.isWX()) {
dHeight = m_driver.idWX()->GetCharHeight();
- dHeight /= static_cast<double>(m_iPhysicalYSize);;
+ dHeight /= static_cast<double>(m_iPhysicalYSize);
+ }
+#endif
+ dHeight *= (yw_max - yw_min);
+ return dHeight;
+}
+
+double
+SGP::getCharWidth ()
+{
+ double dWidth = (1. / 80.);
+
+#if HAVE_WXWINDOWS
+ if (m_driver.isWX()) {
+ dWidth = m_driver.idWX()->GetCharWidth();
+ dWidth /= static_cast<double>(m_iPhysicalXSize);
}
#endif
- return (dHeight * (xw_max - xw_min));
+ dWidth *= (xw_max - xw_min);
+ return dWidth;
}
void
SGP::setTextAngle (double angle)
{
- m_dTextAngle = angle;
+ m_dTextAngle = convertRadiansToDegrees(angle);
}
void
void
-SGP::drawText (const string& rsMessage)
+SGP::drawText (const std::string& rsMessage)
{
drawText (rsMessage.c_str());
}