]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
fix bug with adding entries to a root group containing only subgroups (as shown by...
[wxWidgets.git] / src / generic / dcpsg.cpp
index 1ed27267082420e34d908b598b21224415b21db0..777796b782eb87640fae80d1118faec963e8a04d 100644 (file)
@@ -252,7 +252,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxPostScriptDC, wxDC)
 
 //-------------------------------------------------------------------------------
 
-void wxPostScriptDC::SetResolution(int ppi)
+void wxPostScriptDC::SetResolution(int WXUNUSED(ppi))
 {
 }
 
@@ -297,7 +297,7 @@ wxPostScriptDC::wxPostScriptDC (const wxPrintData& printData)
     // this calculates m_pageHeight required for
     // taking the inverted Y axis into account
     SetPrintData( printData );
-    
+
     m_ok = true;
 }
 
@@ -446,8 +446,8 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
                        "%f %f lineto\n"
                        "closepath\n"
                        "fill\n",
-                XLOG2DEV(xc), YLOG2DEV(yc), 
-                XLOG2DEVREL(i_radius), YLOG2DEVREL(i_radius), 
+                XLOG2DEV(xc), YLOG2DEV(yc),
+                XLOG2DEVREL(i_radius), YLOG2DEVREL(i_radius),
                 alpha1, alpha2,
                 XLOG2DEV(xc), YLOG2DEV(yc) );
         buffer.Replace( ",", "." );
@@ -460,15 +460,15 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         SetPen( m_pen );
-        
+
         wxString buffer;
         buffer.Printf( "newpath\n"
                        "%f %f %f %f %f %f ellipse\n"
                        "%f %f lineto\n"
-                       "stroke\n"
-                       "fill\n",
-                XLOG2DEV(xc), YLOG2DEV(yc), 
-                XLOG2DEVREL(i_radius), YLOG2DEVREL(i_radius), 
+                       "closepath\n"
+                       "stroke\n",
+                XLOG2DEV(xc), YLOG2DEV(yc),
+                XLOG2DEVREL(i_radius), YLOG2DEVREL(i_radius),
                 alpha1, alpha2,
                 XLOG2DEV(xc), YLOG2DEV(yc) );
         buffer.Replace( ",", "." );
@@ -524,7 +524,7 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d
                        "%f %f %f %f %f %f false ellipticarc\n",
                   XLOG2DEV(x+w/2), YLOG2DEV(y+h/2),
                   XLOG2DEVREL(w/2), YLOG2DEVREL(h/2),
-                  wxRound(sa), wxRound(ea) );
+                  sa, ea );
         buffer.Replace( ",", "." );
         PsPrint( buffer );
 
@@ -721,7 +721,7 @@ void wxPostScriptDC::DoDrawLines (int n, wxPoint points[], wxCoord xoffset, wxCo
               YLOG2DEV(points[0].y+yoffset) );
     buffer.Replace( ",", "." );
     PsPrint( buffer );
