125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Raster file routines for CUPS. 325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2016 by Apple Inc. 525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1997-2006 by Easy Software Products. 625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is part of the CUPS Imaging library. 825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the 1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright 1125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law. Distribution and use rights are outlined in the file "LICENSE.txt" 1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file. If this file is 131fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/". 1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception. 1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers... 2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/raster-private.h> 2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_STDINT_H 2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# include <stdint.h> 2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_STDINT_H */ 2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Private structures... 3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstruct _cups_raster_s /**** Raster stream data ****/ 3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned sync; /* Sync word from start of stream */ 3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *ctx; /* File descriptor */ 3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_iocb_t iocb; /* IO callback */ 3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_mode_t mode; /* Read/write mode */ 3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header2_t header; /* Raster header for current page */ 391fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned rowheight, /* Row height in lines */ 401fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann count, /* Current row run-length count */ 4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining, /* Remaining rows in page image */ 4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bpp; /* Bytes per pixel/color */ 4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *pixels, /* Pixels for current row */ 4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *pend, /* End of pixel buffer */ 4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *pcurrent; /* Current byte in pixel buffer */ 4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int compressed, /* Non-zero if data is compressed */ 4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann swapped; /* Non-zero if data is byte-swapped */ 4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *buffer, /* Read/write buffer */ 4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr, /* Current (read) position in buffer */ 5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufend; /* End of current (read) buffer */ 5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bufsize; /* Buffer size */ 5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t iocount; /* Number of bytes read/written */ 5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 551fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned apple_page_count;/* Apple raster page count */ 5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}; 5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local functions... 6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_raster_io(cups_raster_t *r, unsigned char *buf, size_t bytes); 6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned cups_raster_read_header(cups_raster_t *r); 6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_raster_read(cups_raster_t *r, unsigned char *buf, 6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes); 6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int cups_raster_update(cups_raster_t *r); 6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_raster_write(cups_raster_t *r, 6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const unsigned char *pixels); 7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_read_fd(void *ctx, unsigned char *buf, size_t bytes); 7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void cups_swap(unsigned char *buf, size_t bytes); 7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t cups_write_fd(void *ctx, unsigned char *buf, size_t bytes); 7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterClose()' - Close a raster stream. 7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The file descriptor associated with the raster stream must be closed 7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * separately as needed. 8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterClose(cups_raster_t *r) /* I - Stream to close */ 8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r != NULL) 8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->buffer) 8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r->buffer); 8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->pixels) 9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r->pixels); 9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r); 9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterInitPWGHeader()' - Initialize a page header for PWG Raster output. 10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "media" argument specifies the media to use. 10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "type" argument specifies a "pwg-raster-document-type-supported" value 10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * that controls the color space and bit depth of the raster data. 10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "xres" and "yres" arguments specify the raster resolution in dots per 10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * inch. 10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value 11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * to apply for the back side of a page. Pass @code NULL@ for the front side. 11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 2.2/macOS 10.12@ 11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 1 on success, 0 on failure */ 11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterInitPWGHeader( 11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header2_t *h, /* I - Page header */ 11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pwg_media_t *media, /* I - PWG media information */ 11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *type, /* I - PWG raster type string */ 12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int xdpi, /* I - Cross-feed direction (horizontal) resolution */ 12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int ydpi, /* I - Feed direction (vertical) resolution */ 12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *sides, /* I - IPP "sides" option value */ 12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *sheet_back) /* I - Transform for back side or @code NULL@ for none */ 12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!h || !media || !type || xdpi <= 0 || ydpi <= 0) 12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("%s", strerror(EINVAL)); 12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Initialize the page header... 13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(h, 0, sizeof(cups_page_header2_t)); 13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(h->cupsPageSizeName, media->pwg, sizeof(h->cupsPageSizeName)); 13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->PageSize[0] = (unsigned)(72 * media->width / 2540); 14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->PageSize[1] = (unsigned)(72 * media->length / 2540); 14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* This never gets written but is needed for some applications */ 14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsPageSize[0] = 72.0f * media->width / 2540.0f; 14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsPageSize[1] = 72.0f * media->length / 2540.0f; 14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->ImagingBoundingBox[2] = h->PageSize[0]; 14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->ImagingBoundingBox[3] = h->PageSize[1]; 14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->HWResolution[0] = (unsigned)xdpi; 15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->HWResolution[1] = (unsigned)ydpi; 15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsWidth = (unsigned)(media->width * xdpi / 2540); 15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsHeight = (unsigned)(media->length * ydpi / 2540); 15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (h->cupsWidth > 0x00ffffff || h->cupsHeight > 0x00ffffff) 15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Raster dimensions too large."); 15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_ImageBoxRight] = h->cupsWidth; 16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom] = h->cupsHeight; 16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Colorspace and bytes per line... 16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!strcmp(type, "adobe-rgb_8")) 16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 8; 17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 24; 17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_ADOBERGB; 17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "adobe-rgb_16")) 17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 16; 17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 48; 17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_ADOBERGB; 17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "black_1")) 18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 1; 18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 1; 18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_K; 18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "black_8")) 18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 8; 18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 8; 19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_K; 19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "black_16")) 19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 16; 19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 16; 19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_K; 19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "cmyk_8")) 19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 8; 20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 32; 20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_CMYK; 20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "cmyk_16")) 20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 16; 20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 64; 20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_CMYK; 20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strncmp(type, "device", 6) && type[6] >= '1' && type[6] <= '9') 21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int ncolors, bits; /* Number of colors and bits */ 21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (sscanf(type, "device%d_%d", &ncolors, &bits) != 2 || ncolors > 15 || (bits != 8 && bits != 16)) 21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unsupported raster type \'%s\'.", type); 21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = (unsigned)bits; 22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = (unsigned)(ncolors * bits); 22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = (cups_cspace_t)(CUPS_CSPACE_DEVICE1 + ncolors - 1); 22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "rgb_8")) 22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 8; 22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 24; 22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_RGB; 23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "rgb_16")) 23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 16; 23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 48; 23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_RGB; 23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "sgray_1")) 23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 1; 24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 1; 24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_SW; 24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "sgray_8")) 24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 8; 24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 8; 24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_SW; 24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "sgray_16")) 25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 16; 25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 16; 25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_SW; 25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "srgb_8")) 25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 8; 25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 24; 25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_SRGB; 26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(type, "srgb_16")) 26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerColor = 16; 26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBitsPerPixel = 48; 26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorSpace = CUPS_CSPACE_SRGB; 26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unsupported raster type \'%s\'.", type); 27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsColorOrder = CUPS_ORDER_CHUNKED; 27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsNumColors = h->cupsBitsPerPixel / h->cupsBitsPerColor; 27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsBytesPerLine = (h->cupsWidth * h->cupsBitsPerPixel + 7) / 8; 27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Duplex support... 27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 1; 28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 1; 28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (sides) 28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!strcmp(sides, "two-sided-long-edge")) 28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->Duplex = 1; 28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(sides, "two-sided-short-edge")) 29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->Duplex = 1; 29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->Tumble = 1; 29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (strcmp(sides, "one-sided")) 29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unsupported sides value \'%s\'.", sides); 29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (sheet_back) 30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!strcmp(sheet_back, "flipped")) 30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (h->Tumble) 30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; 30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; 30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(sheet_back, "manual-tumble")) 31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (h->Tumble) 31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; 31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; 31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(sheet_back, "rotated")) 31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!h->Tumble) 32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; 32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; 32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (strcmp(sheet_back, "normal")) 32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unsupported sheet_back value \'%s\'.", sheet_back); 32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterOpen()' - Open a raster stream using a file descriptor. 34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function associates a raster stream with the given file descriptor. 34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * For most printer driver filters, "fd" will be 0 (stdin). For most raster 34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * image processor (RIP) filters that generate raster data, "fd" will be 1 34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * (stdout). 34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When writing raster data, the @code CUPS_RASTER_WRITE@, 34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can 34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * be used - compressed and PWG output is generally 25-50% smaller but adds a 34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 100-300% execution time overhead. 35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_t * /* O - New stream */ 35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterOpen(int fd, /* I - File descriptor */ 35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, 35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann @code CUPS_RASTER_WRITE@, 35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann @code CUPS_RASTER_WRITE_COMPRESSED@, 35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann or @code CUPS_RASTER_WRITE_PWG@ */ 35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (mode == CUPS_RASTER_READ) 36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cupsRasterOpenIO(cups_read_fd, (void *)((intptr_t)fd), mode)); 36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cupsRasterOpenIO(cups_write_fd, (void *)((intptr_t)fd), mode)); 36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterOpenIO()' - Open a raster stream using a callback function. 36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function associates a raster stream with the given callback function and 37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * context pointer. 37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When writing raster data, the @code CUPS_RASTER_WRITE@, 37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can 37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * be used - compressed and PWG output is generally 25-50% smaller but adds a 37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 100-300% execution time overhead. 37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_t * /* O - New stream */ 37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterOpenIO( 38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_iocb_t iocb, /* I - Read/write callback */ 38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *ctx, /* I - Context pointer for callback */ 38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, 38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann @code CUPS_RASTER_WRITE@, 38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann @code CUPS_RASTER_WRITE_COMPRESSED@, 38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann or @code CUPS_RASTER_WRITE_PWG@ */ 38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r; /* New stream */ 38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterClearError(); 39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((r = calloc(sizeof(cups_raster_t), 1)) == NULL) 39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unable to allocate memory for raster stream: %s\n", 39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strerror(errno)); 39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->ctx = ctx; 40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->iocb = iocb; 40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->mode = mode; 40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (mode == CUPS_RASTER_READ) 40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open for read - get sync word... 40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) != 41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(r->sync)) 41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unable to read header from raster stream: %s\n", 41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strerror(errno)); 41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r); 41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->sync != CUPS_RASTER_SYNC && 41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync != CUPS_RASTER_REVSYNC && 42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync != CUPS_RASTER_SYNCv1 && 42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync != CUPS_RASTER_REVSYNCv1 && 42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync != CUPS_RASTER_SYNCv2 && 4231fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync != CUPS_RASTER_REVSYNCv2 && 4241fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync != CUPS_RASTER_SYNCapple && 4251fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync != CUPS_RASTER_REVSYNCapple) 42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unknown raster format %08x!\n", r->sync); 42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r); 42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->sync == CUPS_RASTER_SYNCv2 || 4331fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync == CUPS_RASTER_REVSYNCv2 || 4341fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync == CUPS_RASTER_SYNCapple || 4351fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync == CUPS_RASTER_REVSYNCapple) 43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->compressed = 1; 43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->sync == CUPS_RASTER_REVSYNC || 43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync == CUPS_RASTER_REVSYNCv1 || 4401fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync == CUPS_RASTER_REVSYNCv2 || 4411fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync == CUPS_RASTER_REVSYNCapple) 44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->swapped = 1; 44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 4441fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->sync == CUPS_RASTER_SYNCapple || 4451fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync == CUPS_RASTER_REVSYNCapple) 4461fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 4471fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned char header[8]; /* File header */ 4481fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 4491fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (cups_raster_io(r, (unsigned char *)header, sizeof(header)) != 4501fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann sizeof(header)) 4511fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 4521fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann _cupsRasterAddError("Unable to read header from raster stream: %s\n", 4531fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann strerror(errno)); 4541fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann free(r); 4551fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (NULL); 4561fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 4571fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 4581fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 4591fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsRasterOpenIO: r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync)); 46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Open for write - put sync word... 46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (mode) 46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_RASTER_WRITE : 47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync = CUPS_RASTER_SYNC; 47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_RASTER_WRITE_COMPRESSED : 47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->compressed = 1; 47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync = CUPS_RASTER_SYNCv2; 47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_RASTER_WRITE_PWG : 48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->compressed = 1; 48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->sync = htonl(CUPS_RASTER_SYNC_PWG); 48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->swapped = r->sync != CUPS_RASTER_SYNC_PWG; 48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 4851fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 4861fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_RASTER_WRITE_APPLE : 4871fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->compressed = 1; 4881fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->sync = htonl(CUPS_RASTER_SYNCapple); 4891fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->swapped = r->sync != CUPS_RASTER_SYNCapple; 4901fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->apple_page_count = 0xffffffffU; 4911fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann break; 49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) < (ssize_t)sizeof(r->sync)) 49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsRasterAddError("Unable to write raster stream header: %s\n", 49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strerror(errno)); 49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r); 49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (r); 50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterReadHeader()' - Read a raster page header and store it in a 50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * version 1 page header structure. 51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function is deprecated. Use @link cupsRasterReadHeader2@ instead. 51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset 51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * of the version 2 page header data. This function handles reading version 2 51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * page headers and copying only the version 1 data into the provided buffer. 51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @deprecated@ 51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned /* O - 1 on success, 0 on failure/end-of-file */ 52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterReadHeader( 52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r, /* I - Raster stream */ 52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header_t *h) /* I - Pointer to header data */ 52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Get the raster header... 52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_read_header(r)) 53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(h, 0, sizeof(cups_page_header_t)); 53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the header to the user-supplied buffer... 53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(h, &(r->header), sizeof(cups_page_header_t)); 54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterReadHeader2()' - Read a raster page header and store it in a 54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * version 2 page header structure. 54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned /* O - 1 on success, 0 on failure/end-of-file */ 55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterReadHeader2( 55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r, /* I - Raster stream */ 55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header2_t *h) /* I - Pointer to header data */ 55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Get the raster header... 55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsRasterReadHeader2(r=%p, h=%p)", (void *)r, (void *)h)); 56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_read_header(r)) 56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(h, 0, sizeof(cups_page_header2_t)); 56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the header to the user-supplied buffer... 57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(h, &(r->header), sizeof(cups_page_header2_t)); 57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterReadPixels()' - Read raster pixels. 58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * For best performance, filters should read one or more whole lines. 58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "cupsBytesPerLine" value from the page header can be used to allocate 58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the line buffer and as the number of bytes to read. 58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned /* O - Number of bytes read */ 58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */ 58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *p, /* I - Pointer to pixel buffer */ 59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned len) /* I - Number of bytes to read */ 59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Bytes read */ 59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned cupsBytesPerLine; /* cupsBytesPerLine value */ 59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned remaining; /* Bytes remaining */ 59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *ptr, /* Pointer to read buffer */ 59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann byte, /* Byte from file */ 59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *temp; /* Pointer into buffer */ 59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned count; /* Repetition count */ 59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsRasterReadPixels(r=%p, p=%p, len=%u)", (void *)r, (void *)p, len)); 60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0 || 60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBytesPerLine == 0) 60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsRasterReadPixels: Returning 0."); 60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsRasterReadPixels: compressed=%d, remaining=%u", r->compressed, r->remaining)); 61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!r->compressed) 61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read without compression... 61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining -= len / r->header.cupsBytesPerLine; 61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_io(r, p, len) < (ssize_t)len) 62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0."); 62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Swap bytes as needed... 62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->swapped && 63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (r->header.cupsBitsPerColor == 16 || 63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBitsPerPixel == 12 || 63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBitsPerPixel == 16)) 63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_swap(p, len); 63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return... 63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsRasterReadPixels: Returning %u", len)); 64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (len); 64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read compressed data... 64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining = len; 65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsBytesPerLine = r->header.cupsBytesPerLine; 65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (remaining > 0 && r->remaining > 0) 65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->count == 0) 65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Need to read a new row... 65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (remaining == cupsBytesPerLine) 66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr = p; 66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr = r->pixels; 66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read using a modified PackBits compression... 66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_read(r, &byte, 1)) 67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0."); 67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count = (unsigned)byte + 1; 67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->count > 1) 67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr = r->pixels; 67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = ptr; 68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)cupsBytesPerLine; 68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (bytes > 0) 68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Get a new repeat count... 68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_read(r, &byte, 1)) 69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0."); 69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6951fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (byte == 128) 6961fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 6971fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 6981fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Clear to end of line... 6991fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 7001fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 7011fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann switch (r->header.cupsColorSpace) 7021fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 7031fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_CSPACE_W : 7041fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_CSPACE_RGB : 7051fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_CSPACE_SW : 7061fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_CSPACE_SRGB : 7071fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_CSPACE_RGBW : 7081fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_CSPACE_ADOBERGB : 7091fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann memset(temp, 0xff, (size_t)bytes); 7101fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann break; 7111fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann default : 7121fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann memset(temp, 0x00, (size_t)bytes); 7131fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann break; 7141fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 7151fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 7161fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann temp += bytes; 7171fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann bytes = 0; 7181fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 7191fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann else if (byte & 128) 72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy N literal pixels... 72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (unsigned)(257 - byte) * r->bpp; 72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count > (unsigned)bytes) 72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (unsigned)bytes; 72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_read(r, temp, count)) 73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0."); 73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp += count; 73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes -= (ssize_t)count; 73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Repeat the next N bytes... 74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = ((unsigned)byte + 1) * r->bpp; 74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count > (unsigned)bytes) 74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (unsigned)bytes; 74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count < r->bpp) 75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes -= (ssize_t)count; 75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_read(r, temp, r->bpp)) 75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0."); 75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp += r->bpp; 76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count -= r->bpp; 76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (count > 0) 76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(temp, temp - r->bpp, r->bpp); 76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp += r->bpp; 76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count -= r->bpp; 76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Swap bytes as needed... 77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((r->header.cupsBitsPerColor == 16 || 77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBitsPerPixel == 12 || 77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBitsPerPixel == 16) && 77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->swapped) 78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_swap(ptr, (size_t)bytes); 78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Update pointers... 78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (remaining >= cupsBytesPerLine) 78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)cupsBytesPerLine; 78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = r->pixels; 79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count --; 79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining --; 79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)remaining; 79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = r->pixels + bytes; 79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy data as needed... 80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr != p) 80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(p, ptr, (size_t)bytes); 80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy fragment from buffer... 81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((unsigned)(bytes = (int)(r->pend - r->pcurrent)) > remaining) 81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)remaining; 81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(p, r->pcurrent, (size_t)bytes); 81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent += bytes; 81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->pcurrent >= r->pend) 81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = r->pixels; 82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count --; 82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining --; 82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining -= (unsigned)bytes; 82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann p += bytes; 82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1cupsRasterReadPixels: Returning %u", len)); 83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (len); 83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterWriteHeader()' - Write a raster page header from a version 1 page 83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * header structure. 83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function is deprecated. Use @link cupsRasterWriteHeader2@ instead. 84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @deprecated@ 84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned /* O - 1 on success, 0 on failure */ 84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterWriteHeader( 84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r, /* I - Raster stream */ 84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header_t *h) /* I - Raster page header */ 84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r == NULL || r->mode == CUPS_RASTER_READ) 85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Make a copy of the header, and compute the number of raster 85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * lines in the page image... 85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(&(r->header), 0, sizeof(r->header)); 85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(r->header), h, sizeof(cups_page_header_t)); 86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_update(r)) 86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the raster header... 86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->mode == CUPS_RASTER_WRITE_PWG) 86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * PWG raster data is always network byte order with much of the page header 87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * zeroed. 87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header2_t fh; /* File page header */ 87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(&fh, 0, sizeof(fh)); 87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); 88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* PwgRaster */ 88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.MediaColor, r->header.MediaColor, sizeof(fh.MediaColor)); 88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.MediaType, r->header.MediaType, sizeof(fh.MediaType)); 88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.OutputType, r->header.OutputType, sizeof(fh.OutputType)); 88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* PrintContentType */ 88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.CutMedia = htonl(r->header.CutMedia); 88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Duplex = htonl(r->header.Duplex); 88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.HWResolution[0] = htonl(r->header.HWResolution[0]); 88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.HWResolution[1] = htonl(r->header.HWResolution[1]); 89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[0] = htonl(r->header.ImagingBoundingBox[0]); 89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[1] = htonl(r->header.ImagingBoundingBox[1]); 89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[2] = htonl(r->header.ImagingBoundingBox[2]); 89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[3] = htonl(r->header.ImagingBoundingBox[3]); 89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.InsertSheet = htonl(r->header.InsertSheet); 89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Jog = htonl(r->header.Jog); 89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.LeadingEdge = htonl(r->header.LeadingEdge); 89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ManualFeed = htonl(r->header.ManualFeed); 89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.MediaPosition = htonl(r->header.MediaPosition); 89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.MediaWeight = htonl(r->header.MediaWeight); 90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.NumCopies = htonl(r->header.NumCopies); 90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Orientation = htonl(r->header.Orientation); 90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.PageSize[0] = htonl(r->header.PageSize[0]); 90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.PageSize[1] = htonl(r->header.PageSize[1]); 90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Tumble = htonl(r->header.Tumble); 90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsWidth = htonl(r->header.cupsWidth); 90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsHeight = htonl(r->header.cupsHeight); 90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); 90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); 90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); 91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsColorOrder = htonl(r->header.cupsColorOrder); 91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsColorSpace = htonl(r->header.cupsColorSpace); 91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsNumColors = htonl(r->header.cupsNumColors); 91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]); 91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* TotalPageCount */ 91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]); 91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* CrossFeedTransform */ 91725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]); 91825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* FeedTransform */ 91925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[3] = htonl(r->header.cupsInteger[3]); 92025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* ImageBoxLeft */ 92125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[4] = htonl(r->header.cupsInteger[4]); 92225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* ImageBoxTop */ 92325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[5] = htonl(r->header.cupsInteger[5]); 92425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* ImageBoxRight */ 92525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[6] = htonl(r->header.cupsInteger[6]); 92625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* ImageBoxBottom */ 92725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[7] = htonl(r->header.cupsInteger[7]); 92825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* BlackPrimary */ 92925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[8] = htonl(r->header.cupsInteger[8]); 93025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* PrintQuality */ 93125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[14] = htonl(r->header.cupsInteger[14]); 93225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* VendorIdentifier */ 93325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[15] = htonl(r->header.cupsInteger[15]); 93425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* VendorLength */ 93525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *dst = fh.cupsReal; /* Bypass bogus compiler warning */ 93725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *src = r->header.cupsReal; 93825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(dst, src, sizeof(fh.cupsReal) + sizeof(fh.cupsString)); 93925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* VendorData */ 94025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 94125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent, 94225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(fh.cupsRenderingIntent)); 94325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.cupsPageSizeName, r->header.cupsPageSizeName, 94425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(fh.cupsPageSizeName)); 94525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 94625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); 94725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 9481fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann else if (r->mode == CUPS_RASTER_WRITE_APPLE) 9491fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 9501fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 9511fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Raw raster data is always network byte order with most of the page header 9521fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * zeroed. 9531fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 9541fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9551fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned char appleheader[32]; /* Raw page header */ 9561fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9571fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->apple_page_count == 0xffffffffU) 9581fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 9591fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 9601fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Write raw page count from raster page header... 9611fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 9621fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9631fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->apple_page_count = r->header.cupsInteger[0]; 9641fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9651fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[0] = 'A'; 9661fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[1] = 'S'; 9671fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[2] = 'T'; 9681fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[3] = 0; 9691fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[4] = (unsigned char)(r->apple_page_count >> 24); 9701fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[5] = (unsigned char)(r->apple_page_count >> 16); 9711fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[6] = (unsigned char)(r->apple_page_count >> 8); 9721fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[7] = (unsigned char)(r->apple_page_count); 9731fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9741fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (cups_raster_io(r, appleheader, 8) != 8) 9751fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (0); 9761fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 9771fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9781fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann memset(appleheader, 0, sizeof(appleheader)); 9791fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 9801fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[0] = (unsigned char)r->header.cupsBitsPerPixel; 9811fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[1] = r->header.cupsColorSpace == CUPS_CSPACE_SRGB ? 1 : 9821fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_RGBW ? 2 : 9831fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_ADOBERGB ? 3 : 9841fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_W ? 4 : 9851fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_RGB ? 5 : 9861fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_CMYK ? 6 : 0; 9871fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[12] = (unsigned char)(r->header.cupsWidth >> 24); 9881fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[13] = (unsigned char)(r->header.cupsWidth >> 16); 9891fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[14] = (unsigned char)(r->header.cupsWidth >> 8); 9901fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[15] = (unsigned char)(r->header.cupsWidth); 9911fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[16] = (unsigned char)(r->header.cupsHeight >> 24); 9921fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[17] = (unsigned char)(r->header.cupsHeight >> 16); 9931fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[18] = (unsigned char)(r->header.cupsHeight >> 8); 9941fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[19] = (unsigned char)(r->header.cupsHeight); 9951fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[20] = (unsigned char)(r->header.HWResolution[0] >> 24); 9961fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[21] = (unsigned char)(r->header.HWResolution[0] >> 16); 9971fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[22] = (unsigned char)(r->header.HWResolution[0] >> 8); 9981fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[23] = (unsigned char)(r->header.HWResolution[0]); 9991fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 10001fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (cups_raster_io(r, appleheader, sizeof(appleheader)) == sizeof(appleheader)); 10011fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 100225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 100325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) 100425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann == sizeof(r->header)); 100525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 100625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 100725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 100825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 100925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterWriteHeader2()' - Write a raster page header from a version 2 101025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * page header structure. 101125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 10121fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * The page header can be initialized using @link cupsRasterInitPWGHeader@. 101325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 101425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 101525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 101625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 101725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned /* O - 1 on success, 0 on failure */ 101825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterWriteHeader2( 101925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r, /* I - Raster stream */ 102025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header2_t *h) /* I - Raster page header */ 102125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 102225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r == NULL || r->mode == CUPS_RASTER_READ) 102325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 102425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 102525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 102625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Make a copy of the header, and compute the number of raster 102725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * lines in the page image... 102825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 102925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 103025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(r->header), h, sizeof(cups_page_header2_t)); 103125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 103225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_update(r)) 103325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 103425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10351fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->mode == CUPS_RASTER_WRITE_APPLE) 10361fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 10371fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->rowheight = h->HWResolution[0] / h->HWResolution[1]; 10381fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 10391fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (h->HWResolution[0] != (r->rowheight * h->HWResolution[1])) 10401fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (0); 10411fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 10421fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann else 10431fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->rowheight = 1; 10441fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 104525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 104625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the raster header... 104725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 104825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 104925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->mode == CUPS_RASTER_WRITE_PWG) 105025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 105125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 105225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * PWG raster data is always network byte order with most of the page header 105325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * zeroed. 105425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 105525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 105625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_page_header2_t fh; /* File page header */ 105725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 105825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(&fh, 0, sizeof(fh)); 105925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); 106025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.MediaColor, r->header.MediaColor, sizeof(fh.MediaColor)); 106125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.MediaType, r->header.MediaType, sizeof(fh.MediaType)); 106225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.OutputType, r->header.OutputType, sizeof(fh.OutputType)); 106325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent, 106425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(fh.cupsRenderingIntent)); 106525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(fh.cupsPageSizeName, r->header.cupsPageSizeName, 106625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(fh.cupsPageSizeName)); 106725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 106825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.CutMedia = htonl(r->header.CutMedia); 106925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Duplex = htonl(r->header.Duplex); 107025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.HWResolution[0] = htonl(r->header.HWResolution[0]); 107125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.HWResolution[1] = htonl(r->header.HWResolution[1]); 107225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[0] = htonl(r->header.ImagingBoundingBox[0]); 107325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[1] = htonl(r->header.ImagingBoundingBox[1]); 107425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[2] = htonl(r->header.ImagingBoundingBox[2]); 107525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ImagingBoundingBox[3] = htonl(r->header.ImagingBoundingBox[3]); 107625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.InsertSheet = htonl(r->header.InsertSheet); 107725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Jog = htonl(r->header.Jog); 107825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.LeadingEdge = htonl(r->header.LeadingEdge); 107925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.ManualFeed = htonl(r->header.ManualFeed); 108025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.MediaPosition = htonl(r->header.MediaPosition); 108125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.MediaWeight = htonl(r->header.MediaWeight); 108225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.NumCopies = htonl(r->header.NumCopies); 108325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Orientation = htonl(r->header.Orientation); 108425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.PageSize[0] = htonl(r->header.PageSize[0]); 108525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.PageSize[1] = htonl(r->header.PageSize[1]); 108625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.Tumble = htonl(r->header.Tumble); 108725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsWidth = htonl(r->header.cupsWidth); 108825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsHeight = htonl(r->header.cupsHeight); 108925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); 109025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); 109125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); 109225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsColorOrder = htonl(r->header.cupsColorOrder); 109325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsColorSpace = htonl(r->header.cupsColorSpace); 109425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsNumColors = htonl(r->header.cupsNumColors); 109525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]); 109625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]); 109725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]); 109825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[3] = htonl((unsigned)(r->header.cupsImagingBBox[0] * r->header.HWResolution[0] / 72.0)); 109925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[4] = htonl((unsigned)(r->header.cupsImagingBBox[1] * r->header.HWResolution[1] / 72.0)); 110025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[5] = htonl((unsigned)(r->header.cupsImagingBBox[2] * r->header.HWResolution[0] / 72.0)); 110125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[6] = htonl((unsigned)(r->header.cupsImagingBBox[3] * r->header.HWResolution[1] / 72.0)); 110225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fh.cupsInteger[7] = htonl(0xffffff); 110325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); 110525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 11061fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann else if (r->mode == CUPS_RASTER_WRITE_APPLE) 11071fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 11081fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 11091fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Raw raster data is always network byte order with most of the page header 11101fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * zeroed. 11111fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 11121fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11131fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned char appleheader[32]; /* Raw page header */ 11141fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned height = r->header.cupsHeight * r->rowheight; 11151fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* Computed page height */ 11161fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11171fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->apple_page_count == 0xffffffffU) 11181fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 11191fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 11201fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Write raw page count from raster page header... 11211fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 11221fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11231fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->apple_page_count = r->header.cupsInteger[0]; 11241fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11251fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[0] = 'A'; 11261fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[1] = 'S'; 11271fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[2] = 'T'; 11281fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[3] = 0; 11291fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[4] = (unsigned char)(r->apple_page_count >> 24); 11301fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[5] = (unsigned char)(r->apple_page_count >> 16); 11311fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[6] = (unsigned char)(r->apple_page_count >> 8); 11321fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[7] = (unsigned char)(r->apple_page_count); 11331fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11341fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (cups_raster_io(r, appleheader, 8) != 8) 11351fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (0); 11361fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 11371fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11381fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann memset(appleheader, 0, sizeof(appleheader)); 11391fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11401fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[0] = (unsigned char)r->header.cupsBitsPerPixel; 11411fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[1] = r->header.cupsColorSpace == CUPS_CSPACE_SRGB ? 1 : 11421fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_RGBW ? 2 : 11431fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_ADOBERGB ? 3 : 11441fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_W ? 4 : 11451fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_RGB ? 5 : 11461fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace == CUPS_CSPACE_CMYK ? 6 : 0; 11471fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[12] = (unsigned char)(r->header.cupsWidth >> 24); 11481fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[13] = (unsigned char)(r->header.cupsWidth >> 16); 11491fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[14] = (unsigned char)(r->header.cupsWidth >> 8); 11501fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[15] = (unsigned char)(r->header.cupsWidth); 11511fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[16] = (unsigned char)(height >> 24); 11521fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[17] = (unsigned char)(height >> 16); 11531fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[18] = (unsigned char)(height >> 8); 11541fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[19] = (unsigned char)(height); 11551fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[20] = (unsigned char)(r->header.HWResolution[0] >> 24); 11561fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[21] = (unsigned char)(r->header.HWResolution[0] >> 16); 11571fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[22] = (unsigned char)(r->header.HWResolution[0] >> 8); 11581fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann appleheader[23] = (unsigned char)(r->header.HWResolution[0]); 11591fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 11601fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (cups_raster_io(r, appleheader, sizeof(appleheader)) == sizeof(appleheader)); 11611fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 116225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 116325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) 116425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann == sizeof(r->header)); 116525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 116625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 116925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsRasterWritePixels()' - Write raster pixels. 117025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 117125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * For best performance, filters should write one or more whole lines. 117225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The "cupsBytesPerLine" value from the page header can be used to allocate 117325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the line buffer and as the number of bytes to write. 117425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 117525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannunsigned /* O - Number of bytes written */ 117725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */ 117825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *p, /* I - Bytes to write */ 117925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned len)/* I - Number of bytes to write */ 118025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 118125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Bytes read */ 118225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned remaining; /* Bytes remaining */ 118325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u", (void *)r, (void *)p, len, r->remaining)); 118625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r == NULL || r->mode == CUPS_RASTER_READ || r->remaining == 0) 118825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 118925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!r->compressed) 119125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 119225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 119325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Without compression, just write the raster data raw unless the data needs 119425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * to be swapped... 119525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 119625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining -= len / r->header.cupsBytesPerLine; 119825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->swapped && 120025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (r->header.cupsBitsPerColor == 16 || 120125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBitsPerPixel == 12 || 120225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsBitsPerPixel == 16)) 120325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 120425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufptr; /* Pointer into write buffer */ 120525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned count; /* Remaining count */ 120625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 120725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 120825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Allocate a write buffer as needed... 120925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 121025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((size_t)len > r->bufsize) 121225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 121325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->buffer) 121425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr = realloc(r->buffer, len); 121525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 121625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr = malloc(len); 121725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!bufptr) 121925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 122025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->buffer = bufptr; 122225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufsize = len; 122325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 122425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 122625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Byte swap the pixels... 122725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 122825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (bufptr = r->buffer, count = len; count > 1; count -= 2, bufptr += 2) 123025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 123125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr[1] = *p++; 123225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr[0] = *p++; 123325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 123425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count) /* This should never happen... */ 123625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr = *p; 123725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 123925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the byte-swapped buffer... 124025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 124125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = cups_raster_io(r, r->buffer, len); 124325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 124425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 124525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = cups_raster_io(r, p, len); 124625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes < len) 124825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 124925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 125025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (len); 125125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 125225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 125425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Otherwise, compress each line... 125525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 125625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (remaining = len; remaining > 0; remaining -= (unsigned)bytes, p += bytes) 125825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 125925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 126025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Figure out the number of remaining bytes on the current line... 126125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 126225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = (ssize_t)remaining) > (ssize_t)(r->pend - r->pcurrent)) 126425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = (ssize_t)(r->pend - r->pcurrent); 126525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->count > 0) 126725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 126825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 126925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Check to see if this line is the same as the previous line... 127025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 127125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 127225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (memcmp(p, r->pcurrent, (size_t)bytes)) 127325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 127425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_write(r, r->pixels) <= 0) 127525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 127625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 127725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count = 0; 127825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 127925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 128025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 128125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 128225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Mark more bytes as the same... 128325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 128425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent += bytes; 128625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->pcurrent >= r->pend) 128825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 128925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 129025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Increase the repeat count... 129125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 129225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12931fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->count += r->rowheight; 129425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = r->pixels; 129525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 129625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 129725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush out this line if it is the last one... 129825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 129925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining --; 130125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->remaining == 0) 130325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 130425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_write(r, r->pixels) <= 0) 130525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 130625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 130725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (len); 130825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 13091fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann else if (r->count > (256 - r->rowheight)) 131025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 131125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_write(r, r->pixels) <= 0) 131225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 131325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 131425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count = 0; 131525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 131625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 131725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 131825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann continue; 131925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 132025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 132125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->count == 0) 132325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 132425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 132525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the raster data to the buffer... 132625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 132725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(r->pcurrent, p, (size_t)bytes); 132925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent += bytes; 133125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->pcurrent >= r->pend) 133325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 133425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 133525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Increase the repeat count... 133625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 133725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13381fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->count += r->rowheight; 133925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = r->pixels; 134025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 134225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Flush out this line if it is the last one... 134325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 134425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining --; 134625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->remaining == 0) 134825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 134925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cups_raster_write(r, r->pixels) <= 0) 135025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 135125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 135225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 135325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 135425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 135525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 135625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (len); 135725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 135825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 135925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 136125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_raster_read_header()' - Read a raster page header. 136225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 136325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned /* O - 1 on success, 0 on fail */ 136525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_read_header( 136625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r) /* I - Raster stream */ 136725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 136825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t len; /* Length for read/swap */ 136925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("3cups_raster_read_header(r=%p), r->mode=%d", (void *)r, r ? r->mode : 0)); 137225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r == NULL || r->mode != CUPS_RASTER_READ) 137425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 137525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_raster_read_header: r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); 137725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13781fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann memset(&(r->header), 0, sizeof(r->header)); 13791fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 138025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 13811fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Read the header... 138225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 138325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13841fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann switch (r->sync) 13851fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 13861fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann default : 13871fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 13881fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Get the length of the raster header... 13891fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 139025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13911fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1) 13921fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann len = sizeof(cups_page_header_t); 13931fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann else 13941fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann len = sizeof(cups_page_header2_t); 139525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13961fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann DEBUG_printf(("4cups_raster_read_header: len=%d", (int)len)); 139725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13981fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 13991fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Read it... 14001fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 140125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14021fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (cups_raster_read(r, (unsigned char *)&(r->header), len) < (ssize_t)len) 14031fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14041fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann DEBUG_printf(("4cups_raster_read_header: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); 14051fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (0); 14061fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 140725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14081fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* 14091fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * Swap bytes as needed... 14101fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann */ 141125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14121fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->swapped) 14131fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14141fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned *s, /* Current word */ 14151fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann temp; /* Temporary copy */ 141625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 141725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14181fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann DEBUG_puts("4cups_raster_read_header: Swapping header bytes."); 141925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14201fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann for (len = 81, s = &(r->header.AdvanceDistance); 14211fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann len > 0; 14221fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann len --, s ++) 14231fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14241fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann temp = *s; 14251fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann *s = ((temp & 0xff) << 24) | 14261fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann ((temp & 0xff00) << 8) | 14271fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann ((temp & 0xff0000) >> 8) | 14281fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann ((temp & 0xff000000) >> 24); 142925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14301fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann DEBUG_printf(("4cups_raster_read_header: %08x => %08x", temp, *s)); 14311fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 14321fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 14331fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann break; 14341fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 14351fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_RASTER_SYNCapple : 14361fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann case CUPS_RASTER_REVSYNCapple : 14371fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14381fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann unsigned char appleheader[32]; /* Raw header */ 14391fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann static const unsigned rawcspace[] = 14401fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14411fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_SW, 14421fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_SRGB, 14431fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_RGBW, 14441fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_ADOBERGB, 14451fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_W, 14461fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_RGB, 14471fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann CUPS_CSPACE_CMYK 14481fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann }; 14491fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann static const unsigned rawnumcolors[] = 14501fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14511fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 1, 14521fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 3, 14531fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 4, 14541fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 3, 14551fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 1, 14561fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 3, 14571fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 4 14581fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann }; 14591fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 14601fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (cups_raster_read(r, appleheader, sizeof(appleheader)) < (ssize_t)sizeof(appleheader)) 14611fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14621fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann DEBUG_printf(("4cups_raster_read_header: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount)); 14631fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann return (0); 14641fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 14651fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 14661fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann strlcpy(r->header.MediaClass, "PwgRaster", sizeof(r->header.MediaClass)); 14671fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann /* PwgRaster */ 14681fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsBitsPerPixel = appleheader[0]; 14691fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorSpace = appleheader[1] >= (sizeof(rawcspace) / sizeof(rawcspace[0])) ? CUPS_CSPACE_DEVICE1 : rawcspace[appleheader[1]]; 14701fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsNumColors = appleheader[1] >= (sizeof(rawnumcolors) / sizeof(rawnumcolors[0])) ? 1 : rawnumcolors[appleheader[1]]; 14711fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsBitsPerColor = r->header.cupsBitsPerPixel / r->header.cupsNumColors; 14721fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsWidth = ((((((unsigned)appleheader[12] << 8) | (unsigned)appleheader[13]) << 8) | (unsigned)appleheader[14]) << 8) | (unsigned)appleheader[15]; 14731fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsHeight = ((((((unsigned)appleheader[16] << 8) | (unsigned)appleheader[17]) << 8) | (unsigned)appleheader[18]) << 8) | (unsigned)appleheader[19]; 14741fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsBytesPerLine = r->header.cupsWidth * r->header.cupsBitsPerPixel / 8; 14751fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsColorOrder = CUPS_ORDER_CHUNKED; 14761fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.HWResolution[0] = r->header.HWResolution[1] = ((((((unsigned)appleheader[20] << 8) | (unsigned)appleheader[21]) << 8) | (unsigned)appleheader[22]) << 8) | (unsigned)appleheader[23]; 14771fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 14781fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann if (r->header.HWResolution[0] > 0) 14791fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann { 14801fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.PageSize[0] = (unsigned)(r->header.cupsWidth * 72 / r->header.HWResolution[0]); 14811fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.PageSize[1] = (unsigned)(r->header.cupsHeight * 72 / r->header.HWResolution[1]); 14821fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsPageSize[0] = (float)(r->header.cupsWidth * 72.0 / r->header.HWResolution[0]); 14831fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsPageSize[1] = (float)(r->header.cupsHeight * 72.0 / r->header.HWResolution[1]); 14841fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 14851fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann 14861fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsInteger[0] = r->apple_page_count; 14871fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann r->header.cupsInteger[7] = 0xffffff; 14881fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann } 14891fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann break; 149025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 149125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 149225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 149325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Update the header and row count... 149425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 149525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 149625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cups_raster_update(r)) 149725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 149825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 149925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_raster_read_header: cupsBitsPerPixel=%u, cupsBitsPerColor=%u, cupsBytesPerLine=%u, cupsWidth=%u, cupsHeight=%u, r->bpp=%d", r->header.cupsBitsPerPixel, r->header.cupsBitsPerColor, r->header.cupsBytesPerLine, r->header.cupsWidth, r->header.cupsHeight, r->bpp)); 150025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 150125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (r->header.cupsBitsPerPixel > 0 && r->header.cupsBitsPerPixel <= 240 && r->header.cupsBitsPerColor > 0 && r->header.cupsBitsPerColor <= 16 && r->header.cupsBytesPerLine > 0 && r->header.cupsBytesPerLine <= 0x7fffffff && r->header.cupsHeight != 0 && (r->header.cupsBytesPerLine % r->bpp) == 0); 150225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 150325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 150425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 150525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 150625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_raster_io()' - Read/write bytes from a context, handling interruptions. 150725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 150825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 150925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Bytes read/write or -1 */ 151025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_io(cups_raster_t *r, /* I - Raster stream */ 151125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *buf, /* I - Buffer for read/write */ 151225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number of bytes to read/write */ 151325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 151425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t count, /* Number of bytes read/written */ 151525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total; /* Total bytes read/written */ 151625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 151725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 151825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5cups_raster_io(r=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)r, (void *)buf, CUPS_LLCAST bytes)); 151925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (total = 0; total < (ssize_t)bytes; total += count, buf += count) 152125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 152225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (*r->iocb)(r->ctx, buf, bytes - (size_t)total); 152325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("6cups_raster_io: count=%d, total=%d", (int)count, (int)total)); 152525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count == 0) 152625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 152725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("6cups_raster_io: Returning 0."); 152825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 152925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 153025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (count < 0) 153125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 153225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("6cups_raster_io: Returning -1 on error."); 153325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 153425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 153525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 153625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 153725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->iocount += (size_t)count; 153825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 153925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 154025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("6cups_raster_io: Returning " CUPS_LLFMT ".", CUPS_LLCAST total)); 154225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (total); 154425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 154525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 154825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_raster_read()' - Read through the raster buffer. 154925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 155025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 155125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Number of bytes read */ 155225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_read(cups_raster_t *r, /* I - Raster stream */ 155325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *buf, /* I - Buffer */ 155425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number of bytes to read */ 155525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 155625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t count, /* Number of bytes read */ 155725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining, /* Remaining bytes in buffer */ 155825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total; /* Total bytes read */ 155925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 156025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 156125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5cups_raster_read(r=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)r, (void *)buf, CUPS_LLCAST bytes)); 156225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 156325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!r->compressed) 156425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_raster_io(r, buf, bytes)); 156525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 156625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 156725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Allocate a read buffer as needed... 156825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 156925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (ssize_t)(2 * r->header.cupsBytesPerLine); 157125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count < 65536) 157225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = 65536; 157325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((size_t)count > r->bufsize) 157525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 157625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t offset = r->bufptr - r->buffer; 157725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Offset to current start of buffer */ 157825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t end = r->bufend - r->buffer;/* Offset to current end of buffer */ 157925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *rptr; /* Pointer in read buffer */ 158025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->buffer) 158225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann rptr = realloc(r->buffer, (size_t)count); 158325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 158425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann rptr = malloc((size_t)count); 158525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!rptr) 158725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 158825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->buffer = rptr; 159025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufptr = rptr + offset; 159125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufend = rptr + end; 159225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufsize = (size_t)count; 159325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 159425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 159625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Loop until we have read everything... 159725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 159825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (total = 0, remaining = (int)(r->bufend - r->bufptr); 160025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total < (ssize_t)bytes; 160125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total += count, buf += count) 160225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 160325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (ssize_t)bytes - total; 160425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 160525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("6cups_raster_read: count=" CUPS_LLFMT ", remaining=" CUPS_LLFMT ", buf=%p, bufptr=%p, bufend=%p", CUPS_LLCAST count, CUPS_LLCAST remaining, (void *)buf, (void *)r->bufptr, (void *)r->bufend)); 160625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 160725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (remaining == 0) 160825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 160925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count < 16) 161025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 161125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 161225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read into the raster buffer and then copy... 161325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 161425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 161525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining = (*r->iocb)(r->ctx, r->buffer, r->bufsize); 161625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (remaining <= 0) 161725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 161825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 161925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufptr = r->buffer; 162025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufend = r->buffer + remaining; 162125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 162325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->iocount += (size_t)remaining; 162425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 162525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 162625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 162725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 162825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 162925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read directly into "buf"... 163025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 163125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = (*r->iocb)(r->ctx, buf, (size_t)count); 163325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count <= 0) 163525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 163625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 163825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->iocount += (size_t)count; 163925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 164025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann continue; 164225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 164325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 164425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 164625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy bytes from raster buffer to "buf"... 164725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 164825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count > remaining) 165025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = remaining; 165125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 165225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count == 1) 165325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 165425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 165525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy 1 byte... 165625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 165725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 165825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *buf = *(r->bufptr)++; 165925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining --; 166025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 166125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (count < 128) 166225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 166325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 166425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy up to 127 bytes without using memcpy(); this is 166525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * faster because it avoids an extra function call and is 166625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * often further optimized by the compiler... 166725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 166825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 166925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufptr; /* Temporary buffer pointer */ 167025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining -= count; 167225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (bufptr = r->bufptr; count > 0; count --, total ++) 167425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *buf++ = *bufptr++; 167525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufptr = bufptr; 167725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 167825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 167925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 168025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 168125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Use memcpy() for a large read... 168225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 168325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 168425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(buf, r->bufptr, (size_t)count); 168525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufptr += count; 168625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining -= count; 168725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 168825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 168925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 169025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("6cups_raster_read: Returning %ld", (long)total)); 169125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 169225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (total); 169325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 169425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 169525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 169625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 169725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_raster_update()' - Update the raster header and row count for the 169825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * current page. 169925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 170025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 170125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - 1 on success, 0 on failure */ 170225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_update(cups_raster_t *r) /* I - Raster stream */ 170325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 170425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1 || 170525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors == 0) 170625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 170725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 170825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Set the "cupsNumColors" field according to the colorspace... 170925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 171025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 171125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (r->header.cupsColorSpace) 171225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 171325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_W : 171425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_K : 171525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_WHITE : 171625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_GOLD : 171725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_SILVER : 171825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_SW : 171925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors = 1; 172025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 172125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 172225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_RGB : 172325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_CMY : 172425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_YMC : 172525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_CIEXYZ : 172625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_CIELab : 172725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_SRGB : 172825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ADOBERGB : 172925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC1 : 173025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC2 : 173125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC3 : 173225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC4 : 173325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC5 : 173425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC6 : 173525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC7 : 173625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC8 : 173725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICC9 : 173825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICCA : 173925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICCB : 174025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICCC : 174125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICCD : 174225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICCE : 174325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_ICCF : 174425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors = 3; 174525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 174625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 174725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_RGBA : 174825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_RGBW : 174925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_CMYK : 175025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_YMCK : 175125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_KCMY : 175225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_GMCK : 175325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_GMCS : 175425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors = 4; 175525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 175625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 175725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_KCMYcm : 175825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->header.cupsBitsPerPixel < 8) 175925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors = 6; 176025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 176125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors = 4; 176225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 176325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 176425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE1 : 176525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE2 : 176625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE3 : 176725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE4 : 176825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE5 : 176925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE6 : 177025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE7 : 177125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE8 : 177225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICE9 : 177325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICEA : 177425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICEB : 177525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICEC : 177625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICED : 177725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICEE : 177825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_CSPACE_DEVICEF : 177925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->header.cupsNumColors = r->header.cupsColorSpace - 178025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_CSPACE_DEVICE1 + 1; 178125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 178225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 178325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 178425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Unknown color space */ 178525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 178625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 178725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 178825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 178925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 179025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Set the number of bytes per pixel/color... 179125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 179225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 179325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->header.cupsColorOrder == CUPS_ORDER_CHUNKED) 179425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bpp = (r->header.cupsBitsPerPixel + 7) / 8; 179525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 179625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bpp = (r->header.cupsBitsPerColor + 7) / 8; 179725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 179825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->bpp == 0) 179925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bpp = 1; 180025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 180125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 180225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Set the number of remaining rows... 180325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 180425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 180525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->header.cupsColorOrder == CUPS_ORDER_PLANAR) 180625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining = r->header.cupsHeight * r->header.cupsNumColors; 180725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 180825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->remaining = r->header.cupsHeight; 180925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 181025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 181125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Allocate the compression buffer... 181225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 181325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 181425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->compressed) 181525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 181625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->pixels != NULL) 181725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(r->pixels); 181825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 181925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((r->pixels = calloc(r->header.cupsBytesPerLine, 1)) == NULL) 182025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 182125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = NULL; 182225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pend = NULL; 182325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count = 0; 182425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 182525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 182625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 182725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 182825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pcurrent = r->pixels; 182925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->pend = r->pixels + r->header.cupsBytesPerLine; 183025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->count = 0; 183125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 183225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 183325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 183425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 183525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 183625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 183725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 183825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_raster_write()' - Write a row of compressed raster data... 183925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 184025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 184125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Number of bytes written */ 184225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_raster_write( 184325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_raster_t *r, /* I - Raster stream */ 184425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const unsigned char *pixels) /* I - Pixel data to write */ 184525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 184625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const unsigned char *start, /* Start of sequence */ 184725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ptr, /* Current pointer in sequence */ 184825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *pend, /* End of raster buffer */ 184925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *plast; /* Pointer to last pixel */ 185025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *wptr; /* Pointer into write buffer */ 185125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned bpp, /* Bytes per pixel */ 185225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count; /* Count */ 185325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 185425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 185525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("3cups_raster_write(r=%p, pixels=%p)", (void *)r, (void *)pixels)); 185625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 185725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 185825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Allocate a write buffer as needed... 185925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 186025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 186125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = r->header.cupsBytesPerLine * 2; 186225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (count < 65536) 186325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count = 65536; 186425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 186525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((size_t)count > r->bufsize) 186625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 186725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (r->buffer) 186825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann wptr = realloc(r->buffer, count); 186925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 187025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann wptr = malloc(count); 187125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 187225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!wptr) 187325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 187425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_raster_write: Unable to allocate " CUPS_LLFMT " bytes for raster buffer: %s", CUPS_LLCAST count, strerror(errno))); 187525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 187625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 187725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 187825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->buffer = wptr; 187925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann r->bufsize = count; 188025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 188125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 188225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 188325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write the row repeat count... 188425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 188525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 188625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bpp = r->bpp; 188725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pend = pixels + r->header.cupsBytesPerLine; 188825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann plast = pend - bpp; 188925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann wptr = r->buffer; 189025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *wptr++ = (unsigned char)(r->count - 1); 189125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 189225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 189325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Write using a modified PackBits compression... 189425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 189525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 189625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = pixels; ptr < pend;) 189725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 189825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann start = ptr; 189925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr += bpp; 190025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 190125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr == pend) 190225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 190325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 190425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Encode a single pixel at the end... 190525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 190625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 190725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *wptr++ = 0; 190825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (count = bpp; count > 0; count --) 190925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *wptr++ = *start++; 191025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 191125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!memcmp(start, ptr, bpp)) 191225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 191325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 191425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Encode a sequence of repeating pixels... 191525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 191625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 191725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (count = 2; count < 128 && ptr < plast; count ++, ptr += bpp) 191825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (memcmp(ptr, ptr + bpp, bpp)) 191925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 192025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 192125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *wptr++ = (unsigned char)(count - 1); 192225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (count = bpp; count > 0; count --) 192325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *wptr++ = *ptr++; 192425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 192525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 192625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 192725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 192825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Encode a sequence of non-repeating pixels... 192925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 193025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 193125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (count = 1; count < 128 && ptr < plast; count ++, ptr += bpp) 193225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!memcmp(ptr, ptr + bpp, bpp)) 193325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 193425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 193525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ptr >= plast && count < 128) 193625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 193725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count ++; 193825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ptr += bpp; 193925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 194025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 194125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *wptr++ = (unsigned char)(257 - count); 194225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 194325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count *= bpp; 194425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(wptr, start, count); 194525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann wptr += count; 194625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 194725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 194825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 194925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_raster_write: Writing " CUPS_LLFMT " bytes.", CUPS_LLCAST (wptr - r->buffer))); 195025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 195125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cups_raster_io(r, r->buffer, (size_t)(wptr - r->buffer))); 195225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 195325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 195425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 195525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 195625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_read_fd()' - Read bytes from a file. 195725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 195825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 195925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Bytes read or -1 */ 196025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_read_fd(void *ctx, /* I - File descriptor as pointer */ 196125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *buf, /* I - Buffer for read */ 196225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Maximum number of bytes to read */ 196325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 196425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd = (int)((intptr_t)ctx); 196525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* File descriptor */ 196625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t count; /* Number of bytes read */ 196725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 196825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 196925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 /* Sigh */ 197025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((count = read(fd, buf, (unsigned)bytes)) < 0) 197125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 197225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((count = read(fd, buf, bytes)) < 0) 197325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 197425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (errno != EINTR && errno != EAGAIN) 197525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 197625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_read_fd: %s", strerror(errno))); 197725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 197825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 197925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_read_fd: Returning %d bytes.", (int)count)); 198125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (count); 198325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 198425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 198625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 198725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_swap()' - Swap bytes in raster data... 198825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 198925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 199025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 199125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_swap(unsigned char *buf, /* I - Buffer to swap */ 199225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number of bytes to swap */ 199325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 199425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char even, odd; /* Temporary variables */ 199525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 199625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 199725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes /= 2; 199825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 199925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (bytes > 0) 200025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 200125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann even = buf[0]; 200225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann odd = buf[1]; 200325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buf[0] = odd; 200425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buf[1] = even; 200525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 200625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buf += 2; 200725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes --; 200825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 200925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 201025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 201125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 201225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 201325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_write_fd()' - Write bytes to a file. 201425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 201525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 201625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic ssize_t /* O - Bytes written or -1 */ 201725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_write_fd(void *ctx, /* I - File descriptor pointer */ 201825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *buf, /* I - Bytes to write */ 201925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bytes) /* I - Number of bytes to write */ 202025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 202125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd = (int)((intptr_t)ctx); 202225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* File descriptor */ 202325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t count; /* Number of bytes written */ 202425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 202525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 202625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 /* Sigh */ 202725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((count = write(fd, buf, (unsigned)bytes)) < 0) 202825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 202925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((count = write(fd, buf, bytes)) < 0) 203025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 203125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (errno != EINTR && errno != EAGAIN) 203225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 203325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4cups_write_fd: %s", strerror(errno))); 203425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 203525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 203625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 203725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (count); 203825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 2039