]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
wxUSE_THREADS typo corrected
[wxWidgets.git] / src / generic / dcpsg.cpp
index 60758bcb9b1815a4ca4b0f702e6f1a7c8f5ba4be..d5989d500701b1bd4e129cb71a02371cf453b625 100644 (file)
@@ -41,6 +41,8 @@
 #include "wx/stattext.h"
 #include "wx/radiobox.h"
 #include "wx/textctrl.h"
+#include "wx/prntbase.h"
+#include "wx/paper.h"
 
 #include <math.h>
 
@@ -230,34 +232,37 @@ static char wxPostScriptHeaderReencodeISO2[] =
 wxPostScriptDC::wxPostScriptDC ()
 {
     m_pstream = (ofstream*) NULL;
-    
+
     m_currentRed = 0;
     m_currentGreen = 0;
     m_currentBlue = 0;
-    
+
     m_pageNumber = 0;
-    
+
     m_clipping = FALSE;
-    
+
     m_underlinePosition = 0.0;
     m_underlineThickness = 0.0;
 
     m_signX =  1;  // default x-axis left to right
     m_signY = -1;  // default y-axis bottom up -> top down
+
+    // Compatibility only
+    m_printData = * wxThePrintSetupData;
 }
 
 wxPostScriptDC::wxPostScriptDC (const wxString& file, bool interactive, wxWindow *parent)
 {
     m_pstream = (ofstream*) NULL;
-    
+
     m_currentRed = 0;
     m_currentGreen = 0;
     m_currentBlue = 0;
-    
+
     m_pageNumber = 0;
-    
+
     m_clipping = FALSE;
-    
+
     m_underlinePosition = 0.0;
     m_underlineThickness = 0.0;
 
@@ -272,11 +277,11 @@ bool wxPostScriptDC::Create(const wxString& file, bool interactive, wxWindow *pa
     m_isInteractive = interactive;
 
     m_title = "";
-    m_filename = file;
+    m_printData.SetFilename(file);
 
 #ifdef __WXMSW__
     // Can only send to file in Windows
-    wxThePrintSetupData->SetPrinterMode(PS_FILE);
+    m_printData.SetPrintMode(wxPRINT_MODE_FILE);
 #endif
 
     if (m_isInteractive)
@@ -287,10 +292,31 @@ bool wxPostScriptDC::Create(const wxString& file, bool interactive, wxWindow *pa
     {
         m_ok = TRUE;
     }
-    
+
     return m_ok;
 }
 
+wxPostScriptDC::wxPostScriptDC (const wxPrintData& printData)
+{
+    m_pstream = (ofstream*) NULL;
+
+    m_currentRed = 0;
+    m_currentGreen = 0;
+    m_currentBlue = 0;
+
+    m_pageNumber = 0;
+
+    m_clipping = FALSE;
+
+    m_underlinePosition = 0.0;
+    m_underlineThickness = 0.0;
+
+    m_signX =  1;  // default x-axis left to right
+    m_signY = -1;  // default y-axis bottom up -> top down
+
+    m_printData = printData;
+}
+
 wxPostScriptDC::~wxPostScriptDC ()
 {
     if (m_pstream) delete m_pstream;
@@ -300,22 +326,23 @@ bool wxPostScriptDC::Ok() const
 {
   return m_ok;
 }
-  
+
+// This dialog is deprecated now: use wxGenericPrintDialog or the printing framework
 bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
 {
-    wxPostScriptPrintDialog dialog( parent, _("Printer Settings"), wxPoint(150, 150), wxSize(400, 400), 
+    wxPostScriptPrintDialog dialog( parent, _("Printer Settings"), wxPoint(150, 150), wxSize(400, 400),
                                     wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL );
     m_ok = (dialog.ShowModal () == wxID_OK);
 
     if (!m_ok) return FALSE;
 
-    if ((m_filename == "") && 
-        (wxThePrintSetupData->GetPrinterMode() == PS_PREVIEW  || 
-         wxThePrintSetupData->GetPrinterMode() == PS_PRINTER))
+    if ((m_printData.GetFilename() == "") &&
+        (m_printData.GetPrintMode() == wxPRINT_MODE_PREVIEW  ||
+         m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER))
     {
 // steve, 05.09.94
 #ifdef __VMS__
-      wxThePrintSetupData->SetPrinterFile("preview");
+      m_printData.SetFilename("preview");
 #else
       // For PS_PRINTER action this depends on a Unix-style print spooler
       // since the wx_printer_file can be destroyed during a session
@@ -325,24 +352,23 @@ bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
       char tmp[256];
       strcpy (tmp, "/tmp/preview_");
       strcat (tmp, userId);
-      wxThePrintSetupData->SetPrinterFile(tmp);
+      m_printData.SetFilename(tmp);
 #endif
       char tmp2[256];
-      strcpy(tmp2, wxThePrintSetupData->GetPrinterFile());
+      strcpy(tmp2, m_printData.GetFilename());
       strcat (tmp2, ".ps");
-      wxThePrintSetupData->SetPrinterFile(tmp2);
-      m_filename = tmp2;
+      m_printData.SetFilename(tmp2);
     }
-    else if ((m_filename == "") && (wxThePrintSetupData->GetPrinterMode() == PS_FILE))
+    else if ((m_printData.GetFilename() == "") && (m_printData.GetPrintMode() == wxPRINT_MODE_FILE))
     {
-      char *file = wxSaveFileSelector (_("PostScript"), "ps");
-      if (!file)
+      wxString file = wxSaveFileSelector (_("PostScript"), "ps");
+      if ( file.IsEmpty() )
       {
         m_ok = FALSE;
         return FALSE;
       }
-      wxThePrintSetupData->SetPrinterFile(file);
-      m_filename = file;
+
+      m_printData.SetFilename(file);
       m_ok = TRUE;
     }
 
@@ -352,14 +378,14 @@ bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
 void wxPostScriptDC::SetClippingRegion (long x, long y, long w, long h)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (m_clipping) return;
 
     wxDC::SetClippingRegion( x, y, w, h );
-    
+
     m_clipping = TRUE;
-    *m_pstream << "gsave\n" 
-               << "newpath\n" 
+    *m_pstream << "gsave\n"
+               << "newpath\n"
            << XLOG2DEV(x)   << " " << YLOG2DEV(y)   << " moveto\n"
            << XLOG2DEV(x+w) << " " << YLOG2DEV(y)   << " lineto\n"
            << XLOG2DEV(x+w) << " " << YLOG2DEV(y+h) << " lineto\n"
@@ -374,9 +400,9 @@ void wxPostScriptDC::SetClippingRegion( const wxRegion &WXUNUSED(region) )
 void wxPostScriptDC::DestroyClippingRegion()
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     wxDC::DestroyClippingRegion();
-    
+
     if (m_clipping)
     {
         m_clipping = FALSE;
@@ -408,16 +434,16 @@ void wxPostScriptDC::CrossHair (long WXUNUSED(x), long WXUNUSED(y))
 void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if  (m_pen.GetStyle() == wxTRANSPARENT) return;
-    
+
     SetPen( m_pen );
-    
+
     *m_pstream << "newpath\n"
            <<  XLOG2DEV(x1) << " " <<  YLOG2DEV (y1) << " moveto\n"
            <<  XLOG2DEV(x2) << " " <<  YLOG2DEV (y2) << " lineto\n"
            << "stroke\n";
-           
+
     CalcBoundingBox( x1, y1 );
     CalcBoundingBox( x2, y2 );
 }
@@ -427,20 +453,20 @@ void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2)
 void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long yc)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     long dx = x1 - xc;
     long dy = y1 - yc;
     long radius = (long) sqrt(dx*dx+dy*dy);
     double alpha1, alpha2;
 
-    if (x1 == x2 && y1 == y2) 
+    if (x1 == x2 && y1 == y2)
     {
     alpha1 = 0.0;
     alpha2 = 360.0;
-    } else if (radius == 0.0) 
+    } else if (radius == 0.0)
     {
     alpha1 = alpha2 = 0.0;
-    } else 
+    } else
     {
     alpha1 = (x1 - xc == 0) ?
         (y1 - yc < 0) ? 90.0 : -90.0 :
@@ -454,7 +480,7 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
     while (alpha1 > 360)  alpha1 -= 360; // 0 and 360 degree
     while (alpha2 > 360)  alpha2 -= 360;
 
-    if (m_brush.GetStyle() != wxTRANSPARENT) 
+    if (m_brush.GetStyle() != wxTRANSPARENT)
     {
     SetBrush( m_brush );
     *m_pstream << "newpath\n"
@@ -469,8 +495,8 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
          << "closepath\n"
              << "fill\n";
     }
-    
-    if (m_pen.GetStyle() != wxTRANSPARENT) 
+
+    if (m_pen.GetStyle() != wxTRANSPARENT)
     {
     SetPen( m_pen );
     *m_pstream << "newpath\n"
@@ -482,7 +508,7 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
          << alpha2               << " ellipse\n"
              << "stroke\n";
     }
-    
+
     CalcBoundingBox( xc-radius, yc-radius );
     CalcBoundingBox( xc+radius, yc+radius );
 }
@@ -490,12 +516,12 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long
 void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
 {
     wxCHECK_RET( m_ok && m_pstream, "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==ea)
     {
         DrawEllipse(x,y,w,h);
@@ -506,22 +532,22 @@ void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,doubl
     {
         SetBrush( m_brush );
 
-        *m_pstream << "newpath\n" 
-               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " " 
-           << XLOG2DEVREL(w/2) << " " << YLOG2DEVREL(h/2) << " " 
+        *m_pstream << "newpath\n"
+               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " "
+           << XLOG2DEVREL(w/2) << " " << YLOG2DEVREL(h/2) << " "
            << int(sa) <<" "<< int(ea) << " true ellipticarc\n";
 
         CalcBoundingBox( x ,y );
         CalcBoundingBox( x+w, y+h );
     }
-    
+
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen( m_pen );
 
-        *m_pstream << "newpath\n" 
-               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " " 
-           << XLOG2DEVREL(w/2) << " " << XLOG2DEVREL(h/2) << " " 
+        *m_pstream << "newpath\n"
+               << XLOG2DEV(x+w/2) << " " << YLOG2DEV(y+h/2) << " "
+           << XLOG2DEVREL(w/2) << " " << XLOG2DEVREL(h/2) << " "
            << int(sa) <<" "<< int(ea) << " false ellipticarc\n";
 
         CalcBoundingBox( x, y );
@@ -532,29 +558,29 @@ void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,doubl
 void wxPostScriptDC::DrawPoint (long x, long y)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (m_pen.GetStyle() == wxTRANSPARENT) return;
-    
+
     SetPen (m_pen);
-    
+
     *m_pstream << "newpath\n"
          << XLOG2DEV(x)   << " " << YLOG2DEV (y) << " moveto\n"
          << XLOG2DEV(x+1) << " " << YLOG2DEV (y) << " lineto\n"
          << "stroke\n";
-    
+
     CalcBoundingBox( x, y );
 }
 
 void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle))
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (n <= 0) return;
-    
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
     SetBrush( m_brush );
-      
+
     *m_pstream << "newpath\n";
 
     long xx = XLOG2DEV(points[0].x + xoffset);
@@ -575,7 +601,7 @@ void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yo
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
     SetPen( m_pen );
-    
+
     *m_pstream << "newpath\n";
 
     long xx = XLOG2DEV(points[0].x + xoffset);
@@ -598,14 +624,14 @@ void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yo
 void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoffset)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (m_pen.GetStyle() == wxTRANSPARENT)
         return;
     if (n <= 0)
         return;
