diff options
author | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2011-09-20 18:40:57 +0000 |
---|---|---|
committer | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2011-09-20 18:40:57 +0000 |
commit | 10ddcf65af43ef5d23a6256bf30403eb5e71bd8a (patch) | |
tree | 73adf9f4cb60f5e5e58956ad2cd2e9c2a38ed324 /filter | |
parent | 83e080011117b6125721e132de22edb18266e5eb (diff) |
Merge changes from CUPS 1.6svn-r10006.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@3427 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'filter')
-rw-r--r-- | filter/raster.c | 77 | ||||
-rw-r--r-- | filter/rastertopwg.c | 251 |
2 files changed, 314 insertions, 14 deletions
diff --git a/filter/raster.c b/filter/raster.c index bd0838647..bb5725206 100644 --- a/filter/raster.c +++ b/filter/raster.c @@ -560,22 +560,79 @@ cupsRasterWriteHeader( if (r->mode == CUPS_RASTER_WRITE_PWG) { /* - * PWG raster data is always network byte order with most of the page header + * PWG raster data is always network byte order with much 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); + + strlcpy(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); + /* PwgRaster */ + strlcpy(fh.MediaColor, r->header.MediaColor, sizeof(fh.MediaColor)); + strlcpy(fh.MediaType, r->header.MediaType, sizeof(fh.MediaType)); + strlcpy(fh.OutputType, r->header.OutputType, sizeof(fh.OutputType)); + /* PrintContentType */ + + fh.CutMedia = htonl(r->header.CutMedia); + fh.Duplex = htonl(r->header.Duplex); + fh.HWResolution[0] = htonl(r->header.HWResolution[0]); + fh.HWResolution[1] = htonl(r->header.HWResolution[1]); + fh.ImagingBoundingBox[0] = htonl(r->header.ImagingBoundingBox[0]); + fh.ImagingBoundingBox[1] = htonl(r->header.ImagingBoundingBox[1]); + fh.ImagingBoundingBox[2] = htonl(r->header.ImagingBoundingBox[2]); + fh.ImagingBoundingBox[3] = htonl(r->header.ImagingBoundingBox[3]); + fh.InsertSheet = htonl(r->header.InsertSheet); + fh.Jog = htonl(r->header.Jog); + fh.LeadingEdge = htonl(r->header.LeadingEdge); + fh.ManualFeed = htonl(r->header.ManualFeed); + fh.MediaPosition = htonl(r->header.MediaPosition); + fh.MediaWeight = htonl(r->header.MediaWeight); + fh.NumCopies = htonl(r->header.NumCopies); + fh.Orientation = htonl(r->header.Orientation); + fh.PageSize[0] = htonl(r->header.PageSize[0]); + fh.PageSize[1] = htonl(r->header.PageSize[1]); + fh.Tumble = htonl(r->header.Tumble); + 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); + fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]); + /* TotalPageCount */ + fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]); + /* CrossFeedTransform */ + fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]); + /* FeedTransform */ + fh.cupsInteger[3] = htonl(r->header.cupsInteger[3]); + /* ImageBoxLeft */ + fh.cupsInteger[4] = htonl(r->header.cupsInteger[4]); + /* ImageBoxTop */ + fh.cupsInteger[5] = htonl(r->header.cupsInteger[5]); + /* ImageBoxRight */ + fh.cupsInteger[6] = htonl(r->header.cupsInteger[6]); + /* ImageBoxBottom */ + fh.cupsInteger[7] = htonl(r->header.cupsInteger[7]); + /* BlackPrimary */ + fh.cupsInteger[8] = htonl(r->header.cupsInteger[8]); + /* PrintQuality */ + fh.cupsInteger[14] = htonl(r->header.cupsInteger[14]); + /* VendorIdentifier */ + fh.cupsInteger[15] = htonl(r->header.cupsInteger[15]); + /* VendorLength */ + + memcpy(fh.cupsReal, r->header.cupsReal, + sizeof(fh.cupsReal) + sizeof(fh.cupsString)); + /* VendorData */ + + strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent, + sizeof(fh.cupsRenderingIntent)); + strlcpy(fh.cupsPageSizeName, r->header.cupsPageSizeName, + sizeof(fh.cupsPageSizeName)); return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); } diff --git a/filter/rastertopwg.c b/filter/rastertopwg.c index 716603a7f..622aa605a 100644 --- a/filter/rastertopwg.c +++ b/filter/rastertopwg.c @@ -22,10 +22,8 @@ * Include necessary headers... */ -#include <cups/cups.h> -#include <cups/language-private.h> +#include <cups/cups-private.h> #include <cups/raster.h> -#include <cups/string-private.h> #include <unistd.h> #include <fcntl.h> @@ -54,6 +52,14 @@ main(int argc, /* I - Number of command-line args */ linesize, /* Bytes per line */ lineoffset; /* Offset into line */ unsigned char white; /* White pixel */ + ppd_file_t *ppd; /* PPD file */ + ppd_attr_t *back; /* cupsBackSize attribute */ + _ppd_cache_t *cache; /* PPD cache */ + _pwg_size_t *pwg_size; /* PWG media size */ + _pwg_media_t *pwg_media; /* PWG media name */ + int num_options; /* Number of options */ + cups_option_t *options = NULL;/* Options */ + const char *val; /* Option value */ if (argc < 6 || argc > 7) @@ -75,6 +81,16 @@ main(int argc, /* I - Number of command-line args */ inras = cupsRasterOpen(fd, CUPS_RASTER_READ); outras = cupsRasterOpen(1, CUPS_RASTER_WRITE_PWG); + ppd = ppdOpenFile(getenv("PPD")); + back = ppdFindAttr(ppd, "cupsBackSide", NULL); + + num_options = cupsParseOptions(argv[5], 0, &options); + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + cache = ppd ? ppd->cache : NULL; + while (cupsRasterReadHeader2(inras, &inheader)) { /* @@ -126,6 +142,7 @@ main(int argc, /* I - Number of command-line args */ case CUPS_CSPACE_DEVICEF : white = 0; break; + default : _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); fprintf(stderr, "DEBUG: Unsupported cupsColorSpace %d on page %d.\n", @@ -151,10 +168,236 @@ main(int argc, /* I - Number of command-line args */ } memcpy(&outheader, &inheader, sizeof(outheader)); - outheader.cupsWidth = page_width; + outheader.cupsWidth = page_width; outheader.cupsHeight = page_height; outheader.cupsBytesPerLine = linesize; + outheader.cupsInteger[14] = 0; /* VendorIdentifier */ + outheader.cupsInteger[15] = 0; /* VendorLength */ + + if ((val = cupsGetOption("print-content-optimize", num_options, + options)) != NULL) + { + if (!strcmp(val, "automatic")) + strlcpy(outheader.OutputType, "Automatic", + sizeof(outheader.OutputType)); + else if (!strcmp(val, "graphics")) + strlcpy(outheader.OutputType, "Graphics", sizeof(outheader.OutputType)); + else if (!strcmp(val, "photo")) + strlcpy(outheader.OutputType, "Photo", sizeof(outheader.OutputType)); + else if (!strcmp(val, "text")) + strlcpy(outheader.OutputType, "Text", sizeof(outheader.OutputType)); + else if (!strcmp(val, "text-and-graphics")) + strlcpy(outheader.OutputType, "TextAndGraphics", + sizeof(outheader.OutputType)); + else + { + fprintf(stderr, "DEBUG: Unsupported print-content-type \"%s\".\n", val); + outheader.OutputType[0] = '\0'; + } + } + + if ((val = cupsGetOption("print-quality", num_options, options)) != NULL) + { + int quality = atoi(val); /* print-quality value */ + + if (quality >= IPP_QUALITY_DRAFT && quality <= IPP_QUALITY_HIGH) + outheader.cupsInteger[8] = quality; + else + { + fprintf(stderr, "DEBUG: Unsupported print-quality %d.\n", quality); + outheader.cupsInteger[8] = 0; + } + } + + if ((val = cupsGetOption("print-rendering-intent", num_options, + options)) != NULL) + { + if (!strcmp(val, "absolute")) + strlcpy(outheader.cupsRenderingIntent, "Absolute", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "automatic")) + strlcpy(outheader.cupsRenderingIntent, "Automatic", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "perceptual")) + strlcpy(outheader.cupsRenderingIntent, "Perceptual", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "relative")) + strlcpy(outheader.cupsRenderingIntent, "Relative", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "relative-bpc")) + strlcpy(outheader.cupsRenderingIntent, "RelativeBpc", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "saturation")) + strlcpy(outheader.cupsRenderingIntent, "Saturation", + sizeof(outheader.cupsRenderingIntent)); + else + { + fprintf(stderr, "DEBUG: Unsupported print-rendering-intent \"%s\".\n", + val); + outheader.cupsRenderingIntent[0] = '\0'; + } + } + + if (inheader.cupsPageSizeName[0] && + (pwg_size = _ppdCacheGetSize(cache, inheader.cupsPageSizeName)) != NULL) + { + strlcpy(outheader.cupsPageSizeName, pwg_size->map.pwg, + sizeof(outheader.cupsPageSizeName)); + } + else + { + pwg_media = _pwgMediaForSize((int)(2540.0 * inheader.cupsPageSize[0] / + 72.0), + (int)(2540.0 * inheader.cupsPageSize[1] / + 72.0)); + + if (pwg_media) + strlcpy(outheader.cupsPageSizeName, pwg_media->pwg, + sizeof(outheader.cupsPageSizeName)); + else + { + fprintf(stderr, "DEBUG: Unsupported PageSize %.2fx%.2f.\n", + inheader.cupsPageSize[0], inheader.cupsPageSize[1]); + outheader.cupsPageSizeName[0] = '\0'; + } + } + + if (inheader.Duplex && !(page & 1) && + back && _cups_strcasecmp(back->value, "Normal")) + { + if (_cups_strcasecmp(back->value, "Flipped")) + { + if (inheader.Tumble) + { + outheader.cupsInteger[1] = -1;/* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_width - page_left - + inheader.cupsWidth; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_width - page_left; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = -1;/* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_bottom; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_top; + /* ImageBoxBottom */ + } + } + else if (_cups_strcasecmp(back->value, "ManualTumble")) + { + if (inheader.Tumble) + { + outheader.cupsInteger[1] = -1;/* CrossFeedTransform */ + outheader.cupsInteger[2] = -1;/* FeedTransform */ + + outheader.cupsInteger[3] = page_width - page_left - + inheader.cupsWidth; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_bottom; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_width - page_left; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_top; + /* ImageBoxBottom */ + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + } + else if (_cups_strcasecmp(back->value, "Rotated")) + { + if (inheader.Tumble) + { + outheader.cupsInteger[1] = -1;/* CrossFeedTransform */ + outheader.cupsInteger[2] = -1;/* FeedTransform */ + + outheader.cupsInteger[3] = page_width - page_left - + inheader.cupsWidth; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_bottom; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_width - page_left; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_top; + /* ImageBoxBottom */ + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + } + else + { + /* + * Unsupported value... + */ + + fprintf(stderr, "DEBUG: Unsupported cupsBackSide \"%s\".\n", back->value); + + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + if (!cupsRasterWriteHeader2(outras, &outheader)) { _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); |