X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/67bbb91038b29fca45b0e2003a7dbf6368f2c786..987263fe1974dac46a38d6d623557ccf89a25992:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index c8d9cebdc0..9202e61e12 100644 --- a/src/generic/dcpsg.cpp +++ b/src/generic/dcpsg.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dcpsg.h" #endif @@ -85,7 +85,7 @@ static const char *wxPostScriptHeaderConicTo = "\ p1_x p1_y p2_x p2_y to_x to_y curveto\n\ } bind def\n\ "; - + static const char *wxPostScriptHeaderEllipse = "\ /ellipsedict 8 dict def\n\ ellipsedict /mtrx matrix put\n\ @@ -321,7 +321,7 @@ bool wxPostScriptDC::Create( const wxString &output, bool interactive, wxWindow wxPrintData data; data.SetFilename( output ); data.SetPrintMode( wxPRINT_MODE_FILE ); - + if (interactive) { wxPrintDialogData ddata( data ); @@ -334,7 +334,7 @@ bool wxPostScriptDC::Create( const wxString &output, bool interactive, wxWindow } data = dialog.GetPrintDialogData().GetPrintData(); } - + return TRUE; } #endif @@ -347,14 +347,16 @@ bool wxPostScriptDC::Ok() const void wxPostScriptDC::DoSetClippingRegion (wxCoord x, wxCoord y, wxCoord w, wxCoord h) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok , wxT("invalid postscript dc") ); if (m_clipping) DestroyClippingRegion(); wxDC::DoSetClippingRegion(x, y, w, h); m_clipping = TRUE; - fprintf( m_pstream, + + if (m_pstream) + fprintf( m_pstream, "gsave\n newpath\n" "%d %d moveto\n" "%d %d lineto\n" @@ -370,12 +372,13 @@ void wxPostScriptDC::DoSetClippingRegion (wxCoord x, wxCoord y, wxCoord w, wxCoo void wxPostScriptDC::DestroyClippingRegion() { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok , wxT("invalid postscript dc") ); if (m_clipping) { m_clipping = FALSE; - fprintf( m_pstream, "grestore\n" ); + if ( m_pstream ) + fprintf( m_pstream, "grestore\n" ); } wxDC::DestroyClippingRegion(); @@ -383,7 +386,9 @@ void wxPostScriptDC::DestroyClippingRegion() void wxPostScriptDC::Clear() { - wxFAIL_MSG( wxT("wxPostScriptDC::Clear not implemented.") ); + // This should fail silently to avoid unnecessary + // asserts + // wxFAIL_MSG( wxT("wxPostScriptDC::Clear not implemented.") ); } bool wxPostScriptDC::DoFloodFill (wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), const wxColour &WXUNUSED(col), int WXUNUSED(style)) @@ -405,13 +410,14 @@ void wxPostScriptDC::DoCrossHair (wxCoord WXUNUSED(x), wxCoord WXUNUSED(y)) void wxPostScriptDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (m_pen.GetStyle() == wxTRANSPARENT) return; SetPen( m_pen ); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d moveto\n" "%d %d lineto\n" @@ -427,7 +433,7 @@ void wxPostScriptDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); wxCoord dx = x1 - xc; wxCoord dy = y1 - yc; @@ -461,7 +467,8 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, { SetBrush( m_brush ); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d %d %d %d ellipse\n" "%d %d lineto\n" @@ -478,7 +485,8 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, { SetPen( m_pen ); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d %d %d %d ellipse\n" "%d %d lineto\n" @@ -494,7 +502,7 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360; if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360; @@ -511,7 +519,8 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d { SetBrush( m_brush ); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d %d %d %d true ellipticarc\n", LogicalToDeviceX(x+w/2), LogicalToDeviceY(y+h/2), LogicalToDeviceXRel(w/2), LogicalToDeviceYRel(h/2), (wxCoord)sa, (wxCoord)ea ); @@ -524,7 +533,8 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d { SetPen( m_pen ); - fprintf(m_pstream, + if ( m_pstream ) + fprintf(m_pstream, "newpath\n" "%d %d %d %d %d %d false ellipticarc\n", LogicalToDeviceX(x+w/2), LogicalToDeviceY(y+h/2), LogicalToDeviceXRel(w/2), LogicalToDeviceYRel(h/2), (wxCoord)sa, (wxCoord)ea ); @@ -536,13 +546,14 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d void wxPostScriptDC::DoDrawPoint (wxCoord x, wxCoord y) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (m_pen.GetStyle() == wxTRANSPARENT) return; SetPen (m_pen); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d moveto\n" "%d %d lineto\n" @@ -555,7 +566,7 @@ void wxPostScriptDC::DoDrawPoint (wxCoord x, wxCoord y) void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int WXUNUSED(fillStyle)) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (n <= 0) return; @@ -563,12 +574,14 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx { SetBrush( m_brush ); - fprintf( m_pstream, "newpath\n" ); + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" ); wxCoord xx = LogicalToDeviceX(points[0].x + xoffset); wxCoord yy = LogicalToDeviceY(points[0].y + yoffset); - fprintf( m_pstream, "%d %d moveto\n", xx, yy ); + if ( m_pstream ) + fprintf( m_pstream, "%d %d moveto\n", xx, yy ); CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset ); @@ -577,24 +590,28 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx xx = LogicalToDeviceX(points[i].x + xoffset); yy = LogicalToDeviceY(points[i].y + yoffset); - fprintf( m_pstream, "%d %d lineto\n", xx, yy ); + if ( m_pstream ) + fprintf( m_pstream, "%d %d lineto\n", xx, yy ); CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset); } - fprintf( m_pstream, "fill\n" ); + if ( m_pstream ) + fprintf( m_pstream, "fill\n" ); } if (m_pen.GetStyle () != wxTRANSPARENT) { SetPen( m_pen ); - fprintf( m_pstream, "newpath\n" ); + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" ); wxCoord xx = LogicalToDeviceX(points[0].x + xoffset); wxCoord yy = LogicalToDeviceY(points[0].y + yoffset); - fprintf( m_pstream, "%d %d moveto\n", xx, yy ); + if ( m_pstream ) + fprintf( m_pstream, "%d %d moveto\n", xx, yy ); CalcBoundingBox( points[0].x + xoffset, points[0].y + yoffset ); @@ -603,19 +620,23 @@ void wxPostScriptDC::DoDrawPolygon (int n, wxPoint points[], wxCoord xoffset, wx xx = LogicalToDeviceX(points[i].x + xoffset); yy = LogicalToDeviceY(points[i].y + yoffset); - fprintf( m_pstream, "%d %d lineto\n", xx, yy ); + if ( m_pstream ) + fprintf( m_pstream, "%d %d lineto\n", xx, yy ); CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset); } - fprintf( m_pstream, "closepath\n" ); - fprintf( m_pstream, "stroke\n" ); + if ( m_pstream ) + { + fprintf( m_pstream, "closepath\n" ); + fprintf( m_pstream, "stroke\n" ); + } } } void wxPostScriptDC::DoDrawLines (int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (m_pen.GetStyle() == wxTRANSPARENT) return; @@ -629,30 +650,34 @@ void wxPostScriptDC::DoDrawLines (int n, wxPoint points[], wxCoord xoffset, wxCo CalcBoundingBox( LogicalToDeviceX(points[i].x+xoffset), LogicalToDeviceY(points[i].y+yoffset)); } - fprintf( m_pstream, + if ( m_pstream ) + { + fprintf( m_pstream, "newpath\n" "%d %d moveto\n", LogicalToDeviceX(points[0].x+xoffset), LogicalToDeviceY(points[0].y+yoffset) ); - - for (i = 1; i < n; i++) - { - fprintf( m_pstream, + + for (i = 1; i < n; i++) + { + fprintf( m_pstream, "%d %d lineto\n", LogicalToDeviceX(points[i].x+xoffset), LogicalToDeviceY(points[i].y+yoffset) ); + } + + fprintf( m_pstream, "stroke\n" ); } - - fprintf( m_pstream, "stroke\n" ); } void wxPostScriptDC::DoDrawRectangle (wxCoord x, wxCoord y, wxCoord width, wxCoord height) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (m_brush.GetStyle () != wxTRANSPARENT) { SetBrush( m_brush ); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d moveto\n" "%d %d lineto\n" @@ -673,7 +698,8 @@ void wxPostScriptDC::DoDrawRectangle (wxCoord x, wxCoord y, wxCoord width, wxCoo { SetPen (m_pen); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d moveto\n" "%d %d lineto\n" @@ -693,7 +719,7 @@ void wxPostScriptDC::DoDrawRectangle (wxCoord x, wxCoord y, wxCoord width, wxCoo void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (radius < 0.0) { @@ -701,9 +727,9 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width // 'the proportion of the smallest X or Y dimension' double smallest = 0.0; if (width < height) - smallest = width; + smallest = width; else - smallest = height; + smallest = height; radius = (-radius * smallest); } @@ -714,7 +740,8 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width SetBrush( m_brush ); /* Draw rectangle anticlockwise */ - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d 90 180 arc\n" "%d %d moveto\n" @@ -744,7 +771,8 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width SetPen (m_pen); /* Draw rectangle anticlockwise */ - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d 90 180 arc\n" "%d %d moveto\n" @@ -772,13 +800,14 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width void wxPostScriptDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (m_brush.GetStyle () != wxTRANSPARENT) { SetBrush (m_brush); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d %d 0 360 ellipse\n" "fill\n", @@ -793,7 +822,8 @@ void wxPostScriptDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord { SetPen (m_pen); - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d %d %d 0 360 ellipse\n" "stroke\n", @@ -823,7 +853,7 @@ static void LocalDecToHex( int dec, char *buf ) void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool WXUNUSED(useMask) ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (!bitmap.Ok()) return; @@ -840,7 +870,9 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, wxCoord xx = LogicalToDeviceX(x); wxCoord yy = LogicalToDeviceY(y + bitmap.GetHeight()); - fprintf( m_pstream, + if ( m_pstream ) + { + fprintf( m_pstream, "/origstate save def\n" "20 dict begin\n" "/pix %d string def\n" @@ -854,30 +886,29 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, "{currentfile pix readhexstring pop}\n" "false 3 colorimage\n", w, w, xx, yy, ww, hh, w, h, w, -h, h ); - - - for (int j = 0; j < h; j++) - { - for (int i = 0; i < w; i++) + + for (int j = 0; j < h; j++) { - char buffer[5]; - LocalDecToHex( image.GetRed(i,j), buffer ); - fprintf( m_pstream, buffer ); - LocalDecToHex( image.GetGreen(i,j), buffer ); - fprintf( m_pstream, buffer ); - LocalDecToHex( image.GetBlue(i,j), buffer ); - fprintf( m_pstream, buffer ); + for (int i = 0; i < w; i++) + { + char buffer[5]; + LocalDecToHex( image.GetRed(i,j), buffer ); + fprintf( m_pstream, buffer ); + LocalDecToHex( image.GetGreen(i,j), buffer ); + fprintf( m_pstream, buffer ); + LocalDecToHex( image.GetBlue(i,j), buffer ); + fprintf( m_pstream, buffer ); + } + fprintf( m_pstream, "\n" ); } - fprintf( m_pstream, "\n" ); + fprintf( m_pstream, "end\n" ); + fprintf( m_pstream, "origstate restore\n" ); } - - fprintf( m_pstream, "end\n" ); - fprintf( m_pstream, "origstate restore\n" ); } void wxPostScriptDC::SetFont( const wxFont& font ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (!font.Ok()) return; @@ -956,26 +987,28 @@ void wxPostScriptDC::SetFont( const wxFont& font ) } } - fprintf( m_pstream, name ); - fprintf( m_pstream, " reencodeISO def\n" ); - fprintf( m_pstream, name ); - fprintf( m_pstream, " findfont\n" ); - - char buffer[100]; - sprintf( buffer, "%f scalefont setfont\n", LogicalToDeviceYRel(m_font.GetPointSize() * 1000) / 1000.0F); - // this is a hack - we must scale font size (in pts) according to m_scaleY but - // LogicalToDeviceYRel 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 ); - + if ( m_pstream ) + { + fprintf( m_pstream, name ); + fprintf( m_pstream, " reencodeISO def\n" ); + fprintf( m_pstream, name ); + fprintf( m_pstream, " findfont\n" ); + + char buffer[100]; + sprintf( buffer, "%f scalefont setfont\n", LogicalToDeviceYRel(m_font.GetPointSize() * 1000) / 1000.0F); + // this is a hack - we must scale font size (in pts) according to m_scaleY but + // LogicalToDeviceYRel 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 ); + } #endif } void wxPostScriptDC::SetPen( const wxPen& pen ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (!pen.Ok()) return; @@ -983,6 +1016,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) m_pen = pen; + if ( m_pstream ) { char buffer[100]; #ifdef __WXMSW__ @@ -1024,7 +1058,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) default: psdash = "[] 0"; break; } - if (oldStyle != m_pen.GetStyle()) + if ((oldStyle != m_pen.GetStyle()) && m_pstream ) { fprintf( m_pstream, psdash ); fprintf( m_pstream," setdash\n" ); @@ -1054,15 +1088,17 @@ 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 ); + "%.8f %.8f %.8f setrgbcolor\n", + redPS, greenPS, bluePS ); for (int i = 0; i < 100; i++) if (buffer[i] == ',') buffer[i] = '.'; - fprintf( m_pstream, buffer ); + if ( m_pstream ) + fprintf( m_pstream, buffer ); + m_currentRed = red; m_currentBlue = blue; m_currentGreen = green; @@ -1071,7 +1107,7 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) void wxPostScriptDC::SetBrush( const wxBrush& brush ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (!brush.Ok()) return; @@ -1108,7 +1144,9 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush ) redPS, greenPS, bluePS ); for (int i = 0; i < 100; i++) if (buffer[i] == ',') buffer[i] = '.'; - fprintf( m_pstream, buffer ); + + if ( m_pstream ) + fprintf( m_pstream, buffer ); m_currentRed = red; m_currentBlue = blue; @@ -1184,7 +1222,7 @@ static int paps_cubic_to( FT_Vector* control1, OutlineInfo *outline_info = (OutlineInfo*)user_data; fprintf(outline_info->file, "%d %d %d %d %d %d curveto\n", - (int)control1->x , + (int)control1->x , (int)control1->y , (int)control2->x , (int)control2->y , @@ -1204,20 +1242,20 @@ void draw_bezier_outline(FILE *file, FT_Int load_flags = FT_LOAD_NO_BITMAP; FT_Glyph glyph; - FT_Outline_Funcs outlinefunc = + FT_Outline_Funcs outlinefunc = { paps_move_to, paps_line_to, paps_conic_to, paps_cubic_to }; - + OutlineInfo outline_info; outline_info.file = file; fprintf(file, "gsave\n"); fprintf(file, "%d %d translate\n", pos_x, pos_y ); - + // We have to replace the "," from the German // locale with the Englich "." for PostScript char buf[100]; @@ -1231,7 +1269,7 @@ void draw_bezier_outline(FILE *file, FT_Outline_Decompose (&(((FT_OutlineGlyph)glyph)->outline), &outlinefunc, &outline_info); fprintf(file, "closepath fill grestore\n"); - + FT_Done_Glyph (glyph); } @@ -1239,7 +1277,7 @@ void draw_bezier_outline(FILE *file, void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); if (m_textForegroundColour.Ok()) { @@ -1273,19 +1311,20 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) redPS, greenPS, bluePS ); for (size_t i = 0; i < strlen(buffer); i++) if (buffer[i] == ',') buffer[i] = '.'; - fprintf( m_pstream, buffer ); + if ( m_pstream ) + fprintf( m_pstream, buffer ); m_currentRed = red; m_currentBlue = blue; m_currentGreen = green; } } - + #if wxUSE_PANGO int ps_dpi = 72; int pango_dpi = 600; PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi ); - + double scale = (double)pango_dpi / (double)ps_dpi; scale /= m_userScaleY; @@ -1301,15 +1340,16 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) wxCharBuffer buffer = wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ); #endif pango_layout_set_text( layout, (const char*) buffer, strlen(buffer) ); - - fprintf( m_pstream, "%%%% %s\n", (const char*)buffer ); + + if ( m_pstream ) + fprintf( m_pstream, "%%%% %s\n", (const char*)buffer ); PangoRectangle rect; pango_layout_get_extents(layout, NULL, &rect); - + int xx = LogicalToDeviceX( x ); int yy = LogicalToDeviceY( y ); - + int xxx = xx * PANGO_SCALE; int yyy = yy * PANGO_SCALE - (int)(rect.height * 0.66 / scale); // Move down by estimated baseline. HACK. @@ -1320,10 +1360,10 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) for (int i = 0; i < num_lines; i++) { PangoLayoutLine *line = pango_layout_get_line( layout, i ); - + // width of glyphs already printed int all_width = 0; - + // Loop over runs in line GSList *runs_list = line->runs; while (runs_list) @@ -1334,7 +1374,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) PangoAnalysis *analysis = &item->analysis; PangoFont *font = analysis->font; FT_Face ft_face = pango_ft2_font_get_face(font); - + int num_glyphs = glyphs->num_glyphs; for (int glyph_idx = 0; glyph_idx < num_glyphs; glyph_idx++) { @@ -1342,13 +1382,14 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) int pos_x = xxx + (int)((double)(all_width+geometry.x_offset) / scale); int pos_y = yyy + (int)((double)geometry.y_offset / scale ); all_width += geometry.width; - - draw_bezier_outline( m_pstream, ft_face, - (FT_UInt)(glyphs->glyphs[glyph_idx].glyph), - pos_x / PANGO_SCALE, - pos_y / PANGO_SCALE, - 1.0/(ps_kludge_factor * scale * 26.6), - 1.0/(ps_kludge_factor * scale * 26.6) ); + + if ( m_pstream ) + draw_bezier_outline( m_pstream, ft_face, + (FT_UInt)(glyphs->glyphs[glyph_idx].glyph), + pos_x / PANGO_SCALE, + pos_y / PANGO_SCALE, + 1.0/(ps_kludge_factor * scale * 26.6), + 1.0/(ps_kludge_factor * scale * 26.6) ); } runs_list = runs_list->next; } @@ -1372,40 +1413,42 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) // commented by V. Slavik and replaced by accurate version // - note that there is still rounding error in text_descent! wxCoord by = y + size - text_descent; // baseline - fprintf( m_pstream, "%d %d moveto\n", LogicalToDeviceX(x), LogicalToDeviceY(by) ); - - fprintf( m_pstream, "(" ); - const wxWX2MBbuf textbuf = text.mb_str(); - size_t len = strlen(textbuf); - size_t i; - for (i = 0; i < len; i++) + if ( m_pstream ) { - int c = (unsigned char) textbuf[i]; - if (c == ')' || c == '(' || c == '\\') - { - /* Cope with special characters */ - fprintf( m_pstream, "\\" ); - fputc(c, m_pstream); - } - else if ( c >= 128 ) + fprintf( m_pstream, "%d %d moveto\n", LogicalToDeviceX(x), LogicalToDeviceY(by) ); + fprintf( m_pstream, "(" ); + + const wxWX2MBbuf textbuf = text.mb_str(); + size_t len = strlen(textbuf); + size_t i; + for (i = 0; i < len; i++) { - /* Cope with character codes > 127 */ - fprintf(m_pstream, "\\%o", c); + int c = (unsigned char) textbuf[i]; + if (c == ')' || c == '(' || c == '\\') + { + /* Cope with special characters */ + fprintf( m_pstream, "\\" ); + fputc(c, m_pstream); + } + else if ( c >= 128 ) + { + /* Cope with character codes > 127 */ + fprintf(m_pstream, "\\%o", c); + } + else + { + fputc(c, m_pstream); + } } - else + + fprintf( m_pstream, ") show\n" ); + + if (m_font.GetUnderlined()) { - fputc(c, m_pstream); - } - } - - fprintf( m_pstream, ") show\n" ); - - if (m_font.GetUnderlined()) - { - wxCoord uy = (wxCoord)(y + size - m_underlinePosition); - char buffer[100]; - - sprintf( buffer, + wxCoord uy = (wxCoord)(y + size - m_underlinePosition); + char buffer[100]; + + sprintf( buffer, "gsave\n" "%d %d moveto\n" "%f setlinewidth\n" @@ -1415,9 +1458,10 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) LogicalToDeviceX(x), LogicalToDeviceY(uy), m_underlineThickness, LogicalToDeviceX(x + text_w), LogicalToDeviceY(uy) ); - for (i = 0; i < 100; i++) - if (buffer[i] == ',') buffer[i] = '.'; - fprintf( m_pstream, buffer ); + for (i = 0; i < 100; i++) + if (buffer[i] == ',') buffer[i] = '.'; + fprintf( m_pstream, buffer ); + } } CalcBoundingBox( x, y ); @@ -1433,7 +1477,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord return; } - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); SetFont( m_font ); @@ -1469,7 +1513,8 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord redPS, greenPS, bluePS ); for (int i = 0; i < 100; i++) if (buffer[i] == ',') buffer[i] = '.'; - fprintf( m_pstream, buffer ); + if ( m_pstream ) + fprintf( m_pstream, buffer ); m_currentRed = red; m_currentBlue = blue; @@ -1479,68 +1524,77 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord int size = m_font.GetPointSize(); - fprintf(m_pstream, "%d %d moveto\n", - LogicalToDeviceX(x), LogicalToDeviceY(y)); - - char buffer[100]; - sprintf(buffer, "%.8f rotate\n", angle); - size_t i; - for (i = 0; i < 100; i++) - if (buffer[i] == ',') buffer[i] = '.'; - fprintf(m_pstream, buffer); - - fprintf( m_pstream, "(" ); - const wxWX2MBbuf textbuf = text.mb_str(); - size_t len = strlen(textbuf); - for (i = 0; i < len; i++) + if ( m_pstream ) { - int c = (unsigned char) textbuf[i]; - if (c == ')' || c == '(' || c == '\\') - { - /* Cope with special characters */ - fprintf( m_pstream, "\\" ); - fputc(c, m_pstream); - } - else if ( c >= 128 ) + fprintf(m_pstream, "%d %d moveto\n", + LogicalToDeviceX(x), LogicalToDeviceY(y)); + + char buffer[100]; + sprintf(buffer, "%.8f rotate\n", angle); + size_t i; + for (i = 0; i < 100; i++) { - /* Cope with character codes > 127 */ - fprintf(m_pstream, "\\%o", c); + if (buffer[i] == ',') buffer[i] = '.'; } - else + fprintf(m_pstream, buffer); + + fprintf( m_pstream, "(" ); + const wxWX2MBbuf textbuf = text.mb_str(); + size_t len = strlen(textbuf); + for (i = 0; i < len; i++) { - fputc(c, m_pstream); + int c = (unsigned char) textbuf[i]; + if (c == ')' || c == '(' || c == '\\') + { + /* Cope with special characters */ + fprintf( m_pstream, "\\" ); + fputc(c, m_pstream); + } + else if ( c >= 128 ) + { + /* Cope with character codes > 127 */ + fprintf(m_pstream, "\\%o", c); + } + else + { + fputc(c, m_pstream); + } } - } - - fprintf( m_pstream, ") show\n" ); - - sprintf( buffer, "%.8f rotate\n", -angle ); - for (i = 0; i < 100; i++) - if (buffer[i] == ',') buffer[i] = '.'; - fprintf( m_pstream, buffer ); - - if (m_font.GetUnderlined()) - { - wxCoord uy = (wxCoord)(y + size - m_underlinePosition); - wxCoord w, h; - char buffer[100]; - GetTextExtent(text, &w, &h); - - sprintf( buffer, - "gsave\n" - "%d %d moveto\n" - "%f setlinewidth\n" - "%d %d lineto\n" - "stroke\n" - "grestore\n", - LogicalToDeviceX(x), LogicalToDeviceY(uy), - m_underlineThickness, - LogicalToDeviceX(x + w), LogicalToDeviceY(uy) ); + + fprintf( m_pstream, ") show\n" ); + + sprintf( buffer, "%.8f rotate\n", -angle ); for (i = 0; i < 100; i++) + { if (buffer[i] == ',') buffer[i] = '.'; + } fprintf( m_pstream, buffer ); + + if (m_font.GetUnderlined()) + { + wxCoord uy = (wxCoord)(y + size - m_underlinePosition); + wxCoord w, h; + char buffer[100]; + GetTextExtent(text, &w, &h); + + sprintf( buffer, + "gsave\n" + "%d %d moveto\n" + "%f setlinewidth\n" + "%d %d lineto\n" + "stroke\n" + "grestore\n", + LogicalToDeviceX(x), LogicalToDeviceY(uy), + m_underlineThickness, + LogicalToDeviceX(x + w), LogicalToDeviceY(uy) ); + for (i = 0; i < 100; i++) + { + if (buffer[i] == ',') buffer[i] = '.'; + } + fprintf( m_pstream, buffer ); + } } - + CalcBoundingBox( x, y ); CalcBoundingBox( x + size * text.Length() * 2/3 , y ); } @@ -1557,14 +1611,16 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function)) void wxPostScriptDC::DoDrawSpline( wxList *points ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); SetPen( m_pen ); - double a, b, c, d, x1, y1, x2, y2, x3, y3; + // a and b are not used + //double a, b; + double c, d, x1, y1, x2, y2, x3, y3; wxPoint *p, *q; - wxNode *node = points->GetFirst(); + wxList::compatibility_iterator node = points->GetFirst(); p = (wxPoint *)node->GetData(); x1 = p->x; y1 = p->y; @@ -1573,10 +1629,19 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) p = (wxPoint *)node->GetData(); c = p->x; d = p->y; - x3 = a = (double)(x1 + c) / 2; - y3 = b = (double)(y1 + d) / 2; - - fprintf( m_pstream, + x3 = + #if 0 + a = + #endif + (double)(x1 + c) / 2; + y3 = + #if 0 + b = + #endif + (double)(y1 + d) / 2; + + if ( m_pstream ) + fprintf( m_pstream, "newpath\n" "%d %d moveto\n" "%d %d lineto\n", @@ -1586,7 +1651,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) CalcBoundingBox( (wxCoord)x1, (wxCoord)y1 ); CalcBoundingBox( (wxCoord)x3, (wxCoord)y3 ); - while ((node = node->GetNext()) != NULL) + while ((node = node->GetNext())) { q = (wxPoint *)node->GetData(); @@ -1599,7 +1664,8 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) x3 = (double)(x2 + c) / 2; y3 = (double)(y2 + d) / 2; - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "%d %d %d %d %d %d DrawSplineSection\n", LogicalToDeviceX((wxCoord)x1), LogicalToDeviceY((wxCoord)y1), LogicalToDeviceX((wxCoord)x2), LogicalToDeviceY((wxCoord)y2), @@ -1614,7 +1680,8 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) next-to-last and last point respectively, in the point list */ - fprintf( m_pstream, + if ( m_pstream ) + fprintf( m_pstream, "%d %d lineto\n" "stroke\n", LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) ); @@ -1629,7 +1696,7 @@ wxCoord wxPostScriptDC::GetCharWidth() const void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? 1 : -1); @@ -1642,7 +1709,7 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) void wxPostScriptDC::SetDeviceOrigin( wxCoord x, wxCoord y ) { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); int h = 0; int w = 0; @@ -1742,9 +1809,9 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) fprintf( m_pstream, "%%%%Orientation: Landscape\n" ); else fprintf( m_pstream, "%%%%Orientation: Portrait\n" ); - + // fprintf( m_pstream, "%%%%Pages: %d\n", (wxPageNumber - 1) ); - + const char *paper; switch (m_printData.GetPaperId()) { @@ -1808,7 +1875,7 @@ void wxPostScriptDC::EndDoc () fclose( m_pstream ); m_pstream = (FILE *) NULL; -#if 0 +#if 0 // THE FOLLOWING HAS BEEN CONTRIBUTED BY Andy Fyfe wxCoord wx_printer_translate_x, wx_printer_translate_y; double wx_printer_scale_x, wx_printer_scale_y; @@ -1876,7 +1943,7 @@ void wxPostScriptDC::EndDoc () #endif #if defined(__X__) || defined(__WXGTK__) - if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER)) + if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER)) { wxString command; command += m_printData.GetPrinterCommand(); @@ -1893,9 +1960,10 @@ void wxPostScriptDC::EndDoc () void wxPostScriptDC::StartPage() { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); - fprintf( m_pstream, "%%%%Page: %d\n", wxPageNumber++ ); + if ( m_pstream ) + fprintf( m_pstream, "%%%%Page: %d\n", wxPageNumber++ ); // What is this one supposed to do? RR. // *m_pstream << "matrix currentmatrix\n"; @@ -1921,27 +1989,34 @@ void wxPostScriptDC::StartPage() int h; GetSize( (int*) NULL, &h ); translate_y -= h; - fprintf( m_pstream, "90 rotate\n" ); + if ( m_pstream ) + { + fprintf( m_pstream, "90 rotate\n" ); - // I copied this one from a PostScript tutorial, but to no avail. RR. - // fprintf( m_pstream, "90 rotate llx neg ury nef translate\n" ); + // I copied this one from a PostScript tutorial, but to no avail. RR. + // fprintf( m_pstream, "90 rotate llx neg ury nef translate\n" ); + } } - char buffer[100]; - 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 ); + if ( m_pstream ) + { + char buffer[100]; + 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 ); + } } void wxPostScriptDC::EndPage () { - wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") ); + wxCHECK_RET( m_ok , wxT("invalid postscript dc") ); - fprintf( m_pstream, "showpage\n" ); + if ( m_pstream ) + fprintf( m_pstream, "showpage\n" ); } bool wxPostScriptDC::DoBlit( wxCoord xdest, wxCoord ydest, @@ -1950,7 +2025,7 @@ bool wxPostScriptDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord xsrc, wxCoord ysrc, int rop, bool WXUNUSED(useMask), wxCoord WXUNUSED(xsrcMask), wxCoord WXUNUSED(ysrcMask) ) { - wxCHECK_MSG( m_ok && m_pstream, FALSE, wxT("invalid postscript dc") ); + wxCHECK_MSG( m_ok, FALSE, wxT("invalid postscript dc") ); wxCHECK_MSG( source, FALSE, wxT("invalid source dc") ); @@ -1994,20 +2069,20 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if (externalLeading) (*externalLeading) = 0; return; } - + #if wxUSE_PANGO int wx_dpi = GetResolution(); int pango_dpi = 600; PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi ); - + double scale = pango_dpi / wx_dpi; scale /= m_userScaleY; - + pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR ); PangoLayout *layout = pango_layout_new (context); - + PangoFontDescription *desc = fontToUse->GetNativeFontInfo()->description; pango_layout_set_font_description(layout, desc); #if wxUSE_UNICODE @@ -2018,10 +2093,10 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, #endif pango_layout_set_text(layout, (const char*) data, strlen( (const char*) data )); PangoLayoutLine *line = (PangoLayoutLine *)pango_layout_get_lines(layout)->data; - + PangoRectangle rect; pango_layout_line_get_extents(line, NULL, &rect); - + if (x) (*x) = (wxCoord) ( rect.width / PANGO_SCALE / scale ); if (y) (*y) = (wxCoord) ( rect.height / PANGO_SCALE / scale ); if (descent) @@ -2030,7 +2105,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, (*descent) = 0; } if (externalLeading) (*externalLeading) = 0; // ?? - + g_object_unref( G_OBJECT( layout ) ); #else // GTK 2.0 @@ -2158,7 +2233,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, } FILE *afmFile = NULL; - + // Get the directory of the AFM files wxString afmName; if (!m_printData.GetFontMetricPath().IsEmpty())