-  
+
     SetPen (m_pen);
-    
+
     int i;
     for ( i =0; i<n ; i++ )
     {
@@ -615,20 +641,20 @@ void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoff
     *m_pstream << "newpath\n"
                << XLOG2DEV(points[0].x+xoffset) << " "
                << YLOG2DEV(points[0].y+yoffset) << " moveto\n";
-         
-    for (i = 1; i < n; i++) 
+
+    for (i = 1; i < n; i++)
     {
         *m_pstream << XLOG2DEV(points[i].x+xoffset) << " "
                    << YLOG2DEV(points[i].y+yoffset) << " lineto\n";
     }
-    
+
     *m_pstream << "stroke\n";
 }
 
 void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
@@ -644,7 +670,7 @@ void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
-    
+
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
@@ -665,7 +691,7 @@ void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
 void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long height, double radius)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (radius < 0.0)
     {
         // Now, a negative radius is interpreted to mean
@@ -677,13 +703,13 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig
         smallest = height;
         radius =  (-radius * smallest);
     }
-    
+
     long rad = (long) radius;
 
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
-    
+
         // Draw rectangle anticlockwise
         *m_pstream << "newpath\n"
                    << XLOG2DEV(x + rad) << " " << YLOG2DEV(y + rad) << " " << XLOG2DEVREL(rad) << " 90 180 arc\n"
@@ -700,11 +726,11 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
-    
+
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
-    
+
         // Draw rectangle anticlockwise
         *m_pstream << "newpath\n"
                    << XLOG2DEV(x + rad) << " " << YLOG2DEV(y + rad) << " " << XLOG2DEVREL(rad) << " 90 180 arc\n"
@@ -726,27 +752,27 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig
 void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height)
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush (m_brush);
 
-        *m_pstream << "newpath\n" 
-                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " " 
-                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n" 
+        *m_pstream << "newpath\n"
+                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " "
+                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n"
                    << "fill\n";
 
         CalcBoundingBox( x - width, y - height );
         CalcBoundingBox( x + width, y + height );
     }
