r313: *** empty log message ***
[ctsim.git] / libctgraphics / sgp.cpp
index 4790a2394e2b9514222151a41d9aeb855f47e881..4b2d5dcfea9cf1c52a8211b0a3d656dfd65ef821 100644 (file)
@@ -7,7 +7,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: sgp.cpp,v 1.14 2000/09/04 09:06:46 kevin Exp $
+**  $Id: sgp.cpp,v 1.23 2000/12/25 21:54:26 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
 }
 
 
@@ -90,20 +92,27 @@ SGP::SGP (const SGPDriver& driver)
   m_ctm.setIdentity();
 
 #if HAVE_WXWINDOWS
-  m_pen.SetWidth(1);
-  m_pen.SetStyle(wxSOLID);
-#endif
+  m_pen.SetWidth (1);
 
   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;
+    static const double dScreenDPI = 82;
+    static const double dPointsPerInch = 72.;
+    m_dPointsPerPixel = dPointsPerInch / dScreenDPI;
+    const int iTestPointSize = 12;\r
+    m_pFont = new wxFont (wxROMAN, wxNORMAL, wxNORMAL, wxNORMAL);
+    m_pFont->SetPointSize (iTestPointSize);\r
+    m_pFont->SetWeight (wxNORMAL);\r
+    m_pFont->SetStyle (wxNORMAL);
+    m_pFont->SetFamily (wxROMAN);\r
+#ifdef MSVC\r
+    m_pFont->SetFaceName(wxString("times new roman"));\r
+#endif\r
+    m_driver.idWX()->SetFont (*m_pFont);
+    double dTestCharHeight = m_driver.idWX()->GetCharHeight();
+    m_dPointsPerPixel = iTestPointSize / dTestCharHeight;\r
+       m_driver.idWX()->SetBackground (*wxWHITE_BRUSH);
   }
+#endif
 
   setWindow (0., 0., 1., 1.);
   setViewport (0., 0., 1., 1.);
@@ -112,9 +121,19 @@ SGP::SGP (const SGPDriver& driver)
   
   setTextAngle (0.);
   setTextPointSize (12);
-  setColor (C_BLACK);
+  setColor (C_BLACK);\r
+  setLineStyle (LS_SOLID);
 }
 
+SGP::~SGP()\r
+{\r
+#if HAVE_WXWINDOWS\r
+  if (m_driver.isWX()) {\r
+    m_driver.idWX()->SetFont (wxNullFont);\r
+    delete m_pFont;\r
+  }\r
+#endif\r
+}\r
 
 void
 SGP::stylusNDC (double x, double y, bool beam)
@@ -160,8 +179,20 @@ SGP::eraseWindow ()
     g2_clear (m_driver.idG2());
 #endif
 #if HAVE_WXWINDOWS
-  if (m_driver.isWX())
-    m_driver.idWX()->Clear();
+  if (m_driver.isWX()) {\r
+       wxBrush brushWhite;\r
+       brushWhite.SetColour(255,255,255);\r
+       m_driver.idWX()->SetBackground(brushWhite);\r
+       m_driver.idWX()->Clear();\r
+       m_driver.idWX()->SetBackground(wxNullBrush);\r
+#if 1\r
+       wxPen pen;\r
+       pen.SetColour(255,255,255);\r
+       m_driver.idWX()->SetBrush (brushWhite);\r
+       m_driver.idWX()->DrawRectangle (0, 0, m_iPhysicalXSize, m_iPhysicalYSize);\r
+       m_driver.idWX()->SetBrush (wxNullBrush);\r
+#endif\r
+  }
 #endif
 }
 
@@ -363,7 +394,37 @@ SGP::setMarker (int idMarke, int iColor)
 //==============================================================
 void 
 SGP::setLineStyle (int style)
