]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/gnome/gprint.cpp
allow white as mask color when creating mask from mono bitmap
[wxWidgets.git] / src / gtk / gnome / gprint.cpp
index ff86288a88cc899a082ff3484ee21a0c65fc29e8..a623c309d3c59534abf8e3e8a6704fbcd870e9f6 100644 (file)
 
 #if wxUSE_LIBGNOMEPRINT
 
-#include "wx/math.h"
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/dcmemory.h"
+    #include "wx/icon.h"
+    #include "wx/math.h"
+#endif
+
 #include "wx/fontutil.h"
-#include "wx/printdlg.h"
 #include "wx/gtk/private.h"
 #include "wx/module.h"
-#include "wx/generic/prntdlgg.h"
 #include "wx/dynlib.h"
 
 #include <libgnomeprint/gnome-print.h>
@@ -276,7 +280,7 @@ wxGnomePrintNativeData::wxGnomePrintNativeData()
 
 wxGnomePrintNativeData::~wxGnomePrintNativeData()
 {
-    g_object_unref (G_OBJECT (m_config));
+    g_object_unref (m_config);
 }
 
 bool wxGnomePrintNativeData::TransferTo( wxPrintData &data )
@@ -703,7 +707,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
     if (!dc)
     {
         gs_lgp->gnome_print_job_close( job );
-        g_object_unref (G_OBJECT (job));
+        g_object_unref (job);
         sm_lastError = wxPRINTER_ERROR;
         return false;
     }
@@ -734,7 +738,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
     if (maxPage == 0)
     {
         gs_lgp->gnome_print_job_close( job );
-        g_object_unref (G_OBJECT (job));
+        g_object_unref (job);
         sm_lastError = wxPRINTER_ERROR;
         return false;
     }
@@ -779,15 +783,20 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
     gs_lgp->gnome_print_job_close( job );
     if (m_native_preview)
     {
-        wxString title( _("Print preview") );
-        gtk_widget_show( gs_lgp->gnome_print_job_preview_new( job, (const guchar*)(const char*)wxGTK_CONV(title) ));
+        const wxCharBuffer title(wxGTK_CONV_SYS(_("Print preview")));
+        GtkWidget *preview = gs_lgp->gnome_print_job_preview_new
+                                     (
+                                        job,
+                                        (const guchar *)title.data()
+                                     );
+        gtk_widget_show(preview);
     }
     else
     {
         gs_lgp->gnome_print_job_print( job );
     }
 
-    g_object_unref (G_OBJECT (job));
+    g_object_unref (job);
     delete dc;
 
     return (sm_lastError == wxPRINTER_NO_ERROR);
@@ -1154,30 +1163,59 @@ void wxGnomePrintDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width,
     }
 }
 
