X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f50a1c3d667fb948bfbdcbd4b3021d896c6635cd..98cb8dcb0cf3b0e660f1f67e1c02451ab10257de:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index c978aa2b24..3f7057b564 100644 --- a/src/generic/dcpsg.cpp +++ b/src/generic/dcpsg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dcpsg.cpp +// Name: src/generic/dcpsg.cpp // Purpose: Generic wxPostScriptDC implementation // Author: Julian Smart, Robert Roebling, Markus Holzhem // Modified by: @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "dcpsg.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ @@ -40,6 +36,7 @@ #include "wx/paper.h" #include "wx/filefn.h" #include "wx/math.h" +#include "wx/stdpaths.h" #ifdef __WXMSW__ @@ -408,9 +405,10 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, alpha1 = 0.0; alpha2 = 360.0; } - else if (radius == 0.0) + else if ( wxIsNullDouble(radius) ) { - alpha1 = alpha2 = 0.0; + alpha1 = + alpha2 = 0.0; } else { @@ -463,12 +461,16 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d { wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); - if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360; - if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360; - if (sa<0) sa+=360; - if (ea<0) ea+=360; + if ( sa >= 360 || sa <= -360 ) + sa -= int(sa/360)*360; + if ( ea >= 360 || ea <=- 360 ) + ea -= int(ea/360)*360; + if ( sa < 0 ) + sa += 360; + if ( ea < 0 ) + ea += 360; - if (sa==ea) + if ( wxIsSameDouble(sa, ea) ) { DrawEllipse(x,y,w,h); return; @@ -744,7 +746,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width /* Draw rectangle anticlockwise */ PsPrintf( wxT("newpath\n") wxT("%d %d %d 90 180 arc\n") - wxT("%d %d moveto\n") + wxT("%d %d lineto\n") wxT("%d %d %d 180 270 arc\n") wxT("%d %d lineto\n") wxT("%d %d %d 270 0 arc\n") @@ -754,7 +756,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width wxT("closepath\n") wxT("fill\n"), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad), - LogicalToDeviceX(x), LogicalToDeviceY(y + rad), + LogicalToDeviceX(x), LogicalToDeviceY(y + height - rad), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), @@ -773,7 +775,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width /* Draw rectangle anticlockwise */ PsPrintf( wxT("newpath\n") wxT("%d %d %d 90 180 arc\n") - wxT("%d %d moveto\n") + wxT("%d %d lineto\n") wxT("%d %d %d 180 270 arc\n") wxT("%d %d lineto\n") wxT("%d %d %d 270 0 arc\n") @@ -783,7 +785,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width wxT("closepath\n") wxT("stroke\n"), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad), - LogicalToDeviceX(x), LogicalToDeviceY(y + rad), + LogicalToDeviceX(x), LogicalToDeviceY(y + height - rad), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), @@ -1073,7 +1075,6 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) double bluePS = (double)(blue) / 255.0; double greenPS = (double)(green) / 255.0; - char buffer[100]; sprintf( buffer, "%.8f %.8f %.8f setrgbcolor\n", redPS, greenPS, bluePS ); @@ -1250,7 +1251,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle ) { - if (angle == 0.0) + if ( wxIsNullDouble(angle) ) { DoDrawText(text, x, y); return; @@ -1350,7 +1351,6 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord { wxCoord uy = (wxCoord)(y + size - m_underlinePosition); wxCoord w, h; - char buffer[100]; GetTextExtent(text, &w, &h); sprintf( buffer, @@ -1384,6 +1384,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function)) wxFAIL_MSG( wxT("wxPostScriptDC::SetLogicalFunction not implemented.") ); } +#if wxUSE_SPLINES void wxPostScriptDC::DoDrawSpline( wxList *points ) { wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); @@ -1458,6 +1459,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) wxT("stroke\n"), LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) ); } +#endif // wxUSE_SPLINES wxCoord wxPostScriptDC::GetCharWidth() const { @@ -1561,7 +1563,7 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) m_printData.SetFilename(filename); } - m_pstream = wxFopen( m_printData.GetFilename().fn_str(), wxT("w+") ); + m_pstream = wxFopen( m_printData.GetFilename(), wxT("w+") ); if (!m_pstream) { @@ -1962,22 +1964,35 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, FILE *afmFile = NULL; - wxPostScriptPrintNativeData *data = - (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - // Get the directory of the AFM files wxString afmName; - if (!data->GetFontMetricPath().empty()) + + // VZ: I don't know if the cast always works under Unix but it clearly + // never does under Windows where the pointer is + // wxWindowsPrintNativeData and so calling GetFontMetricPath() on + // it just crashes +#ifndef __WIN32__ + wxPostScriptPrintNativeData *data = + wxDynamicCast(m_printData.GetNativeData(), wxPostScriptPrintNativeData); + + if (data && !data->GetFontMetricPath().empty()) { afmName = data->GetFontMetricPath(); afmName << wxFILE_SEP_PATH << name; - afmFile = wxFopen(afmName.fn_str(),wxT("r")); } +#endif // __WIN32__ -#if defined(__UNIX__) && !defined(__VMS__) - if (afmFile==NULL) + if ( !afmName.empty() ) + afmFile = wxFopen(afmName, wxT("r")); + + if ( !afmFile ) { +#if defined(__UNIX__) && !defined(__VMS__) afmName = wxGetDataDir(); +#else // !__UNIX__ + afmName = wxStandardPaths::Get().GetDataDir(); +#endif // __UNIX__/!__UNIX__ + afmName << wxFILE_SEP_PATH #if defined(__LINUX__) || defined(__FREEBSD__) << wxT("gs_afm") << wxFILE_SEP_PATH @@ -1985,9 +2000,8 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, << wxT("afm") << wxFILE_SEP_PATH #endif << name; - afmFile = wxFopen(afmName.fn_str(),wxT("r")); + afmFile = wxFopen(afmName,wxT("r")); } -#endif /* 2. open and process the file / a short explanation of the AFM format: