*
* print.c: Print module
*
- * Copyright (C) 2001 Jim Evins <evins@snaught.com>.
+ * Copyright (C) 2001-2003 Jim Evins <evins@snaught.com>.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
/* remember state of dialog. */
static gboolean outline_flag = FALSE;
static gboolean reverse_flag = FALSE;
+static gboolean crop_marks_flag = FALSE;
static gboolean collate_flag = FALSE;
static gint first = 1, last = 1, n_sheets = 0, n_copies = 1;
gint response,
glLabel *label);
-static void print_sheets (GnomePrintConfig *config, glLabel * label,
- gboolean preview_flag,
- gint n_sheets, gint first, gint last,
- gboolean outline_flag, gboolean reverse_flag);
-
-static void print_sheets_merge (GnomePrintConfig *config, glLabel * label,
- gboolean preview_flag,
- gint n_copies, gint first,
- gboolean collate_flag,
- gboolean outline_flag, gboolean reverse_flag);
+static void print_sheets (GnomePrintConfig *config,
+ glLabel *label,
+ gboolean preview_flag,
+ gint n_sheets,
+ gint first,
+ gint last,
+ gboolean outline_flag,
+ gboolean reverse_flag,
+ gboolean crop_marks_flag);
+
+static void print_sheets_merge (GnomePrintConfig *config,
+ glLabel *label,
+ gboolean preview_flag,
+ gint n_copies,
+ gint first,
+ gboolean collate_flag,
+ gboolean outline_flag,
+ gboolean reverse_flag,
+ gboolean crop_marks_flag);
\f
/*****************************************************************************/
glMerge *merge;
GtkWidget *wframe;
GtkWidget *copies = NULL, *prmerge = NULL;
- GtkWidget *wvbox, *outline_check, *reverse_check;
+ GtkWidget *wvbox, *outline_check, *reverse_check, *crop_marks_check;
gint n_records;
vbox = gl_hig_vbox_new (GL_HIG_VBOX_OUTER);
reverse_flag);
g_object_set_data (G_OBJECT(dlg), "reverse_check", reverse_check);
+ /* add Crop marks check button */
+ crop_marks_check =
+ gtk_check_button_new_with_label (_("print crop marks"));
+ gl_hig_category_add_widget (GL_HIG_CATEGORY(wframe), crop_marks_check);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (crop_marks_check),
+ crop_marks_flag);
+ g_object_set_data (G_OBJECT(dlg), "crop_marks_check", crop_marks_check);
+
gtk_widget_show_all (wframe);
return vbox;
glLabel *label)
{
GtkWidget *copies, *prmerge;
- GtkWidget *outline_check, *reverse_check;
+ GtkWidget *outline_check, *reverse_check, *crop_marks_check;
GtkWidget *printer_select;
GnomePrintConfig *config;
glMerge *merge;
"outline_check");
reverse_check = g_object_get_data (G_OBJECT(dlg),
"reverse_check");
+ crop_marks_check = g_object_get_data (G_OBJECT(dlg),
+ "crop_marks_check");
printer_select = g_object_get_data (G_OBJECT(dlg),
"printer_select");
reverse_flag =
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
(reverse_check));
+ crop_marks_flag =
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+ (crop_marks_check));
merge = gl_label_get_merge (label);
print_sheets (config, label,
(response == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW),
n_sheets, first, last,
- outline_flag, reverse_flag);
+ outline_flag, reverse_flag, crop_marks_flag);
} else {
n_copies, first,
collate_flag,
outline_flag,
- reverse_flag);
+ reverse_flag,
+ crop_marks_flag);
g_object_unref (G_OBJECT(merge));
}
break;
gint first,
gint last,
gboolean outline_flag,
- gboolean reverse_flag)
+ gboolean reverse_flag,
+ gboolean crop_marks_flag)
{
GnomePrintJob *job;
+ glPrintFlags flags;
job = gnome_print_job_new (config);
- gl_print_simple (job, label, n_sheets, first, last,
- outline_flag, reverse_flag);
+ flags.outline = outline_flag;
+ flags.reverse = reverse_flag;
+ flags.crop_marks = crop_marks_flag;
+ gl_print_simple (job, label, n_sheets, first, last, &flags);
gnome_print_job_close (job);
if (preview_flag) {
gint first,
gboolean collate_flag,
gboolean outline_flag,
- gboolean reverse_flag)
+ gboolean reverse_flag,
+ gboolean crop_marks_flag)
{
GnomePrintJob *job;
+ glPrintFlags flags;
job = gnome_print_job_new (config);
+ flags.outline = outline_flag;
+ flags.reverse = reverse_flag;
+ flags.crop_marks = crop_marks_flag;
if ( collate_flag ) {
- gl_print_merge_collated (job, label,
- n_copies, first,
- outline_flag, reverse_flag);
+ gl_print_merge_collated (job, label, n_copies, first, &flags);
} else {
- gl_print_merge_uncollated (job, label,
- n_copies, first,
- outline_flag, reverse_flag);
+ gl_print_merge_uncollated (job, label, n_copies, first, &flags);
}
gnome_print_job_close (job);
#define ARC_FINE 2 /* Resolution in degrees of large arcs */
#define ARC_COURSE 5 /* Resolution in degrees of small arcs */
+#define TICK_OFFSET 2.25
+#define TICK_LENGTH 18.0
+
/*=========================================================================*/
/* Private types. */
/*=========================================================================*/
static void print_page_end (PrintInfo *pi);
+static void print_crop_marks (PrintInfo *pi);
+
static void print_label (PrintInfo *pi,
glLabel *label,
gdouble x,
gint n_sheets,
gint first,
gint last,
- gboolean outline_flag,
- gboolean reverse_flag)
+ glPrintFlags *flags)
{
PrintInfo *pi;
gint i_sheet, i_label;
for (i_sheet = 0; i_sheet < n_sheets; i_sheet++) {
print_page_begin (pi);
+ if (flags->crop_marks) {
+ print_crop_marks (pi);
+ }
for (i_label = first - 1; i_label < last; i_label++) {
print_label (pi, label,
origins[i_label].x, origins[i_label].y,
- NULL, outline_flag, reverse_flag);
+ NULL, flags->outline, flags->reverse);
}
glLabel *label,
gint n_copies,
gint first,
- gboolean outline_flag,
- gboolean reverse_flag)
+ glPrintFlags *flags)
{
glMerge *merge;
const GList *record_list;
if ((i_label == 0) || (i_sheet == 0)) {
i_sheet++;
print_page_begin (pi);
+ if (flags->crop_marks) {
+ print_crop_marks (pi);
+ }
}
print_label (pi, label,
origins[i_label].x,
origins[i_label].y,
record,
- outline_flag, reverse_flag);
+ flags->outline, flags->reverse);
i_label = (i_label + 1) % n_labels_per_page;
if (i_label == 0) {
glLabel *label,
gint n_copies,
gint first,
- gboolean outline_flag,
- gboolean reverse_flag)
+ glPrintFlags *flags)
{
glMerge *merge;
const GList *record_list;
if ((i_label == 0) || (i_sheet == 0)) {
i_sheet++;
print_page_begin (pi);
+ if (flags->crop_marks) {
+ print_crop_marks (pi);
+ }
}
print_label (pi, label,
origins[i_label].x,
origins[i_label].y,
record,
- outline_flag, reverse_flag);
+ flags->outline, flags->reverse);
i_label = (i_label + 1) % n_labels_per_page;
if (i_label == 0) {
glLabel *label,
gint n_sheets,
gint n_copies,
- gboolean outline_flag,
- gboolean reverse_flag)
+ glPrintFlags *flags)
{
gint n_per_page;
glMerge *merge;
if ( merge == NULL ) {
n_per_page = gl_template_get_n_labels(template);
- gl_print_simple (job, label, n_sheets, 1, n_per_page,
- outline_flag, reverse_flag);
+ gl_print_simple (job, label, n_sheets, 1, n_per_page, flags);
} else {
- gl_print_merge_collated (job, label, n_copies, 1,
- outline_flag, reverse_flag);
+ gl_print_merge_collated (job, label, n_copies, 1, flags);
}
gl_template_free (&template);
gl_debug (DEBUG_PRINT, "END");
}
+/*---------------------------------------------------------------------------*/
+/* PRIVATE. Print crop tick marks. */
+/*---------------------------------------------------------------------------*/
+static void
+print_crop_marks (PrintInfo *pi)
+{
+ gdouble w, h, page_w, page_h;
+ GList *p;
+ glTemplateLayout *layout;
+ gdouble xmin, ymin, xmax, ymax, dx, dy;
+ gdouble x1, y1, x2, y2, x3, y3, x4, y4;
+ gint ix, iy, nx, ny;
+
+ gl_debug (DEBUG_PRINT, "START");
+
+ gl_template_get_label_size (pi->template, &w, &h);
+
+ page_w = pi->page_width;
+ page_h = pi->page_height;
+
+ gnome_print_setrgbcolor (pi->pc, 0.25, 0.25, 0.25);
+ gnome_print_setopacity (pi->pc, 1.0);
+ gnome_print_setlinewidth (pi->pc, 0.25);
+
+ for (p=pi->template->label.any.layouts; p != NULL; p=p->next) {
+
+ layout = (glTemplateLayout *)p->data;
+
+ xmin = layout->x0;
+ ymin = layout->y0;
+ xmax = layout->x0 + layout->dx*(layout->nx - 1) + w;
+ ymax = layout->y0 + layout->dy*(layout->ny - 1) + h;
+
+ dx = layout->dx;
+ dy = layout->dy;
+
+ nx = layout->nx;
+ ny = layout->ny;
+
+ for (ix=0; ix < nx; ix++) {
+
+ x1 = xmin + ix*dx;
+ x2 = x1 + w;
+
+ y1 = MAX((ymin - TICK_OFFSET), 0.0);
+ y2 = MAX((y1 - TICK_LENGTH), 0.0);
+
+ y3 = MIN((ymax + TICK_OFFSET), page_h);
+ y4 = MIN((y3 + TICK_LENGTH), page_h);
+
+ gnome_print_moveto (pi->pc, x1, y1);
+ gnome_print_lineto (pi->pc, x1, y2);
+ gnome_print_stroke (pi->pc);
+
+ gnome_print_moveto (pi->pc, x2, y1);
+ gnome_print_lineto (pi->pc, x2, y2);
+ gnome_print_stroke (pi->pc);
+
+ gnome_print_moveto (pi->pc, x1, y3);
+ gnome_print_lineto (pi->pc, x1, y4);
+ gnome_print_stroke (pi->pc);
+
+ gnome_print_moveto (pi->pc, x2, y3);
+ gnome_print_lineto (pi->pc, x2, y4);
+ gnome_print_stroke (pi->pc);
+
+ }
+
+ for (iy=0; iy < ny; iy++) {
+
+ y1 = ymin + iy*dy;
+ y2 = y1 + h;
+
+ x1 = MAX((xmin - TICK_OFFSET), 0.0);
+ x2 = MAX((x1 - TICK_LENGTH), 0.0);
+
+ x3 = MIN((xmax + TICK_OFFSET), page_w);
+ x4 = MIN((x3 + TICK_LENGTH), page_w);
+
+ gnome_print_moveto (pi->pc, x1, y1);
+ gnome_print_lineto (pi->pc, x2, y1);
+ gnome_print_stroke (pi->pc);
+
+ gnome_print_moveto (pi->pc, x1, y2);
+ gnome_print_lineto (pi->pc, x2, y2);
+ gnome_print_stroke (pi->pc);
+
+ gnome_print_moveto (pi->pc, x3, y1);
+ gnome_print_lineto (pi->pc, x4, y1);
+ gnome_print_stroke (pi->pc);
+
+ gnome_print_moveto (pi->pc, x3, y2);
+ gnome_print_lineto (pi->pc, x4, y2);
+ gnome_print_stroke (pi->pc);
+
+ }
+
+ }
+
+ gl_debug (DEBUG_PRINT, "END");
+}
+
/*---------------------------------------------------------------------------*/
/* PRIVATE. Print i'th label. */
/*---------------------------------------------------------------------------*/
gl_debug (DEBUG_PRINT, "END");
}
-