-    
+
     for (i = 1; i < n; i++)
     {
         buffer.Printf( "%f %f lineto\n",
@@ -738,6 +738,9 @@ void wxPostScriptDC::DoDrawRectangle (wxCoord x, wxCoord y, wxCoord width, wxCoo
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
+    width--;
+    height--;
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
@@ -789,6 +792,9 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
+    width--;
+    height--;
+
     if (radius < 0.0)
     {
         // Now, a negative radius is interpreted to mean
@@ -868,6 +874,9 @@ void wxPostScriptDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
+    width--;
+    height--;
+
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush (m_brush);
@@ -933,14 +942,14 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
     wxString buffer;
     buffer.Printf( "/origstate save def\n"
                    "20 dict begin\n"
-                   "/pix %f string def\n"
-                   "/grays %f string def\n"
+                   "/pix %d string def\n"
+                   "/grays %d string def\n"
                    "/npixels 0 def\n"
                    "/rgbindx 0 def\n"
                    "%f %f translate\n"
                    "%f %f scale\n"
-                   "%f %f 8\n"
-                   "[%f 0 0 %f 0 %f]\n"
+                   "%d %d 8\n"
+                   "[%d 0 0 %d 0 %d]\n"
                    "{currentfile pix readhexstring pop}\n"
                    "false 3 colorimage\n",
             w, w, xx, yy, ww, hh, w, h, w, -h, h );
@@ -970,7 +979,11 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
         }
         *(bufferindex++) = '\n';
         *bufferindex = 0;
-        PsPrint( charbuffer );
+
+        if (m_pstream)
+            fwrite( charbuffer, 1, strlen( charbuffer ), m_pstream );
+        else
+            PsPrint( charbuffer );
     }
 
     PsPrint( "end\n" );
@@ -1063,7 +1076,7 @@ void wxPostScriptDC::SetFont( const wxFont& font )
     PsPrint( name );
     PsPrint( " findfont\n" );
 
-    
+
     double size = (double) m_font.GetPointSize();
     wxString buffer;
     buffer.Printf( "%f scalefont setfont\n", size * DEV2PS * m_scaleX );
@@ -1082,7 +1095,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
     m_pen = pen;
 
     double width;
-    
+
     if (m_pen.GetWidth() <= 0)
         width = 0.1;
     else
@@ -1228,9 +1241,9 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
     const wxWX2MBbuf textbuf = text.mb_str();
-    if (textbuf.data() == NULL)
+    if ( !textbuf )
         return;
-    
+
     if (m_textForegroundColour.Ok())
     {
         unsigned char red = m_textForegroundColour.Red();
@@ -1272,11 +1285,6 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
 
     GetTextExtent(text, &text_w, &text_h, &text_descent);
 
-    // VZ: this seems to be unnecessary, so taking it out for now, if it
-    //     doesn't create any problems, remove this comment entirely
-    //SetFont( m_font );
-
-
     int size = m_font.GetPointSize();
 
 //    wxCoord by = y + (wxCoord)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
@@ -1318,7 +1326,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
     if (m_font.GetUnderlined())
     {
         wxCoord uy = (wxCoord)(y + size - m_underlinePosition);
-        
+
         buffer.Printf( "gsave\n"
                        "%f %f moveto\n"
                        "%f setlinewidth\n"
@@ -1378,7 +1386,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
             buffer.Printf( "%f %f %f setrgbcolor\n", redPS, greenPS, bluePS );
             buffer.Replace( ",", "." );
             PsPrint( buffer );
-            
+
             m_currentRed = red;
             m_currentBlue = blue;
             m_currentGreen = green;
@@ -1433,7 +1441,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
         wxCoord w, h;
         GetTextExtent(text, &w, &h);
 
-        buffer.Printf( 
+        buffer.Printf(
                 "gsave\n"
                 "%f %f moveto\n"
                 "%f setlinewidth\n"
@@ -1462,7 +1470,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function))
 }
 
 #if wxUSE_SPLINES
-void wxPostScriptDC::DoDrawSpline( wxList *points )
+void wxPostScriptDC::DoDrawSpline( const wxPointList *points )
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
@@ -1473,13 +1481,13 @@ void wxPostScriptDC::DoDrawSpline( wxList *points )
     double c, d, x1, y1, x2, y2, x3, y3;
     wxPoint *p, *q;
 
-    wxList::compatibility_iterator node = points->GetFirst();
-    p = (wxPoint *)node->GetData();
+    wxPointList::compatibility_iterator node = points->GetFirst();
+    p = node->GetData();
     x1 = p->x;
     y1 = p->y;
 
     node = node->GetNext();
-    p = (wxPoint *)node->GetData();
+    p = node->GetData();
     c = p->x;
     d = p->y;
     x3 =
@@ -1508,7 +1516,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points )
     node = node->GetNext();
     while (node)
     {
-        q = (wxPoint *)node->GetData();
+        q = node->GetData();
 
         x1 = x3;
         y1 = y3;
@@ -1551,7 +1559,7 @@ wxCoord wxPostScriptDC::GetCharWidth() const
 
 void wxPostScriptDC::SetPrintData(const wxPrintData& data)
 {
-    m_printData = data;    
+    m_printData = data;
 
     wxPaperSize id = m_printData.GetPaperId();
     wxPrintPaperType *paper = wxThePrintPaperDatabase->FindPaperType(id);
@@ -1603,6 +1611,25 @@ void wxPostScriptDC::SetDeviceOrigin(wxCoord x, wxCoord y)
 }
 #endif
 
+void wxPostScriptDC::ComputeScaleAndOrigin()
+{
+    const wxRealPoint origScale(m_scaleX, m_scaleY);
+
+#if wxUSE_NEW_DC
+    wxImplDC::ComputeScaleAndOrigin();
+#else
+    wxDC::ComputeScaleAndOrigin();
+#endif
+
+    // If scale has changed call SetPen to recalulate the line width
+    // and SetFont to recalculate font size
+    if ( wxRealPoint(m_scaleX, m_scaleY) != origScale && m_pen.IsOk() )
+    {
+        SetPen( m_pen );
+        SetFont( m_font  );
+    }
+}
+
 void wxPostScriptDC::DoGetSize(int* width, int* height) const
 {
     wxPaperSize id = m_printData.GetPaperId();
@@ -1626,10 +1653,10 @@ void wxPostScriptDC::DoGetSize(int* width, int* height) const
         h = tmp;
     }
 
-    if (width) 
+    if (width)
         *width = wxRound( w * PS2DEV );
-        
-    if (height) 
+
+    if (height)
         *height = wxRound( h * PS2DEV );
 }
 
@@ -1695,14 +1722,14 @@ bool wxPostScriptDC::StartDoc( const wxString& message )
     wxString buffer;
 
     PsPrint( "%!PS-Adobe-2.0\n" );
-    
+
     buffer.Printf( "%%%%Title: %s\n", m_title );
     PsPrint( buffer );
     PsPrint( "%%Creator: wxWidgets PostScript renderer\n" );
-    
+
     buffer.Printf( "%%%%CreationDate: %s\n", wxNow() );
     PsPrint( buffer );
-    
+
     if (m_printData.GetOrientation() == wxLANDSCAPE)
         PsPrint( "%%Orientation: Landscape\n" );
     else
@@ -1727,10 +1754,10 @@ bool wxPostScriptDC::StartDoc( const wxString& message )
        case wxPAPER_10X14: paper = wxT("10x14"); break;         // 10-by-14-inch sheet
        default: paper = wxT("A4");
     }
-    
+
     buffer.Printf( "%%%%DocumentPaperSizes: %s\n", paper );
     PsPrint( buffer );
-    
+
     PsPrint( "%%EndComments\n\n" );
 
     PsPrint( "%%BeginProlog\n" );
@@ -1873,23 +1900,23 @@ void wxPostScriptDC::StartPage()
 
     buffer.Printf( "%d %d translate\n", translate_x, translate_y );
     PsPrint( buffer );
-    
+
     double scale_x = data->GetPrinterScaleX();
     double scale_y = data->GetPrinterScaleY();
-    
+
     buffer.Printf( "%f %f scale\n", scale_x, scale_y );
     buffer.Replace( ",", "." );
     PsPrint( buffer );
-    
+
 #endif
 
     // Each page starts with an "initgraphics" which resets the
-    // transformation and so we need to rotate the page for 
+    // transformation and so we need to rotate the page for
     // landscape printing)
 
     // I copied this one from a PostScript tutorial, but to no avail. RR.
     // PsPrint( "90 rotate llx neg ury nef translate\n" );
-    
+
     if (m_printData.GetOrientation() == wxLANDSCAPE)
         PsPrint( "90 rotate\n" );
 }
@@ -1982,9 +2009,9 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
    // GTK 2.0
 
     const wxWX2MBbuf strbuf = string.mb_str();
-    
+
     // conversion failed (non e.g. ISO characters)
-    if (strbuf.data() == NULL)
+    if ( !strbuf )
         return;
 
 #if !wxUSE_AFM_FOR_POSTSCRIPT