summaryrefslogtreecommitdiff
path: root/filter/bannertops.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/bannertops.c')
-rw-r--r--filter/bannertops.c1094
1 files changed, 0 insertions, 1094 deletions
diff --git a/filter/bannertops.c b/filter/bannertops.c
deleted file mode 100644
index c017c5f3..00000000
--- a/filter/bannertops.c
+++ /dev/null
@@ -1,1094 +0,0 @@
-/*
- * "$Id: bannertops.c 9793 2011-05-20 03:49:49Z mike $"
- *
- * Banner to PostScript filter for CUPS.
- *
- * Copyright 2008-2011 by Apple Inc.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * main() - Generate PostScript cover pages.
- * load_banner() - Load the banner file.
- * ps_ascii85() - Print binary data as a series of base-85 numbers.
- * write_banner() - Write a banner page...
- * write_epilogue() - Write the PostScript file epilogue.
- * write_prolog() - Write the PostScript file prolog with options.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "pstext.h"
-#include "image.h"
-#include <cups/language-private.h>
-
-
-/*
- * Constants...
- */
-
-#define SHOW_IMAGEABLE_AREA 1 /* Show imageable area */
-#define SHOW_JOB_BILLING 2 /* Show billing string */
-#define SHOW_JOB_ID 4 /* Show job ID */
-#define SHOW_JOB_NAME 8 /* Show job title */
-#define SHOW_JOB_ORIGINATING_USER_NAME 16 /* Show owner of job */
-#define SHOW_JOB_ORIGINATING_HOST_NAME 32 /* Show submitting system */
-#define SHOW_JOB_UUID 64 /* Show job UUID */
-#define SHOW_OPTIONS 128 /* Show print options */
-#define SHOW_PAPER_NAME 256 /* Show paper size name */
-#define SHOW_PAPER_SIZE 512 /* Show paper dimensions */
-#define SHOW_PRINTER_DRIVER_NAME 1024 /* Show printer driver name */
-#define SHOW_PRINTER_DRIVER_VERSION 2048 /* Show printer driver version */
-#define SHOW_PRINTER_INFO 4096 /* Show printer description */
-#define SHOW_PRINTER_LOCATION 8192 /* Show printer location */
-#define SHOW_PRINTER_MAKE_AND_MODEL 16384 /* Show printer make and model */
-#define SHOW_PRINTER_NAME 32768 /* Show printer queue ID */
-#define SHOW_TIME_AT_CREATION 65536 /* Show date/time when submitted */
-#define SHOW_TIME_AT_PROCESSING 131072 /* Show date/time when printed */
-
-
-/*
- * Structures...
- */
-
-typedef struct banner_file_s /**** Banner file data ****/
-{
- int show; /* What to show */
- char *header, /* Header text */
- *footer; /* Footer text */
- cups_array_t *notices, /* Notices to show */
- *images; /* Images to show */
-} banner_file_t;
-
-
-/*
- * Local functions...
- */
-
-static banner_file_t *load_banner(const char *filename);
-static int write_banner(banner_file_t *banner, ppd_file_t *ppd,
- ps_text_t *fonts, int job_id,
- const char *title, const char *username,
- int num_options, cups_option_t *options);
-static void write_epilogue(int num_pages);
-static ps_text_t *write_prolog(const char *title, const char *user);
-
-
-/*
- * 'main()' - Generate PostScript cover pages.
- */
-
-int /* O - Exit status */
-main(int argc, /* I - Number of command-line args */
- char *argv[]) /* I - Command-line arguments */
-{
- banner_file_t *banner; /* Banner file data */
- int num_options; /* Number of print options */
- cups_option_t *options; /* Print options */
- ppd_file_t *ppd; /* PPD file */
- ps_text_t *fonts; /* Fonts for output */
- int job_id; /* Job ID from command-line */
- const char *title, /* Title from command-line */
- *username; /* Username from command-line */
- int num_pages; /* Number of pages printed */
-
-
- /*
- * Make sure status messages are not buffered...
- */
-
- setbuf(stderr, NULL);
-
- /*
- * Check command-line...
- */
-
- if (argc < 6 || argc > 7)
- {
- _cupsLangPrintf(stderr,
- _("Usage: %s job-id user title copies options file"),
- argv[0]);
- return (1);
- }
-
- /*
- * Get stuff from command-line...
- */
-
- job_id = atoi(argv[1]);
- username = argv[2];
- title = argv[3];
- options = NULL;
- num_options = cupsParseOptions(argv[5], 0, &options);
- banner = load_banner(argv[6]);
-
- /*
- * Set standard options and get the PPD file for this printer...
- */
-
- ppd = SetCommonOptions(num_options, options, 1);
-
- /*
- * Write a PostScript banner document and return...
- */
-
- fonts = write_prolog(title, username);
- num_pages = write_banner(banner, ppd, fonts, job_id, title, username,
- num_options, options);
-
- write_epilogue(num_pages);
-
- return (0);
-}
-
-
-/*
- * 'load_banner()' - Load the banner file.
- */
-
-static banner_file_t * /* O - Banner file data */
-load_banner(const char *filename) /* I - Filename or NULL for stdin */
-{
- cups_file_t *fp; /* File */
- char line[2048], /* Line buffer */
- *ptr; /* Pointer into line */
- int linenum; /* Current line number */
- banner_file_t *banner; /* Banner file data */
- const char *cups_docroot; /* CUPS_DOCROOT environment variable */
-
-
- fprintf(stderr, "DEBUG: load_banner(filename=\"%s\")\n",
- filename ? filename : "(stdin)");
-
- /*
- * Open the banner file...
- */
-
- if (filename)
- fp = cupsFileOpen(filename, "r");
- else
- fp = cupsFileStdin();
-
- if (!fp)
- {
- _cupsLangPrintError("ERROR", _("Unable to open print file"));
- exit(1);
- }
-
- /*
- * Read the banner file...
- */
-
- if ((cups_docroot = getenv("CUPS_DOCROOT")) == NULL)
- cups_docroot = CUPS_DOCROOT;
-
- banner = calloc(1, sizeof(banner_file_t));
- linenum = 0;
-
- while (cupsFileGets(fp, line, sizeof(line)))
- {
- /*
- * Skip blank and comment lines...
- */
-
- linenum ++;
-
- fprintf(stderr, "DEBUG: %4d %s\n", linenum, line);
-
- if (line[0] == '#' || !line[0])
- continue;
-
- /*
- * Break the line into keyword and value parts...
- */
-
- for (ptr = line; *ptr && !isspace(*ptr & 255); ptr ++);
-
- while (isspace(*ptr & 255))
- *ptr++ = '\0';
-
- if (!*ptr)
- {
- _cupsLangPrintFilter(stderr, "ERROR",
- _("Missing value on line %d of banner file."),
- linenum);
- continue;
- }
-
- /*
- * Save keyword values in the appropriate places...
- */
-
- if (!_cups_strcasecmp(line, "Footer"))
- {
- if (banner->footer)
- fprintf(stderr, "DEBUG: Extra \"Footer\" on line %d of banner file\n",
- linenum);
- else
- banner->footer = strdup(ptr);
- }
- else if (!_cups_strcasecmp(line, "Header"))
- {
- if (banner->header)
- fprintf(stderr, "DEBUG: Extra \"Header\" on line %d of banner file\n",
- linenum);
- else
- banner->header = strdup(ptr);
- }
- else if (!_cups_strcasecmp(line, "Image"))
- {
- char imagefile[1024]; /* Image filename */
-
-
- if (ptr[0] == '/')
- strlcpy(imagefile, ptr, sizeof(imagefile));
- else
- snprintf(imagefile, sizeof(imagefile), "%s/%s", cups_docroot, ptr);
-
- if (access(imagefile, R_OK))
- {
- fprintf(stderr, "DEBUG: Image \"%s\" on line %d of banner file: %s\n",
- ptr, linenum, strerror(errno));
- }
- else
- {
- if (!banner->images)
- banner->images = cupsArrayNew(NULL, NULL);
-
- cupsArrayAdd(banner->images, strdup(imagefile));
- }
- }
- else if (!_cups_strcasecmp(line, "Notice"))
- {
- if (!banner->notices)
- banner->notices = cupsArrayNew(NULL, NULL);
-
- cupsArrayAdd(banner->notices, strdup(ptr));
- }
- else if (!_cups_strcasecmp(line, "Show"))
- {
- char *value; /* Current value */
-
-
- for (value = ptr; *value; value = ptr)
- {
- /*
- * Find the end of the current value
- */
-
- while (*ptr && !isspace(*ptr & 255))
- ptr ++;
-
- while (*ptr && isspace(*ptr & 255))
- *ptr++ = '\0';
-
- /*
- * Add the value to the show flags...
- */
- if (!_cups_strcasecmp(value, "imageable-area"))
- banner->show |= SHOW_IMAGEABLE_AREA;
- else if (!_cups_strcasecmp(value, "job-billing"))
- banner->show |= SHOW_JOB_BILLING;
- else if (!_cups_strcasecmp(value, "job-id"))
- banner->show |= SHOW_JOB_ID;
- else if (!_cups_strcasecmp(value, "job-name"))
- banner->show |= SHOW_JOB_NAME;
- else if (!_cups_strcasecmp(value, "job-originating-host-name"))
- banner->show |= SHOW_JOB_ORIGINATING_HOST_NAME;
- else if (!_cups_strcasecmp(value, "job-originating-user-name"))
- banner->show |= SHOW_JOB_ORIGINATING_USER_NAME;
- else if (!_cups_strcasecmp(value, "job-uuid"))
- banner->show |= SHOW_JOB_UUID;
- else if (!_cups_strcasecmp(value, "options"))
- banner->show |= SHOW_OPTIONS;
- else if (!_cups_strcasecmp(value, "paper-name"))
- banner->show |= SHOW_PAPER_NAME;
- else if (!_cups_strcasecmp(value, "paper-size"))
- banner->show |= SHOW_PAPER_SIZE;
- else if (!_cups_strcasecmp(value, "printer-driver-name"))
- banner->show |= SHOW_PRINTER_DRIVER_NAME;
- else if (!_cups_strcasecmp(value, "printer-driver-version"))
- banner->show |= SHOW_PRINTER_DRIVER_VERSION;
- else if (!_cups_strcasecmp(value, "printer-info"))
- banner->show |= SHOW_PRINTER_INFO;
- else if (!_cups_strcasecmp(value, "printer-location"))
- banner->show |= SHOW_PRINTER_LOCATION;
- else if (!_cups_strcasecmp(value, "printer-make-and-model"))
- banner->show |= SHOW_PRINTER_MAKE_AND_MODEL;
- else if (!_cups_strcasecmp(value, "printer-name"))
- banner->show |= SHOW_PRINTER_NAME;
- else if (!_cups_strcasecmp(value, "time-at-creation"))
- banner->show |= SHOW_TIME_AT_CREATION;
- else if (!_cups_strcasecmp(value, "time-at-processing"))
- banner->show |= SHOW_TIME_AT_PROCESSING;
- else
- {
- fprintf(stderr,
- "DEBUG: Unknown \"Show\" value \"%s\" on line %d of banner "
- "file\n", value, linenum);
- }
- }
- }
- else
- fprintf(stderr, "DEBUG: Unknown key \"%s\" on line %d of banner file\n",
- line, linenum);
- }
-
- if (filename)
- cupsFileClose(fp);
-
- return (banner);
-}
-
-
-/*
- * 'ps_ascii85()' - Print binary data as a series of base-85 numbers.
- */
-
-static void
-ps_ascii85(cups_ib_t *data, /* I - Data to print */
- int length, /* I - Number of bytes to print */
- int last_line) /* I - Last line of raster data? */
-{
- unsigned b; /* Binary data word */
- unsigned char c[5]; /* ASCII85 encoded chars */
- static int col = 0; /* Current column */
-
-
- while (length > 3)
- {
- b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3];
-
- if (b == 0)
- {
- putchar('z');
- col ++;
- }
- else
- {
- c[4] = (b % 85) + '!';
- b /= 85;
- c[3] = (b % 85) + '!';
- b /= 85;
- c[2] = (b % 85) + '!';
- b /= 85;
- c[1] = (b % 85) + '!';
- b /= 85;
- c[0] = b + '!';
-
- fwrite(c, 5, 1, stdout);
- col += 5;
- }
-
- data += 4;
- length -= 4;
-
- if (col >= 75)
- {
- putchar('\n');
- col = 0;
- }
- }
-
- if (last_line)
- {
- if (length > 0)
- {
- memset(data + length, 0, 4 - length);
- b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3];
-
- c[4] = (b % 85) + '!';
- b /= 85;
- c[3] = (b % 85) + '!';
- b /= 85;
- c[2] = (b % 85) + '!';
- b /= 85;
- c[1] = (b % 85) + '!';
- b /= 85;
- c[0] = b + '!';
-
- fwrite(c, length + 1, 1, stdout);
- }
-
- puts("~>");
- col = 0;
- }
-}
-
-
-/*
- * 'write_banner()' - Write a banner page...
- */
-
-static int /* O - Number of pages */
-write_banner(banner_file_t *banner, /* I - Banner file */
- ppd_file_t *ppd, /* I - PPD file */
- ps_text_t *fonts, /* I - Fonts */
- int job_id, /* I - Job ID */
- const char *title, /* I - Title of job */
- const char *username, /* I - Owner of job */
- int num_options, /* I - Number of options */
- cups_option_t *options) /* I - Options */
-{
- char *notice; /* Current notice */
- char *imagefile; /* Current image file */
- cups_array_t *images; /* Images */
- cups_image_t *image; /* Current image */
- const char *option; /* Option value */
- int i, j; /* Looping vars */
- float x, /* Current X position */
- y; /* Current Y position */
- cups_lang_t *language; /* Default language */
- int showlines; /* Number of lines to show */
- float fontsize; /* Font size to use */
- int num_pages; /* Number of pages */
- float print_width, /* Printable width of page */
- print_height, /* Printable height of page */
- info_top, /* Top of info fields */
- info_height, /* Height of info fields */
- line_height, /* Height of info lines */
- notices_height, /* Height of all notices */
- images_width, /* Width of all images */
- images_height, /* Height of all images */
- total_height; /* Height of all content */
- char text[1024]; /* Formatted field text */
-
-
- /*
- * Figure out how many lines of text will be shown...
- */
-
- showlines = 0;
- if (banner->show & SHOW_IMAGEABLE_AREA)
- showlines += 2;
- if (banner->show & SHOW_JOB_BILLING)
- showlines ++;
- if (banner->show & SHOW_JOB_ID)
- showlines ++;
- if (banner->show & SHOW_JOB_NAME)
- showlines ++;
- if (banner->show & SHOW_JOB_ORIGINATING_USER_NAME)
- showlines ++;
- if (banner->show & SHOW_JOB_ORIGINATING_HOST_NAME)
- showlines ++;
- if (banner->show & SHOW_JOB_UUID)
- showlines ++;
- if (banner->show & SHOW_OPTIONS)
- {
- for (j = 0; j < num_options; j ++)
- {
- if (_cups_strcasecmp("media", options[j].name) &&
- _cups_strcasecmp("PageSize", options[j].name) &&
- _cups_strcasecmp("PageRegion", options[j].name) &&
- _cups_strcasecmp("InputSlot", options[j].name) &&
- _cups_strcasecmp("MediaType", options[j].name) &&
- _cups_strcasecmp("finishings", options[j].name) &&
- _cups_strcasecmp("sides", options[j].name) &&
- _cups_strcasecmp("Duplex", options[j].name) &&
- _cups_strcasecmp("orientation-requested", options[j].name) &&
- _cups_strcasecmp("landscape", options[j].name) &&
- _cups_strcasecmp("number-up", options[j].name) &&
- _cups_strcasecmp("OutputOrder", options[j].name))
- continue;
-
- showlines ++;
- }
- }
- if (banner->show & SHOW_PAPER_NAME)
- showlines ++;
- if (banner->show & SHOW_PAPER_SIZE)
- showlines += 2;
- if (banner->show & SHOW_PRINTER_DRIVER_NAME)
- showlines ++;
- if (banner->show & SHOW_PRINTER_DRIVER_VERSION)
- showlines ++;
- if (banner->show & SHOW_PRINTER_INFO)
- showlines ++;
- if (banner->show & SHOW_PRINTER_LOCATION)
- showlines ++;
- if (banner->show & SHOW_PRINTER_MAKE_AND_MODEL)
- showlines ++;
- if (banner->show & SHOW_PRINTER_NAME)
- showlines ++;
- if (banner->show & SHOW_TIME_AT_CREATION)
- showlines ++;
- if (banner->show & SHOW_TIME_AT_PROCESSING)
- showlines ++;
-
- /*
- * Figure out the dimensions and positions of everything...
- */
-
- print_width = PageRight - PageLeft;
- print_height = PageTop - PageBottom;
- fontsize = print_height / 60; /* Nominally 12pts */
- line_height = 1.2 * fontsize;
- info_height = showlines * line_height;
- notices_height = cupsArrayCount(banner->notices) * line_height;
-
- if (cupsArrayCount(banner->images))
- {
- images = cupsArrayNew(NULL, NULL);
- images_height = print_height / 10; /* Nominally 1" */
-
- for (imagefile = (char *)cupsArrayFirst(banner->images), images_width = 0.0;
- imagefile;
- imagefile = (char *)cupsArrayNext(banner->images))
- {
- if ((image = cupsImageOpen(imagefile, ColorDevice ? CUPS_IMAGE_RGB_CMYK :
- CUPS_IMAGE_WHITE,
- CUPS_IMAGE_WHITE, 100, 0, NULL)) == NULL)
- {
- fprintf(stderr, "DEBUG: Unable to open image file \"%s\"\n",
- imagefile);
- continue;
- }
-
- images_width += cupsImageGetWidth(image) * images_height /
- cupsImageGetHeight(image);
- cupsArrayAdd(images, image);
- }
- }
- else
- {
- images = NULL;
- images_height = 0;
- images_width = 0;
- }
-
- total_height = info_height + notices_height + images_height;
- if (cupsArrayCount(banner->notices) && showlines)
- total_height += 2 * line_height;
- if (cupsArrayCount(banner->images) &&
- (showlines || cupsArrayCount(banner->notices)))
- total_height += 2 * line_height;
-
- info_top = 0.5 * (print_height + total_height);
-
- /*
- * Write the page(s)...
- */
-
- language = cupsLangDefault();
- num_pages = Duplex ? 2 : 1;
-
- for (i = 1; i <= num_pages; i ++)
- {
- /*
- * Start the page...
- */
-
- printf("%%%%Page: %s %d\n", i == 1 ? "coverpage" : "coverback", i);
- puts("gsave");
- if (i == 1)
- printf("%.1f %.1f translate\n", PageLeft, PageBottom);
- else
- printf("%.1f %.1f translate\n", PageWidth - PageRight,
- PageLength - PageTop);
- puts("0 setgray");
-
- y = info_top;
-
- /*
- * Information...
- */
-
- if (banner->show)
- {
- x = 0.33 * print_width;
-
- if (banner->show & SHOW_PRINTER_NAME)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Printer Name: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, getenv("PRINTER"));
- }
- if (banner->show & SHOW_JOB_ID)
- {
- snprintf(text, sizeof(text), "%s-%d", getenv("PRINTER"), job_id);
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Job ID: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
- }
- if (banner->show & SHOW_JOB_UUID)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Job UUID: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- cupsGetOption("job-uuid", num_options, options));
- }
- if (banner->show & SHOW_JOB_NAME)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Title: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, title);
- }
- if (banner->show & SHOW_JOB_ORIGINATING_USER_NAME)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Printed For: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, username);
- }
- if (banner->show & SHOW_JOB_ORIGINATING_HOST_NAME)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Printed From: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- cupsGetOption("job-originating-host-name", num_options,
- options));
- }
- if (banner->show & SHOW_JOB_BILLING)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Billing Information: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- cupsGetOption("job-billing", num_options, options));
- }
- if (banner->show & SHOW_OPTIONS)
- {
- printf("%.1f %.1f moveto", x, y);
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Options: ")));
-
- for (j = 0; j < num_options; j ++)
- {
- if (_cups_strcasecmp("media", options[j].name) &&
- _cups_strcasecmp("PageSize", options[j].name) &&
- _cups_strcasecmp("PageRegion", options[j].name) &&
- _cups_strcasecmp("InputSlot", options[j].name) &&
- _cups_strcasecmp("MediaType", options[j].name) &&
- _cups_strcasecmp("finishings", options[j].name) &&
- _cups_strcasecmp("sides", options[j].name) &&
- _cups_strcasecmp("Duplex", options[j].name) &&
- _cups_strcasecmp("orientation-requested", options[j].name) &&
- _cups_strcasecmp("landscape", options[j].name) &&
- _cups_strcasecmp("number-up", options[j].name) &&
- _cups_strcasecmp("OutputOrder", options[j].name))
- continue;
-
- if (!_cups_strcasecmp("landscape", options[j].name))
- strlcpy(text, "orientation-requested=landscape", sizeof(text));
- else if (!_cups_strcasecmp("orientation-requested", options[j].name))
- {
- switch (atoi(options[j].value))
- {
- default :
- case IPP_PORTRAIT :
- strlcpy(text, "orientation-requested=portrait",
- sizeof(text));
- break;
-
- case IPP_LANDSCAPE :
- strlcpy(text, "orientation-requested=landscape",
- sizeof(text));
- break;
-
- case IPP_REVERSE_PORTRAIT :
- strlcpy(text, "orientation-requested=reverse-portrait",
- sizeof(text));
- break;
-
- case IPP_REVERSE_LANDSCAPE :
- strlcpy(text, "orientation-requested=reverse-landscape",
- sizeof(text));
- break;
- }
- }
- else
- snprintf(text, sizeof(text), "%s=%s", options[j].name,
- options[j].value);
-
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
- }
- }
-
- if (banner->show & SHOW_PRINTER_INFO)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Description: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- getenv("PRINTER_INFO"));
- }
- if (banner->show & SHOW_PRINTER_LOCATION)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Location: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- getenv("PRINTER_LOCATION"));
- }
- if (banner->show & SHOW_PRINTER_MAKE_AND_MODEL)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Make and Model: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- ppd ? ppd->nickname : NULL);
- }
-
- if (banner->show & SHOW_PAPER_NAME)
- {
- if ((option = cupsGetOption("media", num_options, options)) == NULL)
- if ((option = cupsGetOption("PageSize", num_options, options)) == NULL)
- if ((option = cupsGetOption("PageRegion", num_options,
- options)) == NULL)
- option = "Default";
-
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Media Name: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, option);
- }
- if (banner->show & SHOW_PAPER_SIZE)
- {
- snprintf(text, sizeof(text),
- _cupsLangString(language, _("%.2f x %.2f inches")),
- PageWidth / 72.0, PageLength / 72.0);
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Media Dimensions: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
-
- snprintf(text, sizeof(text),
- _cupsLangString(language, _("%.0f x %.0f millimeters")),
- PageWidth * 25.4 / 72.0, PageLength * 25.4 / 72.0);
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
- }
- if (banner->show & SHOW_IMAGEABLE_AREA)
- {
- snprintf(text, sizeof(text),
- _cupsLangString(language,
- _("%.2f x %.2f to %.2f x %.2f inches")),
- PageLeft / 72.0, PageBottom / 72.0,
- PageRight / 72.0, PageTop / 72.0);
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Media Limits: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
-
- snprintf(text, sizeof(text),
- _cupsLangString(language,
- _("%.0f x %.0f to %.0f x %.0f millimeters")),
- PageLeft * 25.4 / 72.0, PageBottom * 25.4 / 72.0,
- PageRight * 25.4 / 72.0, PageTop * 25.4 / 72.0);
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
-
- printf("gsave 2 setlinewidth 1 1 %.1f %.1f rectstroke grestore\n",
- print_width - 2.0, print_height - 2.0);
- }
- if (banner->show & SHOW_PRINTER_DRIVER_NAME)
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Driver Name: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- ppd ? ppd->pcfilename : NULL);
- }
- if (banner->show & SHOW_PRINTER_DRIVER_VERSION)
- {
- ppd_attr_t *file_version = ppdFindAttr(ppd, "FileVersion", NULL);
-
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Driver Version: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT,
- file_version ? file_version->value : NULL);
- }
- if (banner->show & SHOW_TIME_AT_CREATION)
- {
- if ((option = cupsGetOption("time-at-creation", num_options,
- options)) != NULL)
- {
- time_t curtime; /* Current time */
- struct tm *curdate; /* Current date */
-
- curtime = (time_t)atoi(option);
- curdate = localtime(&curtime);
-
- strftime(text, sizeof(text), "%c", curdate);
- }
- else
- strlcpy(text, "?", sizeof(text));
-
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Created On: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
- }
- if (banner->show & SHOW_TIME_AT_PROCESSING)
- {
- if ((option = cupsGetOption("time-at-processing", num_options,
- options)) != NULL)
- {
- time_t curtime; /* Current time */
- struct tm *curdate; /* Current date */
-
- curtime = (time_t)atoi(option);
- curdate = localtime(&curtime);
-
- strftime(text, sizeof(text), "%c", curdate);
- }
- else
- strlcpy(text, "?", sizeof(text));
-
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT,
- _cupsLangString(language, _("Printed On: ")));
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text);
- }
- }
-
- /*
- * Notices...
- */
-
- if (cupsArrayCount(banner->notices))
- {
- if (banner->show)
- y -= 2 * line_height;
-
- x = 0.5 * print_width;
-
- for (notice = (char *)cupsArrayFirst(banner->notices);
- notice;
- notice = (char *)cupsArrayNext(banner->notices))
- {
- printf("%.1f %.1f moveto", x, y);
- y -= line_height;
- psTextUTF8(fonts, fontsize, PS_NORMAL, PS_CENTER, notice);
- }
- }
-
- /*
- * Images...
- */
-
- if (cupsArrayCount(images))
- {
- if (banner->show || cupsArrayCount(banner->notices))
- y -= 2 * line_height;
-
- x = 0.5 * (print_width - images_width);
-
- for (image = (cups_image_t *)cupsArrayFirst(images);
- image;
- image = (cups_image_t *)cupsArrayNext(images))
- {
- float temp_width; /* Width of this image */
- int depth, /* Bytes per pixel */
- num_cols, /* Number of columns */
- row, /* Current row */
- num_rows, /* Number of rows */
- out_length, /* Length of data to write */
- out_offset; /* Offset in line buffer */
- unsigned char *line; /* Data for current row */
-
-
- depth = cupsImageGetDepth(image);
- num_cols = cupsImageGetWidth(image);
- num_rows = cupsImageGetHeight(image);
- line = malloc(depth * num_cols + 3);
- temp_width = num_cols * images_height / num_rows;
-
- printf("gsave %.1f %.1f translate %.3f %.3f scale\n", x, y,
- temp_width / num_cols, images_height / num_rows);
- x += temp_width;
-
- switch (cupsImageGetColorSpace(image))
- {
- default :
- case CUPS_IMAGE_WHITE :
- printf("/DeviceGray setcolorspace"
- "<<"
- "/ImageType 1"
- "/Width %d"
- "/Height %d"
- "/BitsPerComponent 8"
- "/Decode[0 1]\n",
- num_cols, num_rows);
- break;
-
- case CUPS_IMAGE_RGB :
- printf("/DeviceRGB setcolorspace"
- "<<"
- "/ImageType 1"
- "/Width %d"
- "/Height %d"
- "/BitsPerComponent 8"
- "/Decode[0 1 0 1 0 1]\n",
- num_cols, num_rows);
- break;
-
- case CUPS_IMAGE_CMYK :
- printf("/DeviceCMYK setcolorspace"
- "<<"
- "/ImageType 1"
- "/Width %d"
- "/Height %d"
- "/BitsPerComponent 8"
- "/Decode[0 1 0 1 0 1 0 1]\n",
- num_cols, num_rows);
- break;
- }
-
- puts("/DataSource currentfile"
- "/ASCII85Decode filter"
- "/ImageMatrix[1 0 0 -1 0 1]>>image");
-
- for (row = 0, out_offset = 0; row < num_rows; row ++)
- {
- cupsImageGetRow(image, 0, row, num_cols, line + out_offset);
-
- out_length = num_cols * depth + out_offset;
- out_offset = out_length & 3;
-
- ps_ascii85(line, out_length, row == (num_rows - 1));
-
- if (out_offset > 0)
- memcpy(line, line + out_length - out_offset, out_offset);
- }
-
- puts("grestore");
-
- if (i == num_pages)
- cupsImageClose(image);
-
- free(line);
- }
- }
-
- /*
- * Header and footer...
- */
-
- x = 0.5 * print_width;
-
- if (banner->header)
- {
- printf("%.1f %.1f moveto", x, print_height - 2 * fontsize);
- psTextUTF8(fonts, 2 * fontsize, PS_BOLD, PS_CENTER, banner->header);
- }
-
- if (banner->footer)
- {
- printf("%.1f %.1f moveto", x, fontsize);
- psTextUTF8(fonts, 2 * fontsize, PS_BOLD, PS_CENTER, banner->footer);
- }
-
- /*
- * Show the page...
- */
-
- puts("grestore");
- puts("showpage");
- }
-
- return (num_pages);
-}
-
-
-/*
- * 'write_epilogue()' - Write the PostScript file epilogue.
- */
-
-static void
-write_epilogue(int num_pages) /* I - Number of pages */
-{
- puts("%%Trailer");
- printf("%%%%Pages: %d\n", num_pages);
- puts("%%EOF");
-}
-
-
-/*
- * 'write_prolog()' - Write the PostScript file prolog with options.
- */
-
-ps_text_t * /* O - Fonts */
-write_prolog(const char *title, /* I - Title of job */
- const char *username) /* I - Username */
-{
- time_t curtime; /* Current time */
- struct tm *curtm; /* Current date */
- char curdate[255]; /* Current date (text format) */
- ps_text_t *fonts; /* Fonts */
-
-
- /*
- * Get the fonts we'll need...
- */
-
- fonts = psTextInitialize();
-
- /*
- * Output the DSC header...
- */
-
- curtime = time(NULL);
- curtm = localtime(&curtime);
- strftime(curdate, sizeof(curdate), "%c", curtm);
-
- puts("%!PS-Adobe-3.0");
- printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom,
- PageRight, PageTop);
- printf("%%cupsRotation: %d\n", (Orientation & 3) * 90);
- puts("%%Creator: bannertops/" CUPS_SVERSION);
- printf("%%%%CreationDate: %s\n", curdate);
- puts("%%LanguageLevel: 2");
- puts("%%DocumentData: Clean7Bit");
- WriteTextComment("Title", title);
- WriteTextComment("For", username);
- printf("%%%%Pages: %d\n", Duplex ? 2 : 1);
- psTextListFonts(fonts);
- puts("%%EndComments");
- puts("%%BeginProlog");
- psTextEmbedFonts(fonts);
- puts("%%EndProlog");
-
- return (fonts);
-}
-
-
-/*
- * End of "$Id: bannertops.c 9793 2011-05-20 03:49:49Z mike $".
- */