X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c7e99122a0f181d199be3ec6c3928109c2bdf76b..3e5f88c6d2cdb2d4b0de4f44146a9839dc55f129:/src/gtk/print.cpp diff --git a/src/gtk/print.cpp b/src/gtk/print.cpp index 2fd307b42c..6076ef552f 100644 --- a/src/gtk/print.cpp +++ b/src/gtk/print.cpp @@ -33,6 +33,8 @@ #include "wx/fontutil.h" #include "wx/dynlib.h" #include "wx/paper.h" +#include "wx/scopeguard.h" +#include "wx/testing.h" #include @@ -74,7 +76,7 @@ public: { #if wxUSE_LIBGNOMEPRINT // This module must be initialized AFTER gnomeprint's one - AddDependency(CLASSINFO(wxGnomePrintModule)); + AddDependency(wxCLASSINFO(wxGnomePrintModule)); #endif } bool OnInit(); @@ -86,8 +88,12 @@ private: bool wxGtkPrintModule::OnInit() { +#ifndef __WXGTK3__ if (gtk_check_version(2,10,0) == NULL) +#endif + { wxPrintFactory::SetPrintFactory( new wxGtkPrintFactory ); + } return true; } @@ -230,13 +236,12 @@ IMPLEMENT_CLASS(wxGtkPrintNativeData, wxPrintNativeDataBase) wxGtkPrintNativeData::wxGtkPrintNativeData() { m_config = gtk_print_settings_new(); - m_job = gtk_print_operation_new(); + m_job = NULL; m_context = NULL; } wxGtkPrintNativeData::~wxGtkPrintNativeData() { - g_object_unref(m_job); g_object_unref(m_config); } @@ -619,7 +624,7 @@ wxGtkPrintDialog::~wxGtkPrintDialog() // This is called even if we actually don't want the dialog to appear. int wxGtkPrintDialog::ShowModal() { - GtkPrintOperationResult response; + WX_TESTING_SHOW_MODAL_HOOK(); // We need to restore the settings given in the constructor. wxPrintData data = m_printDialogData.GetPrintData(); @@ -654,10 +659,17 @@ int wxGtkPrintDialog::ShowModal() // Show the dialog if needed. GError* gError = NULL; - if (GetShowDialog()) - response = gtk_print_operation_run (printOp, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW(gtk_widget_get_toplevel(m_parent->m_widget) ), &gError); - else - response = gtk_print_operation_run (printOp, GTK_PRINT_OPERATION_ACTION_PRINT, GTK_WINDOW(gtk_widget_get_toplevel(m_parent->m_widget)), &gError); + GtkPrintOperationResult response = gtk_print_operation_run + ( + printOp, + GetShowDialog() + ? GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG + : GTK_PRINT_OPERATION_ACTION_PRINT, + m_parent + ? GTK_WINDOW(gtk_widget_get_toplevel(m_parent->m_widget)) + : NULL, + &gError + ); // Does everything went well? if (response == GTK_PRINT_OPERATION_RESULT_CANCEL) @@ -738,6 +750,8 @@ wxGtkPageSetupDialog::~wxGtkPageSetupDialog() int wxGtkPageSetupDialog::ShowModal() { + WX_TESTING_SHOW_MODAL_HOOK(); + // Get the config. m_pageDialogData.GetPrintData().ConvertToNative(); wxGtkPrintNativeData *native = (wxGtkPrintNativeData*) m_pageDialogData.GetPrintData().GetNativeData(); @@ -770,7 +784,9 @@ int wxGtkPageSetupDialog::ShowModal() title = _("Page Setup"); GtkWidget * dlg = gtk_page_setup_unix_dialog_new(title.utf8_str(), - GTK_WINDOW(m_parent->m_widget)); + m_parent + ? GTK_WINDOW(m_parent->m_widget) + : NULL); gtk_page_setup_unix_dialog_set_print_settings( GTK_PAGE_SETUP_UNIX_DIALOG(dlg), nativeData); @@ -893,7 +909,10 @@ bool wxGtkPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt ) wxPrintData printdata = GetPrintDialogData().GetPrintData(); wxGtkPrintNativeData *native = (wxGtkPrintNativeData*) printdata.GetNativeData(); - GtkPrintOperation * const printOp = native->GetPrintJob(); + wxGtkObject printOp(gtk_print_operation_new()); + native->SetPrintJob(printOp); + wxON_BLOCK_EXIT_OBJ1(*native, wxGtkPrintNativeData::SetPrintJob, + static_cast(NULL)); wxPrinterToGtkData dataToSend; dataToSend.printer = this; @@ -1165,8 +1184,6 @@ wxGtkPrinterDCImpl::wxGtkPrinterDCImpl(wxPrinterDC *owner, const wxPrintData& da #if wxCAIRO_SCALE m_PS2DEV = 1.0; m_DEV2PS = 1.0; - - cairo_scale( m_cairo, 72.0 / (double)m_resolution, 72.0 / (double)m_resolution ); #else m_PS2DEV = (double)m_resolution / 72.0; m_DEV2PS = 72.0 / (double)m_resolution; @@ -1178,15 +1195,6 @@ wxGtkPrinterDCImpl::wxGtkPrinterDCImpl(wxPrinterDC *owner, const wxPrintData& da m_signX = 1; // default x-axis left to right. m_signY = 1; // default y-axis bottom up -> top down. - - // By default the origin of the Cairo context 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 (without 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); - cairo_translate(m_cairo, -ml, -mt); } wxGtkPrinterDCImpl::~wxGtkPrinterDCImpl() @@ -1205,6 +1213,11 @@ void* wxGtkPrinterDCImpl::GetCairoContext() const return (void*) cairo_reference( m_cairo ); } +void* wxGtkPrinterDCImpl::GetHandle() const +{ + return GetCairoContext(); +} + bool wxGtkPrinterDCImpl::DoFloodFill(wxCoord WXUNUSED(x1), wxCoord WXUNUSED(y1), const wxColour& WXUNUSED(col), @@ -1444,7 +1457,7 @@ void wxGtkPrinterDCImpl::DoDrawPoint(wxCoord x, wxCoord y) CalcBoundingBox( x, y ); } -void wxGtkPrinterDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset) +void wxGtkPrinterDCImpl::DoDrawLines(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset) { if ( m_pen.IsTransparent() ) return; @@ -1466,7 +1479,7 @@ void wxGtkPrinterDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, w cairo_stroke ( m_cairo); } -void wxGtkPrinterDCImpl::DoDrawPolygon(int n, wxPoint points[], +void wxGtkPrinterDCImpl::DoDrawPolygon(int n, const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle) { @@ -1485,9 +1498,9 @@ void wxGtkPrinterDCImpl::DoDrawPolygon(int n, wxPoint points[], int i; for (i = 1; i < n; i++) { - int x = points[i].x + xoffset; - int y = points[i].y + yoffset; - cairo_line_to( m_cairo, XLOG2DEV(x), YLOG2DEV(y) ); + int xx = points[i].x + xoffset; + int yy = points[i].y + yoffset; + cairo_line_to( m_cairo, XLOG2DEV(xx), YLOG2DEV(yy) ); } cairo_close_path(m_cairo); @@ -1502,7 +1515,7 @@ void wxGtkPrinterDCImpl::DoDrawPolygon(int n, wxPoint points[], cairo_restore(m_cairo); } -void wxGtkPrinterDCImpl::DoDrawPolyPolygon(int n, int count[], wxPoint points[], +void wxGtkPrinterDCImpl::DoDrawPolyPolygon(int n, const int count[], const wxPoint points[], wxCoord xoffset, wxCoord yoffset, wxPolygonFillMode fillStyle) { @@ -1698,9 +1711,11 @@ void wxGtkPrinterDCImpl::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoor y = wxCoord(YLOG2DEV(y)); int bw = bitmap.GetWidth(); int bh = bitmap.GetHeight(); +#ifndef __WXGTK3__ wxBitmap bmpSource = bitmap; // we need a non-const instance. if (!useMask && !bitmap.HasPixbuf() && bitmap.GetMask()) bmpSource.SetMask(NULL); +#endif cairo_save(m_cairo); @@ -1712,12 +1727,16 @@ void wxGtkPrinterDCImpl::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoor wxDouble scaleY = (wxDouble) YLOG2DEVREL(bh) / (wxDouble) bh; cairo_scale(m_cairo, scaleX, scaleY); +#ifdef __WXGTK3__ + bitmap.Draw(m_cairo, 0, 0, useMask, &m_textForegroundColour, &m_textBackgroundColour); +#else gdk_cairo_set_source_pixbuf(m_cairo, bmpSource.GetPixbuf(), 0, 0); cairo_pattern_set_filter(cairo_get_source(m_cairo), CAIRO_FILTER_NEAREST); // Use the original size here since the context is scaled already. cairo_rectangle(m_cairo, 0, 0, bw, bh); // Fill the rectangle using the pattern. cairo_fill(m_cairo); +#endif CalcBoundingBox(0,0); CalcBoundingBox(bw,bh); @@ -2058,6 +2077,8 @@ void wxGtkPrinterDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width { cairo_rectangle ( m_cairo, XLOG2DEV(x), YLOG2DEV(y), XLOG2DEVREL(width), YLOG2DEVREL(height)); cairo_clip(m_cairo); + + wxDCImpl::DoSetClippingRegion(x, y, width, height); } void wxGtkPrinterDCImpl::DestroyClippingRegion() @@ -2077,7 +2098,24 @@ void wxGtkPrinterDCImpl::EndDoc() void wxGtkPrinterDCImpl::StartPage() { - return; + // Notice that we may change the Cairo transformation matrix only here and + // not before (e.g. in wxGtkPrinterDCImpl ctor as we used to do) in order + // to not affect _gtk_print_context_rotate_according_to_orientation() which + // is used in GTK+ itself and wouldn't work correctly if we applied these + // transformations before it is called. + + // By default the origin of the Cairo context 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 (without 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); + cairo_translate(m_cairo, -ml, -mt); + +#if wxCAIRO_SCALE + cairo_scale( m_cairo, 72.0 / (double)m_resolution, 72.0 / (double)m_resolution ); +#endif } void wxGtkPrinterDCImpl::EndPage()