2 * "$Id: imagetoraster.c 6578 2007-06-20 17:46:04Z mike $"
4 * Image file to raster filter for the Common UNIX Printing System (CUPS).
6 * Copyright 1993-2007 by Easy Software Products.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
24 * This file is subject to the Apple OS-Developed Software exception.
28 * main() - Main entry...
29 * blank_line() - Clear a line buffer to the blank value...
30 * format_CMY() - Convert image data to CMY.
31 * format_CMYK() - Convert image data to CMYK.
32 * format_K() - Convert image data to black.
33 * format_KCMY() - Convert image data to KCMY.
34 * format_KCMYcm() - Convert image data to KCMYcm.
35 * format_RGBA() - Convert image data to RGBA/RGBW.
36 * format_W() - Convert image data to luminance.
37 * format_YMC() - Convert image data to YMC.
38 * format_YMCK() - Convert image data to YMCK.
39 * make_lut() - Make a lookup table given gamma and brightness values.
40 * raster_cb() - Validate the page header.
44 * Include necessary headers...
48 #include "image-private.h"
52 #include <cups/i18n.h>
59 int Flip
= 0, /* Flip/mirror pages */
60 XPosition
= 0, /* Horizontal position on page */
61 YPosition
= 0, /* Vertical position on page */
62 Collate
= 0, /* Collate copies? */
63 Copies
= 1; /* Number of copies */
64 int Floyd16x16
[16][16] = /* Traditional Floyd ordered dither */
66 { 0, 128, 32, 160, 8, 136, 40, 168,
67 2, 130, 34, 162, 10, 138, 42, 170 },
68 { 192, 64, 224, 96, 200, 72, 232, 104,
69 194, 66, 226, 98, 202, 74, 234, 106 },
70 { 48, 176, 16, 144, 56, 184, 24, 152,
71 50, 178, 18, 146, 58, 186, 26, 154 },
72 { 240, 112, 208, 80, 248, 120, 216, 88,
73 242, 114, 210, 82, 250, 122, 218, 90 },
74 { 12, 140, 44, 172, 4, 132, 36, 164,
75 14, 142, 46, 174, 6, 134, 38, 166 },
76 { 204, 76, 236, 108, 196, 68, 228, 100,
77 206, 78, 238, 110, 198, 70, 230, 102 },
78 { 60, 188, 28, 156, 52, 180, 20, 148,
79 62, 190, 30, 158, 54, 182, 22, 150 },
80 { 252, 124, 220, 92, 244, 116, 212, 84,
81 254, 126, 222, 94, 246, 118, 214, 86 },
82 { 3, 131, 35, 163, 11, 139, 43, 171,
83 1, 129, 33, 161, 9, 137, 41, 169 },
84 { 195, 67, 227, 99, 203, 75, 235, 107,
85 193, 65, 225, 97, 201, 73, 233, 105 },
86 { 51, 179, 19, 147, 59, 187, 27, 155,
87 49, 177, 17, 145, 57, 185, 25, 153 },
88 { 243, 115, 211, 83, 251, 123, 219, 91,
89 241, 113, 209, 81, 249, 121, 217, 89 },
90 { 15, 143, 47, 175, 7, 135, 39, 167,
91 13, 141, 45, 173, 5, 133, 37, 165 },
92 { 207, 79, 239, 111, 199, 71, 231, 103,
93 205, 77, 237, 109, 197, 69, 229, 101 },
94 { 63, 191, 31, 159, 55, 183, 23, 151,
95 61, 189, 29, 157, 53, 181, 21, 149 },
96 { 254, 127, 223, 95, 247, 119, 215, 87,
97 253, 125, 221, 93, 245, 117, 213, 85 }
101 { 0, 32, 8, 40, 2, 34, 10, 42 },
102 { 48, 16, 56, 24, 50, 18, 58, 26 },
103 { 12, 44, 4, 36, 14, 46, 6, 38 },
104 { 60, 28, 52, 20, 62, 30, 54, 22 },
105 { 3, 35, 11, 43, 1, 33, 9, 41 },
106 { 51, 19, 59, 27, 49, 17, 57, 25 },
107 { 15, 47, 7, 39, 13, 45, 5, 37 },
108 { 63, 31, 55, 23, 61, 29, 53, 21 }
118 cups_ib_t OnPixels
[256], /* On-pixel LUT */
119 OffPixels
[256]; /* Off-pixel LUT */
126 static void blank_line(cups_page_header2_t
*header
, unsigned char *row
);
127 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
);
128 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
);
129 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
);
130 static void format_KCMYcm(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
);
131 static void format_KCMY(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
);
132 #define format_RGB format_CMY
133 static void format_RGBA(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
);
134 static void format_W(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
);
135 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
);
136 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
);
137 static void make_lut(cups_ib_t
*, int, float, float);
138 static int raster_cb(cups_page_header2_t
*header
, int preferred_bits
);
142 * 'main()' - Main entry...
145 int /* O - Exit status */
146 main(int argc
, /* I - Number of command-line arguments */
147 char *argv
[]) /* I - Command-line arguments */
149 int i
; /* Looping var */
150 cups_image_t
*img
; /* Image to print */
151 float xprint
, /* Printable area */
153 xinches
, /* Total size in inches */
155 float xsize
, /* Total size in points */
159 float aspect
; /* Aspect ratio */
160 int xpages
, /* # x pages */
161 ypages
, /* # y pages */
162 xpage
, /* Current x page */
163 ypage
, /* Current y page */
164 xtemp
, /* Bitmap width in pixels */
165 ytemp
, /* Bitmap height in pixels */
166 page
; /* Current page number */
167 int xc0
, yc0
, /* Corners of the page in image coords */
169 ppd_file_t
*ppd
; /* PPD file */
170 ppd_choice_t
*choice
; /* PPD option choice */
171 char *resolution
, /* Output resolution */
172 *media_type
; /* Media type */
173 ppd_profile_t
*profile
; /* Color profile */
174 ppd_profile_t userprofile
; /* User-specified profile */
175 cups_raster_t
*ras
; /* Raster stream */
176 cups_page_header2_t header
; /* Page header */
177 int num_options
; /* Number of print options */
178 cups_option_t
*options
; /* Print options */
179 const char *val
; /* Option value */
180 int slowcollate
, /* Collate copies the slow way */
181 slowcopies
; /* Make copies the "slow" way? */
182 float g
; /* Gamma correction value */
183 float b
; /* Brightness factor */
184 float zoom
; /* Zoom facter */
185 int xppi
, yppi
; /* Pixels-per-inch */
186 int hue
, sat
; /* Hue and saturation adjustment */
187 cups_izoom_t
*z
; /* Image zoom buffer */
188 cups_iztype_t zoom_type
; /* Image zoom type */
189 int primary
, /* Primary image colorspace */
190 secondary
; /* Secondary image colorspace */
191 cups_ib_t
*row
, /* Current row */
193 *r1
; /* Bottom row */
194 int y
, /* Current Y coordinate on page */
195 iy
, /* Current Y coordinate in image */
196 last_iy
, /* Previous Y coordinate in image */
197 yerr0
, /* Top Y error value */
198 yerr1
; /* Bottom Y error value */
199 cups_ib_t lut
[256]; /* Gamma/brightness LUT */
200 int plane
, /* Current color plane */
201 num_planes
; /* Number of color planes */
202 char filename
[1024]; /* Name of file to print */
206 * Make sure status messages are not buffered...
209 setbuf(stderr
, NULL
);
212 * Check command-line...
215 if (argc
< 6 || argc
> 7)
217 fprintf(stderr
, _("Usage: %s job-id user title copies options [file]\n"),
223 * See if we need to use the imagetops and pstoraster filters instead...
227 num_options
= cupsParseOptions(argv
[5], 0, &options
);
229 if (getenv("CLASSIFICATION") ||
230 cupsGetOption("page-label", num_options
, options
))
233 * Yes, fork a copy of pstoraster and then transfer control to imagetops...
236 int mypipes
[2]; /* New pipes for imagetops | pstoraster */
237 int pid
; /* PID of pstoraster */
240 cupsFreeOptions(num_options
, options
);
244 perror("ERROR: Unable to create pipes for imagetops | pstoraster");
248 if ((pid
= fork()) == 0)
251 * Child process for pstoraster... Assign new pipe input to pstoraster...
259 execlp("pstoraster", argv
[0], argv
[1], argv
[2], argv
[3], argv
[4], argv
[5],
261 perror("ERROR: Unable to exec pstoraster");
270 perror("ERROR: Unable to fork pstoraster");
275 * Update stdout so it points at the new pstoraster...
284 * Run imagetops to get the classification or page labelling that was
288 execlp("imagetops", argv
[0], argv
[1], argv
[2], argv
[3], argv
[4], argv
[5],
290 perror("ERROR: Unable to exec imagetops");
295 * Copy stdin as needed...
300 int fd
; /* File to write to */
301 char buffer
[8192]; /* Buffer to read into */
302 int bytes
; /* # of bytes to read */
305 if ((fd
= cupsTempFd(filename
, sizeof(filename
))) < 0)
307 perror("ERROR: Unable to copy image file");
311 fprintf(stderr
, "DEBUG: imagetoraster - copying to temp print file \"%s\"\n",
314 while ((bytes
= fread(buffer
, 1, sizeof(buffer
), stdin
)) > 0)
315 write(fd
, buffer
, bytes
);
320 strlcpy(filename
, argv
[6], sizeof(filename
));
323 * Process command-line options and write the prolog...
334 Copies
= atoi(argv
[4]);
336 ppd
= SetCommonOptions(num_options
, options
, 0);
338 if ((val
= cupsGetOption("multiple-document-handling", num_options
, options
)) != NULL
)
341 * This IPP attribute is unnecessarily complicated...
343 * single-document, separate-documents-collated-copies, and
344 * single-document-new-sheet all require collated copies.
346 * separate-documents-collated-copies allows for uncollated copies.
349 Collate
= strcasecmp(val
, "separate-documents-collated-copies") != 0;
352 if ((val
= cupsGetOption("Collate", num_options
, options
)) != NULL
&&
353 strcasecmp(val
, "True") == 0)
356 if ((val
= cupsGetOption("gamma", num_options
, options
)) != NULL
)
359 * Get gamma value from 1 to 10000...
362 g
= atoi(val
) * 0.001f
;
370 if ((val
= cupsGetOption("brightness", num_options
, options
)) != NULL
)
373 * Get brightness value from 10 to 1000.
376 b
= atoi(val
) * 0.01f
;
384 if ((val
= cupsGetOption("scaling", num_options
, options
)) != NULL
)
385 zoom
= atoi(val
) * 0.01;
386 else if (cupsGetOption("fitplot", num_options
, options
))
389 if ((val
= cupsGetOption("ppi", num_options
, options
)) != NULL
)
390 if (sscanf(val
, "%dx%d", &xppi
, &yppi
) < 2)
393 if ((val
= cupsGetOption("position", num_options
, options
)) != NULL
)
395 if (strcasecmp(val
, "center") == 0)
400 else if (strcasecmp(val
, "top") == 0)
405 else if (strcasecmp(val
, "left") == 0)
410 else if (strcasecmp(val
, "right") == 0)
415 else if (strcasecmp(val
, "top-left") == 0)
420 else if (strcasecmp(val
, "top-right") == 0)
425 else if (strcasecmp(val
, "bottom") == 0)
430 else if (strcasecmp(val
, "bottom-left") == 0)
435 else if (strcasecmp(val
, "bottom-right") == 0)
442 if ((val
= cupsGetOption("saturation", num_options
, options
)) != NULL
)
445 if ((val
= cupsGetOption("hue", num_options
, options
)) != NULL
)
448 if ((choice
= ppdFindMarkedChoice(ppd
, "MirrorPrint")) != NULL
)
450 val
= choice
->choice
;
454 val
= cupsGetOption("mirror", num_options
, options
);
456 if (val
&& (!strcasecmp(val
, "true") || !strcasecmp(val
, "on") ||
457 !strcasecmp(val
, "yes")))
461 * Set the needed options in the page header...
464 if (cupsRasterInterpretPPD(&header
, ppd
, num_options
, options
, raster_cb
))
466 fputs(_("ERROR: Bad page setup!\n"), stderr
);
467 fprintf(stderr
, "DEBUG: %s\n", cupsRasterErrorString());
472 * Get the media type and resolution that have been chosen...
475 if ((choice
= ppdFindMarkedChoice(ppd
, "MediaType")) != NULL
)
476 media_type
= choice
->choice
;
480 if ((choice
= ppdFindMarkedChoice(ppd
, "Resolution")) != NULL
)
481 resolution
= choice
->choice
;
486 * Choose the appropriate colorspace...
489 switch (header
.cupsColorSpace
)
492 if (header
.cupsBitsPerColor
>= 8)
494 primary
= CUPS_IMAGE_WHITE
;
495 secondary
= CUPS_IMAGE_WHITE
;
499 primary
= CUPS_IMAGE_BLACK
;
500 secondary
= CUPS_IMAGE_BLACK
;
505 case CUPS_CSPACE_RGB
:
506 case CUPS_CSPACE_RGBA
:
507 case CUPS_CSPACE_RGBW
:
508 if (header
.cupsBitsPerColor
>= 8)
510 primary
= CUPS_IMAGE_RGB
;
511 secondary
= CUPS_IMAGE_RGB
;
515 primary
= CUPS_IMAGE_CMY
;
516 secondary
= CUPS_IMAGE_CMY
;
521 case CUPS_CSPACE_WHITE
:
522 case CUPS_CSPACE_GOLD
:
523 case CUPS_CSPACE_SILVER
:
524 primary
= CUPS_IMAGE_BLACK
;
525 secondary
= CUPS_IMAGE_BLACK
;
528 case CUPS_CSPACE_CMYK
:
529 case CUPS_CSPACE_YMCK
:
530 case CUPS_CSPACE_KCMY
:
531 case CUPS_CSPACE_KCMYcm
:
532 case CUPS_CSPACE_GMCK
:
533 case CUPS_CSPACE_GMCS
:
534 if (header
.cupsBitsPerColor
== 1)
536 primary
= CUPS_IMAGE_CMY
;
537 secondary
= CUPS_IMAGE_CMY
;
541 primary
= CUPS_IMAGE_CMYK
;
542 secondary
= CUPS_IMAGE_CMYK
;
546 case CUPS_CSPACE_CMY
:
547 case CUPS_CSPACE_YMC
:
548 primary
= CUPS_IMAGE_CMY
;
549 secondary
= CUPS_IMAGE_CMY
;
555 * Find a color profile matching the current options...
558 if ((val
= cupsGetOption("profile", num_options
, options
)) != NULL
)
560 profile
= &userprofile
;
561 sscanf(val
, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f",
562 &(userprofile
.density
), &(userprofile
.gamma
),
563 userprofile
.matrix
[0] + 0, userprofile
.matrix
[0] + 1,
564 userprofile
.matrix
[0] + 2,
565 userprofile
.matrix
[1] + 0, userprofile
.matrix
[1] + 1,
566 userprofile
.matrix
[1] + 2,
567 userprofile
.matrix
[2] + 0, userprofile
.matrix
[2] + 1,
568 userprofile
.matrix
[2] + 2);
570 userprofile
.density
*= 0.001f
;
571 userprofile
.gamma
*= 0.001f
;
572 userprofile
.matrix
[0][0] *= 0.001f
;
573 userprofile
.matrix
[0][1] *= 0.001f
;
574 userprofile
.matrix
[0][2] *= 0.001f
;
575 userprofile
.matrix
[1][0] *= 0.001f
;
576 userprofile
.matrix
[1][1] *= 0.001f
;
577 userprofile
.matrix
[1][2] *= 0.001f
;
578 userprofile
.matrix
[2][0] *= 0.001f
;
579 userprofile
.matrix
[2][1] *= 0.001f
;
580 userprofile
.matrix
[2][2] *= 0.001f
;
582 else if (ppd
!= NULL
)
584 fprintf(stderr
, "DEBUG: Searching for profile \"%s/%s\"...\n",
585 resolution
, media_type
);
587 for (i
= 0, profile
= ppd
->profiles
; i
< ppd
->num_profiles
; i
++, profile
++)
589 fprintf(stderr
, "DEBUG: \"%s/%s\" = ", profile
->resolution
,
590 profile
->media_type
);
592 if ((strcmp(profile
->resolution
, resolution
) == 0 ||
593 profile
->resolution
[0] == '-') &&
594 (strcmp(profile
->media_type
, media_type
) == 0 ||
595 profile
->media_type
[0] == '-'))
597 fputs("MATCH!\n", stderr
);
601 fputs("no.\n", stderr
);
605 * If we found a color profile, use it!
608 if (i
>= ppd
->num_profiles
)
615 cupsImageSetProfile(profile
->density
, profile
->gamma
, profile
->matrix
);
617 cupsImageSetRasterColorSpace(header
.cupsColorSpace
);
620 * Create a gamma/brightness LUT...
623 make_lut(lut
, primary
, g
, b
);
626 * Open the input image to print...
629 fputs(_("INFO: Loading image file...\n"), stderr
);
631 if (header
.cupsColorSpace
== CUPS_CSPACE_CIEXYZ
||
632 header
.cupsColorSpace
== CUPS_CSPACE_CIELab
||
633 header
.cupsColorSpace
>= CUPS_CSPACE_ICC1
)
634 img
= cupsImageOpen(filename
, primary
, secondary
, sat
, hue
, NULL
);
636 img
= cupsImageOpen(filename
, primary
, secondary
, sat
, hue
, lut
);
643 fputs(_("ERROR: Unable to open image file for printing!\n"), stderr
);
649 * Scale as necessary...
652 if (zoom
== 0.0 && xppi
== 0)
661 fprintf(stderr
, "DEBUG: Before scaling: xppi=%d, yppi=%d, zoom=%.2f\n",
667 * Scale the image as neccesary to match the desired pixels-per-inch.
672 xprint
= (PageTop
- PageBottom
) / 72.0;
673 yprint
= (PageRight
- PageLeft
) / 72.0;
677 xprint
= (PageRight
- PageLeft
) / 72.0;
678 yprint
= (PageTop
- PageBottom
) / 72.0;
681 fprintf(stderr
, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n",
684 xinches
= (float)img
->xsize
/ (float)xppi
;
685 yinches
= (float)img
->ysize
/ (float)yppi
;
687 fprintf(stderr
, "DEBUG: Image size is %.1f x %.1f inches...\n",
690 if ((val
= cupsGetOption("natural-scaling", num_options
, options
)) != NULL
)
692 xinches
= xinches
* atoi(val
) / 100;
693 yinches
= yinches
* atoi(val
) / 100;
696 if (cupsGetOption("orientation-requested", num_options
, options
) == NULL
&&
697 cupsGetOption("landscape", num_options
, options
) == NULL
)
700 * Rotate the image if it will fit landscape but not portrait...
703 fputs("DEBUG: Auto orientation...\n", stderr
);
705 if ((xinches
> xprint
|| yinches
> yprint
) &&
706 xinches
<= yprint
&& yinches
<= xprint
)
709 * Rotate the image as needed...
712 fputs("DEBUG: Using landscape orientation...\n", stderr
);
714 Orientation
= (Orientation
+ 1) & 3;
724 * Scale percentage of page size...
727 xprint
= (PageRight
- PageLeft
) / 72.0;
728 yprint
= (PageTop
- PageBottom
) / 72.0;
729 aspect
= (float)img
->yppi
/ (float)img
->xppi
;
731 fprintf(stderr
, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n",
734 fprintf(stderr
, "DEBUG: img->xppi = %d, img->yppi = %d, aspect = %f\n",
735 img
->xppi
, img
->yppi
, aspect
);
737 xsize
= xprint
* zoom
;
738 ysize
= xsize
* img
->ysize
/ img
->xsize
/ aspect
;
740 if (ysize
> (yprint
* zoom
))
742 ysize
= yprint
* zoom
;
743 xsize
= ysize
* img
->xsize
* aspect
/ img
->ysize
;
746 xsize2
= yprint
* zoom
;
747 ysize2
= xsize2
* img
->ysize
/ img
->xsize
/ aspect
;
749 if (ysize2
> (xprint
* zoom
))
751 ysize2
= xprint
* zoom
;
752 xsize2
= ysize2
* img
->xsize
* aspect
/ img
->ysize
;
755 fprintf(stderr
, "DEBUG: Portrait size is %.2f x %.2f inches\n", xsize
, ysize
);
756 fprintf(stderr
, "DEBUG: Landscape size is %.2f x %.2f inches\n", xsize2
, ysize2
);
758 if (cupsGetOption("orientation-requested", num_options
, options
) == NULL
&&
759 cupsGetOption("landscape", num_options
, options
) == NULL
)
762 * Choose the rotation with the largest area, but prefer
763 * portrait if they are equal...
766 fputs("DEBUG: Auto orientation...\n", stderr
);
768 if ((xsize
* ysize
) < (xsize2
* xsize2
))
771 * Do landscape orientation...
774 fputs("DEBUG: Using landscape orientation...\n", stderr
);
779 xprint
= (PageTop
- PageBottom
) / 72.0;
780 yprint
= (PageRight
- PageLeft
) / 72.0;
785 * Do portrait orientation...
788 fputs("DEBUG: Using portrait orientation...\n", stderr
);
795 else if (Orientation
& 1)
797 fputs("DEBUG: Using landscape orientation...\n", stderr
);
801 xprint
= (PageTop
- PageBottom
) / 72.0;
802 yprint
= (PageRight
- PageLeft
) / 72.0;
806 fputs("DEBUG: Using portrait orientation...\n", stderr
);
810 xprint
= (PageRight
- PageLeft
) / 72.0;
811 yprint
= (PageTop
- PageBottom
) / 72.0;
816 * Compute the number of pages to print and the size of the image on each
820 xpages
= ceil(xinches
/ xprint
);
821 ypages
= ceil(yinches
/ yprint
);
823 xprint
= xinches
/ xpages
;
824 yprint
= yinches
/ ypages
;
826 fprintf(stderr
, "DEBUG: xpages = %dx%.2fin, ypages = %dx%.2fin\n",
827 xpages
, xprint
, ypages
, yprint
);
830 * Compute the bitmap size...
833 if ((choice
= ppdFindMarkedChoice(ppd
, "PageSize")) != NULL
&&
834 strcasecmp(choice
->choice
, "Custom") == 0)
836 float width
, /* New width in points */
837 length
; /* New length in points */
841 * Use the correct width and length for the current orientation...
846 width
= yprint
* 72.0;
847 length
= xprint
* 72.0;
851 width
= xprint
* 72.0;
852 length
= yprint
* 72.0;
856 * Add margins to page size...
859 width
+= ppd
->custom_margins
[0] + ppd
->custom_margins
[2];
860 length
+= ppd
->custom_margins
[1] + ppd
->custom_margins
[3];
863 * Enforce minimums...
866 if (width
< ppd
->custom_min
[0])
867 width
= ppd
->custom_min
[0];
869 if (length
< ppd
->custom_min
[1])
870 length
= ppd
->custom_min
[1];
872 fprintf(stderr
, "DEBUG: Updated custom page size to %.2f x %.2f inches...\n",
873 width
/ 72.0, length
/ 72.0);
876 * Set the new custom size...
879 strcpy(header
.cupsPageSizeName
, "Custom");
881 header
.cupsPageSize
[0] = width
+ 0.5;
882 header
.cupsPageSize
[1] = length
+ 0.5;
883 header
.PageSize
[0] = width
+ 0.5;
884 header
.PageSize
[1] = length
+ 0.5;
887 * Update page variables...
892 PageLeft
= ppd
->custom_margins
[0];
893 PageRight
= width
- ppd
->custom_margins
[2];
894 PageBottom
= ppd
->custom_margins
[1];
895 PageTop
= length
- ppd
->custom_margins
[3];
898 * Remove margins from page size...
901 width
-= ppd
->custom_margins
[0] + ppd
->custom_margins
[2];
902 length
-= ppd
->custom_margins
[1] + ppd
->custom_margins
[3];
905 * Set the bitmap size...
908 header
.cupsWidth
= width
* header
.HWResolution
[0] / 72.0;
909 header
.cupsHeight
= length
* header
.HWResolution
[1] / 72.0;
911 header
.cupsBytesPerLine
= (header
.cupsBitsPerPixel
*
912 header
.cupsWidth
+ 7) / 8;
914 if (header
.cupsColorOrder
== CUPS_ORDER_BANDED
)
915 header
.cupsBytesPerLine
*= header
.cupsNumColors
;
918 header
.Margins
[0] = PageLeft
;
919 header
.Margins
[1] = PageBottom
;
921 fprintf(stderr
, "DEBUG: PageSize = [%d %d]\n", header
.PageSize
[0],
930 header
.cupsImagingBBox
[0] = PageLeft
;
931 header
.cupsImagingBBox
[2] = PageLeft
+ xprint
* 72;
934 header
.cupsImagingBBox
[0] = (PageRight
+ PageLeft
- xprint
* 72) / 2;
935 header
.cupsImagingBBox
[2] = (PageRight
+ PageLeft
+ xprint
* 72) / 2;
938 header
.cupsImagingBBox
[0] = PageRight
- xprint
* 72;
939 header
.cupsImagingBBox
[2] = PageRight
;
946 header
.cupsImagingBBox
[1] = PageBottom
;
947 header
.cupsImagingBBox
[3] = PageBottom
+ yprint
* 72;
950 header
.cupsImagingBBox
[1] = (PageTop
+ PageBottom
- yprint
* 72) / 2;
951 header
.cupsImagingBBox
[3] = (PageTop
+ PageBottom
+ yprint
* 72) / 2;
954 header
.cupsImagingBBox
[1] = PageTop
- yprint
* 72;
955 header
.cupsImagingBBox
[3] = PageTop
;
964 header
.cupsImagingBBox
[0] = PageBottom
;
965 header
.cupsImagingBBox
[2] = PageBottom
+ yprint
* 72;
968 header
.cupsImagingBBox
[0] = (PageTop
+ PageBottom
- yprint
* 72) / 2;
969 header
.cupsImagingBBox
[2] = (PageTop
+ PageBottom
+ yprint
* 72) / 2;
972 header
.cupsImagingBBox
[0] = PageTop
- yprint
* 72;
973 header
.cupsImagingBBox
[2] = PageTop
;
980 header
.cupsImagingBBox
[1] = PageLeft
;
981 header
.cupsImagingBBox
[3] = PageLeft
+ xprint
* 72;
984 header
.cupsImagingBBox
[1] = (PageRight
+ PageLeft
- xprint
* 72) / 2;
985 header
.cupsImagingBBox
[3] = (PageRight
+ PageLeft
+ xprint
* 72) / 2;
988 header
.cupsImagingBBox
[1] = PageRight
- xprint
* 72;
989 header
.cupsImagingBBox
[3] = PageRight
;
998 header
.cupsImagingBBox
[0] = PageLeft
;
999 header
.cupsImagingBBox
[2] = PageLeft
+ xprint
* 72;
1002 header
.cupsImagingBBox
[0] = (PageRight
+ PageLeft
- xprint
* 72) / 2;
1003 header
.cupsImagingBBox
[2] = (PageRight
+ PageLeft
+ xprint
* 72) / 2;
1006 header
.cupsImagingBBox
[0] = PageRight
- xprint
* 72;
1007 header
.cupsImagingBBox
[2] = PageRight
;
1014 header
.cupsImagingBBox
[1] = PageBottom
;
1015 header
.cupsImagingBBox
[3] = PageBottom
+ yprint
* 72;
1018 header
.cupsImagingBBox
[1] = (PageTop
+ PageBottom
- yprint
* 72) / 2;
1019 header
.cupsImagingBBox
[3] = (PageTop
+ PageBottom
+ yprint
* 72) / 2;
1022 header
.cupsImagingBBox
[1] = PageTop
- yprint
* 72;
1023 header
.cupsImagingBBox
[3] = PageTop
;
1032 header
.cupsImagingBBox
[0] = PageBottom
;
1033 header
.cupsImagingBBox
[2] = PageBottom
+ yprint
* 72;
1036 header
.cupsImagingBBox
[0] = (PageTop
+ PageBottom
- yprint
* 72) / 2;
1037 header
.cupsImagingBBox
[2] = (PageTop
+ PageBottom
+ yprint
* 72) / 2;
1040 header
.cupsImagingBBox
[0] = PageTop
- yprint
* 72;
1041 header
.cupsImagingBBox
[2] = PageTop
;
1048 header
.cupsImagingBBox
[1] = PageLeft
;
1049 header
.cupsImagingBBox
[3] = PageLeft
+ xprint
* 72;
1052 header
.cupsImagingBBox
[1] = (PageRight
+ PageLeft
- xprint
* 72) / 2;
1053 header
.cupsImagingBBox
[3] = (PageRight
+ PageLeft
+ xprint
* 72) / 2;
1056 header
.cupsImagingBBox
[1] = PageRight
- xprint
* 72;
1057 header
.cupsImagingBBox
[3] = PageRight
;
1063 header
.ImagingBoundingBox
[0] = header
.cupsImagingBBox
[0];
1064 header
.ImagingBoundingBox
[1] = header
.cupsImagingBBox
[1];
1065 header
.ImagingBoundingBox
[2] = header
.cupsImagingBBox
[2];
1066 header
.ImagingBoundingBox
[3] = header
.cupsImagingBBox
[3];
1068 if (header
.cupsColorOrder
== CUPS_ORDER_PLANAR
)
1069 num_planes
= header
.cupsNumColors
;
1073 if (header
.cupsBitsPerColor
>= 8)
1074 zoom_type
= CUPS_IZOOM_NORMAL
;
1076 zoom_type
= CUPS_IZOOM_FAST
;
1079 * See if we need to collate, and if so how we need to do it...
1082 if (xpages
== 1 && ypages
== 1)
1085 slowcollate
= Collate
&& ppdFindOption(ppd
, "Collate") == NULL
;
1087 slowcopies
= ppd
->manual_copies
;
1091 if (Copies
> 1 && !slowcollate
&& !slowcopies
)
1093 header
.Collate
= (cups_bool_t
)Collate
;
1094 header
.NumCopies
= Copies
;
1099 header
.NumCopies
= 1;
1102 * Create the dithering lookup tables...
1106 OnPixels
[255] = 0xff;
1107 OffPixels
[0] = 0x00;
1108 OffPixels
[255] = 0xff;
1110 switch (header
.cupsBitsPerColor
)
1113 for (i
= 1; i
< 255; i
++)
1115 OnPixels
[i
] = 0x55 * (i
/ 85 + 1);
1116 OffPixels
[i
] = 0x55 * (i
/ 64);
1120 for (i
= 1; i
< 255; i
++)
1122 OnPixels
[i
] = 17 * (i
/ 17 + 1);
1123 OffPixels
[i
] = 17 * (i
/ 16);
1129 * Output the pages...
1132 fprintf(stderr
, "DEBUG: cupsWidth = %d\n", header
.cupsWidth
);
1133 fprintf(stderr
, "DEBUG: cupsHeight = %d\n", header
.cupsHeight
);
1134 fprintf(stderr
, "DEBUG: cupsBitsPerColor = %d\n", header
.cupsBitsPerColor
);
1135 fprintf(stderr
, "DEBUG: cupsBitsPerPixel = %d\n", header
.cupsBitsPerPixel
);
1136 fprintf(stderr
, "DEBUG: cupsBytesPerLine = %d\n", header
.cupsBytesPerLine
);
1137 fprintf(stderr
, "DEBUG: cupsColorOrder = %d\n", header
.cupsColorOrder
);
1138 fprintf(stderr
, "DEBUG: cupsColorSpace = %d\n", header
.cupsColorSpace
);
1139 fprintf(stderr
, "DEBUG: img->colorspace = %d\n", img
->colorspace
);
1141 row
= malloc(2 * header
.cupsBytesPerLine
);
1142 ras
= cupsRasterOpen(1, CUPS_RASTER_WRITE
);
1144 for (i
= 0, page
= 1; i
< Copies
; i
++)
1145 for (xpage
= 0; xpage
< xpages
; xpage
++)
1146 for (ypage
= 0; ypage
< ypages
; ypage
++, page
++)
1148 fprintf(stderr
, _("INFO: Formatting page %d...\n"), page
);
1150 if (Orientation
& 1)
1152 xc0
= img
->xsize
* ypage
/ ypages
;
1153 xc1
= img
->xsize
* (ypage
+ 1) / ypages
- 1;
1154 yc0
= img
->ysize
* xpage
/ xpages
;
1155 yc1
= img
->ysize
* (xpage
+ 1) / xpages
- 1;
1157 xtemp
= header
.HWResolution
[0] * yprint
;
1158 ytemp
= header
.HWResolution
[1] * xprint
;
1162 xc0
= img
->xsize
* xpage
/ xpages
;
1163 xc1
= img
->xsize
* (xpage
+ 1) / xpages
- 1;
1164 yc0
= img
->ysize
* ypage
/ ypages
;
1165 yc1
= img
->ysize
* (ypage
+ 1) / ypages
- 1;
1167 xtemp
= header
.HWResolution
[0] * xprint
;
1168 ytemp
= header
.HWResolution
[1] * yprint
;
1171 cupsRasterWriteHeader2(ras
, &header
);
1173 for (plane
= 0; plane
< num_planes
; plane
++)
1176 * Initialize the image "zoom" engine...
1180 z
= _cupsImageZoomNew(img
, xc0
, yc0
, xc1
, yc1
, -xtemp
, ytemp
,
1181 Orientation
& 1, zoom_type
);
1183 z
= _cupsImageZoomNew(img
, xc0
, yc0
, xc1
, yc1
, xtemp
, ytemp
,
1184 Orientation
& 1, zoom_type
);
1187 * Write leading blank space as needed...
1190 if (header
.cupsHeight
> z
->ysize
&& YPosition
<= 0)
1192 blank_line(&header
, row
);
1194 y
= header
.cupsHeight
- z
->ysize
;
1198 fprintf(stderr
, "DEBUG: Writing %d leading blank lines...\n", y
);
1202 if (cupsRasterWritePixels(ras
, row
, header
.cupsBytesPerLine
) <
1203 header
.cupsBytesPerLine
)
1205 fputs(_("ERROR: Unable to write raster data to driver!\n"),
1207 cupsImageClose(img
);
1214 * Then write image data...
1217 for (y
= z
->ysize
, yerr0
= 0, yerr1
= z
->ysize
, iy
= 0, last_iy
= -2;
1223 if (zoom_type
!= CUPS_IZOOM_FAST
&& (iy
- last_iy
) > 1)
1224 _cupsImageZoomFill(z
, iy
);
1226 _cupsImageZoomFill(z
, iy
+ z
->yincr
);
1232 * Format this line of raster data for the printer...
1235 blank_line(&header
, row
);
1237 r0
= z
->rows
[z
->row
];
1238 r1
= z
->rows
[1 - z
->row
];
1240 switch (header
.cupsColorSpace
)
1242 case CUPS_CSPACE_W
:
1243 format_W(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1244 yerr0
, yerr1
, r0
, r1
);
1247 case CUPS_CSPACE_RGB
:
1248 format_RGB(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1249 yerr0
, yerr1
, r0
, r1
);
1251 case CUPS_CSPACE_RGBA
:
1252 case CUPS_CSPACE_RGBW
:
1253 format_RGBA(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1254 yerr0
, yerr1
, r0
, r1
);
1256 case CUPS_CSPACE_K
:
1257 case CUPS_CSPACE_WHITE
:
1258 case CUPS_CSPACE_GOLD
:
1259 case CUPS_CSPACE_SILVER
:
1260 format_K(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1261 yerr0
, yerr1
, r0
, r1
);
1263 case CUPS_CSPACE_CMY
:
1264 format_CMY(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1265 yerr0
, yerr1
, r0
, r1
);
1267 case CUPS_CSPACE_YMC
:
1268 format_YMC(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1269 yerr0
, yerr1
, r0
, r1
);
1271 case CUPS_CSPACE_CMYK
:
1272 format_CMYK(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1273 yerr0
, yerr1
, r0
, r1
);
1275 case CUPS_CSPACE_YMCK
:
1276 case CUPS_CSPACE_GMCK
:
1277 case CUPS_CSPACE_GMCS
:
1278 format_YMCK(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1279 yerr0
, yerr1
, r0
, r1
);
1281 case CUPS_CSPACE_KCMYcm
:
1282 if (header
.cupsBitsPerColor
== 1)
1284 format_KCMYcm(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1285 yerr0
, yerr1
, r0
, r1
);
1288 case CUPS_CSPACE_KCMY
:
1289 format_KCMY(&header
, row
, y
, plane
, z
->xsize
, z
->ysize
,
1290 yerr0
, yerr1
, r0
, r1
);
1295 * Write the raster data to the driver...
1298 if (cupsRasterWritePixels(ras
, row
, header
.cupsBytesPerLine
) <
1299 header
.cupsBytesPerLine
)
1301 fputs(_("ERROR: Unable to write raster data to driver!\n"),
1303 cupsImageClose(img
);
1308 * Compute the next scanline in the image...
1323 * Write trailing blank space as needed...
1326 if (header
.cupsHeight
> z
->ysize
&& YPosition
>= 0)
1328 blank_line(&header
, row
);
1330 y
= header
.cupsHeight
- z
->ysize
;
1334 fprintf(stderr
, "DEBUG: Writing %d trailing blank lines...\n", y
);
1338 if (cupsRasterWritePixels(ras
, row
, header
.cupsBytesPerLine
) <
1339 header
.cupsBytesPerLine
)
1341 fputs(_("ERROR: Unable to write raster data to driver!\n"),
1343 cupsImageClose(img
);
1350 * Free memory used for the "zoom" engine...
1353 _cupsImageZoomDelete(z
);
1362 cupsRasterClose(ras
);
1363 cupsImageClose(img
);
1371 * 'blank_line()' - Clear a line buffer to the blank value...
1375 blank_line(cups_page_header2_t
*header
, /* I - Page header */
1376 unsigned char *row
) /* I - Row buffer */
1378 int count
; /* Remaining bytes */
1381 count
= header
->cupsBytesPerLine
;
1383 switch (header
->cupsColorSpace
)
1385 case CUPS_CSPACE_CIEXYZ
:
1395 case CUPS_CSPACE_CIELab
:
1396 case CUPS_CSPACE_ICC1
:
1397 case CUPS_CSPACE_ICC2
:
1398 case CUPS_CSPACE_ICC3
:
1399 case CUPS_CSPACE_ICC4
:
1400 case CUPS_CSPACE_ICC5
:
1401 case CUPS_CSPACE_ICC6
:
1402 case CUPS_CSPACE_ICC7
:
1403 case CUPS_CSPACE_ICC8
:
1404 case CUPS_CSPACE_ICC9
:
1405 case CUPS_CSPACE_ICCA
:
1406 case CUPS_CSPACE_ICCB
:
1407 case CUPS_CSPACE_ICCC
:
1408 case CUPS_CSPACE_ICCD
:
1409 case CUPS_CSPACE_ICCE
:
1410 case CUPS_CSPACE_ICCF
:
1420 case CUPS_CSPACE_K
:
1421 case CUPS_CSPACE_CMY
:
1422 case CUPS_CSPACE_CMYK
:
1423 case CUPS_CSPACE_YMC
:
1424 case CUPS_CSPACE_YMCK
:
1425 case CUPS_CSPACE_KCMY
:
1426 case CUPS_CSPACE_KCMYcm
:
1427 case CUPS_CSPACE_GMCK
:
1428 case CUPS_CSPACE_GMCS
:
1429 case CUPS_CSPACE_WHITE
:
1430 case CUPS_CSPACE_GOLD
:
1431 case CUPS_CSPACE_SILVER
:
1432 memset(row
, 0, count
);
1436 memset(row
, 255, count
);
1443 * 'format_CMY()' - Convert image data to CMY.
1447 format_CMY(cups_page_header2_t
*header
, /* I - Page header */
1448 unsigned char *row
, /* IO - Bitmap data for device */
1449 int y
, /* I - Current row */
1450 int z
, /* I - Current plane */
1451 int xsize
, /* I - Width of image data */
1452 int ysize
, /* I - Height of image data */
1453 int yerr0
, /* I - Top Y error */
1454 int yerr1
, /* I - Bottom Y error */
1455 cups_ib_t
*r0
, /* I - Primary image data */
1456 cups_ib_t
*r1
) /* I - Image data for interpolation */
1458 cups_ib_t
*ptr
, /* Pointer into row */
1459 *cptr
, /* Pointer into cyan */
1460 *mptr
, /* Pointer into magenta */
1461 *yptr
, /* Pointer into yellow */
1462 bitmask
; /* Current mask for pixel */
1463 int bitoffset
; /* Current offset in line */
1464 int bandwidth
; /* Width of a color band */
1465 int x
, /* Current X coordinate on page */
1466 *dither
; /* Pointer into dither array */
1475 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
1478 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
1482 ptr
= row
+ bitoffset
/ 8;
1483 bandwidth
= header
->cupsBytesPerLine
/ 3;
1485 switch (header
->cupsColorOrder
)
1487 case CUPS_ORDER_CHUNKED
:
1488 switch (header
->cupsBitsPerColor
)
1491 bitmask
= 64 >> (bitoffset
& 7);
1492 dither
= Floyd16x16
[y
& 15];
1494 for (x
= xsize
; x
> 0; x
--)
1496 if (*r0
++ > dither
[x
& 15])
1500 if (*r0
++ > dither
[x
& 15])
1504 if (*r0
++ > dither
[x
& 15])
1518 dither
= Floyd8x8
[y
& 7];
1520 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1522 if ((r0
[0] & 63) > dither
[x
& 7])
1523 *ptr
^= (0x30 & OnPixels
[r0
[0]]);
1525 *ptr
^= (0x30 & OffPixels
[r0
[0]]);
1527 if ((r0
[1] & 63) > dither
[x
& 7])
1528 *ptr
^= (0x0c & OnPixels
[r0
[1]]);
1530 *ptr
^= (0x0c & OffPixels
[r0
[1]]);
1532 if ((r0
[2] & 63) > dither
[x
& 7])
1533 *ptr
++ ^= (0x03 & OnPixels
[r0
[2]]);
1535 *ptr
++ ^= (0x03 & OffPixels
[r0
[2]]);
1540 dither
= Floyd4x4
[y
& 3];
1542 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1544 if ((r0
[0] & 15) > dither
[x
& 3])
1545 *ptr
++ ^= (0x0f & OnPixels
[r0
[0]]);
1547 *ptr
++ ^= (0x0f & OffPixels
[r0
[0]]);
1549 if ((r0
[1] & 15) > dither
[x
& 3])
1550 *ptr
^= (0xf0 & OnPixels
[r0
[1]]);
1552 *ptr
^= (0xf0 & OffPixels
[r0
[1]]);
1554 if ((r0
[2] & 15) > dither
[x
& 3])
1555 *ptr
++ ^= (0x0f & OnPixels
[r0
[2]]);
1557 *ptr
++ ^= (0x0f & OffPixels
[r0
[2]]);
1562 for (x
= xsize
* 3; x
> 0; x
--, r0
++, r1
++)
1566 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
1571 case CUPS_ORDER_BANDED
:
1573 mptr
= ptr
+ bandwidth
;
1574 yptr
= ptr
+ 2 * bandwidth
;
1576 switch (header
->cupsBitsPerColor
)
1579 bitmask
= 0x80 >> (bitoffset
& 7);
1580 dither
= Floyd16x16
[y
& 15];
1582 for (x
= xsize
; x
> 0; x
--)
1584 if (*r0
++ > dither
[x
& 15])
1586 if (*r0
++ > dither
[x
& 15])
1588 if (*r0
++ > dither
[x
& 15])
1604 bitmask
= 0xc0 >> (bitoffset
& 7);
1605 dither
= Floyd8x8
[y
& 7];
1607 for (x
= xsize
; x
> 0; x
--)
1609 if ((*r0
& 63) > dither
[x
& 7])
1610 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
1612 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
1614 if ((*r0
& 63) > dither
[x
& 7])
1615 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
1617 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
1619 if ((*r0
& 63) > dither
[x
& 7])
1620 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
1622 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
1638 bitmask
= 0xf0 >> (bitoffset
& 7);
1639 dither
= Floyd4x4
[y
& 3];
1641 for (x
= xsize
; x
> 0; x
--)
1643 if ((*r0
& 15) > dither
[x
& 3])
1644 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
1646 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
1648 if ((*r0
& 15) > dither
[x
& 3])
1649 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
1651 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
1653 if ((*r0
& 15) > dither
[x
& 3])
1654 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
1656 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
1658 if (bitmask
== 0xf0)
1672 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
1677 *cptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
1682 *mptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
1687 *yptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
1693 case CUPS_ORDER_PLANAR
:
1694 switch (header
->cupsBitsPerColor
)
1697 bitmask
= 0x80 >> (bitoffset
& 7);
1698 dither
= Floyd16x16
[y
& 15];
1703 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1705 if (r0
[0] > dither
[x
& 15])
1719 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1721 if (r0
[1] > dither
[x
& 15])
1735 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1737 if (r0
[2] > dither
[x
& 15])
1753 bitmask
= 0xc0 >> (bitoffset
& 7);
1754 dither
= Floyd8x8
[y
& 7];
1757 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1759 if ((*r0
& 63) > dither
[x
& 7])
1760 *ptr
^= (bitmask
& OnPixels
[*r0
]);
1762 *ptr
^= (bitmask
& OffPixels
[*r0
]);
1776 bitmask
= 0xf0 >> (bitoffset
& 7);
1777 dither
= Floyd4x4
[y
& 3];
1780 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
1782 if ((*r0
& 15) > dither
[x
& 3])
1783 *ptr
^= (bitmask
& OnPixels
[*r0
]);
1785 *ptr
^= (bitmask
& OffPixels
[*r0
]);
1787 if (bitmask
== 0xf0)
1802 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
1807 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
1817 * 'format_CMYK()' - Convert image data to CMYK.
1821 format_CMYK(cups_page_header2_t
*header
,/* I - Page header */
1822 unsigned char *row
, /* IO - Bitmap data for device */
1823 int y
, /* I - Current row */
1824 int z
, /* I - Current plane */
1825 int xsize
, /* I - Width of image data */
1826 int ysize
, /* I - Height of image data */
1827 int yerr0
, /* I - Top Y error */
1828 int yerr1
, /* I - Bottom Y error */
1829 cups_ib_t
*r0
, /* I - Primary image data */
1830 cups_ib_t
*r1
) /* I - Image data for interpolation */
1832 cups_ib_t
*ptr
, /* Pointer into row */
1833 *cptr
, /* Pointer into cyan */
1834 *mptr
, /* Pointer into magenta */
1835 *yptr
, /* Pointer into yellow */
1836 *kptr
, /* Pointer into black */
1837 bitmask
; /* Current mask for pixel */
1838 int bitoffset
; /* Current offset in line */
1839 int bandwidth
; /* Width of a color band */
1840 int x
, /* Current X coordinate on page */
1841 *dither
; /* Pointer into dither array */
1842 int pc
, pm
, py
; /* CMY pixels */
1851 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
1854 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
1858 ptr
= row
+ bitoffset
/ 8;
1859 bandwidth
= header
->cupsBytesPerLine
/ 4;
1861 switch (header
->cupsColorOrder
)
1863 case CUPS_ORDER_CHUNKED
:
1864 switch (header
->cupsBitsPerColor
)
1867 bitmask
= 128 >> (bitoffset
& 7);
1868 dither
= Floyd16x16
[y
& 15];
1870 for (x
= xsize
; x
> 0; x
--)
1872 pc
= *r0
++ > dither
[x
& 15];
1873 pm
= *r0
++ > dither
[x
& 15];
1874 py
= *r0
++ > dither
[x
& 15];
1907 dither
= Floyd8x8
[y
& 7];
1909 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
1911 if ((r0
[0] & 63) > dither
[x
& 7])
1912 *ptr
^= (0xc0 & OnPixels
[r0
[0]]);
1914 *ptr
^= (0xc0 & OffPixels
[r0
[0]]);
1916 if ((r0
[1] & 63) > dither
[x
& 7])
1917 *ptr
^= (0x30 & OnPixels
[r0
[1]]);
1919 *ptr
^= (0x30 & OffPixels
[r0
[1]]);
1921 if ((r0
[2] & 63) > dither
[x
& 7])
1922 *ptr
^= (0x0c & OnPixels
[r0
[2]]);
1924 *ptr
^= (0x0c & OffPixels
[r0
[2]]);
1926 if ((r0
[3] & 63) > dither
[x
& 7])
1927 *ptr
++ ^= (0x03 & OnPixels
[r0
[3]]);
1929 *ptr
++ ^= (0x03 & OffPixels
[r0
[3]]);
1934 dither
= Floyd4x4
[y
& 3];
1936 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
1938 if ((r0
[0] & 15) > dither
[x
& 3])
1939 *ptr
^= (0xf0 & OnPixels
[r0
[0]]);
1941 *ptr
^= (0xf0 & OffPixels
[r0
[0]]);
1943 if ((r0
[1] & 15) > dither
[x
& 3])
1944 *ptr
++ ^= (0x0f & OnPixels
[r0
[1]]);
1946 *ptr
++ ^= (0x0f & OffPixels
[r0
[1]]);
1948 if ((r0
[2] & 15) > dither
[x
& 3])
1949 *ptr
^= (0xf0 & OnPixels
[r0
[2]]);
1951 *ptr
^= (0xf0 & OffPixels
[r0
[2]]);
1953 if ((r0
[3] & 15) > dither
[x
& 3])
1954 *ptr
++ ^= (0x0f & OnPixels
[r0
[3]]);
1956 *ptr
++ ^= (0x0f & OffPixels
[r0
[3]]);
1961 for (x
= xsize
* 4; x
> 0; x
--, r0
++, r1
++)
1965 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
1970 case CUPS_ORDER_BANDED
:
1972 mptr
= ptr
+ bandwidth
;
1973 yptr
= ptr
+ 2 * bandwidth
;
1974 kptr
= ptr
+ 3 * bandwidth
;
1976 switch (header
->cupsBitsPerColor
)
1979 bitmask
= 0x80 >> (bitoffset
& 7);
1980 dither
= Floyd16x16
[y
& 15];
1982 for (x
= xsize
; x
> 0; x
--)
1984 pc
= *r0
++ > dither
[x
& 15];
1985 pm
= *r0
++ > dither
[x
& 15];
1986 py
= *r0
++ > dither
[x
& 15];
2014 bitmask
= 0xc0 >> (bitoffset
& 7);
2015 dither
= Floyd8x8
[y
& 7];
2017 for (x
= xsize
; x
> 0; x
--)
2019 if ((*r0
& 63) > dither
[x
& 7])
2020 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
2022 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
2024 if ((*r0
& 63) > dither
[x
& 7])
2025 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
2027 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
2029 if ((*r0
& 63) > dither
[x
& 7])
2030 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
2032 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
2034 if ((*r0
& 63) > dither
[x
& 7])
2035 *kptr
^= (bitmask
& OnPixels
[*r0
++]);
2037 *kptr
^= (bitmask
& OffPixels
[*r0
++]);
2054 bitmask
= 0xf0 >> (bitoffset
& 7);
2055 dither
= Floyd4x4
[y
& 3];
2057 for (x
= xsize
; x
> 0; x
--)
2059 if ((*r0
& 15) > dither
[x
& 3])
2060 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
2062 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
2064 if ((*r0
& 15) > dither
[x
& 3])
2065 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
2067 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
2069 if ((*r0
& 15) > dither
[x
& 3])
2070 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
2072 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
2074 if ((*r0
& 15) > dither
[x
& 3])
2075 *kptr
^= (bitmask
& OnPixels
[*r0
++]);
2077 *kptr
^= (bitmask
& OffPixels
[*r0
++]);
2079 if (bitmask
== 0xf0)
2094 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
2099 *cptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
2104 *mptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
2109 *yptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
2114 *kptr
++ = (r0
[3] * yerr0
+ r1
[3] * yerr1
) / ysize
;
2120 case CUPS_ORDER_PLANAR
:
2121 switch (header
->cupsBitsPerColor
)
2124 bitmask
= 0x80 >> (bitoffset
& 7);
2125 dither
= Floyd16x16
[y
& 15];
2127 for (x
= xsize
; x
> 0; x
--)
2129 pc
= *r0
++ > dither
[x
& 15];
2130 pm
= *r0
++ > dither
[x
& 15];
2131 py
= *r0
++ > dither
[x
& 15];
2133 if ((pc
&& pm
&& py
&& z
== 3) ||
2134 (pc
&& z
== 0) || (pm
&& z
== 1) || (py
&& z
== 2))
2148 bitmask
= 0xc0 >> (bitoffset
& 7);
2149 dither
= Floyd8x8
[y
& 7];
2152 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
2154 if ((*r0
& 63) > dither
[x
& 7])
2155 *ptr
^= (bitmask
& OnPixels
[*r0
]);
2157 *ptr
^= (bitmask
& OffPixels
[*r0
]);
2171 bitmask
= 0xf0 >> (bitoffset
& 7);
2172 dither
= Floyd4x4
[y
& 3];
2175 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
2177 if ((*r0
& 15) > dither
[x
& 3])
2178 *ptr
^= (bitmask
& OnPixels
[*r0
]);
2180 *ptr
^= (bitmask
& OffPixels
[*r0
]);
2182 if (bitmask
== 0xf0)
2197 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
2202 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
2212 * 'format_K()' - Convert image data to black.
2216 format_K(cups_page_header2_t
*header
, /* I - Page header */
2217 unsigned char *row
, /* IO - Bitmap data for device */
2218 int y
, /* I - Current row */
2219 int z
, /* I - Current plane */
2220 int xsize
, /* I - Width of image data */
2221 int ysize
, /* I - Height of image data */
2222 int yerr0
, /* I - Top Y error */
2223 int yerr1
, /* I - Bottom Y error */
2224 cups_ib_t
*r0
, /* I - Primary image data */
2225 cups_ib_t
*r1
) /* I - Image data for interpolation */
2227 cups_ib_t
*ptr
, /* Pointer into row */
2228 bitmask
; /* Current mask for pixel */
2229 int bitoffset
; /* Current offset in line */
2230 int x
, /* Current X coordinate on page */
2231 *dither
; /* Pointer into dither array */
2242 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
2245 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
2249 ptr
= row
+ bitoffset
/ 8;
2251 switch (header
->cupsBitsPerColor
)
2254 bitmask
= 0x80 >> (bitoffset
& 7);
2255 dither
= Floyd16x16
[y
& 15];
2257 for (x
= xsize
; x
> 0; x
--)
2259 if (*r0
++ > dither
[x
& 15])
2273 bitmask
= 0xc0 >> (bitoffset
& 7);
2274 dither
= Floyd8x8
[y
& 7];
2276 for (x
= xsize
; x
> 0; x
--)
2278 if ((*r0
& 63) > dither
[x
& 7])
2279 *ptr
^= (bitmask
& OnPixels
[*r0
++]);
2281 *ptr
^= (bitmask
& OffPixels
[*r0
++]);
2295 bitmask
= 0xf0 >> (bitoffset
& 7);
2296 dither
= Floyd4x4
[y
& 3];
2298 for (x
= xsize
; x
> 0; x
--)
2300 if ((*r0
& 15) > dither
[x
& 3])
2301 *ptr
^= (bitmask
& OnPixels
[*r0
++]);
2303 *ptr
^= (bitmask
& OffPixels
[*r0
++]);
2305 if (bitmask
== 0xf0)
2317 for (x
= xsize
; x
> 0; x
--, r0
++, r1
++)
2322 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
2330 * 'format_KCMY()' - Convert image data to KCMY.
2334 format_KCMY(cups_page_header2_t
*header
,/* I - Page header */
2335 unsigned char *row
, /* IO - Bitmap data for device */
2336 int y
, /* I - Current row */
2337 int z
, /* I - Current plane */
2338 int xsize
, /* I - Width of image data */
2339 int ysize
, /* I - Height of image data */
2340 int yerr0
, /* I - Top Y error */
2341 int yerr1
, /* I - Bottom Y error */
2342 cups_ib_t
*r0
, /* I - Primary image data */
2343 cups_ib_t
*r1
) /* I - Image data for interpolation */
2345 cups_ib_t
*ptr
, /* Pointer into row */
2346 *cptr
, /* Pointer into cyan */
2347 *mptr
, /* Pointer into magenta */
2348 *yptr
, /* Pointer into yellow */
2349 *kptr
, /* Pointer into black */
2350 bitmask
; /* Current mask for pixel */
2351 int bitoffset
; /* Current offset in line */
2352 int bandwidth
; /* Width of a color band */
2353 int x
, /* Current X coordinate on page */
2354 *dither
; /* Pointer into dither array */
2355 int pc
, pm
, py
; /* CMY pixels */
2364 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
2367 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
2371 ptr
= row
+ bitoffset
/ 8;
2372 bandwidth
= header
->cupsBytesPerLine
/ 4;
2374 switch (header
->cupsColorOrder
)
2376 case CUPS_ORDER_CHUNKED
:
2377 switch (header
->cupsBitsPerColor
)
2380 bitmask
= 128 >> (bitoffset
& 7);
2381 dither
= Floyd16x16
[y
& 15];
2383 for (x
= xsize
; x
> 0; x
--)
2385 pc
= *r0
++ > dither
[x
& 15];
2386 pm
= *r0
++ > dither
[x
& 15];
2387 py
= *r0
++ > dither
[x
& 15];
2420 dither
= Floyd8x8
[y
& 7];
2422 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
2424 if ((r0
[3] & 63) > dither
[x
& 7])
2425 *ptr
^= (0xc0 & OnPixels
[r0
[3]]);
2427 *ptr
^= (0xc0 & OffPixels
[r0
[3]]);
2429 if ((r0
[0] & 63) > dither
[x
& 7])
2430 *ptr
^= (0x30 & OnPixels
[r0
[0]]);
2432 *ptr
^= (0x30 & OffPixels
[r0
[0]]);
2434 if ((r0
[1] & 63) > dither
[x
& 7])
2435 *ptr
^= (0x0c & OnPixels
[r0
[1]]);
2437 *ptr
^= (0x0c & OffPixels
[r0
[1]]);
2439 if ((r0
[2] & 63) > dither
[x
& 7])
2440 *ptr
++ ^= (0x03 & OnPixels
[r0
[2]]);
2442 *ptr
++ ^= (0x03 & OffPixels
[r0
[2]]);
2447 dither
= Floyd4x4
[y
& 3];
2449 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
2451 if ((r0
[3] & 15) > dither
[x
& 3])
2452 *ptr
^= (0xf0 & OnPixels
[r0
[3]]);
2454 *ptr
^= (0xf0 & OffPixels
[r0
[3]]);
2456 if ((r0
[0] & 15) > dither
[x
& 3])
2457 *ptr
++ ^= (0x0f & OnPixels
[r0
[0]]);
2459 *ptr
++ ^= (0x0f & OffPixels
[r0
[0]]);
2461 if ((r0
[1] & 15) > dither
[x
& 3])
2462 *ptr
^= (0xf0 & OnPixels
[r0
[1]]);
2464 *ptr
^= (0xf0 & OffPixels
[r0
[1]]);
2466 if ((r0
[2] & 15) > dither
[x
& 3])
2467 *ptr
++ ^= (0x0f & OnPixels
[r0
[2]]);
2469 *ptr
++ ^= (0x0f & OffPixels
[r0
[2]]);
2474 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
2479 *ptr
++ = (r0
[3] * yerr0
+ r1
[3] * yerr1
) / ysize
;
2484 *ptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
2489 *ptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
2494 *ptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
2500 case CUPS_ORDER_BANDED
:
2502 cptr
= ptr
+ bandwidth
;
2503 mptr
= ptr
+ 2 * bandwidth
;
2504 yptr
= ptr
+ 3 * bandwidth
;
2506 switch (header
->cupsBitsPerColor
)
2509 bitmask
= 0x80 >> (bitoffset
& 7);
2510 dither
= Floyd16x16
[y
& 15];
2512 for (x
= xsize
; x
> 0; x
--)
2514 pc
= *r0
++ > dither
[x
& 15];
2515 pm
= *r0
++ > dither
[x
& 15];
2516 py
= *r0
++ > dither
[x
& 15];
2544 bitmask
= 0xc0 >> (bitoffset
& 7);
2545 dither
= Floyd8x8
[y
& 7];
2547 for (x
= xsize
; x
> 0; x
--)
2549 if ((*r0
& 63) > dither
[x
& 7])
2550 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
2552 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
2554 if ((*r0
& 63) > dither
[x
& 7])
2555 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
2557 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
2559 if ((*r0
& 63) > dither
[x
& 7])
2560 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
2562 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
2564 if ((*r0
& 63) > dither
[x
& 7])
2565 *kptr
^= (bitmask
& OnPixels
[*r0
++]);
2567 *kptr
^= (bitmask
& OffPixels
[*r0
++]);
2584 bitmask
= 0xf0 >> (bitoffset
& 7);
2585 dither
= Floyd4x4
[y
& 3];
2587 for (x
= xsize
; x
> 0; x
--)
2589 if ((*r0
& 15) > dither
[x
& 3])
2590 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
2592 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
2594 if ((*r0
& 15) > dither
[x
& 3])
2595 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
2597 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
2599 if ((*r0
& 15) > dither
[x
& 3])
2600 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
2602 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
2604 if ((*r0
& 15) > dither
[x
& 3])
2605 *kptr
^= (bitmask
& OnPixels
[*r0
++]);
2607 *kptr
^= (bitmask
& OffPixels
[*r0
++]);
2609 if (bitmask
== 0xf0)
2624 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
2629 *cptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
2634 *mptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
2639 *yptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
2644 *kptr
++ = (r0
[3] * yerr0
+ r1
[3] * yerr1
) / ysize
;
2650 case CUPS_ORDER_PLANAR
:
2651 switch (header
->cupsBitsPerColor
)
2654 bitmask
= 0x80 >> (bitoffset
& 7);
2655 dither
= Floyd16x16
[y
& 15];
2657 for (x
= xsize
; x
> 0; x
--)
2659 pc
= *r0
++ > dither
[x
& 15];
2660 pm
= *r0
++ > dither
[x
& 15];
2661 py
= *r0
++ > dither
[x
& 15];
2663 if ((pc
&& pm
&& py
&& z
== 0) ||
2664 (pc
&& z
== 1) || (pm
&& z
== 2) || (py
&& z
== 3))
2678 bitmask
= 0xc0 >> (bitoffset
& 7);
2679 dither
= Floyd8x8
[y
& 7];
2685 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
2687 if ((*r0
& 63) > dither
[x
& 7])
2688 *ptr
^= (bitmask
& OnPixels
[*r0
]);
2690 *ptr
^= (bitmask
& OffPixels
[*r0
]);
2704 bitmask
= 0xf0 >> (bitoffset
& 7);
2705 dither
= Floyd4x4
[y
& 3];
2711 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
2713 if ((*r0
& 15) > dither
[x
& 3])
2714 *ptr
^= (bitmask
& OnPixels
[*r0
]);
2716 *ptr
^= (bitmask
& OffPixels
[*r0
]);
2718 if (bitmask
== 0xf0)
2741 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
2746 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
2756 * 'format_KCMYcm()' - Convert image data to KCMYcm.
2761 cups_page_header2_t
*header
, /* I - Page header */
2762 unsigned char *row
, /* IO - Bitmap data for device */
2763 int y
, /* I - Current row */
2764 int z
, /* I - Current plane */
2765 int xsize
, /* I - Width of image data */
2766 int ysize
, /* I - Height of image data */
2767 int yerr0
, /* I - Top Y error */
2768 int yerr1
, /* I - Bottom Y error */
2769 cups_ib_t
*r0
, /* I - Primary image data */
2770 cups_ib_t
*r1
) /* I - Image data for interpolation */
2772 int pc
, pm
, py
, pk
; /* Cyan, magenta, yellow, and black values */
2773 cups_ib_t
*ptr
, /* Pointer into row */
2774 *cptr
, /* Pointer into cyan */
2775 *mptr
, /* Pointer into magenta */
2776 *yptr
, /* Pointer into yellow */
2777 *kptr
, /* Pointer into black */
2778 *lcptr
, /* Pointer into light cyan */
2779 *lmptr
, /* Pointer into light magenta */
2780 bitmask
; /* Current mask for pixel */
2781 int bitoffset
; /* Current offset in line */
2782 int bandwidth
; /* Width of a color band */
2783 int x
, /* Current X coordinate on page */
2784 *dither
; /* Pointer into dither array */
2793 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
2796 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
2800 ptr
= row
+ bitoffset
/ 8;
2801 bandwidth
= header
->cupsBytesPerLine
/ 6;
2803 switch (header
->cupsColorOrder
)
2805 case CUPS_ORDER_CHUNKED
:
2806 dither
= Floyd16x16
[y
& 15];
2808 for (x
= xsize
; x
> 0; x
--)
2810 pc
= *r0
++ > dither
[x
& 15];
2811 pm
= *r0
++ > dither
[x
& 15];
2812 py
= *r0
++ > dither
[x
& 15];
2813 pk
= pc
&& pm
&& py
;
2816 *ptr
++ ^= 32; /* Black */
2818 *ptr
++ ^= 17; /* Blue (cyan + light magenta) */
2820 *ptr
++ ^= 6; /* Green (light cyan + yellow) */
2822 *ptr
++ ^= 12; /* Red (magenta + yellow) */
2834 case CUPS_ORDER_BANDED
:
2836 cptr
= ptr
+ bandwidth
;
2837 mptr
= ptr
+ 2 * bandwidth
;
2838 yptr
= ptr
+ 3 * bandwidth
;
2839 lcptr
= ptr
+ 4 * bandwidth
;
2840 lmptr
= ptr
+ 5 * bandwidth
;
2842 bitmask
= 0x80 >> (bitoffset
& 7);
2843 dither
= Floyd16x16
[y
& 15];
2845 for (x
= xsize
; x
> 0; x
--)
2847 pc
= *r0
++ > dither
[x
& 15];
2848 pm
= *r0
++ > dither
[x
& 15];
2849 py
= *r0
++ > dither
[x
& 15];
2850 pk
= pc
&& pm
&& py
;
2853 *kptr
^= bitmask
; /* Black */
2856 *cptr
^= bitmask
; /* Blue (cyan + light magenta) */
2861 *lcptr
^= bitmask
; /* Green (light cyan + yellow) */
2866 *mptr
^= bitmask
; /* Red (magenta + yellow) */
2891 case CUPS_ORDER_PLANAR
:
2892 bitmask
= 0x80 >> (bitoffset
& 7);
2893 dither
= Floyd16x16
[y
& 15];
2895 for (x
= xsize
; x
> 0; x
--)
2897 pc
= *r0
++ > dither
[x
& 15];
2898 pm
= *r0
++ > dither
[x
& 15];
2899 py
= *r0
++ > dither
[x
& 15];
2900 pk
= pc
&& pm
&& py
;
2904 else if (pc
&& pm
&& (z
== 1 || z
== 5))
2905 *ptr
^= bitmask
; /* Blue (cyan + light magenta) */
2906 else if (pc
&& py
&& (z
== 3 || z
== 4))
2907 *ptr
^= bitmask
; /* Green (light cyan + yellow) */
2908 else if (pm
&& py
&& (z
== 2 || z
== 3))
2909 *ptr
^= bitmask
; /* Red (magenta + yellow) */
2910 else if (pc
&& z
== 1)
2912 else if (pm
&& z
== 2)
2914 else if (py
&& z
== 3)
2931 * 'format_RGBA()' - Convert image data to RGBA/RGBW.
2935 format_RGBA(cups_page_header2_t
*header
,/* I - Page header */
2936 unsigned char *row
, /* IO - Bitmap data for device */
2937 int y
, /* I - Current row */
2938 int z
, /* I - Current plane */
2939 int xsize
, /* I - Width of image data */
2940 int ysize
, /* I - Height of image data */
2941 int yerr0
, /* I - Top Y error */
2942 int yerr1
, /* I - Bottom Y error */
2943 cups_ib_t
*r0
, /* I - Primary image data */
2944 cups_ib_t
*r1
) /* I - Image data for interpolation */
2946 cups_ib_t
*ptr
, /* Pointer into row */
2947 *cptr
, /* Pointer into cyan */
2948 *mptr
, /* Pointer into magenta */
2949 *yptr
, /* Pointer into yellow */
2950 bitmask
; /* Current mask for pixel */
2951 int bitoffset
; /* Current offset in line */
2952 int bandwidth
; /* Width of a color band */
2953 int x
, /* Current X coordinate on page */
2954 *dither
; /* Pointer into dither array */
2963 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
2966 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
2970 ptr
= row
+ bitoffset
/ 8;
2971 bandwidth
= header
->cupsBytesPerLine
/ 4;
2973 switch (header
->cupsColorOrder
)
2975 case CUPS_ORDER_CHUNKED
:
2976 switch (header
->cupsBitsPerColor
)
2979 bitmask
= 128 >> (bitoffset
& 7);
2980 dither
= Floyd16x16
[y
& 15];
2982 for (x
= xsize
; x
> 0; x
--)
2984 if (*r0
++ > dither
[x
& 15])
2988 if (*r0
++ > dither
[x
& 15])
2992 if (*r0
++ > dither
[x
& 15])
3006 dither
= Floyd8x8
[y
& 7];
3008 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3010 if ((r0
[0] & 63) > dither
[x
& 7])
3011 *ptr
^= (0xc0 & OnPixels
[r0
[0]]);
3013 *ptr
^= (0xc0 & OffPixels
[r0
[0]]);
3015 if ((r0
[1] & 63) > dither
[x
& 7])
3016 *ptr
^= (0x30 & OnPixels
[r0
[1]]);
3018 *ptr
^= (0x30 & OffPixels
[r0
[1]]);
3020 if ((r0
[2] & 63) > dither
[x
& 7])
3021 *ptr
^= (0x0c & OnPixels
[r0
[2]]);
3023 *ptr
^= (0x0c & OffPixels
[r0
[2]]);
3030 dither
= Floyd4x4
[y
& 3];
3032 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3034 if ((r0
[0] & 15) > dither
[x
& 3])
3035 *ptr
^= (0xf0 & OnPixels
[r0
[0]]);
3037 *ptr
^= (0xf0 & OffPixels
[r0
[0]]);
3039 if ((r0
[1] & 15) > dither
[x
& 3])
3040 *ptr
++ ^= (0x0f & OnPixels
[r0
[1]]);
3042 *ptr
++ ^= (0x0f & OffPixels
[r0
[1]]);
3044 if ((r0
[2] & 15) > dither
[x
& 3])
3045 *ptr
^= (0xf0 & OnPixels
[r0
[2]]);
3047 *ptr
^= (0xf0 & OffPixels
[r0
[2]]);
3054 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
3059 *ptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
3064 *ptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
3069 *ptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
3077 case CUPS_ORDER_BANDED
:
3079 mptr
= ptr
+ bandwidth
;
3080 yptr
= ptr
+ 2 * bandwidth
;
3082 memset(ptr
+ 3 * bandwidth
, 255, bandwidth
);
3084 switch (header
->cupsBitsPerColor
)
3087 bitmask
= 0x80 >> (bitoffset
& 7);
3088 dither
= Floyd16x16
[y
& 15];
3090 for (x
= xsize
; x
> 0; x
--)
3092 if (*r0
++ > dither
[x
& 15])
3094 if (*r0
++ > dither
[x
& 15])
3096 if (*r0
++ > dither
[x
& 15])
3112 bitmask
= 0xc0 >> (bitoffset
& 7);
3113 dither
= Floyd8x8
[y
& 7];
3115 for (x
= xsize
; x
> 0; x
--)
3117 if ((*r0
& 63) > dither
[x
& 7])
3118 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
3120 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
3122 if ((*r0
& 63) > dither
[x
& 7])
3123 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
3125 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
3127 if ((*r0
& 63) > dither
[x
& 7])
3128 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
3130 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
3146 bitmask
= 0xf0 >> (bitoffset
& 7);
3147 dither
= Floyd4x4
[y
& 3];
3149 for (x
= xsize
; x
> 0; x
--)
3151 if ((*r0
& 15) > dither
[x
& 3])
3152 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
3154 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
3156 if ((*r0
& 15) > dither
[x
& 3])
3157 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
3159 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
3161 if ((*r0
& 15) > dither
[x
& 3])
3162 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
3164 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
3166 if (bitmask
== 0xf0)
3180 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
3185 *cptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
3190 *mptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
3195 *yptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
3201 case CUPS_ORDER_PLANAR
:
3204 memset(row
, 255, header
->cupsBytesPerLine
);
3208 switch (header
->cupsBitsPerColor
)
3211 bitmask
= 0x80 >> (bitoffset
& 7);
3212 dither
= Floyd16x16
[y
& 15];
3217 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3219 if (r0
[0] > dither
[x
& 15])
3233 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3235 if (r0
[1] > dither
[x
& 15])
3249 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3251 if (r0
[2] > dither
[x
& 15])
3267 bitmask
= 0xc0 >> (bitoffset
& 7);
3268 dither
= Floyd8x8
[y
& 7];
3271 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3273 if ((*r0
& 63) > dither
[x
& 7])
3274 *ptr
^= (bitmask
& OnPixels
[*r0
]);
3276 *ptr
^= (bitmask
& OffPixels
[*r0
]);
3290 bitmask
= 0xf0 >> (bitoffset
& 7);
3291 dither
= Floyd4x4
[y
& 3];
3294 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3296 if ((*r0
& 15) > dither
[x
& 3])
3297 *ptr
^= (bitmask
& OnPixels
[*r0
]);
3299 *ptr
^= (bitmask
& OffPixels
[*r0
]);
3301 if (bitmask
== 0xf0)
3316 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
3321 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
3331 * 'format_W()' - Convert image data to luminance.
3335 format_W(cups_page_header2_t
*header
, /* I - Page header */
3336 unsigned char *row
, /* IO - Bitmap data for device */
3337 int y
, /* I - Current row */
3338 int z
, /* I - Current plane */
3339 int xsize
, /* I - Width of image data */
3340 int ysize
, /* I - Height of image data */
3341 int yerr0
, /* I - Top Y error */
3342 int yerr1
, /* I - Bottom Y error */
3343 cups_ib_t
*r0
, /* I - Primary image data */
3344 cups_ib_t
*r1
) /* I - Image data for interpolation */
3346 cups_ib_t
*ptr
, /* Pointer into row */
3347 bitmask
; /* Current mask for pixel */
3348 int bitoffset
; /* Current offset in line */
3349 int x
, /* Current X coordinate on page */
3350 *dither
; /* Pointer into dither array */
3361 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
3364 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
3368 ptr
= row
+ bitoffset
/ 8;
3370 switch (header
->cupsBitsPerColor
)
3373 bitmask
= 0x80 >> (bitoffset
& 7);
3374 dither
= Floyd16x16
[y
& 15];
3376 for (x
= xsize
; x
> 0; x
--)
3378 if (*r0
++ > dither
[x
& 15])
3392 bitmask
= 0xc0 >> (bitoffset
& 7);
3393 dither
= Floyd8x8
[y
& 7];
3395 for (x
= xsize
; x
> 0; x
--)
3397 if ((*r0
& 63) > dither
[x
& 7])
3398 *ptr
^= (bitmask
& OnPixels
[*r0
++]);
3400 *ptr
^= (bitmask
& OffPixels
[*r0
++]);
3414 bitmask
= 0xf0 >> (bitoffset
& 7);
3415 dither
= Floyd4x4
[y
& 3];
3417 for (x
= xsize
; x
> 0; x
--)
3419 if ((*r0
& 15) > dither
[x
& 3])
3420 *ptr
^= (bitmask
& OnPixels
[*r0
++]);
3422 *ptr
^= (bitmask
& OffPixels
[*r0
++]);
3424 if (bitmask
== 0xf0)
3436 for (x
= xsize
; x
> 0; x
--, r0
++, r1
++)
3441 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
3449 * 'format_YMC()' - Convert image data to YMC.
3453 format_YMC(cups_page_header2_t
*header
, /* I - Page header */
3454 unsigned char *row
, /* IO - Bitmap data for device */
3455 int y
, /* I - Current row */
3456 int z
, /* I - Current plane */
3457 int xsize
, /* I - Width of image data */
3458 int ysize
, /* I - Height of image data */
3459 int yerr0
, /* I - Top Y error */
3460 int yerr1
, /* I - Bottom Y error */
3461 cups_ib_t
*r0
, /* I - Primary image data */
3462 cups_ib_t
*r1
) /* I - Image data for interpolation */
3464 cups_ib_t
*ptr
, /* Pointer into row */
3465 *cptr
, /* Pointer into cyan */
3466 *mptr
, /* Pointer into magenta */
3467 *yptr
, /* Pointer into yellow */
3468 bitmask
; /* Current mask for pixel */
3469 int bitoffset
; /* Current offset in line */
3470 int bandwidth
; /* Width of a color band */
3471 int x
, /* Current X coordinate on page */
3472 *dither
; /* Pointer into dither array */
3481 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
3484 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
3488 ptr
= row
+ bitoffset
/ 8;
3489 bandwidth
= header
->cupsBytesPerLine
/ 3;
3491 switch (header
->cupsColorOrder
)
3493 case CUPS_ORDER_CHUNKED
:
3494 switch (header
->cupsBitsPerColor
)
3497 bitmask
= 64 >> (bitoffset
& 7);
3498 dither
= Floyd16x16
[y
& 15];
3500 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3502 if (r0
[2] > dither
[x
& 15])
3506 if (r0
[1] > dither
[x
& 15])
3510 if (r0
[0] > dither
[x
& 15])
3524 dither
= Floyd8x8
[y
& 7];
3526 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3528 if ((r0
[2] & 63) > dither
[x
& 7])
3529 *ptr
^= (0x30 & OnPixels
[r0
[2]]);
3531 *ptr
^= (0x30 & OffPixels
[r0
[2]]);
3533 if ((r0
[1] & 63) > dither
[x
& 7])
3534 *ptr
^= (0x0c & OnPixels
[r0
[1]]);
3536 *ptr
^= (0x0c & OffPixels
[r0
[1]]);
3538 if ((r0
[0] & 63) > dither
[x
& 7])
3539 *ptr
++ ^= (0x03 & OnPixels
[r0
[0]]);
3541 *ptr
++ ^= (0x03 & OffPixels
[r0
[0]]);
3546 dither
= Floyd4x4
[y
& 3];
3548 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3550 if ((r0
[2] & 15) > dither
[x
& 3])
3551 *ptr
++ ^= (0x0f & OnPixels
[r0
[2]]);
3553 *ptr
++ ^= (0x0f & OffPixels
[r0
[2]]);
3555 if ((r0
[1] & 15) > dither
[x
& 3])
3556 *ptr
^= (0xf0 & OnPixels
[r0
[1]]);
3558 *ptr
^= (0xf0 & OffPixels
[r0
[1]]);
3560 if ((r0
[0] & 15) > dither
[x
& 3])
3561 *ptr
++ ^= (0x0f & OnPixels
[r0
[0]]);
3563 *ptr
++ ^= (0x0f & OffPixels
[r0
[0]]);
3568 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
3573 *ptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
3578 *ptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
3583 *ptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
3589 case CUPS_ORDER_BANDED
:
3591 mptr
= ptr
+ bandwidth
;
3592 cptr
= ptr
+ 2 * bandwidth
;
3594 switch (header
->cupsBitsPerColor
)
3597 bitmask
= 0x80 >> (bitoffset
& 7);
3598 dither
= Floyd16x16
[y
& 15];
3600 for (x
= xsize
; x
> 0; x
--)
3602 if (*r0
++ > dither
[x
& 15])
3604 if (*r0
++ > dither
[x
& 15])
3606 if (*r0
++ > dither
[x
& 15])
3622 bitmask
= 0xc0 >> (bitoffset
& 7);
3623 dither
= Floyd8x8
[y
& 7];
3625 for (x
= xsize
; x
> 0; x
--)
3627 if ((*r0
& 63) > dither
[x
& 7])
3628 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
3630 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
3632 if ((*r0
& 63) > dither
[x
& 7])
3633 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
3635 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
3637 if ((*r0
& 63) > dither
[x
& 7])
3638 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
3640 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
3656 bitmask
= 0xf0 >> (bitoffset
& 7);
3657 dither
= Floyd4x4
[y
& 3];
3659 for (x
= xsize
; x
> 0; x
--)
3661 if ((*r0
& 15) > dither
[x
& 3])
3662 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
3664 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
3666 if ((*r0
& 15) > dither
[x
& 3])
3667 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
3669 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
3671 if ((*r0
& 15) > dither
[x
& 3])
3672 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
3674 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
3676 if (bitmask
== 0xf0)
3690 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
3695 *cptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
3700 *mptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
3705 *yptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
3711 case CUPS_ORDER_PLANAR
:
3712 switch (header
->cupsBitsPerColor
)
3715 bitmask
= 0x80 >> (bitoffset
& 7);
3716 dither
= Floyd16x16
[y
& 15];
3721 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3723 if (r0
[0] > dither
[x
& 15])
3737 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3739 if (r0
[1] > dither
[x
& 15])
3753 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3755 if (r0
[2] > dither
[x
& 15])
3771 bitmask
= 0xc0 >> (bitoffset
& 7);
3772 dither
= Floyd8x8
[y
& 7];
3776 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3778 if ((*r0
& 63) > dither
[x
& 7])
3779 *ptr
^= (bitmask
& OnPixels
[*r0
]);
3781 *ptr
^= (bitmask
& OffPixels
[*r0
]);
3795 bitmask
= 0xf0 >> (bitoffset
& 7);
3796 dither
= Floyd4x4
[y
& 3];
3800 for (x
= xsize
; x
> 0; x
--, r0
+= 3)
3802 if ((*r0
& 15) > dither
[x
& 3])
3803 *ptr
^= (bitmask
& OnPixels
[*r0
]);
3805 *ptr
^= (bitmask
& OffPixels
[*r0
]);
3807 if (bitmask
== 0xf0)
3823 for (x
= xsize
; x
> 0; x
--, r0
+= 3, r1
+= 3)
3828 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
3838 * 'format_YMCK()' - Convert image data to YMCK.
3842 format_YMCK(cups_page_header2_t
*header
,/* I - Page header */
3843 unsigned char *row
, /* IO - Bitmap data for device */
3844 int y
, /* I - Current row */
3845 int z
, /* I - Current plane */
3846 int xsize
, /* I - Width of image data */
3847 int ysize
, /* I - Height of image data */
3848 int yerr0
, /* I - Top Y error */
3849 int yerr1
, /* I - Bottom Y error */
3850 cups_ib_t
*r0
, /* I - Primary image data */
3851 cups_ib_t
*r1
) /* I - Image data for interpolation */
3853 cups_ib_t
*ptr
, /* Pointer into row */
3854 *cptr
, /* Pointer into cyan */
3855 *mptr
, /* Pointer into magenta */
3856 *yptr
, /* Pointer into yellow */
3857 *kptr
, /* Pointer into black */
3858 bitmask
; /* Current mask for pixel */
3859 int bitoffset
; /* Current offset in line */
3860 int bandwidth
; /* Width of a color band */
3861 int x
, /* Current X coordinate on page */
3862 *dither
; /* Pointer into dither array */
3863 int pc
, pm
, py
; /* CMY pixels */
3872 bitoffset
= header
->cupsBitsPerPixel
* ((header
->cupsWidth
- xsize
) / 2);
3875 bitoffset
= header
->cupsBitsPerPixel
* (header
->cupsWidth
- xsize
);
3879 ptr
= row
+ bitoffset
/ 8;
3880 bandwidth
= header
->cupsBytesPerLine
/ 4;
3882 switch (header
->cupsColorOrder
)
3884 case CUPS_ORDER_CHUNKED
:
3885 switch (header
->cupsBitsPerColor
)
3888 bitmask
= 128 >> (bitoffset
& 7);
3889 dither
= Floyd16x16
[y
& 15];
3891 for (x
= xsize
; x
> 0; x
--)
3893 pc
= *r0
++ > dither
[x
& 15];
3894 pm
= *r0
++ > dither
[x
& 15];
3895 py
= *r0
++ > dither
[x
& 15];
3929 dither
= Floyd8x8
[y
& 7];
3931 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
3933 if ((r0
[2] & 63) > dither
[x
& 7])
3934 *ptr
^= (0xc0 & OnPixels
[r0
[2]]);
3936 *ptr
^= (0xc0 & OffPixels
[r0
[2]]);
3938 if ((r0
[1] & 63) > dither
[x
& 7])
3939 *ptr
^= (0x30 & OnPixels
[r0
[1]]);
3941 *ptr
^= (0x30 & OffPixels
[r0
[1]]);
3943 if ((r0
[0] & 63) > dither
[x
& 7])
3944 *ptr
^= (0x0c & OnPixels
[r0
[0]]);
3946 *ptr
^= (0x0c & OffPixels
[r0
[0]]);
3948 if ((r0
[3] & 63) > dither
[x
& 7])
3949 *ptr
++ ^= (0x03 & OnPixels
[r0
[3]]);
3951 *ptr
++ ^= (0x03 & OffPixels
[r0
[3]]);
3956 dither
= Floyd4x4
[y
& 3];
3958 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
3960 if ((r0
[2] & 15) > dither
[x
& 3])
3961 *ptr
^= (0xf0 & OnPixels
[r0
[2]]);
3963 *ptr
^= (0xf0 & OffPixels
[r0
[2]]);
3965 if ((r0
[1] & 15) > dither
[x
& 3])
3966 *ptr
++ ^= (0x0f & OnPixels
[r0
[1]]);
3968 *ptr
++ ^= (0x0f & OffPixels
[r0
[1]]);
3970 if ((r0
[0] & 15) > dither
[x
& 3])
3971 *ptr
^= (0xf0 & OnPixels
[r0
[0]]);
3973 *ptr
^= (0xf0 & OffPixels
[r0
[0]]);
3975 if ((r0
[3] & 15) > dither
[x
& 3])
3976 *ptr
++ ^= (0x0f & OnPixels
[r0
[3]]);
3978 *ptr
++ ^= (0x0f & OffPixels
[r0
[3]]);
3983 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
3988 *ptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
3993 *ptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
3998 *ptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
4003 *ptr
++ = (r0
[3] * yerr0
+ r1
[3] * yerr1
) / ysize
;
4009 case CUPS_ORDER_BANDED
:
4011 mptr
= ptr
+ bandwidth
;
4012 cptr
= ptr
+ 2 * bandwidth
;
4013 kptr
= ptr
+ 3 * bandwidth
;
4015 switch (header
->cupsBitsPerColor
)
4018 bitmask
= 0x80 >> (bitoffset
& 7);
4019 dither
= Floyd16x16
[y
& 15];
4021 for (x
= xsize
; x
> 0; x
--)
4023 pc
= *r0
++ > dither
[x
& 15];
4024 pm
= *r0
++ > dither
[x
& 15];
4025 py
= *r0
++ > dither
[x
& 15];
4054 bitmask
= 0xc0 >> (bitoffset
& 7);
4055 dither
= Floyd8x8
[y
& 7];
4057 for (x
= xsize
; x
> 0; x
--)
4059 if ((*r0
& 63) > dither
[x
& 7])
4060 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
4062 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
4064 if ((*r0
& 63) > dither
[x
& 7])
4065 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
4067 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
4069 if ((*r0
& 63) > dither
[x
& 7])
4070 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
4072 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
4074 if ((*r0
& 63) > dither
[x
& 7])
4075 *kptr
^= (bitmask
& OnPixels
[*r0
++]);
4077 *kptr
^= (bitmask
& OffPixels
[*r0
++]);
4094 bitmask
= 0xf0 >> (bitoffset
& 7);
4095 dither
= Floyd4x4
[y
& 3];
4097 for (x
= xsize
; x
> 0; x
--)
4099 if ((*r0
& 15) > dither
[x
& 3])
4100 *cptr
^= (bitmask
& OnPixels
[*r0
++]);
4102 *cptr
^= (bitmask
& OffPixels
[*r0
++]);
4104 if ((*r0
& 15) > dither
[x
& 3])
4105 *mptr
^= (bitmask
& OnPixels
[*r0
++]);
4107 *mptr
^= (bitmask
& OffPixels
[*r0
++]);
4109 if ((*r0
& 15) > dither
[x
& 3])
4110 *yptr
^= (bitmask
& OnPixels
[*r0
++]);
4112 *yptr
^= (bitmask
& OffPixels
[*r0
++]);
4114 if ((*r0
& 15) > dither
[x
& 3])
4115 *kptr
^= (bitmask
& OnPixels
[*r0
++]);
4117 *kptr
^= (bitmask
& OffPixels
[*r0
++]);
4119 if (bitmask
== 0xf0)
4134 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
4139 *cptr
++ = (r0
[0] * yerr0
+ r1
[0] * yerr1
) / ysize
;
4144 *mptr
++ = (r0
[1] * yerr0
+ r1
[1] * yerr1
) / ysize
;
4149 *yptr
++ = (r0
[2] * yerr0
+ r1
[2] * yerr1
) / ysize
;
4154 *kptr
++ = (r0
[3] * yerr0
+ r1
[3] * yerr1
) / ysize
;
4160 case CUPS_ORDER_PLANAR
:
4161 switch (header
->cupsBitsPerColor
)
4164 bitmask
= 0x80 >> (bitoffset
& 7);
4165 dither
= Floyd16x16
[y
& 15];
4167 for (x
= xsize
; x
> 0; x
--)
4169 pc
= *r0
++ > dither
[x
& 15];
4170 pm
= *r0
++ > dither
[x
& 15];
4171 py
= *r0
++ > dither
[x
& 15];
4173 if ((pc
&& pm
&& py
&& z
== 3) ||
4174 (pc
&& z
== 2) || (pm
&& z
== 1) || (py
&& z
== 0))
4188 bitmask
= 0xc0 >> (bitoffset
& 7);
4189 dither
= Floyd8x8
[y
& 7];
4195 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
4197 if ((*r0
& 63) > dither
[x
& 7])
4198 *ptr
^= (bitmask
& OnPixels
[*r0
]);
4200 *ptr
^= (bitmask
& OffPixels
[*r0
]);
4214 bitmask
= 0xf0 >> (bitoffset
& 7);
4215 dither
= Floyd4x4
[y
& 3];
4221 for (x
= xsize
; x
> 0; x
--, r0
+= 4)
4223 if ((*r0
& 15) > dither
[x
& 3])
4224 *ptr
^= (bitmask
& OnPixels
[*r0
]);
4226 *ptr
^= (bitmask
& OffPixels
[*r0
]);
4228 if (bitmask
== 0xf0)
4251 for (x
= xsize
; x
> 0; x
--, r0
+= 4, r1
+= 4)
4256 *ptr
++ = (*r0
* yerr0
+ *r1
* yerr1
) / ysize
;
4266 * 'make_lut()' - Make a lookup table given gamma and brightness values.
4270 make_lut(cups_ib_t
*lut
, /* I - Lookup table */
4271 int colorspace
, /* I - Colorspace */
4272 float g
, /* I - Image gamma */
4273 float b
) /* I - Image brightness */
4275 int i
; /* Looping var */
4276 int v
; /* Current value */
4282 for (i
= 0; i
< 256; i
++)
4285 v
= 255.0 * b
* (1.0 - pow(1.0 - (float)i
/ 255.0, g
)) + 0.5;
4287 v
= 255.0 * (1.0 - b
* (1.0 - pow((float)i
/ 255.0, g
))) + 0.5;
4300 * 'raster_cb()' - Validate the page header.
4303 static int /* O - 0 if OK, -1 if not */
4305 cups_page_header2_t
*header
, /* IO - Raster header */
4306 int preferred_bits
) /* I - Preferred bits per color */
4309 * Ensure that colorimetric colorspaces use at least 8 bits per
4313 if ((header
->cupsColorSpace
== CUPS_CSPACE_CIEXYZ
||
4314 header
->cupsColorSpace
== CUPS_CSPACE_CIELab
||
4315 header
->cupsColorSpace
>= CUPS_CSPACE_ICC1
) &&
4316 header
->cupsBitsPerColor
< 8)
4317 header
->cupsBitsPerColor
= 8;
4324 * End of "$Id: imagetoraster.c 6578 2007-06-20 17:46:04Z mike $".