r246: More modifications for MSVC
[ctsim.git] / libctgraphics / sgp.cpp
index e96f29d8414c5ffc2d9324fb8a0404582d86c127..3626555c86f0e67d0fc0aad46a503a8326324fae 100644 (file)
@@ -7,7 +7,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: sgp.cpp,v 1.13 2000/09/02 05:10:39 kevin Exp $
+**  $Id: sgp.cpp,v 1.17 2000/12/06 01:46:43 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
@@ -52,14 +52,14 @@ RGBColor SGP::s_aRGBColor[] =
 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
@@ -70,8 +70,10 @@ SGPDriver::SGPDriver (const char* szWinTitle = "", int xsize = 640, int ysize =
 
 SGPDriver::~SGPDriver ()
 {
+#if HAVE_G2_H
   if (isG2()) 
     g2_close (m_idG2);
+#endif
 }
 
 
@@ -79,7 +81,7 @@ SGPDriver::~SGPDriver ()
 //   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();
@@ -92,15 +94,26 @@ SGP::SGP (const SGPDriver& driver)
 #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);
 }
 
@@ -115,12 +128,12 @@ SGP::stylusNDC (double x, double y, bool beam)
 
   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;
@@ -401,11 +414,56 @@ SGP::moveRel (double x, double y)
   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
@@ -418,7 +476,6 @@ SGP::getTextExtent (const char* szText, double* worldW, double* worldH)
     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);
   }
@@ -433,16 +490,32 @@ SGP::getCharHeight ()
 #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