First update patch for GTK+ print
authorRobert Roebling <robert@roebling.de>
Thu, 13 Sep 2007 12:23:39 +0000 (12:23 +0000)
committerRobert Roebling <robert@roebling.de>
Thu, 13 Sep 2007 12:23:39 +0000 (12:23 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48649 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dc.h
samples/printing/printing.cpp
src/gtk/print.cpp

index a77cfee664c9ccda56a7c426a59cfc9a9bb4296d..3acc88d47b4145566f92d384d2f0282300b9de58 100644 (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)
index e231e3bd521df08acaac04c0c34deaf31de1718d..c424da9b466d0911ecd4cf8dcb241d9c35b937a2 100644 (file)
 #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) );
index ab1cd37790773ad073e088258febaf822858ece9..62e14f527acd257c29ea4b464b8a24413d6e5369 100644 (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)