2 - cdj850 and cdj1600 were broken, because of terminating *b command
3 (by 'Y' or 'V' instead of 'y' or 'v'); now *b is terminated only
5 - do_gcr replaced whole black component by CMY (so everything was
6 printed using colour ink!); do_gcr with NOBLACK looks strange,
7 like somebody didn't know what he's doing... (see the "XXX" comments);
8 now old, actual DOGCR is used, but NOBLACK can be enabled by -dUseBlack=0
11 Jakub Bogusz <qboosh@pld-linux.org>
12 --- ghostscript-9.04/contrib/gdevcd8.c.orig 2011-08-05 13:12:20.000000000 +0200
13 +++ ghostscript-9.04/contrib/gdevcd8.c 2011-08-15 21:10:22.919653641 +0200
15 StartRasterMode start_raster_mode; /* output function to start raster mode */
16 PrintNonBlankLines print_non_blank_lines; /* output function to print a non blank line */
17 TerminatePage terminate_page; /* page termination output function */
18 + int useblack; /* use K compound */
25 print_non_blank_line,\
30 #define cdj_1600_device(procs, dev_name, x_dpi, y_dpi, bpp, print_page, correction, quality, papertype, intensities,ptype,compression,mastergamma,gammavalc,gammavalm,gammavaly,gammavalk,blackcorrect,start_raster_mode,print_non_blank_line,terminate_page)\
34 print_non_blank_line,\
39 /* HP2200 and DNJ500 is a RGB printer */
43 print_non_blank_line,\
48 #define cmyk_colour_procs(proc_colour_open, proc_get_params, proc_put_params, \
51 (code = param_write_int(plist, "Quality", &cdj850->quality)) < 0 ||
52 (code = param_write_int(plist, "Papertype", &cdj850->papertype)) < 0 ||
53 + (code = param_write_int(plist, "UseBlack", &cdj850->useblack)) < 0 ||
54 (code = param_write_float(plist, "MasterGamma", &cdj850->gammavalc))
56 (code = param_write_float(plist, "GammaValC", &cdj850->gammavalc)) <
59 int quality = cdj850->quality;
60 int papertype = cdj850->papertype;
61 + int useblack = cdj850->useblack;
62 float mastergamma = cdj850->mastergamma;
63 float gammavalc = cdj850->gammavalc;
64 float gammavalm = cdj850->gammavalm;
66 code = cdj_put_param_int(plist, "BitsPerPixel", &bpp, 1, 32, code);
67 code = cdj_put_param_int(plist, "Quality", &quality, 0, 2, code);
68 code = cdj_put_param_int(plist, "Papertype", &papertype, 0, 4, code);
69 + code = cdj_put_param_int(plist, "UseBlack", &useblack, 0, 1, code);
70 code = cdj_put_param_float(plist, "MasterGamma", &mastergamma, 0.1, 9.0, code);
71 code = cdj_put_param_float(plist, "GammaValC", &gammavalc, 0.0, 9.0, code);
72 code = cdj_put_param_float(plist, "GammaValM", &gammavalm, 0.0, 9.0, code);
75 cdj850->quality = quality;
76 cdj850->papertype = papertype;
77 + cdj850->useblack = useblack;
78 cdj850->mastergamma = mastergamma;
79 cdj850->gammavalc = gammavalc;
80 cdj850->gammavalm = gammavalm;
81 @@ -1155,7 +1160,13 @@
82 gx_device_printer * pdev,
83 struct error_val_field *error_values);
85 - do_gcr(int bytecount, byte * inbyte, const byte * kvalues,
86 + do_gcr_noblack(int bytecount, byte * inbyte, const byte * kvalues,
87 + const byte * cvalues, const byte * mvalues,
88 + const byte * yvalues, const int *kcorrect,
92 + do_gcr_gcr(int bytecount, byte * inbyte, const byte * kvalues,
93 const byte * cvalues, const byte * mvalues,
94 const byte * yvalues, const int *kcorrect,
96 @@ -2018,7 +2029,10 @@
98 /* Skip blank lines if any */
99 if (num_blank_lines > 0) {
100 + if(cdj850->ptype == DJ880C)
101 fprintf(prn_stream, "\033*b%dY", num_blank_lines / (cdj850->yscal + 1));
102 + else /* still in *b if not dj880 */
103 + fprintf(prn_stream, "%dy", num_blank_lines / (cdj850->yscal + 1));
104 memset(data_ptrs->plane_data[0][0], 0,
105 (misc_vars->plane_size * 2 * misc_vars->num_comps));
106 memset(data_ptrs->plane_data_c[0][0], 0,
107 @@ -2028,7 +2042,10 @@
108 /* all blank lines printed, now for the non-blank lines */
109 if (cdj850->yscal && odd(lnum)) {
110 /* output a blank black plane for odd lines */
111 + if(cdj850->ptype == DJ880C)
112 fprintf(prn_stream, "\033*b0V");
113 + else /* still in *b if not dj880 */
114 + putc('v', prn_stream);
116 /* now output all non blank lines */
117 while (lnum < lend && llen != 0) {
118 @@ -2054,9 +2071,11 @@
119 int out_count = gdev_pcl_mode9compress(plane_size, curr, prev, out_data);
121 /* and output the data */
122 - fprintf(prn_stream, "%d%c", out_count, plane_code);
124 + fprintf(prn_stream, "%d%c", out_count, plane_code);
125 fwrite(out_data, sizeof(byte), out_count, prn_stream);
126 + } else { /* single plane_code is sufficient for cdj850 */
127 + putc(plane_code, prn_stream);
131 @@ -2113,15 +2132,22 @@
132 byte *dp = data_ptrs->data[misc_vars->scan + 2];
133 int *ep = data_ptrs->errors[misc_vars->scan];
135 - /* we need cmyk color separation befor all the rest, since
136 + /* we need cmyk color separation before all the rest, since
137 black may be contained in the color fields. This needs to
138 be done on all pixel-rows, since even unused color-bytes
139 might generate black */
141 + if(cdj850->useblack) {
142 misc_vars->is_color_data =
143 - do_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
144 + do_gcr_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
145 gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
146 (word *) data_ptrs->data[misc_vars->scan]);
148 + misc_vars->is_color_data =
149 + do_gcr_noblack(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
150 + gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
151 + (word *) data_ptrs->data[misc_vars->scan]);
154 /* dithering the black-plane */
155 FSDlinebw(misc_vars->scan, misc_vars->plane_size,
156 @@ -2191,15 +2217,22 @@
157 byte *dp = data_ptrs->data[misc_vars->scan + 2];
158 int *ep = data_ptrs->errors[misc_vars->scan];
160 - /* we need cmyk color separation befor all the rest, since
161 + /* we need cmyk color separation before all the rest, since
162 black may be contained in the color fields. This needs to
163 be done on all pixel-rows, since even unused color-bytes
164 might generate black */
166 + if(cdj850->useblack) {
167 + misc_vars->is_color_data =
168 + do_gcr_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
169 + gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
170 + (word *) data_ptrs->data[misc_vars->scan]);
172 misc_vars->is_color_data =
173 - do_gcr(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
174 + do_gcr_noblack(misc_vars->databuff_size, data_ptrs->data[misc_vars->scan],
175 gamma->k, gamma->c, gamma->m, gamma->y, gamma->correct,
176 (word *) data_ptrs->data[misc_vars->scan]);
179 /* dithering the black-plane */
180 FSDlinebw(misc_vars->scan, misc_vars->plane_size,
181 @@ -2408,7 +2441,7 @@
182 do real color separation, here we try a real grey component
185 -do_gcr(int bytecount, byte * inbyte, const byte kvalues[256],
186 +do_gcr_noblack(int bytecount, byte * inbyte, const byte kvalues[256],
187 const byte cvalues[256], const byte mvalues[256],
188 const byte yvalues[256], const int kcorrect[256],
190 @@ -2449,11 +2482,12 @@
191 /* Test whether we 've already computet the value */
192 if (*inword == last_color_value) {
193 /* save a copy of the current color before it will be modified */
194 - last_color_value = *inword;
195 + last_color_value = *inword; /* NOP --q */
196 /* debug_print_string("\n", 1);*/
197 /* copy the result of the old value onto the new position */
198 *inword = *last_color;
200 + /* ??? ALL these NOBLACKs will be NOPs after the first NOBLACK! what are they for??? --q */
201 /* save a copy of the current color before it will be modified */
202 last_color_value = *inword;
203 NOBLACK(cyan, magenta, yellow, black);
204 @@ -2490,6 +2524,7 @@
205 debug_print_string(output, strlen(output));
208 + /* XXX: how byte could be >255??? --q */
209 if ( *cyan > 255) *cyan = 255;
210 if (*magenta > 255) *magenta = 255;
211 if ( *yellow > 255) *yellow = 255;
212 @@ -2497,6 +2532,95 @@
213 *cyan = *(cvalues + *cyan);
214 *magenta = *(mvalues + *magenta);
215 *yellow = *(yvalues + *yellow);
216 + last_color = inword; /* save pointer */
217 + }/* end current_color */
218 + } /* end of if c+m+y > 0 */
219 + *black = *(kvalues + *black);
220 + inword = inword + 1;
221 + } /* end of for bytecount */
226 +do_gcr_gcr(int bytecount, byte * inbyte, const byte kvalues[256],
227 + const byte cvalues[256], const byte mvalues[256],
228 + const byte yvalues[256], const int kcorrect[256],
231 + int i, ucr, kadd, is_color = 0;
233 + byte *black, *cyan, *magenta, *yellow;
234 + word last_color_value = 0;
236 + char output[255], out2[128];
238 + /* initialise *last_color with a dummmy value */
239 + last_color = &last_color_value;
240 + /* Grey component replacement */
241 + for (i = 0; i < bytecount; i += 4) {
243 + /* Assign to black the current address of inbyte */
246 + magenta = inbyte++;
249 + if (*magenta + *yellow + *cyan > 0) { /* if any color at all */
252 + if ((*cyan > 0) && (*magenta > 0) && (*yellow > 0))
254 + sprintf(output, "%3d %3d %3d %3d - ", *cyan, *magenta, *yellow, *black);
255 + debug_print_string(output, strlen(output));
261 + /* Test whether we've already computed the value */
262 + if (*inword == last_color_value) {
263 +/* debug_print_string("\n", 1);*/
264 + /* copy the result of the old value onto the new position */
265 + *inword = *last_color;
267 + /* save a copy of the current color before it will be modified */
268 + last_color_value = *inword;
269 + if ((*cyan >= *magenta)
270 + && (*magenta >= *yellow)
271 + && (*yellow > 0)) { /* if any grey component */
272 + DOGCR(cyan, magenta, yellow, black);
273 + } else if ((*cyan >= *yellow)
274 + && (*yellow >= *magenta)
275 + && (*magenta > 0)) {
276 + DOGCR(cyan, yellow, magenta, black);
277 + } else if ((*yellow >= *magenta)
278 + && (*magenta >= *cyan)
280 + DOGCR(yellow, magenta, cyan, black);
281 + } else if ((*yellow >= *cyan)
282 + && (*cyan >= *magenta)
283 + && (*magenta > 0)) {
284 + DOGCR(yellow, cyan, magenta, black);
285 + } else if ((*magenta >= *yellow)
286 + && (*yellow >= *cyan)
288 + DOGCR(magenta, yellow, cyan, black);
289 + } else if ((*magenta >= *cyan)
290 + && (*cyan >= *yellow)
291 + && (*yellow > 0)) {
292 + DOGCR(magenta, cyan, yellow, black);
293 + } else { /* do gamma only if no black */
298 + sprintf(output, "%3d %3d %3d %3d - %5d\n", *cyan, *magenta, *yellow, *black, ucr);
299 + debug_print_string(output, strlen(output));
302 + *cyan = *(cvalues + *cyan);
303 + *magenta = *(mvalues + *magenta);
304 + *yellow = *(yvalues + *yellow);
305 last_color = inword; /* save pointer */
306 }/* end current_color */
307 } /* end of if c+m+y > 0 */