]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
no need to %import gdi.i
[wxWidgets.git] / src / generic / dcpsg.cpp
index bcd73beb2623e247a4dfe8a31c7ccfa333b3688a..232dcccf8115e69b2a3b254ce6cd1033d7bce795 100644 (file)
@@ -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,37 +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/math.h"
+#include "wx/stdpaths.h"
+
+WXDLLIMPEXP_DATA_CORE(int) wxPageNumber;
 
 #ifdef __WXMSW__
 
@@ -408,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
     {
@@ -463,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;
@@ -744,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")
@@ -754,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),
@@ -773,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")
@@ -783,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),
@@ -872,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++)
@@ -1037,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" );
@@ -1073,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 );
@@ -1245,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;
@@ -1350,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,
@@ -1371,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)
@@ -1384,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") );
@@ -1458,6 +1472,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points )
               wxT("stroke\n"),
             LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) );
 }
+#endif // wxUSE_SPLINES
 
 wxCoord wxPostScriptDC::GetCharWidth() const
 {
@@ -1561,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)
         {
@@ -1589,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 );
@@ -1963,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().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,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
@@ -1988,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:
@@ -2233,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