X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8850cbd3c3f4e714e6883d3ff8e4ac58144427bc..f31bbefd1070af6162b9deeda9d4e528efbc1b31:/src/generic/dcpsg.cpp diff --git a/src/generic/dcpsg.cpp b/src/generic/dcpsg.cpp index 545d25a5c5..4f7be92ace 100644 --- a/src/generic/dcpsg.cpp +++ b/src/generic/dcpsg.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dcpsg.cpp +// Name: src/generic/dcpsg.cpp // Purpose: Generic wxPostScriptDC implementation // Author: Julian Smart, Robert Roebling, Markus Holzhem // Modified by: @@ -9,42 +9,33 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "dcpsg.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif -#ifndef WX_PRECOMP -#endif // WX_PRECOMP - -#if wxUSE_PRINTING_ARCHITECTURE +#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT -#if wxUSE_POSTSCRIPT +#include "wx/generic/dcpsg.h" -#include "wx/setup.h" +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/dcmemory.h" + #include "wx/math.h" + #include "wx/image.h" + #include "wx/icon.h" +#endif // WX_PRECOMP -#include "wx/dcmemory.h" -#include "wx/utils.h" -#include "wx/intl.h" -#include "wx/app.h" -#include "wx/image.h" -#include "wx/log.h" -#include "wx/generic/dcpsg.h" #include "wx/prntbase.h" #include "wx/generic/prntdlgg.h" #include "wx/paper.h" #include "wx/filefn.h" -#if WXWIN_COMPATIBILITY_2_2 - #include "wx/window.h" - #include "wx/printdlg.h" -#endif +#include "wx/stdpaths.h" -#include +WXDLLIMPEXP_DATA_CORE(int) wxPageNumber; #ifdef __WXMSW__ @@ -201,8 +192,6 @@ static const char *wxPostScriptHeaderColourImage = "\ } ifelse % end of 'false' case\n\ "; -#if wxUSE_PANGO -#else static char wxPostScriptHeaderReencodeISO1[] = "\n/reencodeISO {\n" "dup dup findfont dup length dict begin\n" @@ -243,7 +232,6 @@ static char wxPostScriptHeaderReencodeISO2[] = "/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n" "/yacute/thorn/ydieresis\n" "] def\n\n"; -#endif //------------------------------------------------------------------------------- // wxPostScriptDC @@ -282,6 +270,7 @@ wxPostScriptDC::wxPostScriptDC () m_signX = 1; // default x-axis left to right m_signY = -1; // default y-axis bottom up -> top down + } wxPostScriptDC::wxPostScriptDC (const wxPrintData& printData) @@ -304,6 +293,10 @@ wxPostScriptDC::wxPostScriptDC (const wxPrintData& printData) m_printData = printData; + int h = 0; + GetSize( NULL, &h ); + SetDeviceLocalOrigin( 0, h ); + m_ok = true; } @@ -316,32 +309,7 @@ wxPostScriptDC::~wxPostScriptDC () } } -#if WXWIN_COMPATIBILITY_2_2 -bool wxPostScriptDC::Create( const wxString &output, bool interactive, wxWindow *parent ) -{ - wxPrintData data; - data.SetFilename( output ); - data.SetPrintMode( wxPRINT_MODE_FILE ); - - if (interactive) - { - wxPrintDialogData ddata( data ); - wxPrintDialog dialog( parent, &data ); - dialog.GetPrintDialogData().SetSetupDialog(true); - if (dialog.ShowModal() != wxID_OK) - { - m_ok = false; - return false; - } - data = dialog.GetPrintDialogData().GetPrintData(); - } - - return true; -} -#endif - - -bool wxPostScriptDC::Ok() const +bool wxPostScriptDC::IsOk() const { return m_ok; } @@ -441,9 +409,10 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, alpha1 = 0.0; alpha2 = 360.0; } - else if (radius == 0.0) + else if ( wxIsNullDouble(radius) ) { - alpha1 = alpha2 = 0.0; + alpha1 = + alpha2 = 0.0; } else { @@ -496,12 +465,16 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d { 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; - if (sa<0) sa+=360; - if (ea<0) ea+=360; + if ( sa >= 360 || sa <= -360 ) + sa -= int(sa/360)*360; + if ( ea >= 360 || ea <=- 360 ) + ea -= int(ea/360)*360; + if ( sa < 0 ) + sa += 360; + if ( ea < 0 ) + ea += 360; - if (sa==ea) + if ( wxIsSameDouble(sa, ea) ) { DrawEllipse(x,y,w,h); return; @@ -777,7 +750,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width /* Draw rectangle anticlockwise */ PsPrintf( wxT("newpath\n") wxT("%d %d %d 90 180 arc\n") - wxT("%d %d moveto\n") + wxT("%d %d lineto\n") wxT("%d %d %d 180 270 arc\n") wxT("%d %d lineto\n") wxT("%d %d %d 270 0 arc\n") @@ -787,7 +760,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width wxT("closepath\n") wxT("fill\n"), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad), - LogicalToDeviceX(x), LogicalToDeviceY(y + rad), + LogicalToDeviceX(x), LogicalToDeviceY(y + height - rad), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), @@ -806,7 +779,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width /* Draw rectangle anticlockwise */ PsPrintf( wxT("newpath\n") wxT("%d %d %d 90 180 arc\n") - wxT("%d %d moveto\n") + wxT("%d %d lineto\n") wxT("%d %d %d 180 270 arc\n") wxT("%d %d lineto\n") wxT("%d %d %d 270 0 arc\n") @@ -816,7 +789,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width wxT("closepath\n") wxT("stroke\n"), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad), - LogicalToDeviceX(x), LogicalToDeviceY(y + rad), + LogicalToDeviceX(x), LogicalToDeviceY(y + height - rad), LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height), LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad), @@ -905,14 +878,14 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, unsigned char* data = image.GetData(); - /* buffer = line = width*rgb(3)*hexa(2)+'\n'(1)+null(1) */ - char* buffer = new char[ w*6+2 ]; + // size of the buffer = width*rgb(3)*hexa(2)+'\n' + wxCharBuffer buffer(w*6 + 1); int firstDigit, secondDigit; //rows for (int j = 0; j < h; j++) { - char* bufferindex = buffer; + char* bufferindex = buffer.data(); //cols for (int i = 0; i < w*3; i++) @@ -941,8 +914,6 @@ void wxPostScriptDC::SetFont( const wxFont& font ) m_font = font; -#if wxUSE_PANGO -#else int Style = m_font.GetStyle(); int Weight = m_font.GetWeight(); @@ -1029,7 +1000,6 @@ void wxPostScriptDC::SetFont( const wxFont& font ) for (int i = 0; i < 100; i++) if (buffer[i] == ',') buffer[i] = '.'; PsPrint( buffer ); -#endif // !wxUSE_PANGO } void wxPostScriptDC::SetPen( const wxPen& pen ) @@ -1073,12 +1043,26 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) case wxSHORT_DASH: psdash = short_dashed; break; case wxLONG_DASH: psdash = wxCoord_dashed; break; case wxDOT_DASH: psdash = dotted_dashed; break; + case wxUSER_DASH: + { + wxDash *dashes; + int nDashes = m_pen.GetDashes (&dashes); + PsPrint ("["); + for (int i = 0; i < nDashes; ++i) + { + sprintf( buffer, "%d ", dashes [i] ); + PsPrint( buffer ); + } + PsPrint ("] 0 setdash\n"); + psdash = 0; + } + break; case wxSOLID: case wxTRANSPARENT: default: psdash = "[] 0"; break; } - if ( (oldStyle != m_pen.GetStyle()) ) + if ( psdash && (oldStyle != m_pen.GetStyle()) ) { PsPrint( psdash ); PsPrint( " setdash\n" ); @@ -1109,7 +1093,6 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) 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 ); @@ -1172,139 +1155,6 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush ) } } -#if wxUSE_PANGO - -#define PANGO_ENABLE_ENGINE - -#ifdef __WXGTK20__ -#include "wx/gtk/private.h" -#include "gtk/gtk.h" -#else -#include "wx/x11/private.h" -#endif - -#include -#include FT_FREETYPE_H - -#include "wx/fontutil.h" -#include -#include - -#ifndef FT_Outline_Decompose - FT_EXPORT( FT_Error ) FT_Outline_Decompose( - FT_Outline* outline, - const FT_Outline_Funcs* interface, - void* user ); -#endif - -typedef struct _OutlineInfo OutlineInfo; -struct _OutlineInfo { - wxPostScriptDC* caller; -}; - -static int paps_move_to( FT_Vector* to, void *user_data) -{ - OutlineInfo *outline_info = (OutlineInfo*)user_data; - outline_info->caller->PsPrintf( wxT("%d %d moveto\n"), (int)to->x, (int)to->y ); - return 0; -} - -static int paps_line_to( FT_Vector* to, void *user_data) -{ - OutlineInfo *outline_info = (OutlineInfo*)user_data; - outline_info->caller->PsPrintf( wxT("%d %d lineto\n"), (int)to->x , (int)to->y ); - return 0; -} - -static int paps_conic_to( FT_Vector* control, FT_Vector* to, void *user_data) -{ - OutlineInfo *outline_info = (OutlineInfo*)user_data; - outline_info->caller->PsPrintf( wxT("%d %d %d %d conicto\n"), - (int)control->x , - (int)control->y , - (int)to->x , - (int)to->y ); - return 0; -} - -static int -paps_cubic_to( FT_Vector* control1, FT_Vector* control2, - FT_Vector* to, void *user_data) -{ - OutlineInfo *outline_info = (OutlineInfo*)user_data; - outline_info->caller->PsPrintf(wxT("%d %d %d %d %d %d curveto\n"), - (int)control1->x , - (int)control1->y , - (int)control2->x , - (int)control2->y , - (int)to->x , - (int)to->y ); - return 0; -} - -void draw_bezier_outline(wxPostScriptDC* caller, - FT_Face face, - FT_UInt glyph_index, - int pos_x, - int pos_y, - double scale_x, - double scale_y ) -{ - FT_Int load_flags = FT_LOAD_NO_BITMAP; - FT_Glyph glyph; - - FT_Outline_Funcs outlinefunc = - { - paps_move_to, - paps_line_to, - paps_conic_to, - paps_cubic_to - }; - - OutlineInfo outline_info; - outline_info.caller = caller; - - caller->PsPrint("gsave\n"); - caller->PsPrintf( wxT("%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]; - sprintf(buf, "%.8f %.8f scale\n", scale_x, scale_y ); - for (size_t i = 0; i < strlen(buf); i++) - if (buf[i] == ',') buf[i] = '.'; - caller->PsPrint(buf); - - FT_Load_Glyph(face, glyph_index, load_flags); - FT_Get_Glyph (face->glyph, &glyph); - FT_Outline_Decompose (&(((FT_OutlineGlyph)glyph)->outline), - &outlinefunc, &outline_info); - caller->PsPrint("closepath fill grestore\n"); - - FT_Done_Glyph (glyph); -} - -#endif - - -#if wxUSE_PANGO -static void InitializePangoContext(PangoContext *context) -{ -#ifdef __WXGTK__ - pango_context_set_base_dir(context, - gtk_widget_get_default_direction() == GTK_TEXT_DIR_LTR ? - PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL); - pango_context_set_language(context, gtk_get_default_language()); -#else - // FIXME: assuming LTR is incorrect! - pango_context_set_base_dir(context, PANGO_DIRECTION_LTR); - wxString lang = wxGetLocale()->GetCanonicalName(); - pango_context_set_language(context, - pango_language_from_string(lang.ToAscii())); -#endif -} -#endif - void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) { wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); @@ -1349,81 +1199,6 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) } } -#if wxUSE_PANGO - int ps_dpi = 72; - int pango_dpi = 600; - PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi ); - - InitializePangoContext(context); - - double scale = (double)pango_dpi / (double)ps_dpi; - scale /= m_userScaleY; - - pango_context_set_font_description (context, m_font.GetNativeFontInfo()->description ); - - PangoLayout *layout = pango_layout_new (context); -#if wxUSE_UNICODE - wxCharBuffer buffer = wxConvUTF8.cWC2MB( text ); -#else - wxCharBuffer buffer = wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) ); -#endif - pango_layout_set_text( layout, (const char*) buffer, strlen(buffer) ); - - PsPrintf( wxT("%%%% %s\n"), text.c_str() ); - - 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. - -#define ps_kludge_factor 2.8 - - // Loop over lines in layout - int num_lines = pango_layout_get_line_count( layout ); - 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) - { - PangoLayoutRun *run = (PangoLayoutRun*) runs_list->data; - PangoItem *item = run->item; - PangoGlyphString *glyphs = run->glyphs; - 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++) - { - PangoGlyphGeometry geometry = glyphs->glyphs[glyph_idx].geometry; - 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( this, 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; - } - } - - g_object_unref( G_OBJECT( layout ) ); - g_object_unref( G_OBJECT( context ) ); -#else // !wxUSE_PANGO wxCoord text_w, text_h, text_descent; GetTextExtent(text, &text_w, &text_h, &text_descent); @@ -1489,13 +1264,12 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y ) } CalcBoundingBox( x, y ); - CalcBoundingBox( x + size * text.Length() * 2/3 , y ); -#endif // wxUSE_PANGO/!wxUSE_PANGO + CalcBoundingBox( x + size * text.length() * 2/3 , y ); } void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle ) { - if (angle == 0.0) + if ( wxIsNullDouble(angle) ) { DoDrawText(text, x, y); return; @@ -1595,7 +1369,6 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord { wxCoord uy = (wxCoord)(y + size - m_underlinePosition); wxCoord w, h; - char buffer[100]; GetTextExtent(text, &w, &h); sprintf( buffer, @@ -1616,7 +1389,7 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord } CalcBoundingBox( x, y ); - CalcBoundingBox( x + size * text.Length() * 2/3 , y ); + CalcBoundingBox( x + size * text.length() * 2/3 , y ); } void wxPostScriptDC::SetBackground (const wxBrush& brush) @@ -1629,6 +1402,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function)) wxFAIL_MSG( wxT("wxPostScriptDC::SetLogicalFunction not implemented.") ); } +#if wxUSE_SPLINES void wxPostScriptDC::DoDrawSpline( wxList *points ) { wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); @@ -1703,6 +1477,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points ) wxT("stroke\n"), LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) ); } +#endif // wxUSE_SPLINES wxCoord wxPostScriptDC::GetCharWidth() const { @@ -1710,6 +1485,14 @@ wxCoord wxPostScriptDC::GetCharWidth() const return (wxCoord) (GetCharHeight() * 72.0 / 120.0); } +void wxPostScriptDC::SetPrintData(const wxPrintData& data) +{ + m_printData = data; + + int h = 0; + GetSize( NULL, &h ); + SetDeviceLocalOrigin( 0, h ); +} void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) { @@ -1718,21 +1501,32 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? 1 : -1); - // FIXME there is no such function in MSW nor in OS2/PM -#if !defined(__WXMSW__) && !defined(__WXPM__) ComputeScaleAndOrigin(); -#endif } -void wxPostScriptDC::SetDeviceOrigin( wxCoord x, wxCoord y ) +void wxPostScriptDC::SetMapMode(int mode) { - wxCHECK_RET( m_ok, wxT("invalid postscript dc") ); + wxDCBase::SetMapMode(mode); +} - int h = 0; - int w = 0; - GetSize( &w, &h ); +void wxPostScriptDC::SetUserScale(double x, double y) +{ + wxDCBase::SetUserScale(x,y); +} - wxDC::SetDeviceOrigin( x, h-y ); +void wxPostScriptDC::SetLogicalScale(double x, double y) +{ + wxDCBase::SetLogicalScale(x,y); +} + +void wxPostScriptDC::SetLogicalOrigin(wxCoord x, wxCoord y) +{ + wxDCBase::SetLogicalOrigin(x,y); +} + +void wxPostScriptDC::SetDeviceOrigin(wxCoord x, wxCoord y) +{ + wxDCBase::SetDeviceOrigin(x,y); } void wxPostScriptDC::DoGetSize(int* width, int* height) const @@ -1800,11 +1594,8 @@ wxSize wxPostScriptDC::GetPPI(void) const bool wxPostScriptDC::StartDoc( const wxString& message ) { wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") ); - - wxPostScriptPrintNativeData *data = - (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - if (data->GetPrintMode() != wxPRINT_MODE_STREAM ) + if (m_printData.GetPrintMode() != wxPRINT_MODE_STREAM ) { if (m_printData.GetFilename() == wxEmptyString) { @@ -1812,8 +1603,7 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) m_printData.SetFilename(filename); } - // FIXME: use fn_str() here under Unicode? - m_pstream = wxFopen( m_printData.GetFilename().c_str(), wxT("w+") ); + m_pstream = wxFopen( m_printData.GetFilename(), wxT("w+") ); if (!m_pstream) { @@ -1840,20 +1630,20 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) const wxChar *paper; switch (m_printData.GetPaperId()) { - case wxPAPER_LETTER: paper = wxT("Letter"); break; // Letter: paper ""; 8 1/2 by 11 inches - case wxPAPER_LEGAL: paper = wxT("Legal"); break; // Legal, 8 1/2 by 14 inches - case wxPAPER_A4: paper = wxT("A4"); break; // A4 Sheet, 210 by 297 millimeters + case wxPAPER_LETTER: paper = wxT("Letter"); break; // Letter: paper ""; 8 1/2 by 11 inches + case wxPAPER_LEGAL: paper = wxT("Legal"); break; // Legal, 8 1/2 by 14 inches + case wxPAPER_A4: paper = wxT("A4"); break; // A4 Sheet, 210 by 297 millimeters case wxPAPER_TABLOID: paper = wxT("Tabloid"); break; // Tabloid, 11 by 17 inches - case wxPAPER_LEDGER: paper = wxT("Ledger"); break; // Ledger, 17 by 11 inches - case wxPAPER_STATEMENT: paper = wxT("Statement"); break; // Statement, 5 1/2 by 8 1/2 inches - case wxPAPER_EXECUTIVE: paper = wxT("Executive"); break; // Executive, 7 1/4 by 10 1/2 inches - case wxPAPER_A3: paper = wxT("A3"); break; // A3 sheet, 297 by 420 millimeters - case wxPAPER_A5: paper = wxT("A5"); break; // A5 sheet, 148 by 210 millimeters - case wxPAPER_B4: paper = wxT("B4"); break; // B4 sheet, 250 by 354 millimeters - case wxPAPER_B5: paper = wxT("B5"); break; // B5 sheet, 182-by-257-millimeter paper - case wxPAPER_FOLIO: paper = wxT("Folio"); break; // Folio, 8-1/2-by-13-inch paper - case wxPAPER_QUARTO: paper = wxT("Quaro"); break; // Quarto, 215-by-275-millimeter paper - case wxPAPER_10X14: paper = wxT("10x14"); break; // 10-by-14-inch sheet + case wxPAPER_LEDGER: paper = wxT("Ledger"); break; // Ledger, 17 by 11 inches + case wxPAPER_STATEMENT: paper = wxT("Statement"); break; // Statement, 5 1/2 by 8 1/2 inches + case wxPAPER_EXECUTIVE: paper = wxT("Executive"); break; // Executive, 7 1/4 by 10 1/2 inches + case wxPAPER_A3: paper = wxT("A3"); break; // A3 sheet, 297 by 420 millimeters + case wxPAPER_A5: paper = wxT("A5"); break; // A5 sheet, 148 by 210 millimeters + case wxPAPER_B4: paper = wxT("B4"); break; // B4 sheet, 250 by 354 millimeters + case wxPAPER_B5: paper = wxT("B5"); break; // B5 sheet, 182-by-257-millimeter paper + case wxPAPER_FOLIO: paper = wxT("Folio"); break; // Folio, 8-1/2-by-13-inch paper + case wxPAPER_QUARTO: paper = wxT("Quaro"); break; // Quarto, 215-by-275-millimeter paper + case wxPAPER_10X14: paper = wxT("10x14"); break; // 10-by-14-inch sheet default: paper = wxT("A4"); } PsPrintf( wxT("%%%%DocumentPaperSizes: %s\n"), paper ); @@ -1864,11 +1654,8 @@ bool wxPostScriptDC::StartDoc( const wxString& message ) PsPrint( wxPostScriptHeaderEllipse ); PsPrint( wxPostScriptHeaderEllipticArc ); PsPrint( wxPostScriptHeaderColourImage ); -#if wxUSE_PANGO -#else PsPrint( wxPostScriptHeaderReencodeISO1 ); PsPrint( wxPostScriptHeaderReencodeISO2 ); -#endif if (wxPostScriptHeaderSpline) PsPrint( wxPostScriptHeaderSpline ); PsPrint( "%%EndProlog\n" ); @@ -1968,10 +1755,10 @@ void wxPostScriptDC::EndDoc () #endif #ifndef __WXMSW__ - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - if (m_ok && (data->GetPrintMode() == wxPRINT_MODE_PRINTER)) + if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER)) { wxString command; command += data->GetPrinterCommand(); @@ -2005,7 +1792,7 @@ void wxPostScriptDC::StartPage() wxCoord translate_x, translate_y; double scale_x, scale_y; - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); translate_x = (wxCoord)data->GetPrinterTranslateX(); @@ -2075,15 +1862,15 @@ wxCoord wxPostScriptDC::GetCharHeight() const void wxPostScriptDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent, wxCoord *externalLeading, - wxFont *theFont ) const + const wxFont *theFont ) const { - wxFont *fontToUse = theFont; + const wxFont *fontToUse = theFont; - if (!fontToUse) fontToUse = (wxFont*) &m_font; + if (!fontToUse) fontToUse = &m_font; wxCHECK_RET( fontToUse, wxT("GetTextExtent: no font defined") ); - if (string.IsEmpty()) + if (string.empty()) { if (x) (*x) = 0; if (y) (*y) = 0; @@ -2092,44 +1879,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, return; } -#if wxUSE_PANGO - int wx_dpi = GetResolution(); - int pango_dpi = 600; - PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi ); - - InitializePangoContext(context); - - double scale = pango_dpi / wx_dpi; - scale /= m_userScaleY; - - PangoLayout *layout = pango_layout_new (context); - - PangoFontDescription *desc = fontToUse->GetNativeFontInfo()->description; - pango_layout_set_font_description(layout, desc); -#if wxUSE_UNICODE - const wxCharBuffer data = wxConvUTF8.cWC2MB( string ); -#else - const wxWCharBuffer wdata = wxConvLocal.cMB2WC( string ); - const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata ); -#endif - pango_layout_set_text(layout, (const char*) data, strlen( (const char*) data )); - - PangoRectangle rect; - pango_layout_get_extents(layout, NULL, &rect); - - if (x) (*x) = (wxCoord) ( PANGO_PIXELS(rect.width) / scale ); - if (y) (*y) = (wxCoord) ( PANGO_PIXELS(rect.height) / scale ); - if (descent) - { - PangoLayoutIter *iter = pango_layout_get_iter(layout); - int baseline = pango_layout_iter_get_baseline(iter); - pango_layout_iter_free(iter); - *descent = wxCoord(*y - PANGO_PIXELS(baseline) / scale); - } - if (externalLeading) (*externalLeading) = 0; // ?? - - g_object_unref( G_OBJECT( layout ) ); -#else // GTK 2.0 const wxWX2MBbuf strbuf = string.mb_str(); @@ -2255,22 +2004,35 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, FILE *afmFile = NULL; - wxPostScriptPrintNativeData *data = - (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - // Get the directory of the AFM files wxString afmName; - if (!data->GetFontMetricPath().IsEmpty()) + + // VZ: I don't know if the cast always works under Unix but it clearly + // never does under Windows where the pointer is + // wxWindowsPrintNativeData and so calling GetFontMetricPath() on + // it just crashes +#ifndef __WIN32__ + wxPostScriptPrintNativeData *data = + wxDynamicCast(m_printData.GetNativeData(), wxPostScriptPrintNativeData); + + if (data && !data->GetFontMetricPath().empty()) { afmName = data->GetFontMetricPath(); afmName << wxFILE_SEP_PATH << name; - afmFile = wxFopen(afmName,wxT("r")); } +#endif // __WIN32__ -#if defined(__UNIX__) && !defined(__VMS__) - if (afmFile==NULL) + if ( !afmName.empty() ) + afmFile = wxFopen(afmName, wxT("r")); + + if ( !afmFile ) { +#if defined(__UNIX__) && !defined(__VMS__) afmName = wxGetDataDir(); +#else // !__UNIX__ + afmName = wxStandardPaths::Get().GetDataDir(); +#endif // __UNIX__/!__UNIX__ + afmName << wxFILE_SEP_PATH #if defined(__LINUX__) || defined(__FREEBSD__) << wxT("gs_afm") << wxFILE_SEP_PATH @@ -2280,7 +2042,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, << name; afmFile = wxFopen(afmName,wxT("r")); } -#endif /* 2. open and process the file / a short explanation of the AFM format: @@ -2307,8 +2068,10 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, /* init the widths array */ for(int i=0; i<256; i++) lastWidths[i] = INT_MIN; /* some variables for holding parts of a line */ - char cString[10],semiString[10],WXString[10],descString[20]; - char upString[30], utString[30], encString[50]; + char cString[10], semiString[10], WXString[10]; + char descString[20]; + char upString[30], utString[30]; + char encString[50]; char line[256]; int ascii,cWidth; /* read in the file and parse it */ @@ -2462,26 +2225,37 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string, if (externalLeading) *externalLeading = 0; #endif // Use AFM - -#endif - // GTK 2.0 } // print postscript datas via required method (file, stream) -void wxPostScriptDC::PsPrintf( const wxChar* fmt, ... ) +#if !wxUSE_UTF8_LOCALE_ONLY +void wxPostScriptDC::DoPsPrintfFormatWchar(const wxChar *fmt, ...) +{ + va_list argptr; + va_start(argptr, fmt); + + PsPrint( wxString::FormatV( fmt, argptr ) ); +} +#endif // !wxUSE_UTF8_LOCALE_ONLY + +#if wxUSE_UNICODE_UTF8 +void wxPostScriptDC::DoPsPrintfFormatUtf8(const char *fmt, ...) { va_list argptr; va_start(argptr, fmt); - PsPrint( wxString::FormatV( fmt, argptr ).c_str() ); + PsPrint( wxString::FormatV( fmt, argptr ) ); } +#endif // wxUSE_UNICODE_UTF8 -void wxPostScriptDC::PsPrint( const char* psdata ) +void wxPostScriptDC::PsPrint( const wxString& str ) { - wxPostScriptPrintNativeData *data = + const wxWX2MBbuf psdata(str.mb_str(wxConvUTF8)); + + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - switch(data->GetPrintMode()) + switch (m_printData.GetPrintMode()) { #if wxUSE_STREAMS // append to output stream @@ -2503,10 +2277,10 @@ void wxPostScriptDC::PsPrint( const char* psdata ) void wxPostScriptDC::PsPrint( int ch ) { - wxPostScriptPrintNativeData *data = + wxPostScriptPrintNativeData *data = (wxPostScriptPrintNativeData *) m_printData.GetNativeData(); - switch (data->GetPrintMode()) + switch (m_printData.GetPrintMode()) { #if wxUSE_STREAMS // append to output stream @@ -2514,7 +2288,7 @@ void wxPostScriptDC::PsPrint( int ch ) { wxOutputStream* outputstream = data->GetOutputStream(); wxCHECK_RET( outputstream, wxT("invalid outputstream") ); - outputstream->PutC( ch ); + outputstream->PutC( (char)ch ); } break; #endif // wxUSE_STREAMS @@ -2526,57 +2300,6 @@ void wxPostScriptDC::PsPrint( int ch ) } } -#if WXWIN_COMPATIBILITY_2_2 -WXDLLEXPORT wxPrintSetupData *wxThePrintSetupData = 0; - -void wxInitializePrintSetupData(bool init) -{ - if (init) - { - // gets initialized in the constructor - wxThePrintSetupData = new wxPrintSetupData; - } - else - { - delete wxThePrintSetupData; - - wxThePrintSetupData = (wxPrintSetupData *) NULL; - } -} - -// A module to allow initialization/cleanup of PostScript-related -// things without calling these functions from app.cpp. - -class WXDLLEXPORT wxPostScriptModule: public wxModule -{ -DECLARE_DYNAMIC_CLASS(wxPostScriptModule) -public: - wxPostScriptModule() {} - bool OnInit(); - void OnExit(); -}; - -IMPLEMENT_DYNAMIC_CLASS(wxPostScriptModule, wxModule) - -bool wxPostScriptModule::OnInit() -{ - wxInitializePrintSetupData(); - - return true; -} - -void wxPostScriptModule::OnExit() -{ - wxInitializePrintSetupData(false); -} -#endif - // WXWIN_COMPATIBILITY_2_2 - -#endif - // wxUSE_POSTSCRIPT - -#endif - // wxUSE_PRINTING_ARCHITECTURE - +#endif // wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT // vi:sts=4:sw=4:et