1 /* 2 * Copyright (C) 2009 - 2011 Vivien Malerba <malerba@gnome-db.org> 3 * Copyright (C) 2010 David King <davidk@openismus.com> 4 * Copyright (C) 2011 Murray Cumming <murrayc@murrayc.com> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19 */ 20 21 #include <glib/gi18n-lib.h> 22 #include <gtk/gtk.h> 23 #include "browser-canvas.h" 24 #include "browser-canvas-priv.h" 25 #include <cairo.h> 26 #include <goocanvas.h> 27 28 typedef struct { 29 BrowserCanvas *canvas; 30 GtkPrintSettings *settings; 31 GtkPageSetup *page_setup; 32 gboolean show_page_numbers; 33 34 gdouble page_width, page_height; 35 gint h_npages, v_npages; 36 gdouble scale; 37 } PrintPageData; 38 39 static GObject *print_create_custom_widget_cb (GtkPrintOperation *operation, PrintPageData *pdata); 40 static void print_begin (GtkPrintOperation *operation, GtkPrintContext *context, PrintPageData *pdata); 41 static void print_end (GtkPrintOperation *operation, GtkPrintContext *context, PrintPageData *pdata); 42 static void print_draw_page (GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, PrintPageData *pdata); 43 44 static GtkPrintSettings *print_settings = NULL; 45 static GtkPageSetup *page_setup = NULL; 46 static gboolean show_page_numbers = TRUE; 47 48 /** 49 * browser_canvas_print 50 * @canvas: the #BrowserCanvas to print 51 * 52 * Prints @canvas using the GTK+ printing framework (displays printing options) 53 */ 54 void 55 browser_canvas_print (BrowserCanvas *canvas) 56 { 57 GtkPrintOperation *print; 58 GtkPrintOperationResult res; 59 GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (canvas)); 60 PrintPageData *pdata; 61 62 if (!print_settings) 63 print_settings = gtk_print_settings_new (); 64 if (!page_setup) 65 page_setup = gtk_page_setup_new (); 66 67 pdata = g_new0 (PrintPageData, 1); 68 pdata->canvas = canvas; 69 pdata->settings = print_settings; 70 pdata->page_setup = page_setup; browser_canvas_item_get_type(void)71 pdata->show_page_numbers = show_page_numbers; 72 73 print = gtk_print_operation_new (); 74 75 gtk_print_operation_set_print_settings (print, print_settings); 76 gtk_print_operation_set_default_page_setup (print, pdata->page_setup); 77 78 g_signal_connect (print, "create-custom-widget", G_CALLBACK (print_create_custom_widget_cb), pdata); 79 g_signal_connect (print, "begin_print", G_CALLBACK (print_begin), pdata); 80 g_signal_connect (print, "end_print", G_CALLBACK (print_end), pdata); 81 g_signal_connect (print, "draw_page", G_CALLBACK (print_draw_page), pdata); 82 gtk_print_operation_set_custom_tab_label (print, _("Page size and zoom")); 83 res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, 84 (GtkWindow*) toplevel, NULL); 85 86 if (res == GTK_PRINT_OPERATION_RESULT_APPLY) { 87 g_object_unref (print_settings); 88 print_settings = g_object_ref (gtk_print_operation_get_print_settings (print)); 89 if (page_setup != pdata->page_setup) { 90 g_object_unref (page_setup); 91 page_setup = pdata->page_setup; 92 } 93 show_page_numbers = pdata->show_page_numbers; 94 } 95 else if (page_setup != pdata->page_setup) browser_canvas_item_class_init(BrowserCanvasItemClass * class)96 g_object_unref (pdata->page_setup); 97 98 g_object_unref (print); 99 g_free (pdata); 100 } 101 102 static void 103 print_begin (GtkPrintOperation *operation, G_GNUC_UNUSED GtkPrintContext *context, PrintPageData *pdata) 104 { 105 gtk_print_operation_set_n_pages (operation, pdata->h_npages * pdata->v_npages); 106 gtk_print_operation_set_default_page_setup (operation, pdata->page_setup); 107 } 108 109 static void 110 print_end (G_GNUC_UNUSED GtkPrintOperation *operation, G_GNUC_UNUSED GtkPrintContext *context, 111 G_GNUC_UNUSED PrintPageData *pdata) 112 { 113 114 } 115 116 static void 117 print_draw_page (G_GNUC_UNUSED GtkPrintOperation *operation, GtkPrintContext *context, gint page_nr, PrintPageData *pdata) 118 { 119 cairo_t *cr; 120 GooCanvasBounds bounds, canvas_bounds; 121 gint col_page, line_page; 122 #define DRAW_DEBUG 123 #undef DRAW_DEBUG 124 125 cr = gtk_print_context_get_cairo_context (context); 126 127 line_page = page_nr / pdata->h_npages; 128 col_page = page_nr % pdata->h_npages; 129 130 goo_canvas_item_get_bounds (goo_canvas_get_root_item (pdata->canvas->priv->goocanvas), &canvas_bounds); 131 132 /*g_print ("Printing page col%d line%d\n", col_page, line_page);*/ 133 134 #ifdef DRAW_DEBUG 135 cairo_save (cr); 136 /* X axis */ 137 cairo_set_source_rgba (cr, 0., 1., 0., 0.8); 138 cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); 139 cairo_set_font_size (cr, 10.); 140 cairo_move_to (cr, 50., -2.); 141 cairo_show_text (cr, "X"); 142 cairo_stroke (cr); 143 144 cairo_move_to (cr, 0., 0.); 145 cairo_line_to (cr, 50., 0.); 146 cairo_rel_line_to (cr, -10., 10.); 147 cairo_stroke (cr); 148 cairo_move_to (cr, 50., 0.); 149 cairo_rel_line_to (cr, -10., -10.); 150 cairo_stroke (cr); 151 browser_canvas_item_init(BrowserCanvasItem * item)152 /* Y axis */ 153 cairo_set_source_rgba (cr, 0., 0., 1., 0.8); 154 155 cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); 156 cairo_set_font_size (cr, 10.); 157 cairo_move_to (cr, -12., 55.); 158 cairo_show_text (cr, "Y"); 159 cairo_stroke (cr); 160 161 cairo_move_to (cr, 0., 0.); 162 cairo_line_to (cr, 0., 50.); 163 cairo_rel_line_to (cr, 10., -10.); 164 cairo_stroke (cr); 165 cairo_move_to (cr, 0., 50.); 166 cairo_rel_line_to (cr, -10., -10.); 167 cairo_stroke (cr); 168 169 cairo_rectangle (cr, 0, 0, gtk_print_context_get_width (context), gtk_print_context_get_height (context)); 170 cairo_set_source_rgba (cr, 0., 0., 0., 1.); 171 cairo_set_line_width (cr, 0.5); 172 gdouble dash_length = 2.; browser_canvas_item_dispose(GObject * object)173 cairo_set_dash (cr, &dash_length, 1, 0.); 174 cairo_stroke (cr); 175 cairo_restore (cr); 176 #endif 177 178 if (pdata->show_page_numbers) { 179 cairo_text_extents_t extents; 180 gchar *str = g_strdup_printf (_("Page %d of %d horizontally and %d of %d vertically"), 181 col_page + 1, pdata->h_npages, 182 line_page + 1, pdata->v_npages); 183 cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); 184 cairo_set_font_size (cr, 10.); 185 cairo_text_extents (cr, str, &extents); 186 cairo_move_to (cr, gtk_print_context_get_width (context) - extents.width - extents.x_bearing, 187 gtk_print_context_get_height (context) - extents.height - extents.y_bearing); 188 cairo_show_text (cr, str); 189 g_free (str); 190 cairo_stroke (cr); 191 } 192 browser_canvas_item_set_property(GObject * object,guint param_id,const GValue * value,GParamSpec * pspec)193 bounds.x1 = col_page * pdata->page_width + canvas_bounds.x1; 194 bounds.x2 = bounds.x1 + pdata->page_width; 195 bounds.y1 = line_page * pdata->page_height + canvas_bounds.y1; 196 bounds.y2 = bounds.y1 + pdata->page_height; 197 198 cairo_scale (cr, pdata->scale, pdata->scale); 199 cairo_translate (cr, - bounds.x1, - bounds.y1); 200 goo_canvas_render (pdata->canvas->priv->goocanvas, cr, &bounds, .8); 201 /* 202 g_print ("Scale %.2f, cairo's bounds: (%.2fx%.2f) => (%.2fx%.2f), canvas's bounds: (%.2fx%.2f) => (%.2fx%.2f)\n", 203 pdata->scale, bounds.x1, bounds.y1, bounds.x2, bounds.y2, 204 canvas_bounds.x1, canvas_bounds.y1, canvas_bounds.x2, canvas_bounds.y2); 205 */ 206 } 207 208 typedef struct { 209 PrintPageData *pdata; 210 GtkSpinButton *zoom; 211 GtkSpinButton *h_npages; 212 GtkSpinButton *v_npages; 213 } PrintCustomData; 214 215 static void print_page_setup_cb (GtkWidget *button, PrintCustomData *cdata); 216 static void print_h_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata); 217 static void print_v_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata); 218 static void print_zoom_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata); 219 static void print_page_numbers_toggled_cb (GtkToggleButton *toggle, PrintCustomData *cdata); 220 221 static GObject * 222 print_create_custom_widget_cb (G_GNUC_UNUSED GtkPrintOperation *operation, PrintPageData *pdata) 223 { 224 GtkWidget *vbox, *bbox, *button, *label, *hbox, *grid, *entry; 225 PrintCustomData *cdata; browser_canvas_item_get_property(GObject * object,guint param_id,GValue * value,GParamSpec * pspec)226 227 cdata = g_new0 (PrintCustomData, 1); 228 cdata->pdata = pdata; 229 230 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); 231 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); 232 233 /* page size's adjustments */ 234 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); 235 gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0); 236 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START); 237 238 button = gtk_button_new_with_label (_("Adjust page's size and orientation")); 239 g_signal_connect (button, "clicked", G_CALLBACK (print_page_setup_cb), cdata); 240 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0); 241 242 /* zoom control */ 243 label = gtk_label_new (""); 244 gtk_label_set_markup (GTK_LABEL (label), _("<b>Zoom</b>")); 245 gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); 246 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); 247 248 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* HIG */ 249 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); 250 label = gtk_label_new (" "); 251 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); 252 253 grid = gtk_grid_new (); 254 gtk_box_pack_start (GTK_BOX (hbox), grid, TRUE, TRUE, 0); 255 256 label = gtk_label_new (_("Number of pages used:")); 257 gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); 258 gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1); 259 browser_canvas_item_get_canvas(BrowserCanvasItem * item)260 entry = gtk_spin_button_new_with_range (1., 100., 1.); 261 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry), 0); 262 gtk_grid_attach (GTK_GRID (grid), entry, 1, 0, 1, 1); 263 cdata->h_npages = (GtkSpinButton*) entry; 264 g_signal_connect (entry, "value-changed", 265 G_CALLBACK (print_h_npages_value_changed_cb), cdata); 266 267 label = gtk_label_new (_("horizontally")); 268 gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); 269 gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1); 270 271 entry = gtk_spin_button_new_with_range (1., 100., 1.); 272 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry), 0); 273 gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1); 274 cdata->v_npages = (GtkSpinButton*) entry; 275 g_signal_connect (entry, "value-changed", 276 G_CALLBACK (print_v_npages_value_changed_cb), cdata); browser_canvas_item_get_edge_nodes(BrowserCanvasItem * item,BrowserCanvasItem ** from,BrowserCanvasItem ** to)277 278 label = gtk_label_new (_("vertically")); 279 gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); 280 gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1); 281 282 label = gtk_label_new (_("Zoom factor:")); 283 gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); 284 gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1); 285 286 entry = gtk_spin_button_new_with_range (.1, 10., .05); 287 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (entry), 2); 288 gtk_grid_attach (GTK_GRID (grid), entry, 1, 2, 1, 1); 289 cdata->zoom = (GtkSpinButton*) entry; 290 g_signal_connect (entry, "value-changed", 291 G_CALLBACK (print_zoom_value_changed_cb), cdata); 292 293 /* misc options */ 294 label = gtk_label_new (""); 295 gtk_label_set_markup (GTK_LABEL (label), _("<b>Page numbers</b>")); leave_notify_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,G_GNUC_UNUSED GdkEventCrossing * event,G_GNUC_UNUSED gpointer data)296 gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); 297 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); 298 299 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); /* HIG */ 300 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); 301 label = gtk_label_new (" "); 302 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); 303 304 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); button_press_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,GdkEventButton * event,G_GNUC_UNUSED gpointer data)305 gtk_box_pack_start (GTK_BOX (hbox), bbox, FALSE, FALSE, 0); 306 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START); 307 308 button = gtk_check_button_new_with_label (_("Print page numbers")); 309 g_signal_connect (button, "toggled", G_CALLBACK (print_page_numbers_toggled_cb), cdata); 310 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), cdata->pdata->show_page_numbers); 311 gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, FALSE, 0); 312 313 /* correct start state */ 314 gtk_widget_show_all (vbox); 315 g_object_set_data_full (G_OBJECT (vbox), "cdata", cdata, g_free); 316 317 /* default zoom to 1 */ 318 gtk_spin_button_set_value (cdata->zoom, 1.); 319 320 return G_OBJECT (vbox); 321 } 322 323 static void 324 print_page_numbers_toggled_cb (GtkToggleButton *toggle, PrintCustomData *cdata) 325 { 326 cdata->pdata->show_page_numbers = gtk_toggle_button_get_active (toggle); 327 } 328 329 static void 330 print_page_setup_cb (GtkWidget *button, PrintCustomData *cdata) 331 { 332 GtkPageSetup *setup; 333 GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button)); 334 335 setup = cdata->pdata->page_setup; 336 cdata->pdata->page_setup = gtk_print_run_page_setup_dialog ((GtkWindow *) toplevel, 337 cdata->pdata->page_setup, cdata->pdata->settings); 338 if ((cdata->pdata->page_setup != setup) && (setup != page_setup)) 339 g_object_unref (setup); 340 341 print_zoom_value_changed_cb (cdata->zoom, cdata); 342 } 343 344 static void 345 print_h_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata) 346 { 347 gdouble page_width, page_height; 348 GooCanvasBounds bounds; 349 gdouble canvas_height; 350 gdouble zoom; 351 gint h_npages, v_npages; 352 353 h_npages = (gint) gtk_spin_button_get_value (entry); 354 page_width = gtk_page_setup_get_page_width (cdata->pdata->page_setup, GTK_UNIT_POINTS); 355 page_height = gtk_page_setup_get_page_height (cdata->pdata->page_setup, GTK_UNIT_POINTS); 356 357 goo_canvas_item_get_bounds (goo_canvas_get_root_item (cdata->pdata->canvas->priv->goocanvas), &bounds); 358 zoom = (gdouble) h_npages * page_width / (bounds.x2 - bounds.x1); button_release_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,GdkEventButton * event,G_GNUC_UNUSED gpointer data)359 360 canvas_height = (bounds.y2 - bounds.y1) * zoom; 361 v_npages = (gint) (canvas_height / page_height + 1.); 362 363 g_signal_handlers_block_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata); 364 gtk_spin_button_set_value (cdata->zoom, zoom); 365 g_signal_handlers_unblock_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata); 366 g_signal_handlers_block_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata); 367 gtk_spin_button_set_value (cdata->v_npages, v_npages); 368 g_signal_handlers_unblock_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata); 369 370 cdata->pdata->scale = zoom; 371 cdata->pdata->page_width = page_width / zoom; 372 cdata->pdata->page_height = page_height / zoom; 373 cdata->pdata->h_npages = h_npages; 374 cdata->pdata->v_npages = v_npages; 375 376 /* 377 g_print ("Pages: %d/%d Page:%.2f/%.2f\n", cdata->pdata->h_npages, cdata->pdata->v_npages, 378 cdata->pdata->page_width, cdata->pdata->page_height); motion_notify_event(BrowserCanvasItem * citem,G_GNUC_UNUSED GooCanvasItem * target_item,GdkEventMotion * event,G_GNUC_UNUSED gpointer data)379 */ 380 } 381 382 static void 383 print_v_npages_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata) 384 { 385 gdouble page_width, page_height; 386 GooCanvasBounds bounds; 387 gdouble canvas_width; 388 gdouble zoom; 389 gint h_npages, v_npages; 390 391 v_npages = (gint) gtk_spin_button_get_value (entry); 392 page_width = gtk_page_setup_get_page_width (cdata->pdata->page_setup, GTK_UNIT_POINTS); 393 page_height = gtk_page_setup_get_page_height (cdata->pdata->page_setup, GTK_UNIT_POINTS); 394 395 goo_canvas_item_get_bounds (goo_canvas_get_root_item (cdata->pdata->canvas->priv->goocanvas), &bounds); 396 zoom = (gdouble) v_npages * page_height / (bounds.y2 - bounds.y1); 397 398 canvas_width = (bounds.x2 - bounds.x1) * zoom; 399 h_npages = (gint) (canvas_width / page_width + 1.); 400 401 g_signal_handlers_block_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata); 402 gtk_spin_button_set_value (cdata->zoom, zoom); 403 g_signal_handlers_unblock_by_func (cdata->zoom, G_CALLBACK (print_zoom_value_changed_cb), cdata); 404 g_signal_handlers_block_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata); 405 gtk_spin_button_set_value (cdata->h_npages, h_npages); 406 g_signal_handlers_unblock_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata); 407 408 cdata->pdata->scale = zoom; 409 cdata->pdata->page_width = page_width / zoom; 410 cdata->pdata->page_height = page_height / zoom; 411 cdata->pdata->h_npages = h_npages; 412 cdata->pdata->v_npages = v_npages; 413 414 /* 415 g_print ("Pages: %d/%d Page:%.2f/%.2f\n", cdata->pdata->h_npages, cdata->pdata->v_npages, 416 cdata->pdata->page_width, cdata->pdata->page_height); 417 */ 418 } 419 420 static void 421 print_zoom_value_changed_cb (GtkSpinButton *entry, PrintCustomData *cdata) 422 { 423 gdouble page_width, page_height; 424 GooCanvasBounds bounds; 425 gdouble canvas_width, canvas_height; 426 gdouble zoom; 427 gint h_npages, v_npages; 428 429 zoom = gtk_spin_button_get_value (entry); 430 page_width = gtk_page_setup_get_page_width (cdata->pdata->page_setup, GTK_UNIT_POINTS); 431 page_height = gtk_page_setup_get_page_height (cdata->pdata->page_setup, GTK_UNIT_POINTS); 432 433 goo_canvas_item_get_bounds (goo_canvas_get_root_item (cdata->pdata->canvas->priv->goocanvas), &bounds); 434 canvas_width = (bounds.x2 - bounds.x1) * zoom; 435 canvas_height = (bounds.y2 - bounds.y1) * zoom; 436 h_npages = (gint) (canvas_width / page_width + 1.); 437 v_npages = (gint) (canvas_height / page_height + 1.); 438 439 g_signal_handlers_block_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata); 440 gtk_spin_button_set_value (cdata->h_npages, h_npages); 441 g_signal_handlers_unblock_by_func (cdata->h_npages, G_CALLBACK (print_h_npages_value_changed_cb), cdata); 442 g_signal_handlers_block_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata); 443 gtk_spin_button_set_value (cdata->v_npages, v_npages); 444 g_signal_handlers_unblock_by_func (cdata->v_npages, G_CALLBACK (print_v_npages_value_changed_cb), cdata); 445 446 cdata->pdata->scale = zoom; 447 cdata->pdata->page_width = page_width / zoom; 448 cdata->pdata->page_height = page_height / zoom; 449 cdata->pdata->h_npages = h_npages; 450 cdata->pdata->v_npages = v_npages; 451 452 /* 453 g_print ("Pages: %d/%d Page:%.2f/%.2f\n", cdata->pdata->h_npages, cdata->pdata->v_npages, 454 cdata->pdata->page_width, cdata->pdata->page_height); 455 */ 456 } 457 458