-    
+
     if (m_pen.Ok() && m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
 
-        *m_pstream << "newpath\n" 
-                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " " 
-                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n" 
+        *m_pstream << "newpath\n"
+                   << XLOG2DEV(x + width / 2) << " " << YLOG2DEV(y + height / 2) << " "
+                   << XLOG2DEV(width / 2) << " " << YLOG2DEVREL(height / 2) << " 0 360 ellipse\n"
                    << "stroke\n";
 
         CalcBoundingBox( x - width, y - height );
@@ -764,21 +790,21 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool WX
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
 
     if (!bitmap.Ok()) return;
-    
+
     wxImage image( bitmap );
-    
+
     if (!image.Ok()) return;
-    
+
     int ww = XLOG2DEVREL(image.GetWidth());
     int hh = YLOG2DEVREL(image.GetHeight());
-    
+
     image = image.Scale( ww, hh );
-    
+
     if (!image.Ok()) return;
-    
+
     int xx = XLOG2DEV(x);
     int yy = YLOG2DEV(y + bitmap.GetHeight());
-    
+
     *m_pstream << "/origstate save def\n"
                << "20 dict begin\n"
                << "/pix " << ww << " string def\n"
@@ -791,7 +817,7 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool WX
                << "[" << ww << " 0 0 " << (-hh) << " 0 " << hh << "]\n"
                << "{currentfile pix readhexstring pop}\n"
                << "false 3 colorimage\n";
-  
+
     for (int j = 0; j < hh; j++)
     {
         for (int i = 0; i < ww; i++)
@@ -810,15 +836,15 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool WX
 
     *m_pstream << "end\n";
     *m_pstream << "origstate restore\n";
-    
+
 }
 
 void wxPostScriptDC::SetFont( const wxFont& font )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (!font.Ok())  return;
-    
+
     m_font = font;
 
     const char *name;
@@ -896,7 +922,7 @@ void wxPostScriptDC::SetFont( const wxFont& font )
     char buf[100];
     strcpy (buf, name);
     strcat (buf, style);
-    
+
     *m_pstream << buf << " reencodeISO def\n";
     *m_pstream << buf << " findfont\n";
     *m_pstream << YLOG2DEVREL(m_font.GetPointSize()) << " scalefont setfont\n";
@@ -905,9 +931,9 @@ void wxPostScriptDC::SetFont( const wxFont& font )
 void wxPostScriptDC::SetPen( const wxPen& pen )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (!pen.Ok()) return;
-    
+
     int oldStyle = m_pen.GetStyle();
 
     m_pen = pen;
@@ -916,7 +942,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
 
 /*
      Line style - WRONG: 2nd arg is OFFSET
-     
+
      Here, I'm afraid you do not conceive meaning of parameters of 'setdash'
      operator correctly. You should look-up this in the Red Book: the 2nd parame-
      ter is not number of values in the array of the first one, but an offset
@@ -942,7 +968,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         case wxTRANSPARENT:
         default:              psdash = "[] 0";         break;
     }
-    
+
     if (oldStyle != m_pen.GetStyle())
     {
         *m_pstream << psdash << " setdash\n";
@@ -963,16 +989,15 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         green = (unsigned char) 0;
         blue = (unsigned char) 0;
     }
-    
+
     // setgray here ?
     }
 
     if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
     {
-       long redPS = (long) (((int) red) / 255.0);
-       long bluePS = (long) (((int) blue) / 255.0);
-       long greenPS = (long) (((int) green) / 255.0);
-
+       float redPS = (float)(red) / 255.0;
+       float bluePS = (float)(blue) / 255.0;
+       float greenPS = (float)(green) / 255.0;
        *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
 
        m_currentRed = red;
@@ -984,15 +1009,15 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
 void wxPostScriptDC::SetBrush( const wxBrush& brush )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (!brush.Ok()) return;
-    
+
     m_brush = brush;
 
     // Brush colour
-    unsigned char red = m_brush.GetColour ().Red ();
-    unsigned char blue = m_brush.GetColour ().Blue ();
-    unsigned char green = m_brush.GetColour ().Green ();
+    unsigned char red = m_brush.GetColour().Red();
+    unsigned char blue = m_brush.GetColour().Blue();
+    unsigned char green = m_brush.GetColour().Green();
 
     if (!m_colour)
     {
@@ -1004,15 +1029,15 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush )
         green = (unsigned char) 255;
         blue = (unsigned char) 255;
     }
-    
+
     // setgray here ?
     }
 
     if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
     {
-       long redPS = (long) (((int) red) / 255.0);
-       long bluePS = (long) (((int) blue) / 255.0);
-       long greenPS = (long) (((int) green) / 255.0);
+       float redPS = (float)(red) / 255.0;
+       float bluePS = (float)(blue) / 255.0;
+       float greenPS = (float)(green) / 255.0;
        *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
        m_currentRed = red;
        m_currentBlue = blue;
@@ -1023,7 +1048,7 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush )
 void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUSED(use16bit) )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     SetFont( m_font );
 
     if (m_textForegroundColour.Ok ())
@@ -1043,14 +1068,14 @@ void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUS
           blue = (unsigned char) 0;
         }
     }
-    
+
     // maybe setgray here ?
-    
+
         if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
         {
-            long redPS = (long) (((int) red) / 255.0);
-            long bluePS = (long) (((int) blue) / 255.0);
-            long greenPS = (long) (((int) green) / 255.0);
+            float redPS = (float)(red) / 255.0;
+            float bluePS = (float)(blue) / 255.0;
+            float greenPS = (float)(green) / 255.0;
             *m_pstream << redPS << " " << greenPS << " " << bluePS << " setrgbcolor\n";
 
             m_currentRed = red;
@@ -1063,7 +1088,7 @@ void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUS
 
     long by = y + (long)floor( float(size) * 2.0 / 3.0 ); // approximate baseline
     *m_pstream << XLOG2DEV(x) << " " << YLOG2DEV(by) << " moveto\n";
-    
+
     *m_pstream << "(";
     int len = strlen ((char *)(const char *)text);
     int i;
@@ -1092,14 +1117,14 @@ void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUS
         long uy = (long)(y + size - m_underlinePosition);
         long w, h;
         GetTextExtent(text, &w, &h);
-      
+
         *m_pstream << "gsave " << XLOG2DEV(x) << " " << YLOG2DEV(uy)
                    << " moveto\n"
                    << (long)m_underlineThickness << " setlinewidth "
                    << XLOG2DEV(x + w) << " " << YLOG2DEV(uy)
                    << " lineto stroke grestore\n";
     }
-    
+
     CalcBoundingBox( x, y );
     CalcBoundingBox( x + size * text.Length() * 2/3 , y );
 }
@@ -1118,7 +1143,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function))
 void wxPostScriptDC::DrawSpline( wxList *points )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     SetPen( m_pen );
 
     double a, b, c, d, x1, y1, x2, y2, x3, y3;
@@ -1126,20 +1151,20 @@ void wxPostScriptDC::DrawSpline( wxList *points )
 
     wxNode *node = points->First();
     p = (wxPoint *)node->Data();
-    x1 = p->x; 
+    x1 = p->x;
     y1 = p->y;
 
     node = node->Next();
     p = (wxPoint *)node->Data();
-    c = p->x; 
+    c = p->x;
     d = p->y;
     x3 = a = (double)(x1 + c) / 2;
     y3 = b = (double)(y1 + d) / 2;
 
-    *m_pstream  << "newpath " 
-                << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " moveto " 
+    *m_pstream  << "newpath "
+                << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " moveto "
         << XLOG2DEV((long)x3) << " " << YLOG2DEV((long)y3) << " lineto\n";
-        
+
     CalcBoundingBox( (long)x1, (long)y1 );
     CalcBoundingBox( (long)x3, (long)y3 );
 
@@ -1147,22 +1172,22 @@ void wxPostScriptDC::DrawSpline( wxList *points )
     {
         q = (wxPoint *)node->Data();
 
-    x1 = x3; 
+    x1 = x3;
     y1 = y3;
-    x2 = c;  
+    x2 = c;
     y2 = d;
-    c = q->x; 
+    c = q->x;
     d = q->y;
         x3 = (double)(x2 + c) / 2;
         y3 = (double)(y2 + d) / 2;
-        *m_pstream << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " " 
+        *m_pstream << XLOG2DEV((long)x1) << " " << YLOG2DEV((long)y1) << " "
                << XLOG2DEV((long)x2) << " " << YLOG2DEV((long)y2) << " "
                    << XLOG2DEV((long)x3) << " " << YLOG2DEV((long)y3) << " DrawSplineSection\n";
 
         CalcBoundingBox( (long)x1, (long)y1 );
         CalcBoundingBox( (long)x3, (long)y3 );
     }
-    
+
 /*
      At this point, (x2,y2) and (c,d) are the position of the
      next-to-last and last point respectively, in the point list
@@ -1181,10 +1206,10 @@ long wxPostScriptDC::GetCharWidth ()
 void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     m_signX = (xLeftRight ? 1 : -1);
     m_signY = (yBottomUp  ? 1 : -1);
-    
+
     // FIXME there is no such function in MSW
 #ifndef __WXMSW__
     ComputeScaleAndOrigin();
@@ -1194,28 +1219,26 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
 void wxPostScriptDC::SetDeviceOrigin( long x, long y )
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     int h = 0;
     int w = 0;
     GetSize( &w, &h );
-  
+
     wxDC::SetDeviceOrigin( x, h-y );
 }
 
 void wxPostScriptDC::GetSize(int* width, int* height) const
 {
-    const char *paperType = wxThePrintSetupData->GetPaperName();
-    
-    if (!paperType) paperType = _("A4 210 x 297 mm");
+    wxPaperSize id = m_printData.GetPaperId();
+
+    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id);
+
+    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4);
 
-    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType);
-    
-    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(_("A4 210 x 297 mm"));
-    
     if (paper)
     {
-        if (width) *width = paper->widthPixels;
-        if (height) *height = paper->heightPixels;
+        if (width) *width = paper->GetSizeDeviceUnits().x;
+        if (height) *height = paper->GetSizeDeviceUnits().y;
     }
     else
     {
@@ -1224,30 +1247,54 @@ void wxPostScriptDC::GetSize(int* width, int* height) const
     }
 }
 
-bool wxPostScriptDC::StartDoc (const wxString& message)
+void wxPostScriptDC::GetSizeMM(int *width, int *height) const
 {
-    wxCHECK_MSG( m_ok, FALSE, "invalid postscript dc" );
-    
-    if (m_filename == "")
+    wxPaperSize id = m_printData.GetPaperId();
+
+    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id);
+
+    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(wxPAPER_A4);
+
+    if (paper)
     {
-        m_filename = wxGetTempFileName("ps");
-        wxThePrintSetupData->SetPrinterFile((char *)(const char *)m_filename);
-        m_ok = TRUE;
+        if (width) *width = paper->GetWidth() / 10;
+        if (height) *height = paper->GetHeight() / 10;
     }
     else
     {
-    wxThePrintSetupData->SetPrinterFile((char *)(const char *)m_filename);
+       if (width) *width = 210;
+       if (height) *height = 297;
     }
+}
+
+// Resolution in pixels per logical inch
+wxSize wxPostScriptDC::GetPPI(void) const
+{
+    return wxSize(72, 72);
+}
+
+
+bool wxPostScriptDC::StartDoc (const wxString& message)
+{
+    wxCHECK_MSG( m_ok, FALSE, "invalid postscript dc" );
+
+    if (m_printData.GetFilename() == "")
+    {
+        wxString filename = wxGetTempFileName("ps");
+        m_printData.SetFilename(filename);
+
+        m_ok = TRUE;
+    }
+
+    m_pstream = new ofstream (m_printData.GetFilename());
 
-    m_pstream = new ofstream (wxThePrintSetupData->GetPrinterFile());
-      
     if (!m_pstream || !m_pstream->good())
     {
-    wxMessageBox (_("Cannot open file!"), _("Error"), wxOK);
-    m_ok = FALSE;
-    return FALSE;
+        wxMessageBox (_("Cannot open file!"), _("Error"), wxOK);
+        m_ok = FALSE;
+        return FALSE;
     }
-    
+
     m_ok = TRUE;
 
     SetBrush( *wxBLACK_BRUSH );
@@ -1257,7 +1304,7 @@ bool wxPostScriptDC::StartDoc (const wxString& message)
 
     // set origin according to paper size
     SetDeviceOrigin( 0,0 );
-    
+
     wxPageNumber = 1;
     m_pageNumber = 1;
     m_title = message;
@@ -1267,7 +1314,7 @@ bool wxPostScriptDC::StartDoc (const wxString& message)
 void wxPostScriptDC::EndDoc ()
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     if (m_clipping)
     {
         m_clipping = FALSE;
@@ -1281,7 +1328,7 @@ void wxPostScriptDC::EndDoc ()
     }
 
     char *header_file = wxGetTempFileName("ps");
-    
+
     m_pstream = new ofstream( header_file );
 
     *m_pstream << "%!PS-Adobe-2.0\n";   /* PostScript magic strings */
@@ -1307,12 +1354,16 @@ void wxPostScriptDC::EndDoc ()
 
     long wx_printer_translate_x, wx_printer_translate_y;
     double wx_printer_scale_x, wx_printer_scale_y;
-    wxThePrintSetupData->GetPrinterTranslation(&wx_printer_translate_x, &wx_printer_translate_y);
-    wxThePrintSetupData->GetPrinterScaling(&wx_printer_scale_x, &wx_printer_scale_y);
 
-    if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE)
+    wx_printer_translate_x = m_printData.GetPrinterTranslateX();
+    wx_printer_translate_y = m_printData.GetPrinterTranslateY();
+
+    wx_printer_scale_x = m_printData.GetPrinterScaleX();
+    wx_printer_scale_y = m_printData.GetPrinterScaleY();
+
+    if (m_printData.GetOrientation() == wxLANDSCAPE)
     {
-    *m_pstream << "%%Orientation: Landscape\n";
+        *m_pstream << "%%Orientation: Landscape\n";
     }
     else
     {
@@ -1327,7 +1378,7 @@ void wxPostScriptDC::EndDoc ()
     long ury = (long) ((YLOG2DEV(m_maxY)+wx_printer_translate_y)*wx_printer_scale_y);
 
     // If we're landscape, our sense of "x" and "y" is reversed.
-    if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE)
+    if (m_printData.GetOrientation() == wxLANDSCAPE)
     {
         long tmp;
         tmp = llx; llx = lly; lly = tmp;
@@ -1376,46 +1427,53 @@ void wxPostScriptDC::EndDoc ()
     char *tmp_file = wxGetTempFileName("ps");
 
     // Paste header Before wx_printer_file
-    wxConcatFiles (header_file, wxThePrintSetupData->GetPrinterFile(), tmp_file);
+    wxConcatFiles (header_file, m_printData.GetFilename(), tmp_file);
     wxRemoveFile (header_file);
-    wxRemoveFile (wxThePrintSetupData->GetPrinterFile());
-    wxRenameFile(tmp_file, wxThePrintSetupData->GetPrinterFile());
+    wxRemoveFile (m_printData.GetFilename());
+    wxRenameFile(tmp_file, m_printData.GetFilename());
 
 #if defined(__X__) || defined(__WXGTK__)
   if (m_ok)
     {
-      switch (wxThePrintSetupData->GetPrinterMode()) {
-    case PS_PREVIEW:
+      wxString previewCommand(m_printData.GetPreviewCommand());
+      wxString printerCommand(m_printData.GetPrinterCommand());
+      wxString printerOptions(m_printData.GetPrinterOptions());
+      wxString filename(m_printData.GetFilename());
+
+      switch (m_printData.GetPrintMode()) {
+
+    case wxPRINT_MODE_PREVIEW:
     {
           char *argv[3];
-          argv[0] = wxThePrintSetupData->GetPrintPreviewCommand();
-          argv[1] = wxThePrintSetupData->GetPrinterFile();
-          argv[2] = (char *) NULL;
-      wxExecute (argv, TRUE);
-          wxRemoveFile(wxThePrintSetupData->GetPrinterFile());
+          argv[0] = (char*) (const char*) previewCommand;
+          argv[1] = (char*) (const char*) filename;
+          argv[2] = (char*) (char *) NULL;
+          wxExecute (argv, TRUE);
+          wxRemoveFile(m_printData.GetFilename());
     }
     break;
 
-    case PS_PRINTER:
+    case wxPRINT_MODE_PRINTER:
     {
           char *argv[4];
           int argc = 0;
-          argv[argc++] = wxThePrintSetupData->GetPrinterCommand();
+          argv[argc++] = (char*) (const char*) printerCommand;
 
           // !SM! If we simply assign to argv[1] here, if printer options
           // are blank, we get an annoying and confusing message from lpr.
-          char * opts = wxThePrintSetupData->GetPrinterOptions();
+          char * opts = (char*) (const char*) printerOptions;
           if (opts && *opts)
               argv[argc++] = opts;
 
-          argv[argc++] = wxThePrintSetupData->GetPrinterFile();
+          argv[argc++] = (char*) (const char*) filename;
           argv[argc++] = (char *) NULL;
-      wxExecute (argv, TRUE);
-          wxRemoveFile(wxThePrintSetupData->GetPrinterFile());
+          wxExecute (argv, TRUE);
+          wxRemoveFile(filename);
     }
     break;
 
-    case PS_FILE:
+    case wxPRINT_MODE_FILE:
+    case wxPRINT_MODE_NONE:
       break;
     }
     }
@@ -1425,9 +1483,9 @@ void wxPostScriptDC::EndDoc ()
 void wxPostScriptDC::StartPage ()
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     *m_pstream << "%%Page: " << (wxPageNumber++) << "\n";
-    
+
 //  *m_pstream << "matrix currentmatrix\n";
 
     // Added by Chris Breeze
@@ -1435,49 +1493,65 @@ void wxPostScriptDC::StartPage ()
     // Each page starts with an "initgraphics" which resets the
     // transformation and so we need to reset the origin
     // (and rotate the page for landscape printing)
-    
+
 /*
     m_scaleFactor = 1.0;
     m_logicalOriginX = 0;
     m_logicalOriginY = 0;
 */
-       // Output scaling
-       long translate_x, translate_y;
-       double scale_x, scale_y;
-       wxThePrintSetupData->GetPrinterTranslation(&translate_x, &translate_y);
-       wxThePrintSetupData->GetPrinterScaling(&scale_x, &scale_y);
+    // Output scaling
+    long translate_x, translate_y;
+    double scale_x, scale_y;
+
+    translate_x = m_printData.GetPrinterTranslateX();
+    translate_y = m_printData.GetPrinterTranslateY();
 
-       if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE)
-       {
-               translate_y -= m_maxY;
-               *m_pstream << "90 rotate\n";
-       }
+    scale_x = m_printData.GetPrinterScaleX();
+    scale_y = m_printData.GetPrinterScaleY();
 
-       *m_pstream << scale_x << " " << scale_y << " scale\n";
-       *m_pstream << translate_x << " " << translate_y << " translate\n";
+    if (m_printData.GetOrientation() == wxLANDSCAPE)
+    {
+        translate_y -= m_maxY;
+        *m_pstream << "90 rotate\n";
+    }
+
+    *m_pstream << scale_x << " " << scale_y << " scale\n";
+    *m_pstream << translate_x << " " << translate_y << " translate\n";
 }
 
 void wxPostScriptDC::EndPage ()
 {
     wxCHECK_RET( m_ok && m_pstream, "invalid postscript dc" );
-    
+
     *m_pstream << "showpage\n";
 }
 