+void wxGnomePrintDC::makeEllipticalPath(wxCoord x, wxCoord y,
+                                        wxCoord width, wxCoord height)
+{
+    double r = 4 * (sqrt (2) - 1) / 3;
+    double  halfW = 0.5 * width,
+            halfH = 0.5 * height,
+            halfWR = r * halfW,
+            halfHR = r * halfH;
+    wxCoord halfWI = (wxCoord) halfW,
+            halfHI = (wxCoord) halfH;
+
+    gs_lgp->gnome_print_newpath( m_gpc );
+
+    // Approximate an ellipse using four cubic splines, clockwise from 0 deg */
+    gs_lgp->gnome_print_moveto( m_gpc,
+                XLOG2DEV(x + width),
+                YLOG2DEV(y + halfHI) );
+    gs_lgp->gnome_print_curveto( m_gpc,
+                XLOG2DEV(x + width),
+                YLOG2DEV(y + (wxCoord) rint (halfH + halfHR)),
+                XLOG2DEV(x + (wxCoord) rint(halfW + halfWR)),
+                YLOG2DEV(y + height),
+                XLOG2DEV(x + halfWI),
+                YLOG2DEV(y + height) );
+    gs_lgp->gnome_print_curveto( m_gpc,
+                XLOG2DEV(x + (wxCoord) rint(halfW - halfWR)),
+                YLOG2DEV(y + height),
+                XLOG2DEV(x),
+                YLOG2DEV(y + (wxCoord) rint (halfH + halfHR)),
+                XLOG2DEV(x), YLOG2DEV(y+halfHI) );
+    gs_lgp->gnome_print_curveto( m_gpc,
+                XLOG2DEV(x),
+                YLOG2DEV(y + (wxCoord) rint (halfH - halfHR)),
+                XLOG2DEV(x + (wxCoord) rint (halfW - halfWR)),
+                YLOG2DEV(y),
+                XLOG2DEV(x+halfWI), YLOG2DEV(y) );
+    gs_lgp->gnome_print_curveto( m_gpc,
+                XLOG2DEV(x + (wxCoord) rint(halfW + halfWR)),
+                YLOG2DEV(y),
+                XLOG2DEV(x + width),
+                YLOG2DEV(y + (wxCoord) rint(halfH - halfHR)),
+                XLOG2DEV(x + width), YLOG2DEV(y + halfHI) );
+
+    gs_lgp->gnome_print_closepath(m_gpc);
+}
+
 void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
     if (m_brush.GetStyle () != wxTRANSPARENT)
     {
         SetBrush( m_brush );
-
-        gs_lgp->gnome_print_newpath( m_gpc );
-        gs_lgp->gnome_print_moveto( m_gpc,
-                            XLOG2DEV(x), YLOG2DEV(y+height/2) );
-
-        // start with top half
-        gs_lgp->gnome_print_curveto( m_gpc,
-                            XLOG2DEV(x), YLOG2DEV(y),
-                            XLOG2DEV(x+width), YLOG2DEV(y),
-                            XLOG2DEV(x+width), YLOG2DEV(y+height/2) );
-        // lower half
-        gs_lgp->gnome_print_curveto( m_gpc,
-                            XLOG2DEV(x+width), YLOG2DEV(y+height),
-                            XLOG2DEV(x), YLOG2DEV(y+height),
-                            XLOG2DEV(x), YLOG2DEV(y+height/2) );
-
-        gs_lgp->gnome_print_closepath( m_gpc );
+        makeEllipticalPath( x, y, width, height );
         gs_lgp->gnome_print_fill( m_gpc );
-
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
@@ -1185,25 +1223,8 @@ void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord
     if (m_pen.GetStyle () != wxTRANSPARENT)
     {
         SetPen (m_pen);
-
-        gs_lgp->gnome_print_newpath( m_gpc );
-        gs_lgp->gnome_print_moveto( m_gpc,
-                            XLOG2DEV(x), YLOG2DEV(y+height/2) );
-
-        // start with top half
-        gs_lgp->gnome_print_curveto( m_gpc,
-                            XLOG2DEV(x), YLOG2DEV(y),
-                            XLOG2DEV(x+width), YLOG2DEV(y),
-                            XLOG2DEV(x+width), YLOG2DEV(y+height/2) );
-        // lower half
-        gs_lgp->gnome_print_curveto( m_gpc,
-                            XLOG2DEV(x+width), YLOG2DEV(y+height),
-                            XLOG2DEV(x), YLOG2DEV(y+height),
-                            XLOG2DEV(x), YLOG2DEV(y+height/2) );
-
-        gs_lgp->gnome_print_closepath( m_gpc );
+        makeEllipticalPath( x, y, width, height );
         gs_lgp->gnome_print_stroke( m_gpc );
-
         CalcBoundingBox( x, y );
         CalcBoundingBox( x + width, y + height );
     }
@@ -1516,6 +1537,22 @@ void wxGnomePrintDC::SetPen( const wxPen& pen )
         case wxSHORT_DASH:    gs_lgp->gnome_print_setdash( m_gpc, 2, short_dashed, 0 ); break;
         case wxLONG_DASH:     gs_lgp->gnome_print_setdash( m_gpc, 2, wxCoord_dashed, 0 ); break;
         case wxDOT_DASH:      gs_lgp->gnome_print_setdash( m_gpc, 4, dotted_dashed, 0 );  break;
+        case wxUSER_DASH:
+        {
+            // It may be noted that libgnomeprint between at least
+            // versions 2.8.0 and 2.12.1 makes a copy of the dashes
+            // and then leak the memory since it doesn't set the
+            // internal flag "privatedash" to 0.
+            wxDash *wx_dashes;
+            int num = m_pen.GetDashes (&wx_dashes);
+            gdouble *g_dashes = g_new( gdouble, num );
+            int i;
+            for (i = 0; i < num; ++i)
+                g_dashes[i] = (gdouble) wx_dashes[i];
+            gs_lgp -> gnome_print_setdash( m_gpc, num, g_dashes, 0);
+            g_free( g_dashes );
+        }
+        break;
         case wxSOLID:
         case wxTRANSPARENT:
         default:              gs_lgp->gnome_print_setdash( m_gpc, 0, NULL, 0 );   break;