X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..a7cfe08aff22afc81e29fc93018cff111f59d129:/src/gtk/gnome/gprint.cpp diff --git a/src/gtk/gnome/gprint.cpp b/src/gtk/gnome/gprint.cpp index ff86288a88..a623c309d3 100644 --- a/src/gtk/gnome/gprint.cpp +++ b/src/gtk/gnome/gprint.cpp @@ -19,12 +19,16 @@ #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 @@ -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;