125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Hewlett-Packard Page Control Language filter for CUPS.
325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2015 by Apple Inc.
525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1993-2007 by Easy Software Products.
625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the
825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright
925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file.  If this file is
111fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/".
1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception.
1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers...
1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/cups.h>
2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/ppd.h>
2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/string-private.h>
2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/language-private.h>
2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/raster.h>
2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <unistd.h>
2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <fcntl.h>
2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <signal.h>
2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Globals...
3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned char	*Planes[4],		/* Output buffers */
3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*CompBuffer,		/* Compression buffer */
3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*BitBuffer;		/* Buffer for output bits */
3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned 	NumPlanes,		/* Number of color planes */
3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		ColorBits,		/* Number of bits per color */
3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		Feed;			/* Number of lines to skip */
4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint		Duplex,			/* Current duplex mode */
4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		Page,			/* Current page number */
4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		Canceled;		/* Has the current job been canceled? */
4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Prototypes...
4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	Setup(void);
5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	StartPage(ppd_file_t *ppd, cups_page_header2_t *header);
5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	EndPage(void);
5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	Shutdown(void);
5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	CancelJob(int sig);
5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	CompressData(unsigned char *line, unsigned length, unsigned plane, unsigned type);
5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid	OutputLine(cups_page_header2_t *header);
5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'Setup()' - Prepare the printer for printing.
6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannSetup(void)
6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Send a PCL reset sequence.
6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  putchar(0x1b);
7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  putchar('E');
7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'StartPage()' - Start a page of graphics.
7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannStartPage(ppd_file_t         *ppd,	/* I - PPD file */
8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          cups_page_header2_t *header)	/* I - Page header */
8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned	plane;			/* Looping var */
8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Show page device dictionary...
8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: StartPage...\n");
9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex);
9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]);
9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]);
9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed);
9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition);
9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies);
9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation);
9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]);
10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth);
10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight);
10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType);
10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor);
10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel);
10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine);
10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder);
10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace);
10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression);
10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Setup printer/job attributes...
11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Duplex    = header->Duplex;
11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ColorBits = header->cupsBitsPerColor;
11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((!Duplex || (Page & 1)) && header->MediaPosition)
11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l%dH",				/* Set media position */
11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           header->MediaPosition);
12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (Duplex && ppd && ppd->model_number == 2)
12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Handle duplexing on new DeskJet printers...
12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l-2H");			/* Load media */
12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (Page & 1)
13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033&l2S");			/* Set duplex mode */
13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!Duplex || (Page & 1) || (ppd && ppd->model_number == 2))
13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Set the media size...
13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l6D\033&k12H");		/* Set 6 LPI, 10 CPI */
14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l0O");				/* Set portrait orientation */
14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    switch (header->PageSize[1])
14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 540 : /* Monarch Envelope */
14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l80A");			/* Set page size */
14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 595 : /* A5 */
14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l25A");			/* Set page size */
15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 624 : /* DL Envelope */
15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l90A");			/* Set page size */
15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 649 : /* C5 Envelope */
15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l91A");			/* Set page size */
15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 684 : /* COM-10 Envelope */
16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l81A");			/* Set page size */
16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 709 : /* B5 Envelope */
16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l100A");			/* Set page size */
16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 756 : /* Executive */
16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l1A");			/* Set page size */
17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 792 : /* Letter */
17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l2A");			/* Set page size */
17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 842 : /* A4 */
17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l26A");			/* Set page size */
17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 1008 : /* Legal */
18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l3A");			/* Set page size */
18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 1191 : /* A3 */
18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l27A");			/* Set page size */
18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      case 1224 : /* Tabloid */
18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          printf("\033&l6A");			/* Set page size */
19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l%dP",				/* Set page length */
19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           header->PageSize[1] / 12);
19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l0E");				/* Set top margin to 0 */
19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!Duplex || (Page & 1))
19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Set other job options...
20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l%dX", header->NumCopies);	/* Set number copies */
20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (header->cupsMediaType &&
20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        (!ppd || ppd->model_number != 2 || header->HWResolution[0] == 600))
20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033&l%dM",			/* Set media type */
20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             header->cupsMediaType);
21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!ppd || ppd->model_number != 2)
21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      int mode = Duplex ? 1 + header->Tumble != 0 : 0;
21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033&l%dS", mode);		/* Set duplex mode */
21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033&l0L");			/* Turn off perforation skip */
21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else if (!ppd || ppd->model_number != 2)
22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&a2G");				/* Set back side */
22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Set graphics mode...
22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (ppd && ppd->model_number == 2)
22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Figure out the number of color planes...
23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (header->cupsColorSpace == CUPS_CSPACE_KCMY)
23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      NumPlanes = 4;
23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      NumPlanes = 1;
23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Set the resolution and top-of-form...
23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&u%dD", header->HWResolution[0]);
24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann						/* Resolution */
24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l0e0L");			/* Reset top and don't skip */
24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*p0Y\033*p0X");			/* Set top of form */
24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Send 26-byte configure image data command with horizontal and
24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * vertical resolutions as well as a color count...
24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*g26W");
25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(2);					/* Format 2 */
25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)NumPlanes);			/* Output planes */
25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[0] >> 8));/* Black resolution */
25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[0]);
25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[1] >> 8));
25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[1]);
25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(0);
26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(1 << ColorBits);			/* # of black levels */
26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[0] >> 8));/* Cyan resolution */
26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[0]);
26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[1] >> 8));
26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[1]);
26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(0);
26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(1 << ColorBits);			/* # of cyan levels */
26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[0] >> 8));/* Magenta resolution */
27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[0]);
27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[1] >> 8));
27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[1]);
27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(0);
27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(1 << ColorBits);			/* # of magenta levels */
27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[0] >> 8));/* Yellow resolution */
27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[0]);
27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)(header->HWResolution[1] >> 8));
27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar((int)header->HWResolution[1]);
28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(0);
28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    putchar(1 << ColorBits);			/* # of yellow levels */
28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&l0H");				/* Set media position */
28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*t%uR", header->HWResolution[0]);
28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann						/* Set resolution */
28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (header->cupsColorSpace == CUPS_CSPACE_KCMY)
29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      NumPlanes = 4;
29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033*r-4U");			/* Set KCMY graphics */
29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (header->cupsColorSpace == CUPS_CSPACE_CMY)
29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      NumPlanes = 3;
29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033*r-3U");			/* Set CMY graphics */
29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      NumPlanes = 1;				/* Black&white graphics */
30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Set size and position of graphics...
30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*r%uS", header->cupsWidth);	/* Set width */
30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*r%uT", header->cupsHeight);	/* Set height */
30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033&a0H");				/* Set horizontal position */
31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (ppd)
31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033&a%.0fV", 			/* Set vertical position */
31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             10.0 * (ppd->sizes[0].length - ppd->sizes[0].top));
31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      printf("\033&a0V");			/* Set top-of-page */
31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  printf("\033*r1A");				/* Start graphics */
32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (header->cupsCompression)
32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*b%uM",				/* Set compression */
32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           header->cupsCompression);
32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Feed = 0;					/* No blank lines yet */
32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Allocate memory for a line of graphics...
32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL)
33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs("ERROR: Unable to allocate memory\n", stderr);
33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    exit(1);
33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (plane = 1; plane < NumPlanes; plane ++)
33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes;
33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (ColorBits > 1)
34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    BitBuffer = malloc(ColorBits * ((header->cupsWidth + 7) / 8));
34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    BitBuffer = NULL;
34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (header->cupsCompression)
34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CompBuffer = malloc(header->cupsBytesPerLine * 2 + 2);
34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    CompBuffer = NULL;
34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'EndPage()' - Finish a page of graphics.
35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannEndPage(void)
35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Eject the current page...
36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (NumPlanes > 1)
36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     printf("\033*rC");			/* End color GFX */
36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     if (!(Duplex && (Page & 1)))
36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       printf("\033&l0H");		/* Eject current page */
36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     printf("\033*r0B");		/* End GFX */
37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     if (!(Duplex && (Page & 1)))
37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       printf("\014");			/* Eject current page */
37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fflush(stdout);
37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Free memory...
38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  free(Planes[0]);
38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (BitBuffer)
38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(BitBuffer);
38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (CompBuffer)
39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(CompBuffer);
39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'Shutdown()' - Shutdown the printer.
39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannShutdown(void)
40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Send a PCL reset sequence.
40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  putchar(0x1b);
40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  putchar('E');
40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'CancelJob()' - Cancel the current job...
41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannCancelJob(int sig)			/* I - Signal */
41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  (void)sig;
41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Canceled = 1;
42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'CompressData()' - Compress a line of graphics.
42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannCompressData(unsigned char *line,	/* I - Data to compress */
42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             unsigned      length,	/* I - Number of bytes */
43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     unsigned      plane,	/* I - Color plane */
43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     unsigned      type)	/* I - Type of compression */
43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned char	*line_ptr,		/* Current byte pointer */
43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	*line_end,		/* End-of-line byte pointer */
43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	*comp_ptr,		/* Pointer into compression buffer */
43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	*start;			/* Start of compression sequence */
43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned	count;			/* Count of bytes for output */
43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  switch (type)
44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    default :
44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* Do no compression...
44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	line_ptr = line;
44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	line_end = line + length;
44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	break;
45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    case 1 :
45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Do run-length encoding...
45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        */
45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	line_end = line + length;
45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	for (line_ptr = line, comp_ptr = CompBuffer;
45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     line_ptr < line_end;
45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     comp_ptr += 2, line_ptr += count)
46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  for (count = 1;
46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               (line_ptr + count) < line_end &&
46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           line_ptr[0] == line_ptr[count] &&
46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	   count < 256;
46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               count ++);
46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  comp_ptr[0] = (unsigned char)(count - 1);
46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  comp_ptr[1] = line_ptr[0];
46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        line_ptr = CompBuffer;
47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        line_end = comp_ptr;
47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	break;
47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    case 2 :
47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Do TIFF pack-bits encoding...
47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        */
47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	line_ptr = line;
48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	line_end = line + length;
48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	comp_ptr = CompBuffer;
48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	while (line_ptr < line_end)
48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if ((line_ptr + 1) >= line_end)
48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   /*
48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    * Single byte on the end...
49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    */
49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *comp_ptr++ = 0x00;
49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *comp_ptr++ = *line_ptr++;
49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else if (line_ptr[0] == line_ptr[1])
49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   /*
49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    * Repeated sequence...
49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    */
50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    line_ptr ++;
50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    count = 2;
50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    while (line_ptr < (line_end - 1) &&
50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	   line_ptr[0] == line_ptr[1] &&
50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	   count < 127)
50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    {
50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              line_ptr ++;
50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              count ++;
51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    }
51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *comp_ptr++ = (unsigned char)(257 - count);
51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *comp_ptr++ = *line_ptr++;
51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else
51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   /*
51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    * Non-repeated sequence...
51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    */
52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    start    = line_ptr;
52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    line_ptr ++;
52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    count    = 1;
52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    while (line_ptr < (line_end - 1) &&
52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	   line_ptr[0] != line_ptr[1] &&
52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	   count < 127)
52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    {
52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              line_ptr ++;
53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              count ++;
53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    }
53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *comp_ptr++ = (unsigned char)(count - 1);
53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    memcpy(comp_ptr, start, count);
53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    comp_ptr += count;
53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        line_ptr = CompBuffer;
54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        line_end = comp_ptr;
54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	break;
54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Set the length of the data and write a raster plane...
54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  printf("\033*b%d%c", (int)(line_end - line_ptr), plane);
55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fwrite(line_ptr, (size_t)(line_end - line_ptr), 1, stdout);
55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'OutputLine()' - Output a line of graphics.
55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannOutputLine(cups_page_header2_t *header)	/* I - Page header */
56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned	plane,			/* Current plane */
56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		bytes,			/* Bytes to write */
56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		count;			/* Bytes to convert */
56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned char	bit,			/* Current plane data */
56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		bit0,			/* Current low bit data */
56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		bit1,			/* Current high bit data */
56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*plane_ptr,		/* Pointer into Planes */
56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*bit_ptr;		/* Pointer into BitBuffer */
56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Output whitespace as needed...
57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (Feed > 0)
57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    printf("\033*b%dY", Feed);
57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    Feed = 0;
57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Write bitmap data as needed...
58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  bytes = (header->cupsWidth + 7) / 8;
58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (plane = 0; plane < NumPlanes; plane ++)
58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (ColorBits == 1)
58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Send bits as-is...
59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      CompressData(Planes[plane], bytes, plane < (NumPlanes - 1) ? 'V' : 'W',
59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		   header->cupsCompression);
59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Separate low and high bit data into separate buffers.
60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (count = header->cupsBytesPerLine / NumPlanes,
60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               plane_ptr = Planes[plane], bit_ptr = BitBuffer;
60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   count > 0;
60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   count -= 2, plane_ptr += 2, bit_ptr ++)
60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bit = plane_ptr[0];
60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bit0 = (unsigned char)(((bit & 64) << 1) | ((bit & 16) << 2) | ((bit & 4) << 3) | ((bit & 1) << 4));
61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bit1 = (unsigned char)((bit & 128) | ((bit & 32) << 1) | ((bit & 8) << 2) | ((bit & 2) << 3));
61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (count > 1)
61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  bit = plane_ptr[1];
61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          bit0 |= (unsigned char)((bit & 1) | ((bit & 4) >> 1) | ((bit & 16) >> 2) | ((bit & 64) >> 3));
61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          bit1 |= (unsigned char)(((bit & 2) >> 1) | ((bit & 8) >> 2) | ((bit & 32) >> 3) | ((bit & 128) >> 4));
61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bit_ptr[0]     = bit0;
62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	bit_ptr[bytes] = bit1;
62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Send low and high bits...
62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      CompressData(BitBuffer, bytes, 'V', header->cupsCompression);
63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      CompressData(BitBuffer + bytes, bytes, plane < (NumPlanes - 1) ? 'V' : 'W',
63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		   header->cupsCompression);
63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fflush(stdout);
63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'main()' - Main entry and processing of driver.
64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - Exit status */
64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannmain(int  argc,				/* I - Number of command-line arguments */
64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     char *argv[])			/* I - Command-line arguments */
64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			fd;		/* File descriptor */
64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_raster_t		*ras;		/* Raster stream for printing */
64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_page_header2_t	header;		/* Page header from file */
64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  unsigned		y;		/* Current line */
65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_file_t		*ppd;		/* PPD file */
65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  struct sigaction action;		/* Actions for POSIX signals */
65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Make sure status messages are not buffered...
65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  setbuf(stderr, NULL);
66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Check command-line...
66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (argc < 6 || argc > 7)
66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * We don't have the correct number of arguments; write an error message
67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * and return.
67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsLangPrintFilter(stderr, "ERROR",
67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                         _("%s job-id user title copies options [file]"),
67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			 "rastertohp");
67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (1);
67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Open the page stream...
68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (argc == 7)
68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((fd = open(argv[6], O_RDONLY)) == -1)
68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      _cupsLangPrintError("ERROR", _("Unable to open raster file"));
68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      sleep(1);
68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (1);
69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fd = 0;
69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Register a signal handler to eject the current page if the
69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * job is cancelled.
70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Canceled = 0;
70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  sigset(SIGTERM, CancelJob);
70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#elif defined(HAVE_SIGACTION)
70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  memset(&action, 0, sizeof(action));
70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  sigemptyset(&action.sa_mask);
71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  action.sa_handler = CancelJob;
71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  sigaction(SIGTERM, &action, NULL);
71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  signal(SIGTERM, CancelJob);
71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_SIGSET */
71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Initialize the print device...
71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd = ppdOpenFile(getenv("PPD"));
72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd)
72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppd_status_t	status;		/* PPD error */
72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int			linenum;	/* Line number */
72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsLangPrintFilter(stderr, "ERROR",
72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                         _("The PPD file could not be opened."));
72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    status = ppdLastError(&linenum);
73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum);
73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (1);
73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Setup();
73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Process pages as needed...
74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Page = 0;
74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  while (cupsRasterReadHeader2(ras, &header))
74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Write a status message with the page number and number of copies.
74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (Canceled)
75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      break;
75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    Page ++;
75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies);
75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page);
75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Start the page...
76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    StartPage(ppd, &header);
76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Loop for each line on the page...
76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (y = 0; y < header.cupsHeight; y ++)
76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Let the user know how far we have progressed...
77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (Canceled)
77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	break;
77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((y & 127) == 0)
77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        _cupsLangPrintFilter(stderr, "INFO",
78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                     _("Printing page %d, %u%% complete."),
78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			     Page, 100 * y / header.cupsHeight);
78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        fprintf(stderr, "ATTR: job-media-progress=%u\n",
78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		100 * y / header.cupsHeight);
78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Read a line of graphics...
78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (cupsRasterReadPixels(ras, Planes[0], header.cupsBytesPerLine) < 1)
79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        break;
79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * See if the line is blank; if not, write it to the printer...
79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (Planes[0][0] ||
79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          memcmp(Planes[0], Planes[0] + 1, header.cupsBytesPerLine - 1))
79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        OutputLine(&header);
80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        Feed ++;
80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Eject the page...
80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page);
80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    EndPage();
81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (Canceled)
81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      break;
81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Shutdown the printer...
81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  Shutdown();
82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (ppd)
82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppdClose(ppd);
82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Close the raster stream...
82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cupsRasterClose(ras);
83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (fd != 0)
83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    close(fd);
83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * If no pages were printed, send an error message...
83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (Page == 0)
83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found."));
84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (1);
84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
845