X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctgraphics%2Fsgp.cpp;h=275a955bfbf031b24891351eb25e6e9830d57695;hp=4790a2394e2b9514222151a41d9aeb855f47e881;hb=9f29c8b32c972db1178d6f8551d5cd57ceb67083;hpb=3147cd44cff6132e51eac1a179c1fc3d405faacc diff --git a/libctgraphics/sgp.cpp b/libctgraphics/sgp.cpp index 4790a23..275a955 100644 --- a/libctgraphics/sgp.cpp +++ b/libctgraphics/sgp.cpp @@ -5,9 +5,9 @@ ** Programmer: Kevin Rosenberg ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: sgp.cpp,v 1.14 2000/09/04 09:06:46 kevin Exp $ +** $Id: sgp.cpp,v 1.29 2001/01/28 19:10:18 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 } @@ -89,22 +91,10 @@ SGP::SGP (const SGPDriver& driver) ndc_to_mc.setIdentity(); m_ctm.setIdentity(); -#if HAVE_WXWINDOWS - m_pen.SetWidth(1); - m_pen.SetStyle(wxSOLID); +#ifdef HAVE_WXWINDOWS + initFromDC (driver.idWX()); #endif - 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; - } - setWindow (0., 0., 1., 1.); setViewport (0., 0., 1., 1.); moveAbs (0., 0.); @@ -113,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) { @@ -160,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 } @@ -364,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 } //============================================================== @@ -417,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)); @@ -426,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(dHeightPoints)); - m_driver.idWX()->SetFont (m_font); + m_pFont->SetPointSize (nearest(dHeightPoints)); + m_driver.idWX()->SetFont (*m_pFont); } #endif } @@ -443,8 +514,8 @@ SGP::setTextNDCSize (double height) #if HAVE_WXWINDOWS if (m_driver.isWX()) { double dHeightPoints = dHeightPixels * m_dPointsPerPixel; - m_font.SetPointSize (nearest(dHeightPoints)); - m_driver.idWX()->SetFont (m_font); + m_pFont->SetPointSize (nearest(dHeightPoints)); + m_driver.idWX()->SetFont (*m_pFont); } #endif } @@ -458,8 +529,9 @@ SGP::setTextPointSize (double height) #endif #if HAVE_WXWINDOWS if (m_driver.isWX()) { - m_font.SetPointSize (height); - m_driver.idWX()->SetFont (m_font); + m_iTextPointSize = static_cast(height+0.5); + m_pFont->SetPointSize (m_iTextPointSize); + m_driver.idWX()->SetFont (*m_pFont); } #endif } @@ -472,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(deviceW) / static_cast(m_iPhysicalXSize);; - *worldH = static_cast(deviceH) / static_cast(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(m_iPhysicalXSize);; + *worldH = (yw_max - yw_min) * deviceH / static_cast(m_iPhysicalYSize); } #endif } @@ -489,9 +564,10 @@ SGP::getCharHeight () if (m_driver.isWX()) { dHeight = m_driver.idWX()->GetCharHeight(); dHeight /= static_cast(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; } @@ -504,9 +580,10 @@ SGP::getCharWidth () if (m_driver.isWX()) { dWidth = m_driver.idWX()->GetCharWidth(); dWidth /= static_cast(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; } @@ -594,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()); } @@ -875,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