Removed Pango homemade implementation and
reinstated old code that uses /Times and /Helv etc for printing PostScript. Various smaller fixes related to printing. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30126 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -46,12 +46,6 @@ public:
|
|||||||
// Recommended destructor :-)
|
// Recommended destructor :-)
|
||||||
~wxPostScriptDC();
|
~wxPostScriptDC();
|
||||||
|
|
||||||
#if WXWIN_COMPATIBILITY_2_2
|
|
||||||
wxPostScriptDC( const wxString &output, bool interactive = false, wxWindow *parent = NULL )
|
|
||||||
{ Create( output, interactive, parent ); }
|
|
||||||
bool Create ( const wxString &output, bool interactive = false, wxWindow *parent = NULL );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual bool Ok() const;
|
virtual bool Ok() const;
|
||||||
|
|
||||||
virtual void BeginDrawing() {}
|
virtual void BeginDrawing() {}
|
||||||
@@ -142,11 +136,6 @@ private:
|
|||||||
static float ms_PSScaleFactor;
|
static float ms_PSScaleFactor;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
#if wxUSE_PANGO
|
|
||||||
PangoContext *m_context;
|
|
||||||
PangoLayout *m_layout;
|
|
||||||
PangoFontDescription *m_fontdesc;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FILE* m_pstream; // PostScript output stream
|
FILE* m_pstream; // PostScript output stream
|
||||||
wxString m_title;
|
wxString m_title;
|
||||||
@@ -163,50 +152,6 @@ private:
|
|||||||
DECLARE_DYNAMIC_CLASS(wxPostScriptDC)
|
DECLARE_DYNAMIC_CLASS(wxPostScriptDC)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#if WXWIN_COMPATIBILITY_2_2
|
|
||||||
// Print Orientation
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PS_PORTRAIT = wxPORTRAIT,
|
|
||||||
PS_LANDSCAPE = wxLANDSCAPE
|
|
||||||
};
|
|
||||||
|
|
||||||
// Print Actions
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
PS_NONE = wxPRINT_MODE_NONE,
|
|
||||||
PS_PREVIEW = wxPRINT_MODE_PREVIEW,
|
|
||||||
PS_FILE = wxPRINT_MODE_FILE,
|
|
||||||
PS_PRINTER = wxPRINT_MODE_PRINTER
|
|
||||||
};
|
|
||||||
|
|
||||||
class wxPrintSetupData: public wxPrintData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
wxPrintSetupData() {}
|
|
||||||
|
|
||||||
void SetPrinterOrientation( int orient )
|
|
||||||
{ SetOrientation( orient ); }
|
|
||||||
void SetPrinterMode( wxPrintMode mode )
|
|
||||||
{ SetPrintMode( mode ); }
|
|
||||||
void SetAFMPath( const wxString &path )
|
|
||||||
{ SetFontMetricPath( path ); }
|
|
||||||
|
|
||||||
void SetPaperName(const wxString& paper) { m_paperName = paper; }
|
|
||||||
void SetPrinterFile(const wxString& file) { m_printerFile = file; }
|
|
||||||
wxString GetPaperName() const { return m_paperName; }
|
|
||||||
wxString GetPrinterFile() const { return m_printerFile; };
|
|
||||||
|
|
||||||
wxString m_paperName;
|
|
||||||
wxString m_printerFile;
|
|
||||||
};
|
|
||||||
|
|
||||||
WXDLLEXPORT_DATA(extern wxPrintSetupData*) wxThePrintSetupData;
|
|
||||||
WXDLLEXPORT extern void wxInitializePrintSetupData(bool init = true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// wxUSE_POSTSCRIPT
|
// wxUSE_POSTSCRIPT
|
||||||
|
|
||||||
|
@@ -230,6 +230,7 @@ void wxPrintData::operator=(const wxPrintData& data)
|
|||||||
m_paperSize = data.m_paperSize;
|
m_paperSize = data.m_paperSize;
|
||||||
m_bin = data.m_bin;
|
m_bin = data.m_bin;
|
||||||
m_printMode = data.m_printMode;
|
m_printMode = data.m_printMode;
|
||||||
|
m_filename = data.m_filename;
|
||||||
|
|
||||||
m_nativeData = data.GetNativeData();
|
m_nativeData = data.GetNativeData();
|
||||||
m_nativeData->m_ref++;
|
m_nativeData->m_ref++;
|
||||||
|
@@ -39,10 +39,6 @@
|
|||||||
#include "wx/generic/prntdlgg.h"
|
#include "wx/generic/prntdlgg.h"
|
||||||
#include "wx/paper.h"
|
#include "wx/paper.h"
|
||||||
#include "wx/filefn.h"
|
#include "wx/filefn.h"
|
||||||
#if WXWIN_COMPATIBILITY_2_2
|
|
||||||
#include "wx/window.h"
|
|
||||||
#include "wx/printdlg.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
@@ -201,8 +197,6 @@ static const char *wxPostScriptHeaderColourImage = "\
|
|||||||
} ifelse % end of 'false' case\n\
|
} ifelse % end of 'false' case\n\
|
||||||
";
|
";
|
||||||
|
|
||||||
#if wxUSE_PANGO
|
|
||||||
#else
|
|
||||||
static char wxPostScriptHeaderReencodeISO1[] =
|
static char wxPostScriptHeaderReencodeISO1[] =
|
||||||
"\n/reencodeISO {\n"
|
"\n/reencodeISO {\n"
|
||||||
"dup dup findfont dup length dict begin\n"
|
"dup dup findfont dup length dict begin\n"
|
||||||
@@ -243,7 +237,6 @@ static char wxPostScriptHeaderReencodeISO2[] =
|
|||||||
"/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n"
|
"/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n"
|
||||||
"/yacute/thorn/ydieresis\n"
|
"/yacute/thorn/ydieresis\n"
|
||||||
"] def\n\n";
|
"] def\n\n";
|
||||||
#endif
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------
|
||||||
// wxPostScriptDC
|
// wxPostScriptDC
|
||||||
@@ -316,31 +309,6 @@ 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::Ok() const
|
||||||
{
|
{
|
||||||
return m_ok;
|
return m_ok;
|
||||||
@@ -941,8 +909,6 @@ void wxPostScriptDC::SetFont( const wxFont& font )
|
|||||||
|
|
||||||
m_font = font;
|
m_font = font;
|
||||||
|
|
||||||
#if wxUSE_PANGO
|
|
||||||
#else
|
|
||||||
int Style = m_font.GetStyle();
|
int Style = m_font.GetStyle();
|
||||||
int Weight = m_font.GetWeight();
|
int Weight = m_font.GetWeight();
|
||||||
|
|
||||||
@@ -1029,7 +995,6 @@ void wxPostScriptDC::SetFont( const wxFont& font )
|
|||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 100; i++)
|
||||||
if (buffer[i] == ',') buffer[i] = '.';
|
if (buffer[i] == ',') buffer[i] = '.';
|
||||||
PsPrint( buffer );
|
PsPrint( buffer );
|
||||||
#endif // !wxUSE_PANGO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPostScriptDC::SetPen( const wxPen& pen )
|
void wxPostScriptDC::SetPen( const wxPen& pen )
|
||||||
@@ -1172,139 +1137,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 <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 )
|
void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
|
||||||
{
|
{
|
||||||
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
|
wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
|
||||||
@@ -1349,81 +1181,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;
|
wxCoord text_w, text_h, text_descent;
|
||||||
|
|
||||||
GetTextExtent(text, &text_w, &text_h, &text_descent);
|
GetTextExtent(text, &text_w, &text_h, &text_descent);
|
||||||
@@ -1490,7 +1247,6 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
|
|||||||
|
|
||||||
CalcBoundingBox( x, y );
|
CalcBoundingBox( x, y );
|
||||||
CalcBoundingBox( x + size * text.Length() * 2/3 , y );
|
CalcBoundingBox( x + size * text.Length() * 2/3 , y );
|
||||||
#endif // wxUSE_PANGO/!wxUSE_PANGO
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle )
|
void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle )
|
||||||
@@ -1861,11 +1617,8 @@ bool wxPostScriptDC::StartDoc( const wxString& message )
|
|||||||
PsPrint( wxPostScriptHeaderEllipse );
|
PsPrint( wxPostScriptHeaderEllipse );
|
||||||
PsPrint( wxPostScriptHeaderEllipticArc );
|
PsPrint( wxPostScriptHeaderEllipticArc );
|
||||||
PsPrint( wxPostScriptHeaderColourImage );
|
PsPrint( wxPostScriptHeaderColourImage );
|
||||||
#if wxUSE_PANGO
|
|
||||||
#else
|
|
||||||
PsPrint( wxPostScriptHeaderReencodeISO1 );
|
PsPrint( wxPostScriptHeaderReencodeISO1 );
|
||||||
PsPrint( wxPostScriptHeaderReencodeISO2 );
|
PsPrint( wxPostScriptHeaderReencodeISO2 );
|
||||||
#endif
|
|
||||||
if (wxPostScriptHeaderSpline)
|
if (wxPostScriptHeaderSpline)
|
||||||
PsPrint( wxPostScriptHeaderSpline );
|
PsPrint( wxPostScriptHeaderSpline );
|
||||||
PsPrint( "%%EndProlog\n" );
|
PsPrint( "%%EndProlog\n" );
|
||||||
@@ -2089,44 +1842,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
|
|||||||
return;
|
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
|
// GTK 2.0
|
||||||
|
|
||||||
const wxWX2MBbuf strbuf = string.mb_str();
|
const wxWX2MBbuf strbuf = string.mb_str();
|
||||||
@@ -2459,9 +2174,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
|
|||||||
if (externalLeading) *externalLeading = 0;
|
if (externalLeading) *externalLeading = 0;
|
||||||
#endif
|
#endif
|
||||||
// Use AFM
|
// Use AFM
|
||||||
|
|
||||||
#endif
|
|
||||||
// GTK 2.0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// print postscript datas via required method (file, stream)
|
// print postscript datas via required method (file, stream)
|
||||||
@@ -2523,52 +2235,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
|
#endif
|
||||||
// wxUSE_POSTSCRIPT
|
// wxUSE_POSTSCRIPT
|
||||||
|
|
||||||
|
@@ -88,47 +88,6 @@ bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool pro
|
|||||||
|
|
||||||
printout->SetIsPreview(false);
|
printout->SetIsPreview(false);
|
||||||
|
|
||||||
#if 0
|
|
||||||
// 4/9/99, JACS: this is a silly place to allow preparation, considering
|
|
||||||
// the DC and no parameters have been set in the printout object.
|
|
||||||
// Moved further down.
|
|
||||||
|
|
||||||
// printout->OnPreparePrinting();
|
|
||||||
|
|
||||||
// Get some parameters from the printout, if defined
|
|
||||||
int fromPage, toPage;
|
|
||||||
int minPage, maxPage;
|
|
||||||
printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage);
|
|
||||||
|
|
||||||
if (maxPage == 0)
|
|
||||||
{
|
|
||||||
sm_lastError = wxPRINTER_ERROR;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_printDialogData.SetMinPage(minPage);
|
|
||||||
m_printDialogData.SetMaxPage(maxPage);
|
|
||||||
if (fromPage != 0)
|
|
||||||
m_printDialogData.SetFromPage(fromPage);
|
|
||||||
if (toPage != 0)
|
|
||||||
m_printDialogData.SetToPage(toPage);
|
|
||||||
|
|
||||||
if (minPage != 0)
|
|
||||||
{
|
|
||||||
m_printDialogData.EnablePageNumbers(true);
|
|
||||||
if (m_printDialogData.GetFromPage() < m_printDialogData.GetMinPage())
|
|
||||||
m_printDialogData.SetFromPage(m_printDialogData.GetMinPage());
|
|
||||||
else if (m_printDialogData.GetFromPage() > m_printDialogData.GetMaxPage())
|
|
||||||
m_printDialogData.SetFromPage(m_printDialogData.GetMaxPage());
|
|
||||||
if (m_printDialogData.GetToPage() > m_printDialogData.GetMaxPage())
|
|
||||||
m_printDialogData.SetToPage(m_printDialogData.GetMaxPage());
|
|
||||||
else if (m_printDialogData.GetToPage() < m_printDialogData.GetMinPage())
|
|
||||||
m_printDialogData.SetToPage(m_printDialogData.GetMinPage());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_printDialogData.EnablePageNumbers(false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (m_printDialogData.GetMinPage() < 1)
|
if (m_printDialogData.GetMinPage() < 1)
|
||||||
m_printDialogData.SetMinPage(1);
|
m_printDialogData.SetMinPage(1);
|
||||||
if (m_printDialogData.GetMaxPage() < 1)
|
if (m_printDialogData.GetMaxPage() < 1)
|
||||||
@@ -193,7 +152,12 @@ bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool pro
|
|||||||
// set by the user
|
// set by the user
|
||||||
m_printDialogData.SetMinPage(minPage);
|
m_printDialogData.SetMinPage(minPage);
|
||||||
m_printDialogData.SetMaxPage(maxPage);
|
m_printDialogData.SetMaxPage(maxPage);
|
||||||
|
|
||||||
|
if (m_printDialogData.GetFromPage() < minPage)
|
||||||
|
m_printDialogData.SetFromPage( minPage );
|
||||||
|
if (m_printDialogData.GetToPage() > maxPage)
|
||||||
|
m_printDialogData.SetToPage( maxPage );
|
||||||
|
|
||||||
int
|
int
|
||||||
pagesPerCopy = m_printDialogData.GetToPage()-m_printDialogData.GetFromPage()+1,
|
pagesPerCopy = m_printDialogData.GetToPage()-m_printDialogData.GetFromPage()+1,
|
||||||
totalPages = pagesPerCopy * m_printDialogData.GetNoCopies(),
|
totalPages = pagesPerCopy * m_printDialogData.GetNoCopies(),
|
||||||
@@ -273,12 +237,13 @@ bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool pro
|
|||||||
wxDC* wxPostScriptPrinter::PrintDialog(wxWindow *parent)
|
wxDC* wxPostScriptPrinter::PrintDialog(wxWindow *parent)
|
||||||
{
|
{
|
||||||
wxDC* dc = (wxDC*) NULL;
|
wxDC* dc = (wxDC*) NULL;
|
||||||
wxGenericPrintDialog* dialog = new wxGenericPrintDialog(parent, & m_printDialogData);
|
|
||||||
int ret = dialog->ShowModal() ;
|
wxGenericPrintDialog dialog( parent, &m_printDialogData );
|
||||||
if (ret == wxID_OK)
|
if (dialog.ShowModal() == wxID_OK)
|
||||||
{
|
{
|
||||||
dc = dialog->GetPrintDC();
|
dc = dialog.GetPrintDC();
|
||||||
m_printDialogData = dialog->GetPrintDialogData();
|
m_printDialogData = dialog.GetPrintDialogData();
|
||||||
|
|
||||||
if (dc == NULL)
|
if (dc == NULL)
|
||||||
sm_lastError = wxPRINTER_ERROR;
|
sm_lastError = wxPRINTER_ERROR;
|
||||||
else
|
else
|
||||||
@@ -287,8 +252,6 @@ wxDC* wxPostScriptPrinter::PrintDialog(wxWindow *parent)
|
|||||||
else
|
else
|
||||||
sm_lastError = wxPRINTER_CANCELLED;
|
sm_lastError = wxPRINTER_CANCELLED;
|
||||||
|
|
||||||
dialog->Destroy();
|
|
||||||
|
|
||||||
return dc;
|
return dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -301,7 +301,7 @@ void wxGenericPrintDialog::OnOK(wxCommandEvent& WXUNUSED(event))
|
|||||||
{
|
{
|
||||||
m_printDialogData.GetPrintData().SetPrintMode(wxPRINT_MODE_PRINTER);
|
m_printDialogData.GetPrintData().SetPrintMode(wxPRINT_MODE_PRINTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
EndModal(wxID_OK);
|
EndModal(wxID_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,10 +397,16 @@ bool wxGenericPrintDialog::TransferDataFromWindow()
|
|||||||
}
|
}
|
||||||
if(m_rangeRadioBox)
|
if(m_rangeRadioBox)
|
||||||
{
|
{
|
||||||
if (m_rangeRadioBox->GetSelection() == 0)
|
if (m_rangeRadioBox->GetSelection() == 0)
|
||||||
m_printDialogData.SetAllPages(true);
|
{
|
||||||
else
|
m_printDialogData.SetAllPages(true);
|
||||||
m_printDialogData.SetAllPages(false);
|
|
||||||
|
// This means all pages, more or less
|
||||||
|
m_printDialogData.SetFromPage(1);
|
||||||
|
m_printDialogData.SetToPage(32000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_printDialogData.SetAllPages(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -418,11 +424,6 @@ bool wxGenericPrintDialog::TransferDataFromWindow()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
TODO: collate and noCopies should be duplicated across dialog data and print data objects
|
|
||||||
(slightly different semantics on Windows but let's ignore this for a bit).
|
|
||||||
*/
|
|
||||||
|
|
||||||
wxDC *wxGenericPrintDialog::GetPrintDC()
|
wxDC *wxGenericPrintDialog::GetPrintDC()
|
||||||
{
|
{
|
||||||
return new wxPostScriptDC(GetPrintDialogData().GetPrintData());
|
return new wxPostScriptDC(GetPrintDialogData().GetPrintData());
|
||||||
|
Reference in New Issue
Block a user