X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01b5396fcee869baf17192225451c9e310fe53c2..249803fbcd1f73040e4b5457e341d8db2e5cb66e:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index f59a161f7a..232dcccf81 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,38 +9,33 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "dcpsg.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif -#ifndef WX_PRECOMP -#endif // WX_PRECOMP - -#if wxUSE_PRINTING_ARCHITECTURE +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT -#if wxUSE_POSTSCRIPT +#include "wx/generic/dcpsg.h" -#include "wx/setup.h" +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/dcmemory.h" + #include "wx/math.h" + #include "wx/image.h" +#endif // WX_PRECOMP -#include "wx/dcmemory.h" -#include "wx/utils.h" -#include "wx/intl.h" -#include "wx/app.h" -#include "wx/image.h" -#include "wx/log.h" -#include "wx/generic/dcpsg.h" #include "wx/prntbase.h" #include "wx/generic/prntdlgg.h" #include "wx/paper.h" #include "wx/filefn.h" +#include "wx/stdpaths.h" -#include +WXDLLIMPEXP_DATA_CORE(int) wxPageNumber; #ifdef __WXMSW__ @@ -409,9 +404,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 { @@ -464,12 +460,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; @@ -745,7 +745,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") @@ -755,7 +755,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), @@ -774,7 +774,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") @@ -784,7 +784,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), @@ -873,14 +873,14 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, unsigned char* data = image.GetData(); - /* buffer = line = width*rgb(3)*hexa(2)+'\n'(1)+null(1) */ - char* buffer = new char[ w*6+2 ]; + // size of the buffer = width*rgb(3)*hexa(2)+'\n' + wxCharBuffer buffer(w*6 + 1); int firstDigit, secondDigit; //rows for (int j = 0; j < h; j++) { - char* bufferindex = buffer; + char* bufferindex = buffer.data(); //cols for (int i = 0; i < w*3; i++) @@ -1038,12 +1038,26 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) case wxSHORT_DASH: psdash = short_dashed; break; case wxLONG_DASH: psdash = wxCoord_dashed; break; case wxDOT_DASH: psdash = dotted_dashed; break; + case wxUSER_DASH: + { + wxDash *dashes; + int nDashes = m_pen.GetDashes (&dashes); + PsPrint ("["); + for (int i = 0; i < nDashes; ++i) + { + sprintf( buffer, "%d ", dashes [i] ); + PsPrint( buffer ); + } + PsPrint ("] 0 setdash\n"); + psdash = 0; + } + break; case wxSOLID: case wxTRANSPARENT: default: psdash = "[] 0"; break; } - if ( (oldStyle != m_pen.GetStyle()) ) + if ( psdash && (oldStyle != m_pen.GetStyle()) ) { PsPrint( psdash ); PsPrint( " setdash\n" ); @@ -1074,7 +1088,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 ); @@ -1246,12 +1259,12 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) } CalcBoundingBox( x, y ); - CalcBoundingBox( x + size * text.Length() * 2/3 , y ); + CalcBoundingBox( x + size * text.length() * 2/3 , 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; @@ -1351,7 +1364,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, @@ -1372,7 +1384,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord } CalcBoundingBox( x, y ); - CalcBoundingBox( x + size * text.Length() * 2/3 , y ); + CalcBoundingBox( x + size * text.length() * 2/3 , y ); } void wxPostScriptDC::SetBackground (const wxBrush& brush) @@ -1385,6 +1397,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") ); @@ -1459,6 +1472,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) wxT("stroke\n"), LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) ); } +#endif // wxUSE_SPLINES wxCoord wxPostScriptDC::GetCharWidth() const { @@ -1474,10 +1488,7 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? 1 : -1); - // FIXME there is no such function in MSW nor in OS2/PM -#if !defined(__WXMSW__) && !defined(__WXPM__) ComputeScaleAndOrigin(); -#endif } void wxPostScriptDC::SetDeviceOrigin( wxCoord x, wxCoord y ) @@ -1556,7 +1567,7 @@ wxSize wxPostScriptDC::GetPPI(void) const bool wxPostScriptDC::StartDoc( const wxString& message ) { wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") ); - + if (m_printData.GetPrintMode() != wxPRINT_MODE_STREAM ) { if (m_printData.GetFilename() == wxEmptyString) @@ -1565,8 +1576,7 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) m_printData.SetFilename(filename); } - // FIXME: use fn_str() here under Unicode? - m_pstream = wxFopen( m_printData.GetFilename().c_str(), wxT("w+") ); + m_pstream = wxFopen( m_printData.GetFilename(), wxT("w+") ); if (!m_pstream) { @@ -1593,20 +1603,20 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) const wxChar *paper; switch (m_printData.GetPaperId()) { - case wxPAPER_LETTER: paper = wxT("Letter"); break; // Letter: paper ""; 8 1/2 by 11 inches - case wxPAPER_LEGAL: paper = wxT("Legal"); break; // Legal, 8 1/2 by 14 inches - case wxPAPER_A4: paper = wxT("A4"); break; // A4 Sheet, 210 by 297 millimeters + case wxPAPER_LETTER: paper = wxT("Letter"); break; // Letter: paper ""; 8 1/2 by 11 inches + case wxPAPER_LEGAL: paper = wxT("Legal"); break; // Legal, 8 1/2 by 14 inches + case wxPAPER_A4: paper = wxT("A4"); break; // A4 Sheet, 210 by 297 millimeters case wxPAPER_TABLOID: paper = wxT("Tabloid"); break; // Tabloid, 11 by 17 inches - case wxPAPER_LEDGER: paper = wxT("Ledger"); break; // Ledger, 17 by 11 inches - case wxPAPER_STATEMENT: paper = wxT("Statement"); break; // Statement, 5 1/2 by 8 1/2 inches - case wxPAPER_EXECUTIVE: paper = wxT("Executive"); break; // Executive, 7 1/4 by 10 1/2 inches - case wxPAPER_A3: paper = wxT("A3"); break; // A3 sheet, 297 by 420 millimeters - case wxPAPER_A5: paper = wxT("A5"); break; // A5 sheet, 148 by 210 millimeters - case wxPAPER_B4: paper = wxT("B4"); break; // B4 sheet, 250 by 354 millimeters - case wxPAPER_B5: paper = wxT("B5"); break; // B5 sheet, 182-by-257-millimeter paper - case wxPAPER_FOLIO: paper = wxT("Folio"); break; // Folio, 8-1/2-by-13-inch paper - case wxPAPER_QUARTO: paper = wxT("Quaro"); break; // Quarto, 215-by-275-millimeter paper - case wxPAPER_10X14: paper = wxT("10x14"); break; // 10-by-14-inch sheet + case wxPAPER_LEDGER: paper = wxT("Ledger"); break; // Ledger, 17 by 11 inches + case wxPAPER_STATEMENT: paper = wxT("Statement"); break; // Statement, 5 1/2 by 8 1/2 inches + case wxPAPER_EXECUTIVE: paper = wxT("Executive"); break; // Executive, 7 1/4 by 10 1/2 inches + case wxPAPER_A3: paper = wxT("A3"); break; // A3 sheet, 297 by 420 millimeters + case wxPAPER_A5: paper = wxT("A5"); break; // A5 sheet, 148 by 210 millimeters + case wxPAPER_B4: paper = wxT("B4"); break; // B4 sheet, 250 by 354 millimeters + case wxPAPER_B5: paper = wxT("B5"); break; // B5 sheet, 182-by-257-millimeter paper + case wxPAPER_FOLIO: paper = wxT("Folio"); break; // Folio, 8-1/2-by-13-inch paper + case wxPAPER_QUARTO: paper = wxT("Quaro"); break; // Quarto, 215-by-275-millimeter paper + case wxPAPER_10X14: paper = wxT("10x14"); break; // 10-by-14-inch sheet default: paper = wxT("A4"); } PsPrintf( wxT("%%%%DocumentPaperSizes: %s\n"), paper ); @@ -1718,7 +1728,7 @@ void wxPostScriptDC::EndDoc () #endif #ifndef __WXMSW__ - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER)) @@ -1755,7 +1765,7 @@ void wxPostScriptDC::StartPage() wxCoord translate_x, translate_y; double scale_x, scale_y; - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); translate_x = (wxCoord)data->GetPrinterTranslateX(); @@ -1833,7 +1843,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, wxCHECK_RET( fontToUse, wxT("GetTextExtent: no font defined") ); - if (string.IsEmpty()) + if (string.empty()) { if (x) (*x) = 0; if (y) (*y) = 0; @@ -1967,22 +1977,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().IsEmpty()) + + // 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,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 @@ -1992,7 +2015,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, << name; afmFile = wxFopen(afmName,wxT("r")); } -#endif /* 2. open and process the file / a short explanation of the AFM format: @@ -2019,8 +2041,10 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, /* init the widths array */ for(int i=0; i<256; i++) lastWidths[i] = INT_MIN; /* some variables for holding parts of a line */ - char cString[10],semiString[10],WXString[10],descString[20]; - char upString[30], utString[30], encString[50]; + char cString[10], semiString[10], WXString[10]; + char descString[20]; + char upString[30], utString[30]; + char encString[50]; char line[256]; int ascii,cWidth; /* read in the file and parse it */ @@ -2187,9 +2211,9 @@ void wxPostScriptDC::PsPrintf( const wxChar* fmt, ... ) void wxPostScriptDC::PsPrint( const char* psdata ) { - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - + switch (m_printData.GetPrintMode()) { #if wxUSE_STREAMS @@ -2212,9 +2236,9 @@ void wxPostScriptDC::PsPrint( const char* psdata ) void wxPostScriptDC::PsPrint( int ch ) { - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - + switch (m_printData.GetPrintMode()) { #if wxUSE_STREAMS @@ -2223,7 +2247,7 @@ void wxPostScriptDC::PsPrint( int ch ) { wxOutputStream* outputstream = data->GetOutputStream(); wxCHECK_RET( outputstream, wxT("invalid outputstream") ); - outputstream->PutC( ch ); + outputstream->PutC( (char)ch ); } break; #endif // wxUSE_STREAMS @@ -2235,11 +2259,6 @@ void wxPostScriptDC::PsPrint( int ch ) } } -#endif - // wxUSE_POSTSCRIPT - -#endif - // wxUSE_PRINTING_ARCHITECTURE - +#endif // wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT // vi:sts=4:sw=4:et