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