printing works; font sizes are weird
[pspp] / src / ui / gui / psppire-output-view.c
index 38dbf1a060a19fcd1612ca3f2256b96845472a68..ff19f64babe68d5ff3b88a7d850859170ce85c1b 100644 (file)
@@ -985,21 +985,9 @@ static cairo_t *
 get_cairo_context_from_print_context (GtkPrintContext *context)
 {
   cairo_t *cr = gtk_print_context_get_cairo_context (context);
-
-  /*
-    For all platforms except windows, gtk_print_context_get_dpi_[xy] returns 72.
-    Windows returns 600.
-  */
-  double xres = gtk_print_context_get_dpi_x (context);
-  double yres = gtk_print_context_get_dpi_y (context);
-
-  /* This means that the cairo context now has its dimensions in Points */
-  cairo_scale (cr, xres / 72.0, yres / 72.0);
-
-  return cr;
+  return cairo_reference (cr);
 }
 
-
 static void
 create_xr_print_driver (GtkPrintContext *context, struct psppire_output_view *view)
 {
@@ -1011,11 +999,13 @@ create_xr_print_driver (GtkPrintContext *context, struct psppire_output_view *vi
     [V] = gtk_page_setup_get_paper_height (ps, GTK_UNIT_POINTS) * XR_POINT,
   };
 
+  /* These are all 1/2 inch.  The "margins" that GTK+ gives us are useless:
+     they are the printer's imagable area. */
   int margins[TABLE_N_AXES][2] = {
-    [H][0] = gtk_page_setup_get_left_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
-    [H][1] = gtk_page_setup_get_right_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
-    [V][0] = gtk_page_setup_get_top_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
-    [V][1] = gtk_page_setup_get_bottom_margin (ps, GTK_UNIT_POINTS) * XR_POINT,
+    [H][0] = XR_POINT * 36,
+    [H][1] = XR_POINT * 36,
+    [V][0] = XR_POINT * 36,
+    [V][1] = XR_POINT * 36,
   };
 
   double size[TABLE_N_AXES];
@@ -1031,14 +1021,11 @@ create_xr_print_driver (GtkPrintContext *context, struct psppire_output_view *vi
   *view->page_style = (struct xr_page_style) {
     .ref_cnt = 1,
 
-    .size = { [H] = size[H], [V] = size[V] },
     .margins = {
       [H] = { margins[H][0], margins[H][1] },
       [V] = { margins[V][0], margins[V][1] },
     },
-    .font = pango_font_description_copy (proportional_font),
     .bg = { .alpha = 0 },
-    .font_scale = 72.0 / 128.0,
     .initial_page_number = 1,
     .object_spacing = 12 * XR_POINT,
   };
@@ -1048,6 +1035,7 @@ create_xr_print_driver (GtkPrintContext *context, struct psppire_output_view *vi
     .ref_cnt = 1,
 
     .size = { [H] = size[H], [V] = size[V] },
+    .min_break = { [H] = size[H] / 2, [V] = size[V] / 2 },
     .fonts = {
       [XR_FONT_PROPORTIONAL] = proportional_font,
       [XR_FONT_FIXED] = fixed_font,
@@ -1058,7 +1046,7 @@ create_xr_print_driver (GtkPrintContext *context, struct psppire_output_view *vi
     .font_scale = 72.0 / 128.0
   };
 
-  view->pager = xr_pager_create (view->page_style);
+  view->pager = xr_pager_create (view->page_style, view->fsm_style);
 }
 
 static gboolean
@@ -1074,8 +1062,7 @@ paginate (GtkPrintOperation *operation,
     }
   else if (view->print_item < view->n_items)
     {
-      xr_pager_add_item (view->pager, view->fsm_style,
-                         view->items[view->print_item++].item);
+      xr_pager_add_item (view->pager, view->items[view->print_item++].item);
       while (xr_pager_needs_new_page (view->pager))
        {
          xr_pager_add_page (view->pager,
@@ -1086,11 +1073,11 @@ paginate (GtkPrintOperation *operation,
     }
   else
     {
-      gtk_print_operation_set_n_pages (operation, view->print_n_pages);
+      gtk_print_operation_set_n_pages (operation, MAX (1, view->print_n_pages));
 
       /* Re-create the driver to do the real printing. */
       xr_pager_destroy (view->pager);
-      view->pager = xr_pager_create (view->page_style);
+      view->pager = xr_pager_create (view->page_style, view->fsm_style);
       view->print_item = 0;
       view->paginated = TRUE;
 
@@ -1106,7 +1093,7 @@ begin_print (GtkPrintOperation *operation,
   create_xr_print_driver (context, view);
 
   view->print_item = 0;
-  view->print_n_pages = 1;
+  view->print_n_pages = 0;
   view->paginated = FALSE;
 }
 
@@ -1116,6 +1103,7 @@ end_print (GtkPrintOperation *operation,
           struct psppire_output_view *view)
 {
   xr_pager_destroy (view->pager);
+  view->pager = NULL;
 }
 
 
@@ -1129,8 +1117,7 @@ draw_page (GtkPrintOperation *operation,
                      get_cairo_context_from_print_context (context));
   while (!xr_pager_needs_new_page (view->pager)
          && view->print_item < view->n_items)
-    xr_pager_add_item (view->pager, view->fsm_style,
-                       view->items [view->print_item++].item);
+    xr_pager_add_item (view->pager, view->items [view->print_item++].item);
 }
 
 
@@ -1145,6 +1132,9 @@ psppire_output_view_print (struct psppire_output_view *view,
   if (view->print_settings != NULL)
     gtk_print_operation_set_print_settings (print, view->print_settings);
 
+  gtk_print_operation_set_use_full_page (print, TRUE);
+  gtk_print_operation_set_unit (print, GTK_UNIT_POINTS);
+
   g_signal_connect (print, "begin_print", G_CALLBACK (begin_print), view);
   g_signal_connect (print, "end_print",   G_CALLBACK (end_print),   view);
   g_signal_connect (print, "paginate",    G_CALLBACK (paginate),    view);