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