diff options
Diffstat (limited to 'filter/raster.c')
-rw-r--r-- | filter/raster.c | 119 |
1 files changed, 100 insertions, 19 deletions
diff --git a/filter/raster.c b/filter/raster.c index 1f059f61..c03192e3 100644 --- a/filter/raster.c +++ b/filter/raster.c @@ -1,5 +1,5 @@ /* - * "$Id: raster.c 9598 2011-03-11 23:53:27Z mike $" + * "$Id: raster.c 9735 2011-05-03 21:31:49Z mike $" * * Raster file routines for CUPS. * @@ -20,6 +20,7 @@ * * cupsRasterClose() - Close a raster stream. * cupsRasterOpen() - Open a raster stream using a file descriptor. + * cupsRasterOpenIO() - Open a raster stream using a callback function. * cupsRasterReadHeader() - Read a raster page header and store it in a * version 1 page header structure. * cupsRasterReadHeader2() - Read a raster page header and store it in a @@ -57,13 +58,11 @@ * Private structures... */ -typedef ssize_t (*_cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length); - struct _cups_raster_s /**** Raster stream data ****/ { unsigned sync; /* Sync word from start of stream */ void *ctx; /* File descriptor */ - _cups_raster_iocb_t iocb; /* IO callback */ + cups_raster_iocb_t iocb; /* IO callback */ cups_mode_t mode; /* Read/write mode */ cups_page_header2_t header; /* Raster header for current page */ int count, /* Current row run-length count */ @@ -128,16 +127,46 @@ cupsRasterClose(cups_raster_t *r) /* I - Stream to close */ * image processor (RIP) filters that generate raster data, "fd" will be 1 * (stdout). * - * When writing raster data, the @code CUPS_RASTER_WRITE@ or - * @code CUPS_RASTER_WRITE_COMPRESS@ mode can be used - compressed output is - * generally 25-50% smaller but adds a 100-300% execution time overhead. + * When writing raster data, the @code CUPS_RASTER_WRITE@, + * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can + * be used - compressed and PWG output is generally 25-50% smaller but adds a + * 100-300% execution time overhead. */ cups_raster_t * /* O - New stream */ cupsRasterOpen(int fd, /* I - File descriptor */ cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, - @code CUPS_RASTER_WRITE@, or - @code CUPS_RASTER_WRITE_COMPRESSED@ */ + @code CUPS_RASTER_WRITE@, + @code CUPS_RASTER_WRITE_COMPRESSED@, + or @code CUPS_RASTER_WRITE_PWG@ */ +{ + if (mode == CUPS_RASTER_READ) + return (cupsRasterOpenIO(cups_read_fd, (void *)((intptr_t)fd), mode)); + else + return (cupsRasterOpenIO(cups_write_fd, (void *)((intptr_t)fd), mode)); +} + + +/* + * 'cupsRasterOpenIO()' - Open a raster stream using a callback function. + * + * This function associates a raster stream with the given callback function and + * context pointer. + * + * When writing raster data, the @code CUPS_RASTER_WRITE@, + * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can + * be used - compressed and PWG output is generally 25-50% smaller but adds a + * 100-300% execution time overhead. + */ + +cups_raster_t * /* O - New stream */ +cupsRasterOpenIO( + cups_raster_iocb_t iocb, /* I - Read/write callback */ + void *ctx, /* I - Context pointer for callback */ + cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, + @code CUPS_RASTER_WRITE@, + @code CUPS_RASTER_WRITE_COMPRESSED@, + or @code CUPS_RASTER_WRITE_PWG@ */ { cups_raster_t *r; /* New stream */ @@ -151,8 +180,8 @@ cupsRasterOpen(int fd, /* I - File descriptor */ return (NULL); } - r->ctx = (void *)((intptr_t)fd); - r->iocb = mode == CUPS_RASTER_READ ? cups_read_fd : cups_write_fd; + r->ctx = ctx; + r->iocb = iocb; r->mode = mode; if (mode == CUPS_RASTER_READ) @@ -210,6 +239,12 @@ cupsRasterOpen(int fd, /* I - File descriptor */ r->compressed = 1; r->sync = CUPS_RASTER_SYNCv2; break; + + case CUPS_RASTER_WRITE_PWG : + r->compressed = 1; + r->sync = htonl(CUPS_RASTER_SYNC_PWG); + r->swapped = r->sync != CUPS_RASTER_SYNC_PWG; + break; } if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) @@ -527,8 +562,31 @@ cupsRasterWriteHeader( * Write the raster header... */ - return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) - == sizeof(r->header)); + if (r->mode == CUPS_RASTER_WRITE_PWG) + { + /* + * PWG raster data is always network byte order with most of the page header + * zeroed. + */ + + cups_page_header2_t fh; /* File page header */ + + memset(&fh, 0, sizeof(fh)); + fh.HWResolution[0] = htonl(r->header.HWResolution[0]); + fh.HWResolution[1] = htonl(r->header.HWResolution[1]); + fh.cupsWidth = htonl(r->header.cupsWidth); + fh.cupsHeight = htonl(r->header.cupsHeight); + fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); + fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); + fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); + fh.cupsColorOrder = htonl(r->header.cupsColorOrder); + fh.cupsColorSpace = htonl(r->header.cupsColorSpace); + + return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); + } + else + return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) + == sizeof(r->header)); } @@ -562,8 +620,32 @@ cupsRasterWriteHeader2( * Write the raster header... */ - return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) - == sizeof(r->header)); + if (r->mode == CUPS_RASTER_WRITE_PWG) + { + /* + * PWG raster data is always network byte order with most of the page header + * zeroed. + */ + + cups_page_header2_t fh; /* File page header */ + + memset(&fh, 0, sizeof(fh)); + fh.HWResolution[0] = htonl(r->header.HWResolution[0]); + fh.HWResolution[1] = htonl(r->header.HWResolution[1]); + fh.cupsWidth = htonl(r->header.cupsWidth); + fh.cupsHeight = htonl(r->header.cupsHeight); + fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); + fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); + fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); + fh.cupsColorOrder = htonl(r->header.cupsColorOrder); + fh.cupsColorSpace = htonl(r->header.cupsColorSpace); + fh.cupsNumColors = htonl(r->header.cupsNumColors); + + return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); + } + else + return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) + == sizeof(r->header)); } @@ -962,7 +1044,6 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ unsigned char *bufptr; /* Temporary buffer pointer */ - remaining -= count; for (bufptr = r->bufptr; count > 0; count --, total ++) @@ -1160,7 +1241,7 @@ cups_raster_write( *wptr++ = r->count - 1; /* - * Write using a modified TIFF "packbits" compression... + * Write using a modified PackBits compression... */ for (ptr = pixels; ptr < pend;) @@ -1198,7 +1279,7 @@ cups_raster_write( * Encode a sequence of non-repeating pixels... */ - for (count = 1; count < 127 && ptr < plast; count ++, ptr += bpp) + for (count = 1; count < 128 && ptr < plast; count ++, ptr += bpp) if (!memcmp(ptr, ptr + bpp, bpp)) break; @@ -1291,5 +1372,5 @@ cups_write_fd(void *ctx, /* I - File descriptor pointer */ /* - * End of "$Id: raster.c 9598 2011-03-11 23:53:27Z mike $". + * End of "$Id: raster.c 9735 2011-05-03 21:31:49Z mike $". */ |