/*
- * "$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
* 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.
* 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.
*/
/*
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 },
* 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);
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);
/*
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 */
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)
* 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...
case CUPS_CSPACE_W :
primary = CUPS_IMAGE_WHITE;
secondary = CUPS_IMAGE_WHITE;
- header.cupsBitsPerPixel = header.cupsBitsPerColor;
break;
default :
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 :
case CUPS_CSPACE_SILVER :
primary = CUPS_IMAGE_BLACK;
secondary = CUPS_IMAGE_BLACK;
- header.cupsBitsPerPixel = header.cupsBitsPerColor;
break;
case CUPS_CSPACE_CMYK :
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 :
{
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;
}
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;
*/
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);
/*
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;
}
* Free memory used for the "zoom" engine...
*/
- cupsImageZoomDelete(z);
+ _cupsImageZoomDelete(z);
}
}
}
-/*
- * '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.
*/
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)
{
case 1 :
bitmask = 64 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --)
{
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
cptr ++;
mptr ++;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
switch (z)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
r0 += z;
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
*/
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 */
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)
{
case 1 :
bitmask = 128 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --)
{
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]]);
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
cptr ++;
mptr ++;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
r0 += z;
for (x = xsize; x > 0; x --, r0 += 4)
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
r0 += z;
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
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;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
*/
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 */
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)
{
case 1 :
bitmask = 128 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --, r0 += 4)
{
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]]);
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
cptr ++;
mptr ++;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
if (z == 0)
r0 += 3;
else
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
if (z == 0)
r0 += 3;
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
*/
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)
switch (header->cupsBitsPerColor)
{
case 1 :
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --)
{
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
switch (z)
{
*/
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 */
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)
{
case 1 :
bitmask = 128 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --)
{
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]]);
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
cptr ++;
mptr ++;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
switch (z)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
r0 += z;
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
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;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
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)
{
case 1 :
bitmask = 64 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --, r0 += 3)
{
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
cptr ++;
mptr ++;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
switch (z)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
z = 2 - z;
r0 += z;
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
*/
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 */
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)
{
case 1 :
bitmask = 128 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize ; x > 0; x --, r0 += 4)
{
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]]);
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
for (x = xsize; x > 0; x --)
{
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
for (x = xsize; x > 0; x --)
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
cptr ++;
mptr ++;
{
case 1 :
bitmask = 0x80 >> (bitoffset & 7);
- dither = Floyd16x16[y & 15];
+ dither = Floyd16xc16[y & 15];
if (z < 3)
r0 += 2 - z;
break;
case 2 :
- bitmask = 0xc0 >> (bitoffset & 7);
+ bitmask = 0x0 >> (bitoffset & 7);
dither = Floyd8x8[y & 7];
if (z == 3)
r0 += 3;
bitmask >>= 2;
else
{
- bitmask = 0xc0;
+ bitmask = 0x0;
ptr ++;
}
/*
- * 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 $".
*/