** 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
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
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.);
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)
{
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
}
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
}
//==============================================================
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));
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
}
#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
}
#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
}
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
}
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;
}
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;
}
void
-SGP::drawText (const string& rsMessage)
+SGP::drawText (const std::string& rsMessage)
{
drawText (rsMessage.c_str());
}
void
SGP::setDC (wxDC* pDC)
{
- if (m_driver.isWX())
+ if (m_driver.isWX()) {
m_driver.setDC(pDC);
+ initFromDC (pDC);
+ setTextPointSize (m_iTextPointSize);
+ }
}
#endif