X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctgraphics%2Fsgp.cpp;h=52a2430ad942d98d0f63d2b934a671db10b5f6d0;hp=6b826d7172d4b22cfb1f5dd443d56f438cecb3f0;hb=6bfb747f8163381d94a02c03a0351e9ca6815d22;hpb=1e88cf0f7fa4f690ea9f110e8ed3f2b5338d0a10 diff --git a/libctgraphics/sgp.cpp b/libctgraphics/sgp.cpp index 6b826d7..52a2430 100644 --- a/libctgraphics/sgp.cpp +++ b/libctgraphics/sgp.cpp @@ -7,7 +7,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: sgp.cpp,v 1.10 2000/08/25 15:59:13 kevin Exp $ +** $Id: sgp.cpp,v 1.11 2000/08/27 20:32:55 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 @@ -81,9 +81,6 @@ SGPDriver::~SGPDriver () SGP::SGP (const SGPDriver& driver) : m_driver (driver) -#if HAVE_WXWINDOWS - , m_pPen(NULL) -#endif { m_iPhysicalXSize = m_driver.getPhysicalXSize(); m_iPhysicalYSize = m_driver.getPhysicalYSize(); @@ -93,6 +90,11 @@ SGP::SGP (const SGPDriver& driver) ndc_to_mc.setIdentity(); m_ctm.setIdentity(); +#if HAVE_WXWINDOWS + m_pen.SetWidth(1); + m_pen.SetStyle(wxSOLID); +#endif + setWindow (0., 0., 1., 1.); setViewport (0., 0., 1., 1.); moveAbs (0., 0.); @@ -101,6 +103,7 @@ SGP::SGP (const SGPDriver& driver) setTextAngle (0.); setTextSize (1. / 25.); setColor (C_BLACK); + } @@ -203,16 +206,28 @@ SGP::setViewport (double xmin, double ymin, double xmax, double ymax) void SGP::frameViewport (void) { - stylusNDC (xv_min, yv_min, 0); - stylusNDC (xv_max, yv_min, 1); - stylusNDC (xv_max, yv_max, 1); - stylusNDC (xv_min, yv_max, 1); - stylusNDC (xv_min, yv_min, 1); + stylusNDC (xv_min, yv_min, false); + stylusNDC (xv_max, yv_min, true); + stylusNDC (xv_max, yv_max, true); + stylusNDC (xv_min, yv_max, true); + stylusNDC (xv_min, yv_min, true); } void SGP::setTextColor (int iFGcolor, int iBGcolor) { +#if HAVE_WXWINDOWS + if (m_driver.isWX()) { + if (iFGcolor >= 0) { + wxColor colour (s_aRGBColor[iFGcolor].getRed(), s_aRGBColor[iFGcolor].getGreen(), s_aRGBColor[iFGcolor].getBlue()); + m_driver.idWX()->SetTextForeground (colour); + } + if (iBGcolor >= 0) { + wxColor colour (s_aRGBColor[iBGcolor].getRed(), s_aRGBColor[iBGcolor].getGreen(), s_aRGBColor[iBGcolor].getBlue()); + m_driver.idWX()->SetTextBackground (colour); + } + } +#endif } void @@ -228,9 +243,21 @@ SGP::setColor (int icol) #if HAVE_WXWINDOWS if (m_driver.isWX()) { wxColor colour (s_aRGBColor[icol].getRed(), s_aRGBColor[icol].getGreen(), s_aRGBColor[icol].getBlue()); - delete m_pPen; - m_pPen = new wxPen (colour, 1, wxSOLID); - m_driver.idWX()->SetPen (*m_pPen); + m_pen.SetColour (colour); + m_driver.idWX()->SetPen (m_pen); + } +#endif + } +} + +void +SGP::setPenWidth (int iWidth) +{ + if (iWidth >= 0) { +#if HAVE_WXWINDOWS + if (m_driver.isWX()) { + m_pen.SetWidth (iWidth); + m_driver.idWX()->SetPen (m_pen); } #endif } @@ -331,8 +358,8 @@ SGP::lineAbs (double x, double y) mc_to_ndc.transformPoint (&x2, &y2); if (clip_rect (x1, y1, x2, y2, viewNDC) == true) { // clip to viewport - stylusNDC (x1, y1, 0); // move to first point - stylusNDC (x2, y2, 1); // draw to second point + stylusNDC (x1, y1, false); // move to first point + stylusNDC (x2, y2, true); // draw to second point } m_dCurrentWorldX = x; @@ -365,6 +392,37 @@ SGP::setTextSize (double height) g2_set_font_size(m_driver.idG2(), (height * m_iPhysicalYSize)); } +void +SGP::getTextExtent (const char* szText, double* worldW, double* worldH) +{ +#if HAVE_WXWINDOWS + if (m_driver.isWX()) { + 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); + // cout << deviceW << ", " << deviceH << ", " << *worldW << ", " << *worldH << endl; + *worldW *= (xw_max - xw_min); + *worldH *= (yw_max - yw_min); + } +#endif +} + +double +SGP::getCharHeight () +{ + double dHeight = (1. / 25.); + +#if HAVE_WXWINDOWS + if (m_driver.isWX()) { + dHeight = m_driver.idWX()->GetCharHeight(); + dHeight /= static_cast(m_iPhysicalYSize);; + } +#endif + return (dHeight * (xw_max - xw_min)); +} + void SGP::setTextAngle (double angle) { @@ -386,8 +444,8 @@ SGP::polylineAbs (double x[], double y[], int n) double yt = y2; // as the beginning point of the next line if (clip_rect (x1, y1, xt, yt, viewNDC)) { - stylusNDC (x1, y1, 0); - stylusNDC (xt, yt, 1); + stylusNDC (x1, y1, false); + stylusNDC (xt, yt, true); } for (int i = 2; i < n; i++) { @@ -397,8 +455,8 @@ SGP::polylineAbs (double x[], double y[], int n) xt = x2; yt = y2; if (clip_rect (x1, y1, xt, yt, viewNDC)) { - stylusNDC (x1, y1, 0); - stylusNDC (xt, yt, 1); + stylusNDC (x1, y1, false); + stylusNDC (xt, yt, true); } } } @@ -508,7 +566,7 @@ SGP::drawRect (double xmin, double ymin, double xmax, double ymax) void SGP::drawCircle (const double r) { - drawArc (0.0, 7.0, r); + drawArc (r, 0.0, 7.0); } // ============================================================= @@ -516,7 +574,7 @@ SGP::drawCircle (const double r) //============================================================== void -SGP::drawArc (double start, double stop, const double r) +SGP::drawArc (const double r, double start, double stop) { if ((stop-start) > 2 * PI) stop = start + 2 * PI;