21#include <poppler/glib/poppler.h>
28#include <wx/cmndata.h>
31#include <wx/gtk/print.h>
41 PrintData( PopplerDocument* d ) :
48void draw_page( GtkPrintOperation* operation, GtkPrintContext* context, gint page_nr, gpointer user_data )
50 PrintData* print_data =
static_cast<PrintData*
>( user_data );
52 if( !print_data || !print_data->doc )
55 PopplerPage* page = poppler_document_get_page( print_data->doc, page_nr );
59 auto cleanup_page = std::unique_ptr<PopplerPage, decltype( &g_object_unref )>( page, &g_object_unref );
61 cairo_t* cr = gtk_print_context_get_cairo_context( context );
66 double page_width, page_height;
67 poppler_page_get_size( page, &page_width, &page_height );
70 double print_width = gtk_print_context_get_width( context );
71 double print_height = gtk_print_context_get_height( context );
74 auto cleanup_cairo = std::unique_ptr<cairo_t, decltype( &cairo_restore )>( cr, &cairo_restore );
76 if( print_data->fit_to_page )
79 double scale_x = print_width / page_width;
80 double scale_y = print_height / page_height;
81 double scale = std::min( scale_x, scale_y );
84 double scaled_width = page_width *
scale;
85 double scaled_height = page_height *
scale;
86 double offset_x = ( print_width - scaled_width ) / 2.0;
87 double offset_y = ( print_height - scaled_height ) / 2.0;
90 cairo_translate( cr, offset_x, offset_y );
95 cairo_set_source_rgb( cr, 1.0, 1.0, 1.0 );
99 poppler_page_render( page, cr );
102void begin_print_callback( GtkPrintOperation* operation, GtkPrintContext* context, gpointer user_data )
104 PrintData* print_data =
static_cast<PrintData*
>( user_data );
105 if( !print_data || !print_data->doc )
107 gtk_print_operation_cancel( operation );
111 int num_pages = poppler_document_get_n_pages( print_data->doc );
114 gtk_print_operation_cancel( operation );
118 gtk_print_operation_set_n_pages( operation, num_pages );
121void request_page_setup_callback( GtkPrintOperation* operation, GtkPrintContext* context, gint page_nr,
122 GtkPageSetup* setup, gpointer user_data )
124 PrintData* print_data =
static_cast<PrintData*
>( user_data );
126 if( !print_data || !print_data->doc )
129 PopplerPage* page = poppler_document_get_page( print_data->doc, page_nr );
135 double page_width, page_height;
136 poppler_page_get_size( page, &page_width, &page_height );
139 GtkPageOrientation orientation =
140 ( page_width > page_height ) ? GTK_PAGE_ORIENTATION_LANDSCAPE : GTK_PAGE_ORIENTATION_PORTRAIT;
141 gtk_page_setup_set_orientation( setup, orientation );
143 g_object_unref( page );
154 if( access( aFile.c_str(), R_OK ) != 0 )
158 gchar* uri = g_filename_to_uri( aFile.c_str(), NULL, NULL );
163 GError* error = NULL;
164 PopplerDocument* doc = poppler_document_new_from_file( uri, NULL, &error );
169 g_error_free( error );
176 auto cleanup_doc = std::unique_ptr<PopplerDocument, decltype(&g_object_unref)>(doc, &g_object_unref);
179 int num_pages = poppler_document_get_n_pages( doc );
185 PrintData print_data( doc );
186 print_data.fit_to_page = fit_to_page;
189 GtkPrintOperation* op = gtk_print_operation_new();
194 auto cleanup_op = std::unique_ptr<GtkPrintOperation, decltype( &g_object_unref )>( op, &g_object_unref );
197 gtk_print_operation_set_use_full_page( op, FALSE );
198 gtk_print_operation_set_unit( op, GTK_UNIT_POINTS );
201 g_signal_connect( op,
"begin-print", G_CALLBACK( begin_print_callback ), &print_data );
202 g_signal_connect( op,
"draw-page", G_CALLBACK( draw_page ), &print_data );
203 g_signal_connect( op,
"request-page-setup", G_CALLBACK( request_page_setup_callback ), &print_data );
207 GtkPrintOperationResult
result =
208 gtk_print_operation_run( op, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, &error );
215 g_error_free( error );
222 case GTK_PRINT_OPERATION_RESULT_APPLY: return_result =
PRINT_RESULT::OK;
break;
224 case GTK_PRINT_OPERATION_RESULT_ERROR:
229 return return_result;
239 aData.SetFilename( wxEmptyString );
244 wxGtkPrintNativeData* nativeData =
dynamic_cast<wxGtkPrintNativeData*
>( aData.GetNativeData() );
246 if( nativeData && nativeData->GetPrintConfig() )
247 gtk_print_settings_unset( nativeData->GetPrintConfig(), GTK_PRINT_SETTINGS_OUTPUT_URI );
wxString result
Test unit parsing edge cases and error handling.