-{
+{\r
+  m_iLinestyle = style;\r
+
+#if HAVE_WXWINDOWS\r
+  if (m_driver.isWX()) {\r
+    switch (m_iLinestyle) {\r
+    case LS_SOLID:\r
+      m_pen.SetStyle (wxSOLID);\r
+      break;\r
+    case LS_DASH1:\r
+      m_pen.SetStyle (wxLONG_DASH);\r
+      break;\r
+    case LS_DASH2:\r
+      m_pen.SetStyle (wxSHORT_DASH);\r
+      break;\r
+    case LS_DASH3:\r
+      m_pen.SetStyle (wxDOT_DASH);\r
+      break;\r
+    case LS_DASH4:\r
+      m_pen.SetStyle (wxCROSS_HATCH);\r
+      break;\r
+    case LS_DOTTED:\r
+      m_pen.SetStyle (wxDOT);\r
+      break;\r
+    default:\r
+      m_pen.SetStyle (wxSOLID);\r
+      break;\r
+    }\r
+    m_driver.idWX()->SetPen (m_pen);\r
+  }\r
+#endif\r
 }
 
 //==============================================================
@@ -417,7 +478,7 @@ SGP::moveRel (double x, double y)
 void
 SGP::setTextSize (double height)
 {
-    height /= (xw_max - xw_min);
+    height /= (yw_max - yw_min);  // convert to NDC
 #if HAVE_G2_H
   if (m_driver.isG2())
     g2_set_font_size(m_driver.idG2(), (height * m_iPhysicalYSize));
@@ -426,8 +487,8 @@ SGP::setTextSize (double height)
   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);
+      m_pFont->SetPointSize (nearest<int>(dHeightPoints));
+      m_driver.idWX()->SetFont (*m_pFont);
   }
 #endif
 }
@@ -443,8 +504,8 @@ SGP::setTextNDCSize (double height)
 #if HAVE_WXWINDOWS
   if (m_driver.isWX()) {
       double dHeightPoints = dHeightPixels * m_dPointsPerPixel;
-      m_font.SetPointSize (nearest<int>(dHeightPoints));
-      m_driver.idWX()->SetFont (m_font);
+      m_pFont->SetPointSize (nearest<int>(dHeightPoints));
+      m_driver.idWX()->SetFont (*m_pFont);
   }
 #endif
 }
@@ -458,8 +519,8 @@ SGP::setTextPointSize (double height)
 #endif
 #if HAVE_WXWINDOWS
   if (m_driver.isWX()) {
-      m_font.SetPointSize (height);
-      m_driver.idWX()->SetFont (m_font);
+      m_pFont->SetPointSize (static_cast<int>(height+0.5));
+      m_driver.idWX()->SetFont (*m_pFont);
   }
 #endif
 }
@@ -472,10 +533,8 @@ SGP::getTextExtent (const char* szText, double* worldW, double* worldH)
     wxString sText (szText);
     wxCoord deviceW, deviceH;
     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);
-    *worldW *= (xw_max - xw_min);
-    *worldH *= (yw_max - yw_min);
+    *worldW = (xw_max - xw_min) * deviceW / static_cast<double>(m_iPhysicalXSize);;
+    *worldH = (yw_max - yw_min) * deviceH / static_cast<double>(m_iPhysicalYSize);
   }
 #endif
 }
@@ -488,10 +547,11 @@ 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);\r
+       dHeight /= (yv_max - yv_min); // scale to viewport;
   }
 #endif
-  dHeight *= (yw_max - yw_min);
+  dHeight *= (yw_max - yw_min);  // scale to world coordinates
   return dHeight;
 }
 
@@ -503,10 +563,11 @@ SGP::getCharWidth ()
 #if HAVE_WXWINDOWS
   if (m_driver.isWX()) {
     dWidth = m_driver.idWX()->GetCharWidth();
-    dWidth /= static_cast<double>(m_iPhysicalXSize);
+    dWidth /= static_cast<double>(m_iPhysicalXSize);\r
+       dWidth /= (xv_max - xv_min); // scale to viewport
   }
 #endif
-  dWidth *= (xw_max - xw_min);
+  dWidth *= (xw_max - xw_min); //scale to world coordinates
   return dWidth;
 }
 
@@ -594,7 +655,7 @@ SGP::pointRel (double x, double y)
 
 
 void
-SGP::drawText (const string& rsMessage)
+SGP::drawText (const std::string& rsMessage)
 {
   drawText (rsMessage.c_str());
 }