-bool wxPostScriptDC::Blit( long WXUNUSED(xdest), long WXUNUSED(ydest), 
-                           long WXUNUSED(fwidth), long WXUNUSED(fheight),
-                           wxDC *WXUNUSED(source), 
-               long WXUNUSED(xsrc), long WXUNUSED(ysrc), 
-               int WXUNUSED(rop), bool WXUNUSED(useMask) )
+bool wxPostScriptDC::Blit( long xdest, long ydest,
+                           long fwidth, long fheight,
+                           wxDC *source,
+                           long xsrc, long ysrc,
+                           int rop, bool WXUNUSED(useMask) )
 {
     wxCHECK_MSG( m_ok && m_pstream, FALSE, "invalid postscript dc" );
-    
-    wxFAIL_MSG( "wxPostScriptDC::Blit no yet implemented." );
-    
+
+    wxCHECK_MSG( source, FALSE, "invalid source dc" );
+
+    /* blit into a bitmap */
+
+    wxBitmap bitmap( (int)fwidth, (int)fheight );
+    wxMemoryDC memDC;
+    memDC.SelectObject(bitmap);
+    memDC.Blit(0, 0, fwidth, fheight, source, xsrc, ysrc, rop); /* TODO: Blit transparently? */
+    memDC.SelectObject(wxNullBitmap);
+
+    /* draw bitmap. scaling and positioning is done there */
+
+    DrawBitmap( bitmap, xdest, ydest );
+
     return TRUE;
 }
 
