/////////////////////////////////////////////////////////////////////////////
-// Name: dcpsg.cpp
+// Name: src/generic/dcpsg.cpp
// Purpose: Generic wxPostScriptDC implementation
// Author: Julian Smart, Robert Roebling, Markus Holzhem
// Modified by:
// 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 <math.h>
+WXDLLIMPEXP_DATA_CORE(int) wxPageNumber;
#ifdef __WXMSW__
} ifelse % end of 'false' case\n\
";
-#if wxUSE_PANGO
-#else
static char wxPostScriptHeaderReencodeISO1[] =
"\n/reencodeISO {\n"
"dup dup findfont dup length dict begin\n"
"/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n"
"/yacute/thorn/ydieresis\n"
"] def\n\n";
-#endif
//-------------------------------------------------------------------------------
// 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)
m_printData = printData;
+ int h = 0;
+ GetSize( NULL, &h );
+ SetDeviceLocalOrigin( 0, h );
+
m_ok = true;
}
}
}
-#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;
}
alpha1 = 0.0;
alpha2 = 360.0;
}
- else if (radius == 0.0)
+ else if ( wxIsNullDouble(radius) )
{
- alpha1 = alpha2 = 0.0;
+ alpha1 =
+ alpha2 = 0.0;
}
else
{
{
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;
/* 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")
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),
/* 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")
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),
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++)
m_font = font;
-#if wxUSE_PANGO
-#else
int Style = m_font.GetStyle();
int Weight = m_font.GetWeight();
for (int i = 0; i < 100; i++)
if (buffer[i] == ',') buffer[i] = '.';
PsPrint( buffer );
-#endif // !wxUSE_PANGO
}
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" );
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 );
}
}
-#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 <ft2build.h>
-#include FT_FREETYPE_H
-
-#include "wx/fontutil.h"
-#include <pango/pangoft2.h>
-#include <freetype/ftglyph.h>
-
-#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") );
}
}
-#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);
}
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;
{
wxCoord uy = (wxCoord)(y + size - m_underlinePosition);
wxCoord w, h;
- char buffer[100];
GetTextExtent(text, &w, &h);
sprintf( buffer,
}
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)
wxFAIL_MSG( wxT("wxPostScriptDC::SetLogicalFunction not implemented.") );
}
+#if wxUSE_SPLINES
void wxPostScriptDC::DoDrawSpline( wxList *points )
{
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
wxT("stroke\n"),
LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) );
}
+#endif // wxUSE_SPLINES
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 )
{
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);
+}
+
+void wxPostScriptDC::SetLogicalScale(double x, double y)
+{
+ wxDCBase::SetLogicalScale(x,y);
+}
+
+void wxPostScriptDC::SetLogicalOrigin(wxCoord x, wxCoord y)
+{
+ wxDCBase::SetLogicalOrigin(x,y);
+}
- wxDC::SetDeviceOrigin( x, h-y );
+void wxPostScriptDC::SetDeviceOrigin(wxCoord x, wxCoord y)
+{
+ wxDCBase::SetDeviceOrigin(x,y);
}
void wxPostScriptDC::DoGetSize(int* width, int* height) const
bool wxPostScriptDC::StartDoc( const wxString& message )
{
wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") );
-
+
if (m_printData.GetPrintMode() != wxPRINT_MODE_STREAM )
{
if (m_printData.GetFilename() == wxEmptyString)
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)
{
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 );
PsPrint( wxPostScriptHeaderEllipse );
PsPrint( wxPostScriptHeaderEllipticArc );
PsPrint( wxPostScriptHeaderColourImage );
-#if wxUSE_PANGO
-#else
PsPrint( wxPostScriptHeaderReencodeISO1 );
PsPrint( wxPostScriptHeaderReencodeISO2 );
-#endif
if (wxPostScriptHeaderSpline)
PsPrint( wxPostScriptHeaderSpline );
PsPrint( "%%EndProlog\n" );
#endif
#ifndef __WXMSW__
- wxPostScriptPrintNativeData *data =
+ wxPostScriptPrintNativeData *data =
(wxPostScriptPrintNativeData *) m_printData.GetNativeData();
if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER))
wxCoord translate_x, translate_y;
double scale_x, scale_y;
- wxPostScriptPrintNativeData *data =
+ wxPostScriptPrintNativeData *data =
(wxPostScriptPrintNativeData *) m_printData.GetNativeData();
translate_x = (wxCoord)data->GetPrinterTranslateX();
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;
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();
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
<< name;
afmFile = wxFopen(afmName,wxT("r"));
}
-#endif
/* 2. open and process the file
/ a short explanation of the AFM format:
/* 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 */
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 (m_printData.GetPrintMode())
{
#if wxUSE_STREAMS
void wxPostScriptDC::PsPrint( int ch )
{
- wxPostScriptPrintNativeData *data =
+ wxPostScriptPrintNativeData *data =
(wxPostScriptPrintNativeData *) m_printData.GetNativeData();
-
+
switch (m_printData.GetPrintMode())
{
#if wxUSE_STREAMS
{
wxOutputStream* outputstream = data->GetOutputStream();
wxCHECK_RET( outputstream, wxT("invalid outputstream") );
- outputstream->PutC( ch );
+ outputstream->PutC( (char)ch );
}
break;
#endif // wxUSE_STREAMS
}
}
-#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