r385: no message
[ctsim.git] / libctgraphics / sgp.cpp
index 07e103f182e054d3f20fbd74c1cf83de54169e1c..ec6b89d4a936dcff1fe103a2a362232525bb4b15 100644 (file)
@@ -7,7 +7,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: sgp.cpp,v 1.16 2000/10/11 08:16:08 kevin Exp $
+**  $Id: sgp.cpp,v 1.27 2001/01/12 21:53:27 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
@@ -91,20 +91,8 @@ SGP::SGP (const SGPDriver& driver)
   ndc_to_mc.setIdentity();
   m_ctm.setIdentity();
 
-#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;
-  }
+#ifdef HAVE_WXWINDOWS
+  initFromDC (driver.idWX());
 #endif
 
   setWindow (0., 0., 1., 1.);
@@ -115,9 +103,48 @@ SGP::SGP (const SGPDriver& driver)
   setTextAngle (0.);
   setTextPointSize (12);
   setColor (C_BLACK);
+  setLineStyle (LS_SOLID);
 }
 
 
+#ifdef HAVE_WXWINDOWS
+void
+SGP::initFromDC (wxDC* pDC)
+{
+  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 = 12;
+    m_pFont = new wxFont (wxROMAN, wxNORMAL, wxNORMAL, wxNORMAL);
+    m_pFont->SetPointSize (iTestPointSize);
+    m_pFont->SetWeight (wxNORMAL);
+    m_pFont->SetStyle (wxNORMAL);
+    m_pFont->SetFamily (wxROMAN);
+#ifdef MSVC
+    m_pFont->SetFaceName(wxString("times new roman"));
+#endif
+    m_driver.idWX()->SetFont (*m_pFont);
+    double dTestCharHeight = m_driver.idWX()->GetCharHeight();
+    m_dPointsPerPixel = iTestPointSize / dTestCharHeight;
+       m_driver.idWX()->SetBackground (*wxWHITE_BRUSH);
+  }
+}
+#endif
+
+
+SGP::~SGP()
+{
+#if HAVE_WXWINDOWS
+  if (m_driver.isWX()) {
+ //   m_driver.idWX()->SetFont (wxNullFont);
+    delete m_pFont;
+  }
+#endif
+}
+
 void
 SGP::stylusNDC (double x, double y, bool beam)
 {
@@ -162,8 +189,20 @@ SGP::eraseWindow ()
     g2_clear (m_driver.idG2());
 #endif
 #if HAVE_WXWINDOWS
-  if (m_driver.isWX())
-    m_driver.idWX()->Clear();
+  if (m_driver.isWX()) {
+       wxBrush brushWhite;
+       brushWhite.SetColour(255,255,255);
+       m_driver.idWX()->SetBackground(brushWhite);
+       m_driver.idWX()->Clear();
+       m_driver.idWX()->SetBackground(wxNullBrush);
+#if 1
+       wxPen pen;
+       pen.SetColour(255,255,255);
+       m_driver.idWX()->SetBrush (brushWhite);
+       m_driver.idWX()->DrawRectangle (0, 0, m_iPhysicalXSize, m_iPhysicalYSize);
+       m_driver.idWX()->SetBrush (wxNullBrush);
+#endif
+  }
 #endif
 }
 
@@ -366,6 +405,36 @@ SGP::setMarker (int idMarke, int iColor)
 void 
 SGP::setLineStyle (int style)
 {
+  m_iLinestyle = style;
+
+#if HAVE_WXWINDOWS
+  if (m_driver.isWX()) {
+    switch (m_iLinestyle) {
+    case LS_SOLID:
+      m_pen.SetStyle (wxSOLID);
+      break;
+    case LS_DASH1:
+      m_pen.SetStyle (wxLONG_DASH);
+      break;
+    case LS_DASH2:
+      m_pen.SetStyle (wxSHORT_DASH);
+      break;
+    case LS_DASH3:
+      m_pen.SetStyle (wxDOT_DASH);
+      break;
+    case LS_DASH4:
+      m_pen.SetStyle (wxCROSS_HATCH);
+      break;
+    case LS_DOTTED:
+      m_pen.SetStyle (wxDOT);
+      break;
+    default:
+      m_pen.SetStyle (wxSOLID);
+      break;
+    }
+    m_driver.idWX()->SetPen (m_pen);
+  }
+#endif
 }
 
 //==============================================================
@@ -419,7 +488,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));
@@ -428,8 +497,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
 }
@@ -445,8 +514,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
 }
@@ -460,8 +529,9 @@ SGP::setTextPointSize (double height)
 #endif
 #if HAVE_WXWINDOWS
   if (m_driver.isWX()) {
-      m_font.SetPointSize (static_cast<int>(height+0.5));
-      m_driver.idWX()->SetFont (m_font);
+    m_iTextPointSize = static_cast<int>(height+0.5);
+      m_pFont->SetPointSize (m_iTextPointSize);
+      m_driver.idWX()->SetFont (*m_pFont);
   }
 #endif
 }
@@ -474,10 +544,13 @@ 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);
+    if (m_dTextAngle == 90 || m_dTextAngle == -90) {
+      wxCoord temp = deviceW;
+      deviceW = deviceH;
+      deviceH = temp;
+    }
+    *worldW = (xw_max - xw_min) * deviceW / static_cast<double>(m_iPhysicalXSize);;
+    *worldH = (yw_max - yw_min) * deviceH / static_cast<double>(m_iPhysicalYSize);
   }
 #endif
 }
@@ -491,9 +564,10 @@ SGP::getCharHeight ()
   if (m_driver.isWX()) {
     dHeight = m_driver.idWX()->GetCharHeight();
     dHeight /= static_cast<double>(m_iPhysicalYSize);
+       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;
 }
 
@@ -506,9 +580,10 @@ SGP::getCharWidth ()
   if (m_driver.isWX()) {
     dWidth = m_driver.idWX()->GetCharWidth();
     dWidth /= static_cast<double>(m_iPhysicalXSize);
+       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;
 }
 
@@ -596,7 +671,7 @@ SGP::pointRel (double x, double y)
 
 
 void
-SGP::drawText (const string& rsMessage)
+SGP::drawText (const std::string& rsMessage)
 {
   drawText (rsMessage.c_str());
 }
@@ -877,7 +952,10 @@ const unsigned char SGP::MARKER_BITMAP[MARK_COUNT][5] =
 void
 SGP::setDC (wxDC* pDC)
 {
-  if (m_driver.isWX())
+  if (m_driver.isWX()) {
     m_driver.setDC(pDC);
+    initFromDC (pDC);
+    setTextPointSize (m_iTextPointSize);
+  }
 }
 #endif