-long wxPostScriptDC::GetCharHeight ()
+long wxPostScriptDC::GetCharHeight()
 {
     if (m_font.Ok())
         return  m_font.GetPointSize();
@@ -1485,12 +1559,12 @@ long wxPostScriptDC::GetCharHeight ()
         return 12;
 }
 
-void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
-           long *descent, long *externalLeading, wxFont *theFont,
-                    bool WXUNUSED(use16))
+void wxPostScriptDC::GetTextExtentconst wxString& string, long *x, long *y,
+                                    long *descent, long *externalLeading, wxFont *theFont,
+                                    bool WXUNUSED(use16) )
 {
     wxFont *fontToUse = theFont;
-  
+
     if (!fontToUse) fontToUse = (wxFont*) &m_font;
 
     wxCHECK_RET( fontToUse, "GetTextExtent: no font defined" );
@@ -1501,55 +1575,55 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
     /* Provide a VERY rough estimate (avoid using it).
      * Produces accurate results for mono-spaced font
      * such as Courier (aka wxMODERN) */
-     
+
     int height = 12;
     if (fontToUse)
     {
-       height = fontToUse->GetPointSize();
+        height = fontToUse->GetPointSize();
     }
     *x = strlen (string) * height * 72 / 120;
-    *y = (long) (height * 1.32);       /* allow for descender */
+    *y = (long) (height * 1.32);    /* allow for descender */
     if (descent) *descent = 0;
     if (externalLeading) *externalLeading = 0;
 #else
 
-   /* method for calculating string widths in postscript:
-   /  read in the AFM (adobe font metrics) file for the
-   /  actual font, parse it and extract the character widths
-   /  and also the descender. this may be improved, but for now
-   /  it works well. the AFM file is only read in if the
-   /  font is changed. this may be chached in the future.
-   /  calls to GetTextExtent with the font unchanged are rather
-   /  efficient!!!
-   /
-   /  for each font and style used there is an AFM file necessary.
-   /  currently i have only files for the roman font family.
-   /  I try to get files for the other ones!
-   /
-   /  CAVE: the size of the string is currently always calculated
-   /        in 'points' (1/72 of an inch). this should later on be
-   /        changed to depend on the mapping mode.
-   /  CAVE: the path to the AFM files must be set before calling this
-   /        function. this is usually done by a call like the following:
-   /        wxSetAFMPath("d:\\wxw161\\afm\\");
-   /
-   /  example:
-   /
-   /    wxPostScriptDC dc(NULL, TRUE);
-   /    if (dc.Ok()){
-   /      wxSetAFMPath("d:\\wxw161\\afm\\");
-   /      dc.StartDoc("Test");
-   /      dc.StartPage();
-   /      long w,h;
-   /      dc.SetFont(new wxFont(10, wxROMAN, wxNORMAL, wxNORMAL));
-   /      dc.GetTextExtent("Hallo",&w,&h);
-   /      dc.EndPage();
-   /      dc.EndDoc();
-   /    }
-   /
-   /  by steve (stefan.hammes@urz.uni-heidelberg.de)
-   /  created: 10.09.94
-   /  updated: 14.05.95 */
+    /* method for calculating string widths in postscript:
+    /  read in the AFM (adobe font metrics) file for the
+    /  actual font, parse it and extract the character widths
+    /  and also the descender. this may be improved, but for now
+    /  it works well. the AFM file is only read in if the
+    /  font is changed. this may be chached in the future.
+    /  calls to GetTextExtent with the font unchanged are rather
+    /  efficient!!!
+    /
+    /  for each font and style used there is an AFM file necessary.
+    /  currently i have only files for the roman font family.
+    /  I try to get files for the other ones!
+    /
+    /  CAVE: the size of the string is currently always calculated
+    /        in 'points' (1/72 of an inch). this should later on be
+    /        changed to depend on the mapping mode.
+    /  CAVE: the path to the AFM files must be set before calling this
+    /        function. this is usually done by a call like the following:
+    /        wxSetAFMPath("d:\\wxw161\\afm\\");
+    /
+    /  example:
+    /
+    /    wxPostScriptDC dc(NULL, TRUE);
+    /    if (dc.Ok()){
+    /      wxSetAFMPath("d:\\wxw161\\afm\\");
+    /      dc.StartDoc("Test");
+    /      dc.StartPage();
+    /      long w,h;
+    /      dc.SetFont(new wxFont(10, wxROMAN, wxNORMAL, wxNORMAL));
+    /      dc.GetTextExtent("Hallo",&w,&h);
+    /      dc.EndPage();
+    /      dc.EndDoc();
+    /    }
+    /
+    /  by steve (stefan.hammes@urz.uni-heidelberg.de)
+    /  created: 10.09.94
+    /  updated: 14.05.95 */
 
     /* these static vars are for storing the state between calls */
     static int lastFamily= INT_MIN;
@@ -1577,51 +1651,52 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
         char *name = (char*) NULL;
 
         switch (Family)
-       {
-           case wxMODERN:
-           {
-                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO";
-               else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo";
-               else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Cour0";
-               else name = "Cour";
-           }
-           break;
-           case wxROMAN:
-           {
-                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO";
-               else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo";
-               else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO";
-               else if name = "TimesRo";  /* no typo */
-           }
-           break;
-           default:
-           {
-                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO";
-               else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo";
-               else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Helv0";
-               else if ((Style != wxITALIC) && (Weight != wxBOLD)) name = "Helv";
-           }
-           break;
-       }
+        {
+            case wxMODERN:
+                {
+                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "CourBoO";
+                    else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "CourBo";
+                    else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Cour0";
+                    else name = "Cour";
+                }
+                break;
+            case wxROMAN:
+                {
+                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "TimesBoO";
+                    else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "TimesBo";
+                    else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "TimesO";
+                    else if name = "TimesRo";  /* no typo */
+                }
+                break;
+            default:
+                {
+                    if ((Style == wxITALIC) && (Weight == wxBOLD)) name = "HelvBoO";
+                    else if ((Style != wxITALIC) && (Weight == wxBOLD)) name = "HelvBo";
+                    else if ((Style == wxITALIC) && (Weight != wxBOLD)) name = "Helv0";
+                    else name = "Helv";
+                }
+                break;
+        }
 
         /* get the directory of the AFM files */
         char afmName[256];
         afmName[0] = 0;
-        if (wxGetAFMPath()) strcpy( afmName, wxGetAFMPath() );
-
-    /* 2. open and process the file
-    /  a short explanation of the AFM format:
-    /  we have for each character a line, which gives its size
-    /  e.g.:
-    / 
-    /    C 63 ; WX 444 ; N question ; B 49 -14 395 676 ;
-    / 
-    /  that means, we have a character with ascii code 63, and width
-    /  (444/1000 * fontSize) points.
-    /  the other data is ignored for now!
-    / 
-    /  when the font has changed, we read in the right AFM file and store the
-    /  character widths in an array, which is processed below (see point 3.). */
+        wxString fmPath(m_printData.GetFontMetricPath());
+        if (fmPath != "") strcpy( afmName, (const char*) fmPath );
+
+        /* 2. open and process the file
+           /  a short explanation of the AFM format:
+           /  we have for each character a line, which gives its size
+           /  e.g.:
+           /
+           /    C 63 ; WX 444 ; N question ; B 49 -14 395 676 ;
+           /
+           /  that means, we have a character with ascii code 63, and width
+           /  (444/1000 * fontSize) points.
+           /  the other data is ignored for now!
+           /
+           /  when the font has changed, we read in the right AFM file and store the
+           /  character widths in an array, which is processed below (see point 3.). */
 
         /* new elements JC Sun Aug 25 23:21:44 MET DST 1996 */
 
@@ -1635,8 +1710,8 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
             for (int i=0; i<256; i++) lastWidths[i] = 500; /* an approximate value */
             lastDescender = -150; /* dito. */
         }
