]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
Doc/distribution script mods
[wxWidgets.git] / src / generic / dcpsg.cpp
index 6b5c65a0e7cc8a5d24b47d315d204e876031fea0..9239f644b7ac170a9807e83a182252e3b57702d6 100644 (file)
@@ -233,6 +233,20 @@ static char wxPostScriptHeaderReencodeISO2[] =
 // wxPostScriptDC
 //-------------------------------------------------------------------------------
 
+float wxPostScriptDC::ms_PSScaleFactor = 10.0;
+
+void wxPostScriptDC::SetResolution(int ppi)
+{
+    ms_PSScaleFactor = (float)ppi / 72.0;
+}
+
+int wxPostScriptDC::GetResolution()
+{
+    return (int)(ms_PSScaleFactor * 72.0);
+}
+  
+
+
 wxPostScriptDC::wxPostScriptDC ()
 {
     m_pstream = (FILE*) NULL;
@@ -636,6 +650,9 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx
         wxCoord xx = XLOG2DEV(points[0].x + xoffset);
         wxCoord yy = YLOG2DEV(points[0].y + yoffset);
 
+        wxCoord xx0 = xx;
+        wxCoord yy0 = yy;
+        
         fprintf( m_pstream, "%d %d moveto\n", xx, yy );
 
         CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset );
@@ -650,7 +667,8 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx
             CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset);
         }
 
-        fprintf( m_pstream, "fill\n" );
+        fprintf( m_pstream, "%d %d lineto\n", xx0, yy0 );
+        fprintf( m_pstream, "stroke\n" );
     }
 }
 
@@ -824,7 +842,7 @@ void wxPostScriptDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord
                 "%d %d %d %d 0 360 ellipse\n"
                 "fill\n",
                 XLOG2DEV(x + width / 2), YLOG2DEV(y + height / 2),
-                XLOG2DEV(width / 2), YLOG2DEVREL(height / 2) );
+                XLOG2DEVREL(width / 2), YLOG2DEVREL(height / 2) );
 
         CalcBoundingBox( x - width, y - height );
         CalcBoundingBox( x + width, y + height );
@@ -839,7 +857,7 @@ void wxPostScriptDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord
                 "%d %d %d %d 0 360 ellipse\n"
                 "stroke\n",
                 XLOG2DEV(x + width / 2), YLOG2DEV(y + height / 2),
-                XLOG2DEV(width / 2), YLOG2DEVREL(height / 2) );
+                XLOG2DEVREL(width / 2), YLOG2DEVREL(height / 2) );
 
         CalcBoundingBox( x - width, y - height );
         CalcBoundingBox( x + width, y + height );
@@ -872,13 +890,12 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
 
     if (!image.Ok()) return;
 
+    wxCoord w = image.GetWidth();
+    wxCoord h = image.GetHeight();
+
     wxCoord ww = XLOG2DEVREL(image.GetWidth());
     wxCoord hh = YLOG2DEVREL(image.GetHeight());
 
-    image = image.Scale( ww, hh );
-
-    if (!image.Ok()) return;
-
     wxCoord xx = XLOG2DEV(x);
     wxCoord yy = YLOG2DEV(y + bitmap.GetHeight());
 
@@ -895,11 +912,12 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
             "[%d 0 0 %d 0 %d]\n"
             "{currentfile pix readhexstring pop}\n"
             "false 3 colorimage\n",
-            ww, ww, xx, yy, ww, hh, ww, hh, ww, -hh, hh );
+            w, w, xx, yy, ww, hh, w, h, w, -h, h );
+
 
