X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=filter%2Fimagetoraster.c;h=0c7d705a224dbe41833279261b74ddb78cfbf64b;hb=a74454a757c35671e1cbf71870231a3d51945858;hp=6fdea10381424277516551d78619b899db6430c5;hpb=ef416fc25c4af449e930416117bedb12fc9924ba;p=thirdparty%2Fcups.git diff --git a/filter/imagetoraster.c b/filter/imagetoraster.c index 6fdea1038..0c7d705a2 100644 --- a/filter/imagetoraster.c +++ b/filter/imagetoraster.c @@ -1,9 +1,9 @@ /* - * "$Id: imagetoraster.c 4767 2005-10-10 19:23:23Z mike $" + * "$Id: imagetoraster.c 5485 2006-05-02 23:59:56Z mike $" * * Image file to raster filter for the Common UNIX Printing System (CUPS). * - * Copyright 1993-2005 by Easy Software Products. + * Copyright 1993-2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the * property of Easy Software Products and are protected by Federal @@ -26,8 +26,6 @@ * Contents: * * main() - Main entry... - * exec_code() - Execute PostScript setpagedevice commands as - * appropriate. * format_CMY() - Convert image data to CMY. * format_CMYK() - Convert image data to CMYK. * format_K() - Convert image data to black. @@ -38,6 +36,7 @@ * format_YMC() - Convert image data to YMC. * format_YMCK() - Convert image data to YMCK. * make_lut() - Make a lookup table given gamma and brightness values. + * raster_cb() - Validate the page header. */ /* @@ -60,7 +59,7 @@ int Flip = 0, /* Flip/mirror pages */ YPosition = 0, /* Vertical position on page */ Collate = 0, /* Collate copies? */ Copies = 1; /* Number of copies */ -int Floyd16x16[16][16] = /* Traditional Floyd ordered dither */ +int Floyd16xc16[16][16] = /* Traditional Floyd ordered dither */ { { 0, 128, 32, 160, 8, 136, 40, 168, 2, 130, 34, 162, 10, 138, 42, 170 }, @@ -172,7 +171,6 @@ int Planes[] = /* Number of planes for each colorspace */ * Local functions... */ -static void exec_code(cups_page_header2_t *header, const char *code); static void format_CMY(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); static void format_CMYK(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); static void format_K(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); @@ -184,6 +182,7 @@ static void format_W(cups_page_header2_t *header, unsigned char *row, int y, int static void format_YMC(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); static void format_YMCK(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); static void make_lut(cups_ib_t *, int, float, float); +static int raster_cb(cups_page_header2_t *header, int preferred_bits); /* @@ -212,12 +211,10 @@ main(int argc, /* I - Number of command-line arguments */ xtemp, /* Bitmap width in pixels */ ytemp, /* Bitmap height in pixels */ page; /* Current page number */ - int x0, y0, /* Corners of the page in image coords */ - x1, y1; + int xc0, yc0, /* Corners of the page in image coords */ + xc1, yc1; ppd_file_t *ppd; /* PPD file */ - ppd_choice_t *choice, /* PPD option choice */ - **choices; /* List of marked choices */ - int count; /* Number of marked choices */ + ppd_choice_t *choice; /* PPD option choice */ char *resolution, /* Output resolution */ *media_type; /* Media type */ ppd_profile_t *profile; /* Color profile */ @@ -407,13 +404,37 @@ main(int argc, /* I - Number of command-line arguments */ Collate = 1; if ((val = cupsGetOption("gamma", num_options, options)) != NULL) + { + /* + * Get gamma value from 1 to 10000... + */ + g = atoi(val) * 0.001f; + if (g < 0.001f) + g = 0.001f; + else if (g > 10.0f) + g = 10.0f; + } + if ((val = cupsGetOption("brightness", num_options, options)) != NULL) + { + /* + * Get brightness value from 10 to 1000. + */ + b = atoi(val) * 0.01f; + if (b < 0.1f) + b = 0.1f; + else if (b > 10.0f) + b = 10.0f; + } + if ((val = cupsGetOption("scaling", num_options, options)) != NULL) zoom = atoi(val) * 0.01; + else if (cupsGetOption("fitplot", num_options, options)) + zoom = 1.0; if ((val = cupsGetOption("ppi", num_options, options)) != NULL) if (sscanf(val, "%dx%d", &xppi, &yppi) < 2) @@ -482,31 +503,11 @@ main(int argc, /* I - Number of command-line arguments */ * Set the needed options in the page header... */ - memset(&header, 0, sizeof(header)); - header.HWResolution[0] = 100; - header.HWResolution[1] = 100; - header.cupsBitsPerColor = 1; - header.cupsColorOrder = CUPS_ORDER_CHUNKED; - header.cupsColorSpace = CUPS_CSPACE_K; - - if (ppd && ppd->patches) - exec_code(&header, ppd->patches); - - if ((count = ppdCollect(ppd, PPD_ORDER_DOCUMENT, &choices)) > 0) - for (i = 0; i < count; i ++) - exec_code(&header, choices[i]->code); - - if ((count = ppdCollect(ppd, PPD_ORDER_ANY, &choices)) > 0) - for (i = 0; i < count; i ++) - exec_code(&header, choices[i]->code); - - if ((count = ppdCollect(ppd, PPD_ORDER_PROLOG, &choices)) > 0) - for (i = 0; i < count; i ++) - exec_code(&header, choices[i]->code); - - if ((count = ppdCollect(ppd, PPD_ORDER_PAGE, &choices)) > 0) - for (i = 0; i < count; i ++) - exec_code(&header, choices[i]->code); + if (cupsRasterInterpretPPD(&header, ppd, num_options, options, raster_cb)) + { + fputs("ERROR: Bad page setup!\n", stderr); + return (1); + } /* * Get the media type and resolution that have been chosen... @@ -531,7 +532,6 @@ main(int argc, /* I - Number of command-line arguments */ case CUPS_CSPACE_W : primary = CUPS_IMAGE_WHITE; secondary = CUPS_IMAGE_WHITE; - header.cupsBitsPerPixel = header.cupsBitsPerColor; break; default : @@ -540,25 +540,6 @@ main(int argc, /* I - Number of command-line arguments */ case CUPS_CSPACE_RGBW : primary = CUPS_IMAGE_RGB; secondary = CUPS_IMAGE_RGB; - - /* - * Ensure that colorimetric colorspaces use at least 8 bits per - * component... - */ - - if (header.cupsColorSpace >= CUPS_CSPACE_CIEXYZ && - header.cupsBitsPerColor < 8) - header.cupsBitsPerColor = 8; - - if (header.cupsColorOrder == CUPS_ORDER_CHUNKED) - { - if (header.cupsBitsPerColor >= 8) - header.cupsBitsPerPixel = header.cupsBitsPerColor * 3; - else - header.cupsBitsPerPixel = header.cupsBitsPerColor * 4; - } - else - header.cupsBitsPerPixel = header.cupsBitsPerColor; break; case CUPS_CSPACE_K : @@ -567,7 +548,6 @@ main(int argc, /* I - Number of command-line arguments */ case CUPS_CSPACE_SILVER : primary = CUPS_IMAGE_BLACK; secondary = CUPS_IMAGE_BLACK; - header.cupsBitsPerPixel = header.cupsBitsPerColor; break; case CUPS_CSPACE_CMYK : @@ -577,27 +557,12 @@ main(int argc, /* I - Number of command-line arguments */ case CUPS_CSPACE_GMCS : primary = CUPS_IMAGE_CMYK; secondary = CUPS_IMAGE_CMYK; - - if (header.cupsColorOrder == CUPS_ORDER_CHUNKED) - header.cupsBitsPerPixel = header.cupsBitsPerColor * 4; - else - header.cupsBitsPerPixel = header.cupsBitsPerColor; break; case CUPS_CSPACE_CMY : case CUPS_CSPACE_YMC : primary = CUPS_IMAGE_CMY; secondary = CUPS_IMAGE_CMY; - - if (header.cupsColorOrder == CUPS_ORDER_CHUNKED) - { - if (header.cupsBitsPerColor >= 8) - header.cupsBitsPerPixel = 24; - else - header.cupsBitsPerPixel = header.cupsBitsPerColor * 4; - } - else - header.cupsBitsPerPixel = header.cupsBitsPerColor; break; case CUPS_CSPACE_KCMYcm : @@ -605,21 +570,11 @@ main(int argc, /* I - Number of command-line arguments */ { primary = CUPS_IMAGE_CMY; secondary = CUPS_IMAGE_CMY; - - if (header.cupsColorOrder == CUPS_ORDER_CHUNKED) - header.cupsBitsPerPixel = 8; - else - header.cupsBitsPerPixel = 1; } else { primary = CUPS_IMAGE_CMYK; secondary = CUPS_IMAGE_CMYK; - - if (header.cupsColorOrder == CUPS_ORDER_CHUNKED) - header.cupsBitsPerPixel = header.cupsBitsPerColor * 4; - else - header.cupsBitsPerPixel = header.cupsBitsPerColor; } break; } @@ -1234,20 +1189,20 @@ main(int argc, /* I - Number of command-line arguments */ if (Orientation & 1) { - x0 = img->xsize * ypage / ypages; - x1 = img->xsize * (ypage + 1) / ypages - 1; - y0 = img->ysize * xpage / xpages; - y1 = img->ysize * (xpage + 1) / xpages - 1; + xc0 = img->xsize * ypage / ypages; + xc1 = img->xsize * (ypage + 1) / ypages - 1; + yc0 = img->ysize * xpage / xpages; + yc1 = img->ysize * (xpage + 1) / xpages - 1; xtemp = header.HWResolution[0] * yprint; ytemp = header.HWResolution[1] * xprint; } else { - x0 = img->xsize * xpage / xpages; - x1 = img->xsize * (xpage + 1) / xpages - 1; - y0 = img->ysize * ypage / ypages; - y1 = img->ysize * (ypage + 1) / ypages - 1; + xc0 = img->xsize * xpage / xpages; + xc1 = img->xsize * (xpage + 1) / xpages - 1; + yc0 = img->ysize * ypage / ypages; + yc1 = img->ysize * (ypage + 1) / ypages - 1; xtemp = header.HWResolution[0] * xprint; ytemp = header.HWResolution[1] * yprint; @@ -1262,10 +1217,10 @@ main(int argc, /* I - Number of command-line arguments */ */ if (Flip) - z = cupsImageZoomNew(img, x0, y0, x1, y1, -xtemp, ytemp, + z = _cupsImageZoomNew(img, xc0, yc0, xc1, yc1, -xtemp, ytemp, Orientation & 1, zoom_type); else - z = cupsImageZoomNew(img, x0, y0, x1, y1, xtemp, ytemp, + z = _cupsImageZoomNew(img, xc0, yc0, xc1, yc1, xtemp, ytemp, Orientation & 1, zoom_type); /* @@ -1303,9 +1258,9 @@ main(int argc, /* I - Number of command-line arguments */ if (iy != last_iy) { if (zoom_type != CUPS_IZOOM_FAST && (iy - last_iy) > 1) - cupsImageZoomFill(z, iy); + _cupsImageZoomFill(z, iy); - cupsImageZoomFill(z, iy + z->yincr); + _cupsImageZoomFill(z, iy + z->yincr); last_iy = iy; } @@ -1425,7 +1380,7 @@ main(int argc, /* I - Number of command-line arguments */ * Free memory used for the "zoom" engine... */ - cupsImageZoomDelete(z); + _cupsImageZoomDelete(z); } } @@ -1442,184 +1397,6 @@ main(int argc, /* I - Number of command-line arguments */ } -/* - * 'exec_code()' - Execute PostScript setpagedevice commands as appropriate. - */ - -static void -exec_code(cups_page_header2_t *header, /* I - Page header */ - const char *code) /* I - Option choice to execute */ -{ - char *ptr, /* Pointer into name/value string */ - name[255], /* Name of pagedevice entry */ - value[1024]; /* Value of pagedevice entry */ - - - for (; *code != '\0';) - { - /* - * Search for the start of a dictionary name... - */ - - while (*code != '/' && *code != '\0') - code ++; - - if (*code == '\0') - break; - - /* - * Get the name... - */ - - code ++; - for (ptr = name; isalnum(*code & 255) && (ptr - name) < (sizeof(name) - 1);) - *ptr++ = *code++; - *ptr = '\0'; - - /* - * The parse the value as needed... - */ - - while (isspace(*code & 255)) - code ++; - - if (*code == '\0') - break; - - if (*code == '[') - { - /* - * Read array of values... - */ - - code ++; - for (ptr = value; - *code != ']' && *code != '\0' && - (ptr - value) < (sizeof(value) - 1);) - *ptr++ = *code++; - *ptr = '\0'; - } - else if (*code == '(') - { - /* - * Read string value... - */ - - code ++; - for (ptr = value; - *code != ')' && *code != '\0' && - (ptr - value) < (sizeof(value) - 1);) - if (*code == '\\') - { - code ++; - if (isdigit(*code & 255)) - *ptr++ = (char)strtol(code, (char **)&code, 8); - else - *ptr++ = *code++; - } - else - *ptr++ = *code++; - - *ptr = '\0'; - } - else if (isdigit(*code & 255) || *code == '-') - { - /* - * Read single number... - */ - - for (ptr = value; - (isdigit(*code & 255) || *code == '-') && - (ptr - value) < (sizeof(value) - 1);) - *ptr++ = *code++; - *ptr = '\0'; - } - else - { - /* - * Read a single name... - */ - - for (ptr = value; - (isalnum(*code & 255) || *code == '_') && - (ptr - value) < (sizeof(value) - 1);) - *ptr++ = *code++; - *ptr = '\0'; - } - - /* - * Assign the value as needed... - */ - - if (!strcmp(name, "MediaClass")) - strlcpy(header->MediaClass, value, sizeof(header->MediaClass)); - else if (!strcmp(name, "MediaColor")) - strlcpy(header->MediaColor, value, sizeof(header->MediaColor)); - else if (!strcmp(name, "MediaType")) - strlcpy(header->MediaType, value, sizeof(header->MediaType)); - else if (!strcmp(name, "OutputType")) - strlcpy(header->OutputType, value, sizeof(header->OutputType)); - else if (!strcmp(name, "AdvanceDistance")) - header->AdvanceDistance = atoi(value); - else if (!strcmp(name, "AdvanceMedia")) - header->AdvanceMedia = atoi(value); - else if (!strcmp(name, "Collate")) - header->Collate = !strcmp(value, "true"); - else if (!strcmp(name, "CutMedia")) - header->CutMedia = (cups_cut_t)atoi(value); - else if (!strcmp(name, "Duplex")) - header->Duplex = !strcmp(value, "true"); - else if (!strcmp(name, "HWResolution")) - sscanf(value, "%d%d", header->HWResolution + 0, header->HWResolution + 1); - else if (!strcmp(name, "InsertSheet")) - header->InsertSheet = !strcmp(value, "true"); - else if (!strcmp(name, "Jog")) - header->Jog = atoi(value); - else if (!strcmp(name, "LeadingEdge")) - header->LeadingEdge = atoi(value); - else if (!strcmp(name, "Margins")) - sscanf(value, "%d%d", header->Margins + 0, header->Margins + 1); - else if (!strcmp(name, "ManualFeed")) - header->ManualFeed = !strcmp(value, "true"); - else if (!strcmp(name, "cupsMediaPosition") || /* Compatibility */ - !strcmp(name, "MediaPosition")) - header->MediaPosition = atoi(value); - else if (!strcmp(name, "MediaWeight")) - header->MediaWeight = atoi(value); - else if (!strcmp(name, "MirrorPrint")) - header->MirrorPrint = !strcmp(value, "true"); - else if (!strcmp(name, "NegativePrint")) - header->NegativePrint = !strcmp(value, "true"); - else if (!strcmp(name, "Orientation")) - header->Orientation = atoi(value); - else if (!strcmp(name, "OutputFaceUp")) - header->OutputFaceUp = !strcmp(value, "true"); - else if (!strcmp(name, "Separations")) - header->Separations = !strcmp(value, "true"); - else if (!strcmp(name, "TraySwitch")) - header->TraySwitch = !strcmp(value, "true"); - else if (!strcmp(name, "Tumble")) - header->Tumble = !strcmp(value, "true"); - else if (!strcmp(name, "cupsMediaType")) - header->cupsMediaType = atoi(value); - else if (!strcmp(name, "cupsBitsPerColor")) - header->cupsBitsPerColor = atoi(value); - else if (!strcmp(name, "cupsColorOrder")) - header->cupsColorOrder = (cups_order_t)atoi(value); - else if (!strcmp(name, "cupsColorSpace")) - header->cupsColorSpace = (cups_cspace_t)atoi(value); - else if (!strcmp(name, "cupsCompression")) - header->cupsCompression = atoi(value); - else if (!strcmp(name, "cupsRowCount")) - header->cupsRowCount = atoi(value); - else if (!strcmp(name, "cupsRowFeed")) - header->cupsRowFeed = atoi(value); - else if (!strcmp(name, "cupsRowStep")) - header->cupsRowStep = atoi(value); - } -} - - /* * 'format_CMY()' - Convert image data to CMY. */ @@ -1633,18 +1410,18 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -1670,7 +1447,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 64 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --) { @@ -1758,7 +1535,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -1782,7 +1559,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -1806,7 +1583,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; cptr ++; mptr ++; @@ -1876,7 +1653,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; switch (z) { @@ -1931,7 +1708,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; r0 += z; @@ -1946,7 +1723,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -1999,7 +1776,7 @@ format_CMY(cups_page_header2_t *header, /* I - Page header */ */ static void -format_CMYK(cups_page_header2_t *header, /* I - Page header */ +format_CMYK(cups_page_header2_t *header,/* I - Page header */ unsigned char *row, /* IO - Bitmap data for device */ int y, /* I - Current row */ int z, /* I - Current plane */ @@ -2007,19 +1784,19 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -2045,7 +1822,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --) { @@ -2080,9 +1857,9 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ for (x = xsize ; x > 0; x --, r0 += 4) { if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[0]]); + *ptr ^= (0x0 & OnPixels[r0[0]]); else - *ptr ^= (0xc0 & OffPixels[r0[0]]); + *ptr ^= (0x0 & OffPixels[r0[0]]); if ((r0[1] & 63) > dither[x & 7]) *ptr ^= (0x30 & OnPixels[r0[1]]); @@ -2148,7 +1925,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -2175,7 +1952,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -2204,7 +1981,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; cptr ++; mptr ++; @@ -2286,7 +2063,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; r0 += z; for (x = xsize; x > 0; x --, r0 += 4) @@ -2305,7 +2082,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; r0 += z; @@ -2320,7 +2097,7 @@ format_CMYK(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -2381,14 +2158,14 @@ format_K(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ (void)z; @@ -2412,7 +2189,7 @@ format_K(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -2430,7 +2207,7 @@ format_K(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -2444,7 +2221,7 @@ format_K(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -2491,7 +2268,7 @@ format_K(cups_page_header2_t *header, /* I - Page header */ */ static void -format_KCMY(cups_page_header2_t *header, /* I - Page header */ +format_KCMY(cups_page_header2_t *header,/* I - Page header */ unsigned char *row, /* IO - Bitmap data for device */ int y, /* I - Current row */ int z, /* I - Current plane */ @@ -2499,19 +2276,19 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -2537,7 +2314,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --, r0 += 4) { @@ -2572,9 +2349,9 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ for (x = xsize ; x > 0; x --, r0 += 4) { if ((r0[3] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[3]]); + *ptr ^= (0x0 & OnPixels[r0[3]]); else - *ptr ^= (0xc0 & OffPixels[r0[3]]); + *ptr ^= (0x0 & OffPixels[r0[3]]); if ((r0[0] & 63) > dither[x & 7]) *ptr ^= (0x30 & OnPixels[r0[0]]); @@ -2657,7 +2434,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -2684,7 +2461,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -2713,7 +2490,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; cptr ++; mptr ++; @@ -2795,7 +2572,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; if (z == 0) r0 += 3; else @@ -2817,7 +2594,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; if (z == 0) r0 += 3; @@ -2835,7 +2612,7 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -2899,30 +2676,31 @@ format_KCMY(cups_page_header2_t *header, /* I - Page header */ */ static void -format_KCMYcm(cups_page_header2_t *header,/* I - Page header */ - unsigned char *row, /* IO - Bitmap data for device */ - int y, /* I - Current row */ - int z, /* I - Current plane */ - int xsize,/* I - Width of image data */ - int ysize,/* I - Height of image data */ - int yerr0,/* I - Top Y error */ - int yerr1,/* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ +format_KCMYcm( + cups_page_header2_t *header, /* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - int pc, pm, py, pk; /* Cyan, magenta, yellow, and black values */ - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - *lcptr, /* Pointer into light cyan */ - *lmptr, /* Pointer into light magenta */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + int pc, pm, py, pk; /* Cyan, magenta, yellow, and black values */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + *lcptr, /* Pointer into light cyan */ + *lmptr, /* Pointer into light magenta */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -2950,7 +2728,7 @@ format_KCMYcm(cups_page_header2_t *header,/* I - Page header */ switch (header->cupsBitsPerColor) { case 1 : - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --) { @@ -3015,7 +2793,7 @@ format_KCMYcm(cups_page_header2_t *header,/* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -3095,7 +2873,7 @@ format_KCMYcm(cups_page_header2_t *header,/* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; switch (z) { @@ -3236,7 +3014,7 @@ format_KCMYcm(cups_page_header2_t *header,/* I - Page header */ */ static void -format_RGBA(cups_page_header2_t *header, /* I - Page header */ +format_RGBA(cups_page_header2_t *header,/* I - Page header */ unsigned char *row, /* IO - Bitmap data for device */ int y, /* I - Current row */ int z, /* I - Current plane */ @@ -3244,18 +3022,18 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -3281,7 +3059,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --) { @@ -3315,9 +3093,9 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ for (x = xsize ; x > 0; x --, r0 += 3) { if ((r0[0] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[0]]); + *ptr ^= (0x0 & OnPixels[r0[0]]); else - *ptr ^= (0xc0 & OffPixels[r0[0]]); + *ptr ^= (0x0 & OffPixels[r0[0]]); if ((r0[1] & 63) > dither[x & 7]) *ptr ^= (0x30 & OnPixels[r0[1]]); @@ -3392,7 +3170,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -3416,7 +3194,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -3440,7 +3218,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; cptr ++; mptr ++; @@ -3516,7 +3294,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; switch (z) { @@ -3571,7 +3349,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; r0 += z; @@ -3586,7 +3364,7 @@ format_RGBA(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -3647,14 +3425,14 @@ format_W(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ (void)z; @@ -3678,7 +3456,7 @@ format_W(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -3696,7 +3474,7 @@ format_W(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -3710,7 +3488,7 @@ format_W(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -3765,18 +3543,18 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -3802,7 +3580,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 64 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --, r0 += 3) { @@ -3902,7 +3680,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -3926,7 +3704,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -3950,7 +3728,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; cptr ++; mptr ++; @@ -4020,7 +3798,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; switch (z) { @@ -4075,7 +3853,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; z = 2 - z; r0 += z; @@ -4091,7 +3869,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -4146,7 +3924,7 @@ format_YMC(cups_page_header2_t *header, /* I - Page header */ */ static void -format_YMCK(cups_page_header2_t *header, /* I - Page header */ +format_YMCK(cups_page_header2_t *header,/* I - Page header */ unsigned char *row, /* IO - Bitmap data for device */ int y, /* I - Current row */ int z, /* I - Current plane */ @@ -4154,19 +3932,19 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ int ysize, /* I - Height of image data */ int yerr0, /* I - Top Y error */ int yerr1, /* I - Bottom Y error */ - cups_ib_t *r0, /* I - Primary image data */ - cups_ib_t *r1) /* I - Image data for interpolation */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ { - cups_ib_t *ptr, /* Pointer into row */ - *cptr, /* Pointer into cyan */ - *mptr, /* Pointer into magenta */ - *yptr, /* Pointer into yellow */ - *kptr, /* Pointer into black */ - bitmask; /* Current mask for pixel */ - int bitoffset; /* Current offset in line */ - int bandwidth; /* Width of a color band */ - int x, /* Current X coordinate on page */ - *dither; /* Pointer into dither array */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ switch (XPosition) @@ -4192,7 +3970,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 128 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize ; x > 0; x --, r0 += 4) { @@ -4228,9 +4006,9 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ for (x = xsize ; x > 0; x --, r0 += 4) { if ((r0[2] & 63) > dither[x & 7]) - *ptr ^= (0xc0 & OnPixels[r0[2]]); + *ptr ^= (0x0 & OnPixels[r0[2]]); else - *ptr ^= (0xc0 & OffPixels[r0[2]]); + *ptr ^= (0x0 & OffPixels[r0[2]]); if ((r0[1] & 63) > dither[x & 7]) *ptr ^= (0x30 & OnPixels[r0[1]]); @@ -4313,7 +4091,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; for (x = xsize; x > 0; x --) { @@ -4341,7 +4119,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; for (x = xsize; x > 0; x --) @@ -4370,7 +4148,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; cptr ++; mptr ++; @@ -4452,7 +4230,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ { case 1 : bitmask = 0x80 >> (bitoffset & 7); - dither = Floyd16x16[y & 15]; + dither = Floyd16xc16[y & 15]; if (z < 3) r0 += 2 - z; @@ -4475,7 +4253,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ break; case 2 : - bitmask = 0xc0 >> (bitoffset & 7); + bitmask = 0x0 >> (bitoffset & 7); dither = Floyd8x8[y & 7]; if (z == 3) r0 += 3; @@ -4493,7 +4271,7 @@ format_YMCK(cups_page_header2_t *header, /* I - Page header */ bitmask >>= 2; else { - bitmask = 0xc0; + bitmask = 0x0; ptr ++; } @@ -4587,5 +4365,29 @@ make_lut(cups_ib_t *lut, /* I - Lookup table */ /* - * End of "$Id: imagetoraster.c 4767 2005-10-10 19:23:23Z mike $". + * 'raster_cb()' - Validate the page header. + */ + +static int /* O - 0 if OK, -1 if not */ +raster_cb( + cups_page_header2_t *header, /* IO - Raster header */ + int preferred_bits) /* I - Preferred bits per color */ +{ + /* + * Ensure that colorimetric colorspaces use at least 8 bits per + * component... + */ + + if ((header->cupsColorSpace == CUPS_CSPACE_CIEXYZ || + header->cupsColorSpace == CUPS_CSPACE_CIELab || + header->cupsColorSpace >= CUPS_CSPACE_ICC1) && + header->cupsBitsPerColor < 8) + header->cupsBitsPerColor = 8; + + return (0); +} + + +/* + * End of "$Id: imagetoraster.c 5485 2006-05-02 23:59:56Z mike $". */