First update patch for GTK+ print

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48649 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2007-09-13 12:23:39 +00:00
parent 05787cec0d
commit da249bc359
3 changed files with 50 additions and 109 deletions

View File

@ -874,49 +874,6 @@ public:
bool useMask = false)
{ m_pimpl->DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
virtual void DrawScaledBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, wxCoord w, wxCoord h, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
{
if (bmp.GetWidth() != w || bmp.GetHeight() != h)
{
if (quality != wxIMAGE_QUALITY_HIGH)
quality = wxIMAGE_QUALITY_NORMAL;
wxImage tmpImg = bmp.ConvertToImage();
tmpImg.Rescale( w, h, quality );
wxBitmap scaledBmp(tmpImg);
m_pimpl->DoDrawBitmap(scaledBmp, x, y, useMask);
}
else
m_pimpl->DoDrawBitmap(bmp, x, y, useMask);
}
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxPoint& pt, const wxSize& sz, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
{
if (bmp.GetWidth() != sz.x || bmp.GetHeight() != sz.y)
{
if (quality != wxIMAGE_QUALITY_HIGH)
quality = wxIMAGE_QUALITY_NORMAL;
wxImage tmpImg = bmp.ConvertToImage();
tmpImg.Rescale( sz.x, sz.y, quality );
wxBitmap scaledBmp(tmpImg);
m_pimpl->DoDrawBitmap(scaledBmp, pt.x, pt.y, useMask);
}
else
m_pimpl->DoDrawBitmap(bmp, pt.x, pt.y, useMask);
}
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxRect& rect, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
{
if (bmp.GetWidth() != rect.width || bmp.GetHeight() != rect.height)
{
if (quality != wxIMAGE_QUALITY_HIGH)
quality = wxIMAGE_QUALITY_NORMAL;
wxImage tmpImg = bmp.ConvertToImage();
tmpImg.Rescale( rect.width, rect.height, quality );
wxBitmap scaledBmp(tmpImg);
m_pimpl->DoDrawBitmap(scaledBmp, rect.x, rect.y, useMask);
}
else
m_pimpl->DoDrawBitmap(bmp, rect.x, rect.y, useMask);
}
void DrawText(const wxString& text, wxCoord x, wxCoord y)
{ m_pimpl->DoDrawText(text, x, y); }
void DrawText(const wxString& text, const wxPoint& pt)
@ -1233,49 +1190,6 @@ public:
bool useMask = false)
{ DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
virtual void DrawScaledBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, wxCoord w, wxCoord h, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
{
if (bmp.GetWidth() != w || bmp.GetHeight() != h)
{
if (quality != wxIMAGE_QUALITY_HIGH)
quality = wxIMAGE_QUALITY_NORMAL;
wxImage tmpImg = bmp.ConvertToImage();
tmpImg.Rescale( w, h, quality );
wxBitmap scaledBmp(tmpImg);
DoDrawBitmap(scaledBmp, x, y, useMask);
}
else
DoDrawBitmap(bmp, x, y, useMask);
}
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxPoint& pt, const wxSize& sz, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
{
if (bmp.GetWidth() != sz.x || bmp.GetHeight() != sz.y)
{
if (quality != wxIMAGE_QUALITY_HIGH)
quality = wxIMAGE_QUALITY_NORMAL;
wxImage tmpImg = bmp.ConvertToImage();
tmpImg.Rescale( sz.x, sz.y, quality );
wxBitmap scaledBmp(tmpImg);
DoDrawBitmap(scaledBmp, pt.x, pt.y, useMask);
}
else
DoDrawBitmap(bmp, pt.x, pt.y, useMask);
}
virtual void DrawScaledBitmap(const wxBitmap &bmp, const wxRect& rect, bool useMask = false, int quality = wxIMAGE_QUALITY_NORMAL)
{
if (bmp.GetWidth() != rect.width || bmp.GetHeight() != rect.height)
{
if (quality != wxIMAGE_QUALITY_HIGH)
quality = wxIMAGE_QUALITY_NORMAL;
wxImage tmpImg = bmp.ConvertToImage();
tmpImg.Rescale( rect.width, rect.height, quality );
wxBitmap scaledBmp(tmpImg);
DoDrawBitmap(scaledBmp, rect.x, rect.y, useMask);
}
else
DoDrawBitmap(bmp, rect.x, rect.y, useMask);
}
void DrawText(const wxString& text, wxCoord x, wxCoord y)
{ DoDrawText(text, x, y); }
void DrawText(const wxString& text, const wxPoint& pt)

View File

@ -50,12 +50,6 @@
#include "mondrian.xpm"
#endif
#if wxUSE_LIBGNOMEPRINT
#include "wx/html/forcelnk.h"
FORCE_LINK(gnome_print)
#endif
// Declare a frame
MyFrame *frame = (MyFrame *) NULL;
// int orientation = wxPORTRAIT;
@ -337,10 +331,10 @@ void MyFrame::Draw(wxDC& dc)
// between the screen image, the print preview image (at various zoom
// levels), and the printed page.
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
// dc.Clear();
dc.SetFont(wxGetApp().m_testFont);
dc.SetBackgroundMode(wxTRANSPARENT);
// dc.SetBackgroundMode(wxTRANSPARENT);
dc.SetPen(*wxBLACK_PEN);
dc.SetBrush(*wxLIGHT_GREY_BRUSH);
@ -353,7 +347,7 @@ void MyFrame::Draw(wxDC& dc)
dc.SetPen(*wxRED_PEN);
dc.DrawRoundedRectangle(0, 20, 200, 80, 20);
dc.DrawText( wxT("Rectangle 200 by 80"), 40, 40);
dc.SetPen( wxPen(*wxBLACK,0,wxDOT_DASH) );

View File

@ -79,7 +79,6 @@ bool wxGtkPrintModule::OnInit()
gs_cairo = wxCairoLibrary::Get();
if (gs_cairo && gtk_check_version(2,10,0) == NULL)
wxPrintFactory::SetPrintFactory( new wxGtkPrintFactory );
return true;
}
@ -670,21 +669,29 @@ int wxGtkPrintDialog::ShowModal()
case GTK_PRINT_PAGES_CURRENT:
m_printDialogData.SetSelection( true );
break;
case GTK_PRINT_PAGES_ALL:
m_printDialogData.SetAllPages( true );
m_printDialogData.SetFromPage( 0 );
m_printDialogData.SetToPage( 9999 );
break;
case GTK_PRINT_PAGES_RANGES:
default:
// wxWidgets doesn't support multiple ranges, so we can only save the first one even if the user wants to print others.
{// wxWidgets doesn't support multiple ranges, so we can only save the first one even if the user wants to print others.
// For example, the user enters "1-3;5-7" in the dialog: pages 1-3 and 5-7 will be correctly printed when the user
// will hit "OK" button. However we can only save 1-3 in the print data.
gint num_ranges = 0;
GtkPageRange* range;
range = gtk_print_settings_get_page_ranges (newSettings, &num_ranges);
if (num_ranges >= 1)
{
m_printDialogData.SetFromPage( range[0].start );
m_printDialogData.SetToPage( range[0].end );
}
else {
m_printDialogData.SetAllPages( true );
m_printDialogData.SetFromPage( 0 );
m_printDialogData.SetToPage( 9999 );
}
break;}
case GTK_PRINT_PAGES_ALL:
default:
m_printDialogData.SetAllPages( true );
m_printDialogData.SetFromPage( 0 );
m_printDialogData.SetToPage( 9999 );
break;
}
@ -972,8 +979,15 @@ void wxGtkPrinter::DrawPage(wxPrintout *printout, GtkPrintOperation *operation,
GtkPageRange* range;
range = gtk_print_settings_get_page_ranges (settings, &num_ranges);
// We don't need to verify these values as it has already been done in wxGtkPrinter::BeginPrint.
if (num_ranges >= 1)
{
startPage = range[0].start + 1;
endPage = range[0].end + 1;
}
else {
startPage = minPage;
endPage = maxPage;
}
break;}
case GTK_PRINT_PAGES_ALL:
default:
@ -1081,6 +1095,14 @@ wxGtkPrintDC::wxGtkPrintDC( const wxPrintData& data )
m_signX = 1; // default x-axis left to right.
m_signY = 1; // default y-axis bottom up -> top down.
// By default the origine of cairo contexte is in the upper left corner of the printable area.
// We need to translate it so that it is in the upper left corner of the paper (i.e. doesn't care about margins)
GtkPageSetup *setup = gtk_print_context_get_page_setup( m_gpc );
gdouble ml, mt;
ml = gtk_page_setup_get_left_margin (setup, GTK_UNIT_POINTS);
mt = gtk_page_setup_get_top_margin (setup, GTK_UNIT_POINTS);
gs_cairo->cairo_translate(m_cairo, -ml, -mt);
}
wxGtkPrintDC::~wxGtkPrintDC()
@ -1269,6 +1291,8 @@ void wxGtkPrintDC::DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord
alpha1 *= DEG2RAD;
alpha2 *= DEG2RAD;
gs_cairo->cairo_new_path(m_cairo);
gs_cairo->cairo_arc_negative ( m_cairo, XLOG2DEVREL(xc), YLOG2DEVREL(yc), XLOG2DEVREL((int)radius), alpha1, alpha2);
gs_cairo->cairo_line_to(m_cairo, XLOG2DEVREL(xc), YLOG2DEVREL(yc));
gs_cairo->cairo_close_path (m_cairo);
@ -1288,6 +1312,8 @@ void wxGtkPrintDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,dou
{
gs_cairo->cairo_save( m_cairo );
gs_cairo->cairo_new_path(m_cairo);
gs_cairo->cairo_translate( m_cairo, XLOG2DEVREL((wxCoord) (x + w / 2.)), XLOG2DEVREL((wxCoord) (y + h / 2.)) );
double scale = (double)YLOG2DEVREL(h) / (double) XLOG2DEVREL(w);
gs_cairo->cairo_scale( m_cairo, 1.0, scale );
@ -1382,6 +1408,7 @@ void wxGtkPrintDC::DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoo
void wxGtkPrintDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
gs_cairo->cairo_new_path(m_cairo);
gs_cairo->cairo_rectangle ( m_cairo, XLOG2DEVREL(x), YLOG2DEVREL(y), XLOG2DEVREL(width), YLOG2DEVREL(height));
SetBrush( m_brush );
@ -1443,6 +1470,8 @@ void wxGtkPrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord he
{
gs_cairo->cairo_save (m_cairo);
gs_cairo->cairo_new_path(m_cairo);
gs_cairo->cairo_translate (m_cairo, XLOG2DEVREL((wxCoord) (x + width / 2.)), YLOG2DEVREL((wxCoord) (y + height / 2.)));
gs_cairo->cairo_scale(m_cairo, 1, (double)YLOG2DEVREL(height)/(double)XLOG2DEVREL(width));
gs_cairo->cairo_arc ( m_cairo, 0, 0, XLOG2DEVREL(width/2), 0, 2 * M_PI);
@ -1580,10 +1609,14 @@ void wxGtkPrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, b
// blue. The 32-bit quantities are stored native-endian.
// Pre-multiplied alpha is used.
unsigned char alpha = p.Alpha();
if (!bmpSource.HasAlpha() && mask)
alpha = 255;
if (alpha == 0)
*data = 0;
else
*data = ( alpha/255 << 24
*data = ( alpha << 24
| (p.Red() * alpha/255) << 16
| (p.Green() * alpha/255) << 8
| (p.Blue() * alpha/255) );
@ -1809,14 +1842,14 @@ void wxGtkPrintDC::SetPen( const wxPen& pen )
switch (m_pen.GetStyle())
{
case wxDOT: gs_cairo->cairo_set_dash( m_cairo, dotted, 1, 0 ); break;
case wxSHORT_DASH: gs_cairo->cairo_set_dash( m_cairo, short_dashed, 1, 0 ); break;
case wxLONG_DASH: gs_cairo->cairo_set_dash( m_cairo, long_dashed, 1, 0 ); break;
case wxDOT_DASH: gs_cairo->cairo_set_dash( m_cairo, dotted_dashed, 3, 0 ); break;
case wxDOT: gs_cairo->cairo_set_dash( m_cairo, dotted, 2, 0 ); break;
case wxSHORT_DASH: gs_cairo->cairo_set_dash( m_cairo, short_dashed, 2, 0 ); break;
case wxLONG_DASH: gs_cairo->cairo_set_dash( m_cairo, long_dashed, 2, 0 ); break;
case wxDOT_DASH: gs_cairo->cairo_set_dash( m_cairo, dotted_dashed, 4, 0 ); break;
case wxUSER_DASH:
{
wxDash *wx_dashes;
int num = m_pen.GetDashes (&wx_dashes) - 1;
int num = m_pen.GetDashes (&wx_dashes);
gdouble *g_dashes = g_new( gdouble, num );
int i;
for (i = 0; i < num; ++i)