-    for (int j = 0; j < hh; j++)
+    for (int j = 0; j < h; j++)
     {
-        for (int i = 0; i < ww; i++)
+        for (int i = 0; i < w; i++)
         {
             char buffer[5];
             LocalDecToHex( image.GetRed(i,j), buffer );
@@ -1006,12 +1024,12 @@ void wxPostScriptDC::SetFont( const wxFont& font )
     fprintf( m_pstream, " findfont\n" );
 
     sprintf( buffer, "%f scalefont setfont\n", YLOG2DEVREL(m_font.GetPointSize() * 1000) / 1000.0F);
-    for (int i = 0; i < 100; i++)
-        if (buffer[i] == ',') buffer[i] = '.';
-    fprintf( m_pstream, buffer );
                 // this is a hack - we must scale font size (in pts) according to m_scaleY but
                 // YLOG2DEVREL works with wxCoord type (int or longint). Se we first convert font size
                 // to 1/1000th of pt and then back.
+    for (int i = 0; i < 100; i++)
+        if (buffer[i] == ',') buffer[i] = '.';
+    fprintf( m_pstream, buffer );
 }
 
 void wxPostScriptDC::SetPen( const wxPen& pen )
@@ -1032,7 +1050,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         sprintf( buffer, "%f setlinewidth\n", XLOG2DEVREL(1000 * m_pen.GetWidth()) / 1000.0f );
         #endif
         for (int i = 0; i < 100; i++)
-            if (buffer[i] == ',') buffer[i] = '.'; 
+            if (buffer[i] == ',') buffer[i] = '.';
         fprintf( m_pstream, buffer );
     }
 
@@ -1095,13 +1113,13 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         double redPS = (double)(red) / 255.0;
         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 );
         for (int i = 0; i < 100; i++)
-            if (buffer[i] == ',') buffer[i] = '.'; 
+            if (buffer[i] == ',') buffer[i] = '.';
         fprintf( m_pstream, buffer );
 
         m_currentRed = red;
@@ -1148,7 +1166,7 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush )
                 "%.8f %.8f %.8f setrgbcolor\n",
                 redPS, greenPS, bluePS );
         for (int i = 0; i < 100; i++)
-            if (buffer[i] == ',') buffer[i] = '.'; 
+            if (buffer[i] == ',') buffer[i] = '.';
         fprintf( m_pstream, buffer );
 
         m_currentRed = red;
@@ -1198,7 +1216,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
                 "%.8f %.8f %.8f setrgbcolor\n",
                 redPS, greenPS, bluePS );
             for (int i = 0; i < 100; i++)
-                if (buffer[i] == ',') buffer[i] = '.'; 
+                if (buffer[i] == ',') buffer[i] = '.';
             fprintf( m_pstream, buffer );
 
             m_currentRed = red;
@@ -1263,7 +1281,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
                 m_underlineThickness,
                 XLOG2DEV(x + text_w), YLOG2DEV(uy) );
         for (i = 0; i < 100; i++)
-            if (buffer[i] == ',') buffer[i] = '.'; 
+            if (buffer[i] == ',') buffer[i] = '.';
         fprintf( m_pstream, buffer );
     }
 
@@ -1314,7 +1332,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
                 "%.8f %.8f %.8f setrgbcolor\n",
                 redPS, greenPS, bluePS );
             for (int i = 0; i < 100; i++)
-                if (buffer[i] == ',') buffer[i] = '.'; 
+                if (buffer[i] == ',') buffer[i] = '.';
             fprintf( m_pstream, buffer );
 
             m_currentRed = red;
@@ -1329,13 +1347,13 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
 
     // FIXME only correct for 90 degrees
     fprintf(m_pstream, "%d %d moveto\n",
-            XLOG2DEV((wxCoord)(x + size)), YLOG2DEV(by) );
-            
+            XLOG2DEV((wxCoord)(x + size)), YLOG2DEV((wxCoord)by) );
+
     char buffer[100];
     sprintf(buffer, "%.8f rotate\n", angle);
     int i;
     for (i = 0; i < 100; i++)
-        if (buffer[i] == ',') buffer[i] = '.'; 
+        if (buffer[i] == ',') buffer[i] = '.';
     fprintf(m_pstream, buffer);
 
     /* I don't know how to write char to a stream, so I use a mini string */
@@ -1368,10 +1386,10 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
     }
 
     fprintf( m_pstream, ") show\n" );
-    
+
     sprintf( buffer, "%.8f rotate\n", -angle );
     for (i = 0; i < 100; i++)
-        if (buffer[i] == ',') buffer[i] = '.'; 
+        if (buffer[i] == ',') buffer[i] = '.';
     fprintf( m_pstream, buffer );
 
     if (m_font.GetUnderlined())