-       else
-       {
+        else
+        {
             /* init the widths array */
             for(int i=0; i<256; i++) lastWidths[i] = INT_MIN;
             /* some variables for holding parts of a line */
@@ -1646,67 +1721,67 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
             int ascii,cWidth;
             /* read in the file and parse it */
             while(fgets(line,sizeof(line),afmFile)!=NULL)
-           {
+            {
                 /* A.) check for descender definition */
                 if (strncmp(line,"Descender",9)==0)
-               {
+                {
                     if ((sscanf(line,"%s%d",descString,&lastDescender)!=2) ||
-                       (strcmp(descString,"Descender")!=0)) 
-                   {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (bad descender)\n", afmName,line );
+                            (strcmp(descString,"Descender")!=0))
+                    {
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (bad descender)\n", afmName,line );
                     }
                 }
                 /* JC 1.) check for UnderlinePosition */
                 else if(strncmp(line,"UnderlinePosition",17)==0)
-               {
+                {
                     if ((sscanf(line,"%s%lf",upString,&UnderlinePosition)!=2) ||
-                       (strcmp(upString,"UnderlinePosition")!=0)) 
-                   {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlinePosition)\n", afmName, line );
+                            (strcmp(upString,"UnderlinePosition")!=0))
+                    {
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlinePosition)\n", afmName, line );
                     }
                 }
-               /* JC 2.) check for UnderlineThickness */
+                /* JC 2.) check for UnderlineThickness */
                 else if(strncmp(line,"UnderlineThickness",18)==0)
-               {
+                {
                     if ((sscanf(line,"%s%lf",utString,&UnderlineThickness)!=2) ||
-                       (strcmp(utString,"UnderlineThickness")!=0)) 
-                   {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlineThickness)\n", afmName, line );
+                            (strcmp(utString,"UnderlineThickness")!=0))
+                    {
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (bad UnderlineThickness)\n", afmName, line );
                     }
                 }
-               /* JC 3.) check for EncodingScheme */
+                /* JC 3.) check for EncodingScheme */
                 else if(strncmp(line,"EncodingScheme",14)==0)
-               {
+                {
                     if ((sscanf(line,"%s%s",utString,encString)!=2) ||
-                       (strcmp(utString,"EncodingScheme")!=0)) 
-                   {
-                       wxLogDebug("AFM-file '%s': line '%s' has error (bad EncodingScheme)\n", afmName, line );
+                            (strcmp(utString,"EncodingScheme")!=0))
+                    {
+                        wxLogDebug("AFM-file '%s': line '%s' has error (bad EncodingScheme)\n", afmName, line );
                     }
                     else if (strncmp(encString, "AdobeStandardEncoding", 21))
                     {
-                       wxLogDebug( "AFM-file '%s': line '%s' has error (unsupported EncodingScheme %s)\n",
-                                   afmName,line, encString);
+                        wxLogDebug( "AFM-file '%s': line '%s' has error (unsupported EncodingScheme %s)\n",
+                                afmName,line, encString);
                     }
                 }
                 /* B.) check for char-width */
                 else if(strncmp(line,"C ",2)==0)
-               {
+                {
                     if (sscanf(line,"%s%d%s%s%d",cString,&ascii,semiString,WXString,&cWidth)!=5)
-                   {
+                    {
                         wxLogDebug("AFM-file '%s': line '%s' has an error (bad character width)\n",afmName,line);
                     }
                     if(strcmp(cString,"C")!=0 || strcmp(semiString,";")!=0 || strcmp(WXString,"WX")!=0)
-                   {
+                    {
                         wxLogDebug("AFM-file '%s': line '%s' has a format error\n",afmName,line);
                     }
                     /* printf("            char '%c'=%d has width '%d'\n",ascii,ascii,cWidth); */
                     if (ascii>=0 && ascii<256)
-                   {
+                    {
                         lastWidths[ascii] = cWidth; /* store width */
                     }
-                   else
-                   {
-                       /* MATTHEW: this happens a lot; don't print an error */
+                    else
+                    {
+                        /* MATTHEW: this happens a lot; don't print an error */
                         /* wxLogDebug("AFM-file '%s': ASCII value %d out of range\n",afmName,ascii); */
                     }
                 }
@@ -1715,9 +1790,9 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
             fclose(afmFile);
         }
         /* hack to compute correct values for german 'Umlaute'
-        /  the correct way would be to map the character names
-        /  like 'adieresis' to corresp. positions of ISOEnc and read
-        /  these values from AFM files, too. Maybe later ... */
+           /  the correct way would be to map the character names
+           /  like 'adieresis' to corresp. positions of ISOEnc and read
+           /  these values from AFM files, too. Maybe later ... */
         lastWidths[196] = lastWidths['A'];  // Ä
         lastWidths[228] = lastWidths['a'];  // ä
         lastWidths[214] = lastWidths['O'];  // Ö
@@ -1732,8 +1807,8 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
     m_underlineThickness = m_underlineThickness * fontToUse->GetPointSize() / 1000.0f * m_scaleFactor;
 
     /* 3. now the font metrics are read in, calc size this
-    /  is done by adding the widths of the characters in the
-    /  string. they are given in 1/1000 of the size! */
+       /  is done by adding the widths of the characters in the
+       /  string. they are given in 1/1000 of the size! */
 
     long widthSum=0;
     long height=Size; /* by default */
@@ -1741,16 +1816,16 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
     for(p=(unsigned char *)(const char *)string; *p; p++)
     {
         if(lastWidths[*p]== INT_MIN)
-       {
+        {
             wxLogDebug("GetTextExtent: undefined width for character '%c' (%d)\n", *p,*p);
             widthSum += (long)(lastWidths[' ']/1000.0F * Size); /* assume space */
         }
-       else
-       {
+        else
+        {
             widthSum += (long)((lastWidths[*p]/1000.0F)*Size);
         }
     }
-    
+
     /* add descender to height (it is usually a negative value) */
     if (lastDescender!=INT_MIN)
     {
@@ -1765,12 +1840,12 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
     if (descent)
     {
         if(lastDescender!=INT_MIN)
-       {
+        {
             *descent = (long)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */
         }
-       else
-       {
-           *descent = 0;
+        else
+        {
+            *descent = 0;
         }
     }
 
@@ -1780,28 +1855,6 @@ void wxPostScriptDC::GetTextExtent (const wxString& string, long *x, long *y,
 #endif
 }
 
-void wxPostScriptDC::GetSizeMM(long *width, long *height) const
-{
-    const char *paperType = wxThePrintSetupData->GetPaperName();
-  
-    if (!paperType) paperType = _("A4 210 x 297 mm");
-
-    wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(paperType);
-    
-    if (!paper) paper = wxThePrintPaperDatabase->FindPaperType(_("A4 210 x 297 mm"));
-    
-    if (paper)
-    {
-        if (width) *width = paper->widthMM;
-        if (height) *height = paper->heightMM;
-    }
-    else
-    {
-       if (width) *width = 210;
-       if (height) *height = 297;
-    }
-}
-
 // Determine the Default Postscript Previewer
 // available on the platform
 #if defined(__SUN__) && defined(__XVIEW__)
@@ -1824,10 +1877,8 @@ void wxPostScriptDC::GetSizeMM(long *width, long *height) const
 wxPrintSetupData *wxThePrintSetupData = (wxPrintSetupData *) NULL;
 
 #if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxPostScriptModule, wxModule)
 IMPLEMENT_DYNAMIC_CLASS(wxPostScriptDC, wxDC)
 IMPLEMENT_DYNAMIC_CLASS(wxPrintSetupData, wxObject)
-IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperType, wxObject)
 #endif
 
 // Redundant now I think
@@ -1857,7 +1908,7 @@ wxPostScriptPrintDialog::wxPostScriptPrintDialog (wxWindow *parent, const wxStri
    print_modes[2] = _("Preview Only");
 
 
-  
+
    wxButton *okBut = new wxButton (this, wxID_OK, _("OK"), wxPoint(5, 5));
    (void) new wxButton (this, wxID_CANCEL, _("Cancel"), wxPoint(40, 5));
    okBut->SetDefault();
@@ -1883,18 +1934,18 @@ wxPostScriptPrintDialog::wxPostScriptPrintDialog (wxWindow *parent, const wxStri
    radio0->SetSelection((int)wxThePrintSetupData->GetPrinterOrientation() - 1);
 
   // @@@ Configuration hook
-   if (wxThePrintSetupData->GetPrintPreviewCommand() == NULL)
+   if ( !wxThePrintSetupData->GetPrintPreviewCommand() )
       wxThePrintSetupData->SetPrintPreviewCommand(PS_VIEWER_PROG);
 
-   wxGetResource ("wxWindows", "PSView", &wxThePrintSetupData->previewCommand);
+   //   wxGetResource ("wxWindows", "PSView", &wxThePrintSetupData->m_previewCommand);
 
    features = (wxThePrintSetupData->GetPrintPreviewCommand() &&
-               *wxThePrintSetupData->GetPrintPreviewCommand()) ? 3 : 2; 
-  
+               *wxThePrintSetupData->GetPrintPreviewCommand()) ? 3 : 2;
+
    wxRadioBox *radio1 = new wxRadioBox(this, wxID_PRINTER_MODES, _("PostScript:"),
                                        wxPoint(150, yPos),
                                        wxSize(-1,-1), features,
-                                       print_modes, features, wxRA_SPECIFY_ROWS); 
+                                       print_modes, features, wxRA_SPECIFY_ROWS);
 
 #ifdef __WXMSW__
    radio1->Enable(0, FALSE);
@@ -1925,7 +1976,7 @@ wxPostScriptPrintDialog::wxPostScriptPrintDialog (wxWindow *parent, const wxStri
    (void) new wxStaticText(this, -1, _("Y Translation"), wxPoint(220, yPos));
    sprintf (buf, "%.2ld", wx_printer_translate_y);
    /* wxTextCtrl *text4 = */ (void) new wxTextCtrl(this, wxID_PRINTER_Y_TRANS, buf, wxPoint(320, yPos), wxSize(100, -1));
-  
+
    Fit ();
 
    delete[] orientation;
@@ -1947,17 +1998,17 @@ int wxPostScriptPrintDialog::ShowModal ()
       wxRadioBox *radio0 = (wxRadioBox *)FindWindow(wxID_PRINTER_ORIENTATION);
       wxRadioBox *radio1 = (wxRadioBox *)FindWindow(wxID_PRINTER_MODES);
 
-      StringToDouble (WXSTRINGCAST text1->GetValue (), &wxThePrintSetupData->printerScaleX);
-      StringToDouble (WXSTRINGCAST text2->GetValue (), &wxThePrintSetupData->printerScaleY);
-      StringToLong (WXSTRINGCAST text3->GetValue (), &wxThePrintSetupData->printerTranslateX);
-      StringToLong (WXSTRINGCAST text4->GetValue (), &wxThePrintSetupData->printerTranslateY);
+      StringToDouble (WXSTRINGCAST text1->GetValue (), &wxThePrintSetupData->m_printerScaleX);
+      StringToDouble (WXSTRINGCAST text2->GetValue (), &wxThePrintSetupData->m_printerScaleY);
+      StringToLong (WXSTRINGCAST text3->GetValue (), &wxThePrintSetupData->m_printerTranslateX);
+      StringToLong (WXSTRINGCAST text4->GetValue (), &wxThePrintSetupData->m_printerTranslateY);
 
 #ifdef __X__
       //      wxThePrintSetupData->SetPrinterOptions(WXSTRINGCAST text0->GetValue ());
       //      wxThePrintSetupData->SetPrinterCommand(WXSTRINGCAST text_prt->GetValue ());
 #endif
 
-      wxThePrintSetupData->SetPrinterOrientation((radio0->GetSelection() == 1 ? PS_LANDSCAPE : PS_PORTRAIT));
+      wxThePrintSetupData->SetPrinterOrientation((radio0->GetSelection() == 1 ? wxLANDSCAPE : wxPORTRAIT));
 
       // C++ wants this
       switch ( radio1->GetSelection() ) {
@@ -1974,22 +2025,22 @@ int wxPostScriptPrintDialog::ShowModal ()
 
 // PostScript printer settings
 // RETAINED FOR BACKWARD COMPATIBILITY
-void wxSetPrinterCommand(const char *cmd)
+void wxSetPrinterCommand(const wxString& cmd)
 {
   wxThePrintSetupData->SetPrinterCommand(cmd);
 }
 
-void wxSetPrintPreviewCommand(const char *cmd)
+void wxSetPrintPreviewCommand(const wxString& cmd)
 {
   wxThePrintSetupData->SetPrintPreviewCommand(cmd);
 }
 
-void wxSetPrinterOptions(const char *flags)
+void wxSetPrinterOptions(const wxString& flags)
 {
   wxThePrintSetupData->SetPrinterOptions(flags);
 }
 
-void wxSetPrinterFile(const char *f)
+void wxSetPrinterFile(const wxString& f)
 {
   wxThePrintSetupData->SetPrinterFile(f);
 }
@@ -2015,28 +2066,28 @@ void wxSetPrinterMode(int mode)
   wxThePrintSetupData->SetPrinterMode(mode);
 }
 
-void wxSetAFMPath(const char *f)
+void wxSetAFMPath(const wxString& f)
 {
   wxThePrintSetupData->SetAFMPath(f);
 }
 
 // Get current values
-char *wxGetPrinterCommand()
+wxString wxGetPrinterCommand()
 {
   return wxThePrintSetupData->GetPrinterCommand();
 }
 
-char *wxGetPrintPreviewCommand()
+wxString wxGetPrintPreviewCommand()
 {
   return wxThePrintSetupData->GetPrintPreviewCommand();
 }
 
-char *wxGetPrinterOptions()
+wxString wxGetPrinterOptions()
 {
   return wxThePrintSetupData->GetPrinterOptions();
 }
 
-char *wxGetPrinterFile()
+wxString wxGetPrinterFile()
 {
   return wxThePrintSetupData->GetPrinterFile();
 }
@@ -2061,7 +2112,7 @@ int wxGetPrinterMode()
   return wxThePrintSetupData->GetPrinterMode();
 }
 
-char *wxGetAFMPath()
+wxString wxGetAFMPath()
 {
   return wxThePrintSetupData->GetAFMPath();
 }
@@ -2072,200 +2123,17 @@ char *wxGetAFMPath()
 
 wxPrintSetupData::wxPrintSetupData()
 {
-  printerCommand = (char *) NULL;
-  previewCommand = (char *) NULL;
-  printerFlags = (char *) NULL;
-  printerOrient = PS_PORTRAIT;
-  printerScaleX = (double)1.0;
-  printerScaleY = (double)1.0;
-  printerTranslateX = 0;
-  printerTranslateY = 0;
-  // 1 = Preview, 2 = print to file, 3 = send to printer
-  printerMode = 3;
-  afmPath = (char *) NULL;
-  paperName = (char *) NULL;
-  printColour = TRUE;
-  printerFile = (char *) NULL;
+  m_printerOrient = wxPORTRAIT;
+  m_printerScaleX = (double)1.0;
+  m_printerScaleY = (double)1.0;
+  m_printerTranslateX = 0;
+  m_printerTranslateY = 0;
+  m_printerMode = wxPRINT_MODE_FILE;
+  m_printColour = TRUE;
 }
 
 wxPrintSetupData::~wxPrintSetupData()
 {
-  if (printerCommand)
-    delete[] printerCommand;
-  if (previewCommand)
-    delete[] previewCommand;
-  if (printerFlags)
-    delete[] printerFlags;
-  if (afmPath)
-    delete[] afmPath;
-  if (paperName)
-    delete[] paperName;
-  if (printerFile)
-    delete[] printerFile;
-}
-
-void wxPrintSetupData::SetPrinterCommand(const char *cmd)
-{
-  if (cmd == printerCommand)
-    return;
-
-  if (printerCommand)
-    delete[] printerCommand;
-  if (cmd)
-    printerCommand = copystring(cmd);
-  else
-    printerCommand = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrintPreviewCommand(const char *cmd)
-{
-  if (cmd == previewCommand)
-    return;
-
-  if (previewCommand)
-    delete[] previewCommand;
-  if (cmd)
-    previewCommand = copystring(cmd);
-  else
-    previewCommand = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPaperName(const char *name)
-{
-  if (name == paperName)
-    return;
-
-  if (paperName)
-    delete[] paperName;
-  if (name)
-    paperName = copystring(name);
-  else
-    paperName = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrinterOptions(const char *flags)
-{
-  if (printerFlags == flags)
-    return;
-
-  if (printerFlags)
-    delete[] printerFlags;
-  if (flags)
-    printerFlags = copystring(flags);
-  else
-    printerFlags = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrinterFile(const char *f)
-{
-  if (f == printerFile)
-    return;
-
-  if (printerFile)
-    delete[] printerFile;
-  if (f)
-    printerFile = copystring(f);
-  else
-    printerFile = (char *) NULL;
-}
-
-void wxPrintSetupData::SetPrinterOrientation(int orient)
-{
-  printerOrient = orient;
-}
-
-void wxPrintSetupData::SetPrinterScaling(double x, double y)
-{
-  printerScaleX = x;
-  printerScaleY = y;
-}
-
-void wxPrintSetupData::SetPrinterTranslation(long x, long y)
-{
-  printerTranslateX = x;
-  printerTranslateY = y;
-}
-
-// 1 = Preview, 2 = print to file, 3 = send to printer
-void wxPrintSetupData::SetPrinterMode(int mode)
-{
-  printerMode = mode;
-}
-
-void wxPrintSetupData::SetAFMPath(const char *f)
-{
-  if (f == afmPath)
-    return;
-
-  if (afmPath)
-    delete[] afmPath;
-  if (f)
-    afmPath = copystring(f);
-  else
-    afmPath = (char *) NULL;
-}
-
-void wxPrintSetupData::SetColour(bool col)
-{
-  printColour = col;
-}
-
-// Get current values
-char *wxPrintSetupData::GetPrinterCommand()
-{
-  return printerCommand;
-}
-
-char *wxPrintSetupData::GetPrintPreviewCommand()
-{
-  return previewCommand;
-}
-
-char *wxPrintSetupData::GetPrinterOptions()
-{
-  return printerFlags;
-}
-
-char *wxPrintSetupData::GetPrinterFile()
-{
-  return printerFile;
-}
-
-char *wxPrintSetupData::GetPaperName()
-{
-  return paperName;
-}
-
-int wxPrintSetupData::GetPrinterOrientation()
-{
-  return printerOrient;
-}
-
-void wxPrintSetupData::GetPrinterScaling(double *x, double *y)
-{
-  *x = printerScaleX;
-  *y = printerScaleY;
-}
-
-void wxPrintSetupData::GetPrinterTranslation(long *x, long *y)
-{
-  *x = printerTranslateX;
-  *y = printerTranslateY;
-}
-
-int wxPrintSetupData::GetPrinterMode()
-{
-  return printerMode;
-}
-
-char *wxPrintSetupData::GetAFMPath()
-{
-  return afmPath;
-}
-
-bool wxPrintSetupData::GetColour()
-{
-  return printColour;
 }
 
 void wxPrintSetupData::operator=(wxPrintSetupData& data)
@@ -2288,6 +2156,22 @@ void wxPrintSetupData::operator=(wxPrintSetupData& data)
   SetColour(data.GetColour());
 }
 
+// Initialize from a wxPrintData object (wxPrintData should now be used instead of wxPrintSetupData).
+void wxPrintSetupData::operator=(const wxPrintData& data)
+{
+    SetPrinterCommand(data.GetPrinterCommand());
+    SetPrintPreviewCommand(data.GetPreviewCommand());
+    SetPrinterOptions(data.GetPrinterOptions());
+    SetPrinterTranslation(data.GetPrinterTranslateX(), data.GetPrinterTranslateY());
+    SetPrinterScaling(data.GetPrinterScaleX(), data.GetPrinterScaleY());
+    SetPrinterOrientation(data.GetOrientation());
+    SetPrinterMode((int) data.GetPrintMode());
+    SetAFMPath(data.GetFontMetricPath());
+    SetPaperName(wxThePrintPaperDatabase->ConvertIdToName(data.GetPaperId()));
+    SetColour(data.GetColour());
+    SetPrinterFile(data.GetFilename());
+}
+
 void wxInitializePrintSetupData(bool init)
 {
   if (init)
@@ -2295,9 +2179,9 @@ void wxInitializePrintSetupData(bool init)
     wxThePrintSetupData = new wxPrintSetupData;
 
     wxThePrintSetupData->SetPrintPreviewCommand(PS_VIEWER_PROG);
-    wxThePrintSetupData->SetPrinterOrientation(PS_PORTRAIT);
-    wxThePrintSetupData->SetPrinterMode(PS_PREVIEW);
-    wxThePrintSetupData->SetPaperName(_("A4 210 x 297 mm"));
+    wxThePrintSetupData->SetPrinterOrientation(wxPORTRAIT);
+    wxThePrintSetupData->SetPrinterMode(wxPRINT_MODE_PREVIEW);
+    wxThePrintSetupData->SetPaperName(_("A4 sheet, 210 x 297 mm"));
 
     // Could have a .ini file to read in some defaults
     // - and/or use environment variables, e.g. WXWIN
@@ -2309,12 +2193,12 @@ void wxInitializePrintSetupData(bool init)
 #ifdef __WXMSW__
     wxThePrintSetupData->SetPrinterCommand("print");
     wxThePrintSetupData->SetAFMPath("c:\\windows\\system\\");
-    wxThePrintSetupData->SetPrinterOptions(NULL);
+    wxThePrintSetupData->SetPrinterOptions("");
 #endif
 #if !defined(__VMS__) && !defined(__WXMSW__)
     wxThePrintSetupData->SetPrinterCommand("lpr");
-    wxThePrintSetupData->SetPrinterOptions((char *) NULL);
-    wxThePrintSetupData->SetAFMPath((char *) NULL);
+    wxThePrintSetupData->SetPrinterOptions("");
+    wxThePrintSetupData->SetAFMPath("");
 #endif
   }
   else
@@ -2325,86 +2209,19 @@ void wxInitializePrintSetupData(bool init)
   }
 }
 
-/*
- * Paper size database for PostScript
- */
-
-wxPrintPaperType::wxPrintPaperType(const char *name, int wmm, int hmm, int wp, int hp)
-{
-  widthMM = wmm;
-  heightMM = hmm;
-  widthPixels = wp;
-  heightPixels = hp;
-  pageName = copystring(name);
-}
-
-wxPrintPaperType::~wxPrintPaperType()
-{
-  delete[] pageName;
-}
-
-/*
- * Print paper database for PostScript
- */
-
-#if !USE_SHARED_LIBRARIES
-IMPLEMENT_DYNAMIC_CLASS(wxPrintPaperDatabase, wxList)
-#endif
-
-wxPrintPaperDatabase::wxPrintPaperDatabase():wxList(wxKEY_STRING)
-{
-  DeleteContents(TRUE);
-}
-
-wxPrintPaperDatabase::~wxPrintPaperDatabase()
-{
-}
+// A module to allow initialization/cleanup of PostScript-related
+// things without calling these functions from app.cpp.
 
-void wxPrintPaperDatabase::CreateDatabase()
+class WXDLLEXPORT wxPostScriptModule: public wxModule
 {
-  // Need correct values for page size in pixels.
-  // Each unit is one 'point' = 1/72 of an inch.
-  // NOTE: WE NEED ALSO TO MAKE ADJUSTMENTS WHEN TRANSLATING
-  // in wxPostScriptDC code, so we can start from top left.
-  // So access this database and translate by appropriate number
-  // of points for this paper size. OR IS IT OK ALREADY?
-  // Can't remember where the PostScript origin is by default.
-  // Heck, someone will know how to make it hunky-dory...
-  // JACS 25/5/95
-
-  AddPaperType(_("A4 210 x 297 mm"), 210, 297,         595, 842);
-  AddPaperType(_("A3 297 x 420 mm"), 297, 420,         842, 1191);
-  AddPaperType(_("Letter 8 1/2 x 11 in"), 216, 279,    612, 791);
-  AddPaperType(_("Legal 8 1/2 x 14 in"), 216, 356,     612, 1009);
-  
-/*
-  This is for 100 ppi
+DECLARE_DYNAMIC_CLASS(wxPostScriptModule)
+public:
+    wxPostScriptModule() {}
+    bool OnInit();
+    void OnExit();
+};
 
-  AddPaperType(_("A4 210 x 297 mm"), 210, 297,         210*4, 297*4 );
-  AddPaperType(_("A3 297 x 420 mm"), 297, 420,         297*4, 420*4 );
-  AddPaperType(_("Letter 8 1/2 x 11 in"), 216, 279,    216*4, 279*4 );
-  AddPaperType(_("Legal 8 1/2 x 14 in"), 216, 356,     216*4, 356*4 );
-*/
-}
-
-void wxPrintPaperDatabase::ClearDatabase()
-{
-  Clear();
-}
-
-void wxPrintPaperDatabase::AddPaperType(const char *name, int wmm, int hmm, int wp, int hp)
-{
-  Append(name, new wxPrintPaperType(name, wmm, hmm, wp, hp));
-}
-
-wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(const char *name)
-{
-  wxNode *node = Find(name);
-  if (node)
-    return (wxPrintPaperType *)node->Data();
-  else
-    return (wxPrintPaperType *) NULL;
-}
+IMPLEMENT_DYNAMIC_CLASS(wxPostScriptModule, wxModule)
 
 /*
  * Initialization/cleanup module
@@ -2413,8 +2230,6 @@ wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(const char *name)
 bool wxPostScriptModule::OnInit()
 {
     wxInitializePrintSetupData();
-    wxThePrintPaperDatabase = new wxPrintPaperDatabase;
-    wxThePrintPaperDatabase->CreateDatabase();
 
     return TRUE;
 }
@@ -2422,8 +2237,6 @@ bool wxPostScriptModule::OnInit()
 void wxPostScriptModule::OnExit()
 {
     wxInitializePrintSetupData(FALSE);
-    delete wxThePrintPaperDatabase;
-    wxThePrintPaperDatabase = NULL;
 }
 
 #endif