X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eb7637b58750721cc1cbd7b126c3d9323a974b75..9a7b7798282622e445efc3318b6c85ff0bed9af8:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index 1ed2726708..777796b782 100644 --- a/src/generic/dcpsg.cpp +++ b/src/generic/dcpsg.cpp @@ -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