185
227
preview->page = NULL;
188
G_OBJECT_CLASS (gimp_print_preview_parent_class)->finalize (object);
230
G_OBJECT_CLASS (print_preview_parent_class)->finalize (object);
234
print_preview_realize (GtkWidget *widget)
236
PrintPreview *preview = PRINT_PREVIEW (widget);
238
GTK_WIDGET_CLASS (print_preview_parent_class)->realize (widget);
240
preview->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
245
print_preview_unrealize (GtkWidget *widget)
247
PrintPreview *preview = PRINT_PREVIEW (widget);
250
gdk_cursor_unref (preview->cursor);
252
GTK_WIDGET_CLASS (print_preview_parent_class)->unrealize (widget);
256
print_preview_size_request (GtkWidget *widget,
257
GtkRequisition *requisition)
259
PrintPreview *preview = PRINT_PREVIEW (widget);
261
gdouble paper_height;
262
gint border = GTK_CONTAINER (widget)->border_width + 1;
264
print_preview_get_page_size (preview, &paper_width, &paper_height);
266
if (paper_width > paper_height)
268
requisition->height = SIZE_REQUEST;
269
requisition->width = paper_width * SIZE_REQUEST / paper_height;
270
requisition->width = MIN (requisition->width, 2 * SIZE_REQUEST);
274
requisition->width = SIZE_REQUEST;
275
requisition->height = paper_height * SIZE_REQUEST / paper_width;
276
requisition->height = MIN (requisition->height, 2 * SIZE_REQUEST);
279
requisition->width += 2 * border;
280
requisition->height += 2 * border;
284
print_preview_size_allocate (GtkWidget *widget,
285
GtkAllocation *allocation)
287
PrintPreview *preview = PRINT_PREVIEW (widget);
289
GTK_WIDGET_CLASS (print_preview_parent_class)->size_allocate (widget,
292
if (preview->thumbnail)
294
cairo_surface_destroy (preview->thumbnail);
295
preview->thumbnail = NULL;
300
print_preview_button_press_event (GtkWidget *widget,
301
GdkEventButton *event)
303
PrintPreview *preview = PRINT_PREVIEW (widget);
305
if (event->type == GDK_BUTTON_PRESS && event->button == 1 && preview->inside)
309
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
312
if (gdk_pointer_grab (event->window, FALSE,
313
(GDK_BUTTON1_MOTION_MASK |
314
GDK_BUTTON_RELEASE_MASK),
315
NULL, cursor, event->time) == GDK_GRAB_SUCCESS)
317
preview->orig_offset_x = preview->image_offset_x;
318
preview->orig_offset_y = preview->image_offset_y;
320
preview->start_x = event->x;
321
preview->start_y = event->y;
323
preview->dragging = TRUE;
326
gdk_cursor_unref (cursor);
333
print_preview_button_release_event (GtkWidget *widget,
334
GdkEventButton *event)
336
PrintPreview *preview = PRINT_PREVIEW (widget);
338
if (preview->dragging)
340
gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
342
preview->dragging = FALSE;
344
print_preview_set_inside (preview,
345
print_preview_is_inside (preview,
346
event->x, event->y));
353
print_preview_motion_notify_event (GtkWidget *widget,
354
GdkEventMotion *event)
356
PrintPreview *preview = PRINT_PREVIEW (widget);
358
if (preview->dragging)
360
gdouble scale = print_preview_get_scale (preview);
364
offset_x = (preview->orig_offset_x +
365
(event->x - preview->start_x) / scale);
366
offset_y = (preview->orig_offset_y +
367
(event->y - preview->start_y) / scale);
369
offset_x = CLAMP (offset_x, 0, preview->image_offset_x_max);
370
offset_y = CLAMP (offset_y, 0, preview->image_offset_y_max);
372
if (preview->image_offset_x != offset_x ||
373
preview->image_offset_y != offset_y)
375
print_preview_set_image_offsets (preview,
378
g_signal_emit (preview,
379
print_preview_signals[OFFSETS_CHANGED], 0,
380
preview->image_offset_x,
381
preview->image_offset_y);
386
print_preview_set_inside (preview,
387
print_preview_is_inside (preview,
388
event->x, event->y));
395
print_preview_leave_notify_event (GtkWidget *widget,
396
GdkEventCrossing *event)
398
PrintPreview *preview = PRINT_PREVIEW (widget);
400
print_preview_set_inside (preview, FALSE);
406
print_preview_expose_event (GtkWidget *widget,
407
GdkEventExpose *event)
409
PrintPreview *preview = PRINT_PREVIEW (widget);
410
GtkStyle *style = gtk_widget_get_style (widget);
413
gdouble paper_height;
415
gdouble right_margin;
417
gdouble bottom_margin;
419
gint border = GTK_CONTAINER (widget)->border_width + 1;
421
print_preview_get_page_size (preview, &paper_width, &paper_height);
422
print_preview_get_page_margins (preview,
423
&left_margin, &right_margin,
424
&top_margin, &bottom_margin);
426
scale = print_preview_get_scale (preview);
428
cr = gdk_cairo_create (widget->window);
431
widget->allocation.x + border,
432
widget->allocation.y + border);
434
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
436
gint width = widget->allocation.width - 2 * border;
438
cairo_translate (cr, width - scale * paper_width, 0);
441
cairo_set_line_width (cr, 1.0);
443
/* draw page background */
444
cairo_rectangle (cr, 0, 0, scale * paper_width, scale * paper_height);
446
gdk_cairo_set_source_color (cr, &style->black);
447
cairo_stroke_preserve (cr);
449
gdk_cairo_set_source_color (cr, &style->white);
452
/* draw page_margins */
456
scale * (paper_width - left_margin - right_margin),
457
scale * (paper_height - top_margin - bottom_margin));
459
gdk_cairo_set_source_color (cr, &style->mid[widget->state]);
463
scale * (left_margin + preview->image_offset_x),
464
scale * (top_margin + preview->image_offset_y));
466
if (preview->dragging || preview->inside)
470
scale * preview->image_width,
471
scale * preview->image_height);
473
gdk_cairo_set_source_color (cr, &style->black);
477
if (preview->thumbnail == NULL &&
478
gimp_drawable_is_valid (preview->drawable->drawable_id))
481
print_preview_get_thumbnail (preview->drawable,
482
MIN (widget->allocation.width, 1024),
483
MIN (widget->allocation.height, 1024));
486
if (preview->thumbnail != NULL)
491
scale_x = (preview->image_width /
492
cairo_image_surface_get_width (preview->thumbnail));
493
scale_y = (preview->image_height /
494
cairo_image_surface_get_height (preview->thumbnail));
496
cairo_rectangle (cr, 0, 0, preview->image_width, preview->image_height);
498
cairo_scale (cr, scale_x * scale, scale_y * scale);
500
cairo_set_source_surface (cr, preview->thumbnail, 0, 0);
192
* gimp_print_preview_new:
193
511
* @page: page setup
194
512
* @drawable_id: the drawable to print
196
* Creates a new #GimpPrintPreview widget.
514
* Creates a new #PrintPreview widget.
198
* Return value: the new #GimpPrintPreview widget.
516
* Return value: the new #PrintPreview widget.
201
gimp_print_preview_new (GtkPageSetup *page,
519
print_preview_new (GtkPageSetup *page,
204
GimpPrintPreview *preview;
207
preview = g_object_new (GIMP_TYPE_PRINT_PREVIEW, NULL);
522
PrintPreview *preview;
524
g_return_val_if_fail (GTK_IS_PAGE_SETUP (page), NULL);
526
preview = g_object_new (PRINT_TYPE_PREVIEW, NULL);
209
528
preview->drawable = gimp_drawable_get (drawable_id);
212
preview->page = gtk_page_setup_copy (page);
214
preview->page = gtk_page_setup_new ();
216
ratio = (gtk_page_setup_get_paper_width (preview->page, GTK_UNIT_POINTS) /
217
gtk_page_setup_get_paper_height (preview->page, GTK_UNIT_POINTS));
219
gtk_aspect_frame_set (GTK_ASPECT_FRAME (preview), 0.5, 0.5, ratio, FALSE);
221
gtk_widget_set_size_request (preview->area,
222
DRAWING_AREA_SIZE, DRAWING_AREA_SIZE);
530
print_preview_set_page_setup (preview, page);
224
532
return GTK_WIDGET (preview);
228
* gimp_print_preview_set_image_dpi:
229
* @preview: a #GimpPrintPreview.
536
* print_preview_set_image_dpi:
537
* @preview: a #PrintPreview.
230
538
* @xres: the X resolution
231
539
* @yres: the Y resolution
233
541
* Sets the resolution of the image/drawable displayed by the
237
gimp_print_preview_set_image_dpi (GimpPrintPreview *preview,
545
print_preview_set_image_dpi (PrintPreview *preview,
241
g_return_if_fail (GIMP_IS_PRINT_PREVIEW (preview));
243
if (preview->image_xres != xres || preview->image_yres != yres)
552
g_return_if_fail (PRINT_IS_PREVIEW (preview));
553
g_return_if_fail (xres > 0.0 && yres > 0.0);
555
width = preview->drawable->width * 72.0 / xres;
556
height = preview->drawable->height * 72.0 / yres;
558
if (width != preview->image_width || height != preview->image_height)
245
preview->image_xres = xres;
246
preview->image_yres = yres;
560
preview->image_width = width;
561
preview->image_height = height;
248
print_preview_queue_draw (preview);
563
gtk_widget_queue_draw (GTK_WIDGET (preview));
253
* gimp_print_preview_set_page_setup:
254
* @preview: a #GimpPrintPreview.
568
* print_preview_set_page_setup:
569
* @preview: a #PrintPreview.
255
570
* @page: the page setup to use
257
* Sets the page setup to use by the #GimpPrintPreview.
572
* Sets the page setup to use by the #PrintPreview.
260
gimp_print_preview_set_page_setup (GimpPrintPreview *preview,
575
print_preview_set_page_setup (PrintPreview *preview,
578
g_return_if_fail (PRINT_IS_PREVIEW (preview));
579
g_return_if_fail (GTK_IS_PAGE_SETUP (page));
265
581
if (preview->page)
266
582
g_object_unref (preview->page);
268
584
preview->page = gtk_page_setup_copy (page);
270
ratio = (gtk_page_setup_get_paper_width (page, GTK_UNIT_POINTS) /
271
gtk_page_setup_get_paper_height (page, GTK_UNIT_POINTS));
273
gtk_aspect_frame_set (GTK_ASPECT_FRAME (preview), 0.5, 0.5, ratio, FALSE);
275
print_preview_queue_draw (preview);
586
gtk_widget_queue_resize (GTK_WIDGET (preview));
279
* gimp_print_preview_set_image_offsets:
280
* @preview: a #GimpPrintPreview.
590
* print_preview_set_image_offsets:
591
* @preview: a #PrintPreview.
281
592
* @offset_x: the X offset
282
593
* @offset_y: the Y offset
284
* Sets the offsets of the image/drawable displayed by the #GimpPrintPreview.
595
* Sets the offsets of the image/drawable displayed by the #PrintPreview.
285
596
* It does not emit the "offsets-changed" signal.
288
gimp_print_preview_set_image_offsets (GimpPrintPreview *preview,
599
print_preview_set_image_offsets (PrintPreview *preview,
292
g_return_if_fail (GIMP_IS_PRINT_PREVIEW (preview));
603
g_return_if_fail (PRINT_IS_PREVIEW (preview));
294
605
preview->image_offset_x = offset_x;
295
606
preview->image_offset_y = offset_y;
297
print_preview_queue_draw (preview);
608
gtk_widget_queue_draw (GTK_WIDGET (preview));
301
* gimp_print_preview_set_image_offsets_max:
302
* @preview: a #GimpPrintPreview.
612
* print_preview_set_image_offsets_max:
613
* @preview: a #PrintPreview.
303
614
* @offset_x_max: the maximum X offset allowed
304
615
* @offset_y_max: the maximum Y offset allowed
306
617
* Sets the maximum offsets of the image/drawable displayed by the
307
* #GimpPrintPreview. It does not emit the "offsets-changed" signal.
618
* #PrintPreview. It does not emit the "offsets-changed" signal.
310
gimp_print_preview_set_image_offsets_max (GimpPrintPreview *preview,
311
gdouble offset_x_max,
312
gdouble offset_y_max)
621
print_preview_set_image_offsets_max (PrintPreview *preview,
622
gdouble offset_x_max,
623
gdouble offset_y_max)
314
g_return_if_fail (GIMP_IS_PRINT_PREVIEW (preview));
625
g_return_if_fail (PRINT_IS_PREVIEW (preview));
316
627
preview->image_offset_x_max = offset_x_max;
317
628
preview->image_offset_y_max = offset_y_max;
319
print_preview_queue_draw (preview);
630
gtk_widget_queue_draw (GTK_WIDGET (preview));
323
* gimp_print_preview_set_use_full_page:
324
* @preview: a #GimpPrintPreview.
634
* print_preview_set_use_full_page:
635
* @preview: a #PrintPreview.
325
636
* @full_page: TRUE to ignore the page margins
327
638
* If @full_page is TRUE, the page margins are ignored and the full page
328
639
* can be used to setup printing.
331
gimp_print_preview_set_use_full_page (GimpPrintPreview *preview,
642
print_preview_set_use_full_page (PrintPreview *preview,
334
g_return_if_fail (GIMP_IS_PRINT_PREVIEW (preview));
645
g_return_if_fail (PRINT_IS_PREVIEW (preview));
336
647
preview->use_full_page = full_page;
338
print_preview_queue_draw (preview);
649
gtk_widget_queue_draw (GTK_WIDGET (preview));
653
print_preview_is_inside (PrintPreview *preview,
657
GtkWidget *widget = GTK_WIDGET (preview);
659
gdouble right_margin;
661
gdouble bottom_margin;
663
gint border = GTK_CONTAINER (widget)->border_width + 1;
667
scale = print_preview_get_scale (preview);
669
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
672
gdouble paper_height;
673
gint width = widget->allocation.width - 2 * border;
675
print_preview_get_page_size (preview, &paper_width, &paper_height);
677
x -= width - scale * paper_width;
680
print_preview_get_page_margins (preview,
681
&left_margin, &right_margin,
682
&top_margin, &bottom_margin);
684
x = x / scale - left_margin;
685
y = y / scale - top_margin;
687
return (x > preview->image_offset_x &&
688
x < preview->image_offset_x + preview->image_width &&
689
y > preview->image_offset_y &&
690
y < preview->image_offset_y + preview->image_height);
342
gimp_print_preview_realize (GtkWidget *widget)
346
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
348
gdk_window_set_cursor (widget->window, cursor);
349
gdk_cursor_unref (cursor);
353
gimp_print_preview_event (GtkWidget *widget,
355
GimpPrintPreview *preview)
357
static gdouble orig_offset_x = 0.0;
358
static gdouble orig_offset_y = 0.0;
359
static gint start_x = 0;
360
static gint start_y = 0;
368
case GDK_BUTTON_PRESS:
369
gdk_pointer_grab (widget->window, FALSE,
370
(GDK_BUTTON1_MOTION_MASK |
371
GDK_BUTTON_RELEASE_MASK),
372
NULL, NULL, event->button.time);
374
orig_offset_x = preview->image_offset_x;
375
orig_offset_y = preview->image_offset_y;
377
start_x = event->button.x;
378
start_y = event->button.y;
380
preview->dragging = TRUE;
383
case GDK_MOTION_NOTIFY:
384
scale = gimp_print_preview_get_scale (preview);
386
offset_x = (orig_offset_x + (event->motion.x - start_x) / scale);
387
offset_y = (orig_offset_y + (event->motion.y - start_y) / scale);
389
offset_x = CLAMP (offset_x, 0, preview->image_offset_x_max);
390
offset_y = CLAMP (offset_y, 0, preview->image_offset_y_max);
392
if (preview->image_offset_x != offset_x ||
393
preview->image_offset_y != offset_y)
395
gimp_print_preview_set_image_offsets (preview, offset_x, offset_y);
397
g_signal_emit (preview,
398
gimp_print_preview_signals[OFFSETS_CHANGED], 0,
399
preview->image_offset_x, preview->image_offset_y);
403
case GDK_BUTTON_RELEASE:
404
gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
406
start_x = start_y = 0;
407
preview->dragging = FALSE;
409
print_preview_queue_draw (preview);
420
gimp_print_preview_expose_event (GtkWidget *widget,
421
GdkEventExpose *eevent,
422
GimpPrintPreview *preview)
425
gdouble paper_height;
427
gdouble right_margin;
429
gdouble bottom_margin;
433
paper_width = gtk_page_setup_get_paper_width (preview->page,
435
paper_height = gtk_page_setup_get_paper_height (preview->page,
437
gimp_print_preview_get_page_margins (preview,
443
cr = gdk_cairo_create (widget->window);
445
scale = gimp_print_preview_get_scale (preview);
447
/* draw background */
448
cairo_scale (cr, scale, scale);
449
gdk_cairo_set_source_color (cr, &widget->style->white);
450
cairo_rectangle (cr, 0, 0, paper_width, paper_height);
453
/* draw page_margins */
454
gdk_cairo_set_source_color (cr, &widget->style->black);
458
paper_width - left_margin - right_margin,
459
paper_height - top_margin - bottom_margin);
462
if (preview->dragging)
464
gdouble width = preview->drawable->width;
465
gdouble height = preview->drawable->height;
468
left_margin + preview->image_offset_x,
469
top_margin + preview->image_offset_y,
470
width * 72.0 / preview->image_xres,
471
height * 72.0 / preview->image_yres);
476
gint32 drawable_id = preview->drawable->drawable_id;
480
left_margin + preview->image_offset_x,
481
top_margin + preview->image_offset_y);
483
if (preview->pixbuf == NULL && gimp_drawable_is_valid (drawable_id))
485
gint width = MIN (widget->allocation.width, 1024);
486
gint height = MIN (widget->allocation.height, 1024);
488
preview->pixbuf = gimp_drawable_get_thumbnail (drawable_id,
490
GIMP_PIXBUF_KEEP_ALPHA);
493
if (preview->pixbuf != NULL)
495
gdouble scale_x = ((gdouble) preview->drawable->width /
496
gdk_pixbuf_get_width (preview->pixbuf));
497
gdouble scale_y = ((gdouble) preview->drawable->height /
498
gdk_pixbuf_get_height (preview->pixbuf));
500
if (scale_x < scale_y)
505
scale_x = scale_x * 72.0 / preview->image_xres;
506
scale_y = scale_y * 72.0 / preview->image_yres;
508
cairo_scale (cr, scale_x, scale_y);
510
gdk_cairo_set_source_pixbuf (cr, preview->pixbuf, 0, 0);
694
print_preview_set_inside (PrintPreview *preview,
697
if (inside != preview->inside)
699
GtkWidget *widget = GTK_WIDGET (preview);
701
preview->inside = inside;
703
if (GTK_WIDGET_DRAWABLE (widget))
704
gdk_window_set_cursor (widget->window,
705
inside ? preview->cursor : NULL);
707
gtk_widget_queue_draw (widget);
522
gimp_print_preview_get_scale (GimpPrintPreview* preview)
712
print_preview_get_scale (PrintPreview *preview)
527
scale_x = ((gdouble) preview->area->allocation.width /
528
gtk_page_setup_get_paper_width (preview->page, GTK_UNIT_POINTS));
530
scale_y = ((gdouble) preview->area->allocation.height /
531
gtk_page_setup_get_paper_height (preview->page, GTK_UNIT_POINTS));
714
GtkWidget *widget = GTK_WIDGET (preview);
716
gdouble paper_height;
719
gint border = GTK_CONTAINER (widget)->border_width + 1;
721
print_preview_get_page_size (preview, &paper_width, &paper_height);
723
scale_x = (gdouble) (widget->allocation.width - 2 * border) / paper_width;
724
scale_y = (gdouble) (widget->allocation.height - 2 * border) / paper_height;
533
726
return MIN (scale_x, scale_y);
537
gimp_print_preview_size_allocate (GtkWidget *widget,
538
GtkAllocation *allocation,
539
GimpPrintPreview *preview)
730
print_preview_get_page_size (PrintPreview *preview,
731
gdouble *paper_width,
732
gdouble *paper_height)
541
if (preview->pixbuf != NULL)
543
g_object_unref (preview->pixbuf);
544
preview->pixbuf = NULL;
734
*paper_width = gtk_page_setup_get_paper_width (preview->page,
736
*paper_height = gtk_page_setup_get_paper_height (preview->page,
549
gimp_print_preview_get_page_margins (GimpPrintPreview *preview,
550
gdouble *left_margin,
551
gdouble *right_margin,
553
gdouble *bottom_margin)
741
print_preview_get_page_margins (PrintPreview *preview,
742
gdouble *left_margin,
743
gdouble *right_margin,
745
gdouble *bottom_margin)
555
747
if (preview->use_full_page)