@@ -1392,7 +1410,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
                  m_underlineThickness,
                  XLOG2DEV(x + w), YLOG2DEV(uy) );
         for (i = 0; i < 100; i++)
-            if (buffer[i] == ',') buffer[i] = '.'; 
+            if (buffer[i] == ',') buffer[i] = '.';
         fprintf( m_pstream, buffer );
     }
 
@@ -1529,8 +1547,8 @@ void wxPostScriptDC::DoGetSize(int* width, int* height) const
         h = tmp;
     }
 
-    if (width) *width = w;
-    if (height) *height = h;
+    if (width) *width = (int)(w * ms_PSScaleFactor);
+    if (height) *height = (int)(h * ms_PSScaleFactor);
 }
 
 void wxPostScriptDC::DoGetSizeMM(int *width, int *height) const
@@ -1563,7 +1581,8 @@ void wxPostScriptDC::DoGetSizeMM(int *width, int *height) const
 // Resolution in pixels per logical inch
 wxSize wxPostScriptDC::GetPPI(void) const
 {
-    return wxSize(72, 72);
+    return wxSize((int)(72 * ms_PSScaleFactor), 
+                  (int)(72 * ms_PSScaleFactor));
 }
 
 
@@ -1799,11 +1818,12 @@ void wxPostScriptDC::StartPage()
     }
 
     char buffer[100];
-    sprintf( buffer, "%.8f %.8f scale\n", scale_x, scale_y );
+    sprintf( buffer, "%.8f %.8f scale\n", scale_x / ms_PSScaleFactor, 
+                                          scale_y / ms_PSScaleFactor);
     for (int i = 0; i < 100; i++)
         if (buffer[i] == ',') buffer[i] = '.';
     fprintf( m_pstream, buffer );
-    
+
     fprintf( m_pstream, "%d %d translate\n", translate_x, translate_y );
 }
 
@@ -1840,7 +1860,7 @@ bool wxPostScriptDC::DoBlit( wxCoord xdest, wxCoord ydest,
 wxCoord wxPostScriptDC::GetCharHeight() const
 {
     if (m_font.Ok())
-        return  m_font.GetPointSize();
+        return m_font.GetPointSize();
     else
         return 12;
 }
@@ -1855,8 +1875,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
     if (!fontToUse) fontToUse = (wxFont*) &m_font;
 
     wxCHECK_RET( fontToUse, wxT("GetTextExtent: no font defined") );
-    wxCHECK_RET( x, wxT("GetTextExtent: x == NULL") );
-    wxCHECK_RET( y, wxT("GetTextExtent: y == NULL") );
 
     const wxWX2MBbuf strbuf = string.mb_str();
 
@@ -2125,9 +2143,9 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
         // VS: dirty, but is there any better solution?
         double *pt;
         pt = (double*) &m_underlinePosition;
-        *pt = YLOG2DEVREL(UnderlinePosition * fontToUse->GetPointSize()) / 1000.0f;
+        *pt = YLOG2DEVREL((wxCoord)(UnderlinePosition * fontToUse->GetPointSize())) / 1000.0f;
         pt = (double*) &m_underlineThickness;
-        *pt = YLOG2DEVREL(UnderlineThickness * fontToUse->GetPointSize()) / 1000.0f;
+        *pt = YLOG2DEVREL((wxCoord)(UnderlineThickness * fontToUse->GetPointSize())) / 1000.0f;
 
     }
 
@@ -2494,7 +2512,8 @@ void wxPrintSetupData::operator=(const wxPrintData& data)
     SetPrinterCommand(data.GetPrinterCommand());
     SetPrintPreviewCommand(data.GetPreviewCommand());
     SetPrinterOptions(data.GetPrinterOptions());
-    SetPrinterTranslation(data.GetPrinterTranslateX(), data.GetPrinterTranslateY());
+    SetPrinterTranslation((wxCoord)data.GetPrinterTranslateX(),
+                          (wxCoord)data.GetPrinterTranslateY());
     SetPrinterScaling(data.GetPrinterScaleX(), data.GetPrinterScaleY());
     SetPrinterOrientation(data.GetOrientation());
     SetPrinterMode((int) data.GetPrintMode());