130
129
The devices are "photoex" and "photoexm". The mono device driver is
131
130
catered for (that is, the rendering part knows how to render for B&W)
132
131
but it is not finished yet (no device structure and gray colour mapping
133
procedures) mainly because all my B&W needs are fairly well satisfied
132
procedures) mainly because all my B&W needs are fairly well satisfied
134
133
by our laser printer.
136
135
The driver features the following:
138
137
Supported resolutions
140
360x360 Y weaving (not that micro :-) by the printer
141
720x720 Y microweave by the driver (quicker than the printer)
142
1440x720 Y and X microweave by the driver
144
Resolutions other than these will result in a rangecheck error.
139
360x360 Y weaving (not that micro :-) by the printer
140
720x720 Y microweave by the driver (quicker than the printer)
141
1440x720 Y and X microweave by the driver
143
Resolutions other than these will result in a rangecheck error.
148
Whatever Ghostscript supports. The printer docs say that if you load
149
multiple sheets of transparencies into the tray you should at least
150
have 30mm or 1.2" top margin. The driver always sets the smallest
151
possible top margin (3mm or 0.12"), it's up to you to comply.
153
In addition, the printer says that the bottom margin is at least
154
14mm or 0.54". I violate it by setting it to 0.5" or 12.7mm.
155
0.5" seems to be a common margin value for documents and you
156
would hate it when the last line of your page gets printed on the
157
top of the next sheet ...
147
Whatever Ghostscript supports. The printer docs say that if you load
148
multiple sheets of transparencies into the tray you should at least
149
have 30mm or 1.2" top margin. The driver always sets the smallest
150
possible top margin (3mm or 0.12"), it's up to you to comply.
152
In addition, the printer says that the bottom margin is at least
153
14mm or 0.54". I violate it by setting it to 0.5" or 12.7mm.
154
0.5" seems to be a common margin value for documents and you
155
would hate it when the last line of your page gets printed on the
156
top of the next sheet ...
163
n = 0 Let the driver choose a dotsize
167
n = 4 'super microdots' (whatever they are, they are *big*)
169
The default is 0 which is n=1 for 1440x720, 2 for 720x720 and
170
3 for 360x360. Do not use large dots if you don't have to, you
171
will soak the paper. If you print 720x720 on normal paper, try
176
n = 0 Floyd-Steinbeck error diffusion
177
n = 1 Clustered dither
178
n = 2 Bendor's error diffusion (experimental, do not use)
180
Default is Floyd-Steinbeck error diffusion
184
nn is between 0 and 25. It only effects Bendor's error diffusion.
185
It sets the percentage of the error which is left to 'leak', that
186
is it is the coefficient of an exponential decay of the error.
187
Experiments show that it can be beneficial on image quality.
188
Default is 0 (no leakage).
192
nn is between 0 and 100. It only affects Bendor's error diffusion.
193
The ED routine tries to take the increase of dot diameter on certain
194
paper types into account.
195
It sets the percentage of the ink dot size increase as it splashes
196
onto the paper and spreads. 0 means no splashing, 100 means that
197
the dot is twice as large as it should be.
202
If n is 1, then if black ink is deposited to a pixel, it will
203
inhibit the deposition of any other ink to the same pixel.
204
If 0, black ink may be deposited together with other inks.
162
n = 0 Let the driver choose a dotsize
166
n = 4 'super microdots' (whatever they are, they are *big*)
168
The default is 0 which is n=1 for 1440x720, 2 for 720x720 and
169
3 for 360x360. Do not use large dots if you don't have to, you
170
will soak the paper. If you print 720x720 on normal paper, try
175
n = 0 Floyd-Steinbeck error diffusion
176
n = 1 Clustered dither
177
n = 2 Bendor's error diffusion (experimental, do not use)
179
Default is Floyd-Steinbeck error diffusion
183
nn is between 0 and 25. It only effects Bendor's error diffusion.
184
It sets the percentage of the error which is left to 'leak', that
185
is it is the coefficient of an exponential decay of the error.
186
Experiments show that it can be beneficial on image quality.
187
Default is 0 (no leakage).
191
nn is between 0 and 100. It only affects Bendor's error diffusion.
192
The ED routine tries to take the increase of dot diameter on certain
193
paper types into account.
194
It sets the percentage of the ink dot size increase as it splashes
195
onto the paper and spreads. 0 means no splashing, 100 means that
196
the dot is twice as large as it should be.
201
If n is 1, then if black ink is deposited to a pixel, it will
202
inhibit the deposition of any other ink to the same pixel.
203
If 0, black ink may be deposited together with other inks.
207
206
ESC/P RASTER DOCS
208
207
~~~~~~~~~~~~~~~~~
209
The parts of the ESC/P Raster protocol which I've managed to decipher,
208
The parts of the ESC/P Raster protocol which I've managed to decipher,
210
209
and which are actually used in this driver can be found below.
211
210
nn, mm, xx, etc. represent a single byte with a binary value in it.
212
211
nnnn, xxxx etc. represent a 16-bit binary number, sent in two bytes,
213
in little endian order (low byte first). 2-digit numbers are a single
212
in little endian order (low byte first). 2-digit numbers are a single
214
213
byte in hex. Other chars are themselves.
215
Quite a few commands are identical to the ESC/P2 commands, these are
214
Quite a few commands are identical to the ESC/P2 commands, these are
216
215
marked with (P2).
223
221
ESC ( U 01 00 nn (P2)
225
Sets the unit to 3600/nn dpi. Note that 1440 can not be set !
223
Sets the unit to 3600/nn dpi. Note that 1440 can not be set !
228
225
ESC ( C 02 00 nnnn (P2)
230
Sets the page (paper) length to nnnn units
227
Sets the page (paper) length to nnnn units
233
229
ESC ( c 04 00 bbbb tttt (P2)
235
Sets the top margin to tttt units, the bottom margin to
236
bbbb units. The bottom margin is measured from the top
237
of the page not from the bottom of the page !
231
Sets the top margin to tttt units, the bottom margin to
232
bbbb units. The bottom margin is measured from the top
233
of the page not from the bottom of the page !
242
Unidirectional printing
247
30 off (this is ASCII 0)
248
31 on (this is ASCII 1)
237
Unidirectional printing
242
30 off (this is ASCII 0)
243
31 on (this is ASCII 1)
251
245
ESC ( i 01 00 nn (P2)
258
30 off (this is ASCII 0)
259
31 on (this is ASCII 1)
261
Turns microweave on for 720x720 dpi printing.
252
30 off (this is ASCII 0)
253
31 on (this is ASCII 1)
255
Turns microweave on for 720x720 dpi printing.
274
267
ESC ( G 01 00 nn (P2)
276
Selects graphics mode:
269
Selects graphics mode:
285
277
ESC ( v 02 00 dddd (P2)
287
Advance the paper by dddd units defined by ESC ( U
279
Advance the paper by dddd units defined by ESC ( U
290
281
ESC . cc vv hh nn mmmm <data> (P2)
292
Sends graphics data to the printer.
297
01 Run-length encoded data
299
vv Vertical resolution
301
28 90 dpi *interleave*
302
14 180 dpi *interleave*
306
hh Horizontal resolution
313
It should be set to 32 (normal printing) or 1 (microweave)
315
mmmm Number of collumns of data (not number of data bytes !)
319
The data should contain as many bytes as needed to fill the
320
mmmm * nn pixels. Data is presented horizontally, that is,
321
the bits of a byte will be represented by eight pixels in
322
a row. If the number of collumns is not an integer multiple
323
of eight, then some bits from the last byte belonging to the
324
row will be discarded and the next row starts on a byte boundary.
325
If a bit in a byte is '1' ink is deposited, if '0' not.
326
The leftmost pixel is represented by the MSB, rightmost by LSB.
327
In case of raw data that's about it.
329
In case of run-length encoded data, the following is done:
330
The first byte is a counter. If the counter is <= 127 then
331
the following counter+1 bytes are uncompressed data.
332
If the counter is >= 128 then the following single byte should
333
be repeated 257-counter times.
335
There are resolution restrictions:
337
360x360 nozzle= 1 microweave on
338
360x360 nozzle=32 microweave off
339
720x 90 nozzle=32 microweave off
340
720x720 nozzle= 1 microweave on
342
Other combinations are not supported.
283
Sends graphics data to the printer.
288
01 Run-length encoded data
290
vv Vertical resolution
292
28 90 dpi *interleave*
293
14 180 dpi *interleave*
297
hh Horizontal resolution
304
It should be set to 32 (normal printing) or 1 (microweave)
306
mmmm Number of collumns of data (not number of data bytes !)
310
The data should contain as many bytes as needed to fill the
311
mmmm * nn pixels. Data is presented horizontally, that is,
312
the bits of a byte will be represented by eight pixels in
313
a row. If the number of collumns is not an integer multiple
314
of eight, then some bits from the last byte belonging to the
315
row will be discarded and the next row starts on a byte boundary.
316
If a bit in a byte is '1' ink is deposited, if '0' not.
317
The leftmost pixel is represented by the MSB, rightmost by LSB.
318
In case of raw data that's about it.
320
In case of run-length encoded data, the following is done:
321
The first byte is a counter. If the counter is <= 127 then
322
the following counter+1 bytes are uncompressed data.
323
If the counter is >= 128 then the following single byte should
324
be repeated 257-counter times.
326
There are resolution restrictions:
328
360x360 nozzle= 1 microweave on
329
360x360 nozzle=32 microweave off
330
720x 90 nozzle=32 microweave off
331
720x720 nozzle= 1 microweave on
333
Other combinations are not supported.
344
335
ESC ( e 02 00 00 nn
346
Sets the amount of ink spat onto the paper.
349
01 microdots (faint printing)
350
02 normal dots (not so faint printing)
351
03 double dots (full inking)
352
04 super microdots (ink is continuously dripping :-)
354
Values other than that have apparently no effect.
337
Sets the amount of ink spat onto the paper.
340
01 microdots (faint printing)
341
02 normal dots (not so faint printing)
342
03 double dots (full inking)
343
04 super microdots (ink is continuously dripping :-)
345
Values other than that have apparently no effect.
356
347
ESC ( K 02 00 xxxx
358
This command is sent by the Windows driver but it is not used
359
in the Epson test images. I have not found it having any effect
360
whatsoever. The driver does not use it. The Epson docs don't
365
Selects the ink according to this:
349
This command is sent by the Windows driver but it is not used
350
in the Epson test images. I have not found it having any effect
351
whatsoever. The driver does not use it. The Epson docs don't
356
Selects the ink according to this:
376
366
ESC ( \ 04 00 xxxx llll
378
Horizontal positioning of the head.
380
Moves the head to the position llll times 1/xxxx inches from
382
On the example images xxxx was always set to 1440.
383
I tried other values in which case the command was ignored,
387
ESC ( R ll 00 00 <text> <cc> xxxx nn .. nn
368
Horizontal positioning of the head.
370
Moves the head to the position llll times 1/xxxx inches from
372
On the example images xxxx was always set to 1440.
373
I tried other values in which case the command was ignored,
376
ESC ( R ll 00 00 <text> <cc> xxxx nn .. nn
390
This is supposedly sets the printer into 'remote' mode.
391
ll is the length of the <text> + 1 which consists of ASCII
392
characters (e.g. REMOTE1).
393
<cc> is a two-character code, for example "SN" or "LD".
394
xxxx is the number of bytes (nn -s) which will follow.
395
After that there's either a new <cc> xxxx nn .. nn sequence or
397
I have absolutely no idea about this command and the Epson document
398
says that it's in an other document. It's not in that other one.
399
The driver does not use it. The printer does not miss it.
400
The Epson test images use it and the Windows driver uses it too.
401
They send different <cc>-s and different values for identical <cc>-s.
379
This is supposedly sets the printer into 'remote' mode.
380
ll is the length of the <text> + 1 which consists of ASCII
381
characters (e.g. REMOTE1).
382
<cc> is a two-character code, for example "SN" or "LD".
383
xxxx is the number of bytes (nn -s) which will follow.
384
After that there's either a new <cc> xxxx nn .. nn sequence or
386
I have absolutely no idea about this command and the Epson document
387
says that it's in an other document. It's not in that other one.
388
The driver does not use it. The printer does not miss it.
389
The Epson test images use it and the Windows driver uses it too.
390
They send different <cc>-s and different values for identical <cc>-s.
406
395
First, some comments.
407
Anything I know about the printer can be found above.
408
Anything I know about Ghostscript internals (not much) can be
409
found in the comments in the code. I do not believe in the 'it was hard
410
to write, it should be hard to read' principle since I once had to
396
Anything I know about the printer can be found above.
397
Anything I know about Ghostscript internals (not much) can be
398
found in the comments in the code. I do not believe in the 'it was hard
399
to write, it should be hard to read' principle since I once had to
411
400
understand my own code.
412
401
Therefore, the code has lots of comments in it, sometimes apparently
413
superfluous but I find it easier to understand the program 6 months
402
superfluous but I find it easier to understand the program 6 months
415
404
I did not follow the Ghostscript or GNU style guide, I write code the way
416
405
I like it - I'm a lazy dog :-) I use hard tabs at every 4th position,
417
406
I use a *lot* of whitespace (as recommended by K&R in their original
418
C book) and I have a formatting style similar to the K&R with the
419
notable exception that I do not indent variable declarations that follow
420
the curly. Anyway, you can run your favourite C formatter through the
407
C book) and I have a formatting style similar to the K&R with the
408
notable exception that I do not indent variable declarations that follow
409
the curly. Anyway, you can run your favourite C formatter through the
423
In addition to the above, the driver is not hand-optimised, it assumes
412
In addition to the above, the driver is not hand-optimised, it assumes
424
413
that it is compiled with a good optimising compiler which will handle
425
414
common subexpression ellimination, move loop independent code out of
426
415
the loop, transform repeated array accesses to cached pointer arithmetics
427
and so on. The code is much more readable this way and gcc is fairly
416
and so on. The code is much more readable this way and gcc is fairly
428
417
good at doing optimisation. Feel free to hand-optimise it.
430
419
So, the driver works the following way:
1036
1024
gx_photoex_device far_data gs_photoex_device = {
1038
/* This is a macro that fills GS specific fields in the struct */
1042
gx_photoex_device, /* Device struct type */
1043
photoex_device_procs, /* Procedure table */
1044
"photoex", /* Name of the device */
1045
DEFAULT_WIDTH_10THS, /* Default width */
1046
DEFAULT_HEIGHT_10THS, /* Default height */
1047
X_DPI, /* Vertical resolution */
1048
Y_DPI, /* Horizontal resolution */
1049
MARGIN_L, /* Left margin */
1050
MARGIN_B, /* Bottom margin */
1051
MARGIN_R, /* Right margin */
1052
MARGIN_T, /* Top margin */
1053
ICOLN, /* Number of colours (4:CMYK) */
1054
32, /* Bit per pixel for the device(!) */
1055
255, /* Max. gray level */
1056
255, /* Max. colour level */
1057
256, /* Number of gray gradations */
1058
256, /* Number of colour gradations */
1059
photoex_print_page /* Print page procedure */
1062
/* Here come our extensions */
1064
0, /* Shingling off, not implemented */
1065
0, /* Depletion off, not implemented */
1066
0, /* Dither type: FS ED */
1067
0, /* No splash correction */
1069
0, /* Not monochrome */
1070
1, /* Colour inhibition on black */
1071
127, /* Mid level cyan */
1072
127, /* Mid level magenta */
1073
0 /* Automatic dot size setting */
1026
/* This is a macro that fills GS specific fields in the struct */
1030
gx_photoex_device, /* Device struct type */
1031
photoex_device_procs, /* Procedure table */
1032
"photoex", /* Name of the device */
1033
DEFAULT_WIDTH_10THS, /* Default width */
1034
DEFAULT_HEIGHT_10THS, /* Default height */
1035
X_DPI, /* Vertical resolution */
1036
Y_DPI, /* Horizontal resolution */
1037
MARGIN_L, /* Left margin */
1038
MARGIN_B, /* Bottom margin */
1039
MARGIN_R, /* Right margin */
1040
MARGIN_T, /* Top margin */
1041
ICOLN, /* Number of colours (4:CMYK) */
1042
32, /* Bit per pixel for the device(!) */
1043
255, /* Max. gray level */
1044
255, /* Max. colour level */
1045
256, /* Number of gray gradations */
1046
256, /* Number of colour gradations */
1047
photoex_print_page /* Print page procedure */
1050
/* Here come our extensions */
1052
0, /* Shingling off, not implemented */
1053
0, /* Depletion off, not implemented */
1054
0, /* Dither type: FS ED */
1055
0, /* No splash correction */
1057
0, /* Not monochrome */
1058
1, /* Colour inhibition on black */
1059
127, /* Mid level cyan */
1060
127, /* Mid level magenta */
1061
0 /* Automatic dot size setting */
1077
* This table contains the line scheduling table for the first
1065
* This table contains the line scheduling table for the first
1078
1066
* few runs if we are in 720 dpi mode.
1081
1069
static const int start_720[ HEAD_SPACING ][ NOZZLES ] = {
1083
{ 0, 8, 16, 24, 32, 40, 48, 56,
1084
64, 72, 80, 88, 96, 104, 112, 120,
1085
128, 136, 144, 152, 160, 168, 176, 184,
1086
192, 200, 208, 216, 224, 232, 240, 248 },
1088
{ 1, 9, 17, 25, 33, 41, 49, 57,
1089
65, 73, 81, 89, 97, 105, 113, 121,
1090
129, 137, 145, 153, 161, 169, 177, 185,
1091
193, 201, 209, -1, -1, -1, -1, -1 },
1093
{ 2, 10, 18, 26, 34, 42, 50, 58,
1094
66, 74, 82, 90, 98, 106, 114, 122,
1095
130, 138, 146, 154, 162, 170, 178, -1,
1096
-1, -1, -1, -1, -1, -1, -1, -1 },
1098
{ 3, 11, 19, 27, 35, 43, 51, 59,
1099
67, 75, 83, 91, 99, 107, 115, 123,
1100
131, 139, 147, -1, -1, -1, -1, -1,
1101
-1, -1, -1, -1, -1, -1, -1, -1 },
1103
{ 4, 12, 20, 28, 36, 44, 52, 60,
1104
68, 76, 84, 92, 100, 108, 116, -1,
1105
-1, -1, -1, -1, -1, -1, -1, -1,
1106
-1, -1, -1, -1, -1, -1, -1, -1 },
1108
{ 5, 13, 21, 29, 37, 45, 53, 61,
1109
69, 77, 85, -1, -1, -1, -1, -1,
1110
-1, -1, -1, -1, -1, -1, -1, -1,
1111
-1, -1, -1, -1, -1, -1, -1, -1 },
1113
{ 6, 14, 22, 30, 38, 46, 54, -1,
1114
-1, -1, -1, -1, -1, -1, -1, -1,
1115
-1, -1, -1, -1, -1, -1, -1, -1,
1116
-1, -1, -1, -1, -1, -1, -1, -1 },
1118
{ 7, 15, 23, -1, -1, -1, -1, -1,
1119
-1, -1, -1, -1, -1, -1, -1, -1,
1120
-1, -1, -1, -1, -1, -1, -1, -1,
1121
-1, -1, -1, -1, -1, -1, -1, -1 }
1071
{ 0, 8, 16, 24, 32, 40, 48, 56,
1072
64, 72, 80, 88, 96, 104, 112, 120,
1073
128, 136, 144, 152, 160, 168, 176, 184,
1074
192, 200, 208, 216, 224, 232, 240, 248 },
1076
{ 1, 9, 17, 25, 33, 41, 49, 57,
1077
65, 73, 81, 89, 97, 105, 113, 121,
1078
129, 137, 145, 153, 161, 169, 177, 185,
1079
193, 201, 209, -1, -1, -1, -1, -1 },
1081
{ 2, 10, 18, 26, 34, 42, 50, 58,
1082
66, 74, 82, 90, 98, 106, 114, 122,
1083
130, 138, 146, 154, 162, 170, 178, -1,
1084
-1, -1, -1, -1, -1, -1, -1, -1 },
1086
{ 3, 11, 19, 27, 35, 43, 51, 59,
1087
67, 75, 83, 91, 99, 107, 115, 123,
1088
131, 139, 147, -1, -1, -1, -1, -1,
1089
-1, -1, -1, -1, -1, -1, -1, -1 },
1091
{ 4, 12, 20, 28, 36, 44, 52, 60,
1092
68, 76, 84, 92, 100, 108, 116, -1,
1093
-1, -1, -1, -1, -1, -1, -1, -1,
1094
-1, -1, -1, -1, -1, -1, -1, -1 },
1096
{ 5, 13, 21, 29, 37, 45, 53, 61,
1097
69, 77, 85, -1, -1, -1, -1, -1,
1098
-1, -1, -1, -1, -1, -1, -1, -1,
1099
-1, -1, -1, -1, -1, -1, -1, -1 },
1101
{ 6, 14, 22, 30, 38, 46, 54, -1,
1102
-1, -1, -1, -1, -1, -1, -1, -1,
1103
-1, -1, -1, -1, -1, -1, -1, -1,
1104
-1, -1, -1, -1, -1, -1, -1, -1 },
1106
{ 7, 15, 23, -1, -1, -1, -1, -1,
1107
-1, -1, -1, -1, -1, -1, -1, -1,
1108
-1, -1, -1, -1, -1, -1, -1, -1,
1109
-1, -1, -1, -1, -1, -1, -1, -1 }
1126
* This table contains the scheduling table for the first
1113
* This table contains the scheduling table for the first
1127
1114
* few lines if we are in 1440 dpi mode
1130
1117
static const int start_1440[ 2 ][ HEAD_SPACING ][ NOZZLES ] = {
1132
{ 0, 8, 16, 24, 32, 40, 48, 56,
1133
64, 72, 80, 88, 96, 104, 112, 120,
1134
128, 136, 144, 152, 160, 168, 176, 184,
1135
192, 200, 208, 216, 224, 232, 240, 248 },
1137
{ 1, 9, 17, 25, 33, 41, 49, 57,
1138
-1, -1, -1, -1, -1, -1, -1, -1,
1139
-1, -1, -1, -1, -1, -1, -1, -1,
1140
-1, -1, -1, -1, -1, -1, -1, -1 },
1142
{ 2, 10, 18, -1, -1, -1, -1, -1,
1143
-1, -1, -1, -1, -1, -1, -1, -1,
1144
-1, -1, -1, -1, -1, -1, -1, -1,
1145
-1, -1, -1, -1, -1, -1, -1, -1 },
1147
{ 3, 11, 19, 27, 35, 43, 51, 59,
1148
67, 75, 83, -1, -1, -1, -1, -1,
1149
-1, -1, -1, -1, -1, -1, -1, -1,
1150
-1, -1, -1, -1, -1, -1, -1, -1 },
1152
{ 4, 12, 20, 28, 36, 44, -1, -1,
1153
-1, -1, -1, -1, -1, -1, -1, -1,
1154
-1, -1, -1, -1, -1, -1, -1, -1,
1155
-1, -1, -1, -1, -1, -1, -1, -1 },
1157
{ 5, -1, -1, -1, -1, -1, -1, -1,
1158
-1, -1, -1, -1, -1, -1, -1, -1,
1159
-1, -1, -1, -1, -1, -1, -1, -1,
1160
-1, -1, -1, -1, -1, -1, -1, -1 },
1162
{ 6, 14, 22, 30, 38, 46, 54, 62,
1163
70, -1, -1, -1, -1, -1, -1, -1,
1164
-1, -1, -1, -1, -1, -1, -1, -1,
1165
-1, -1, -1, -1, -1, -1, -1, -1 },
1167
{ 7, 15, 23, 31, -1, -1, -1, -1,
1168
-1, -1, -1, -1, -1, -1, -1, -1,
1169
-1, -1, -1, -1, -1, -1, -1, -1,
1170
-1, -1, -1, -1, -1, -1, -1, -1 },
1119
{ 0, 8, 16, 24, 32, 40, 48, 56,
1120
64, 72, 80, 88, 96, 104, 112, 120,
1121
128, 136, 144, 152, 160, 168, 176, 184,
1122
192, 200, 208, 216, 224, 232, 240, 248 },
1124
{ 1, 9, 17, 25, 33, 41, 49, 57,
1125
-1, -1, -1, -1, -1, -1, -1, -1,
1126
-1, -1, -1, -1, -1, -1, -1, -1,
1127
-1, -1, -1, -1, -1, -1, -1, -1 },
1129
{ 2, 10, 18, -1, -1, -1, -1, -1,
1130
-1, -1, -1, -1, -1, -1, -1, -1,
1131
-1, -1, -1, -1, -1, -1, -1, -1,
1132
-1, -1, -1, -1, -1, -1, -1, -1 },
1134
{ 3, 11, 19, 27, 35, 43, 51, 59,
1135
67, 75, 83, -1, -1, -1, -1, -1,
1136
-1, -1, -1, -1, -1, -1, -1, -1,
1137
-1, -1, -1, -1, -1, -1, -1, -1 },
1139
{ 4, 12, 20, 28, 36, 44, -1, -1,
1140
-1, -1, -1, -1, -1, -1, -1, -1,
1141
-1, -1, -1, -1, -1, -1, -1, -1,
1142
-1, -1, -1, -1, -1, -1, -1, -1 },
1144
{ 5, -1, -1, -1, -1, -1, -1, -1,
1145
-1, -1, -1, -1, -1, -1, -1, -1,
1146
-1, -1, -1, -1, -1, -1, -1, -1,
1147
-1, -1, -1, -1, -1, -1, -1, -1 },
1149
{ 6, 14, 22, 30, 38, 46, 54, 62,
1150
70, -1, -1, -1, -1, -1, -1, -1,
1151
-1, -1, -1, -1, -1, -1, -1, -1,
1152
-1, -1, -1, -1, -1, -1, -1, -1 },
1154
{ 7, 15, 23, 31, -1, -1, -1, -1,
1155
-1, -1, -1, -1, -1, -1, -1, -1,
1156
-1, -1, -1, -1, -1, -1, -1, -1,
1157
-1, -1, -1, -1, -1, -1, -1, -1 },
1174
{ 0, 8, 16, 24, 32, 40, 48, 56,
1175
64, 72, 80, 88, 96, -1, -1, -1,
1176
-1, -1, -1, -1, -1, -1, -1, -1,
1177
-1, -1, -1, -1, -1, -1, -1, -1 },
1179
{ 1, 9, 17, 25, 33, 41, 49, 57,
1180
65, 73, 81, 89, 97, 105, 113, 121,
1181
129, 137, 145, 153, 161, -1, -1, -1,
1182
-1, -1, -1, -1, -1, -1, -1, -1 },
1184
{ 2, 10, 18, 26, 34, 42, 50, 58,
1185
66, 74, 82, 90, 98, 106, 114, 122,
1186
-1, -1, -1, -1, -1, -1, -1, -1,
1187
-1, -1, -1, -1, -1, -1, -1, -1 },
1189
{ 3, 11, 19, 27, 35, 43, 51, 59,
1190
67, 75, 83, 91, 99, 107, 115, 123,
1191
131, 139, 147, 155, 163, 171, 179, 187,
1192
-1, -1, -1, -1, -1, -1, -1, -1 },
1194
{ 4, 12, 20, 28, 36, 44, 52, 60,
1195
68, 76, 84, 92, 100, 108, 116, 124,
1196
132, 140, 148, -1, -1, -1, -1, -1,
1197
-1, -1, -1, -1, -1, -1, -1, -1 },
1199
{ 5, 13, 21, 29, 37, 45, 53, 61,
1200
69, 77, 85, 93, 101, 109, -1, -1,
1201
-1, -1, -1, -1, -1, -1, -1, -1,
1202
-1, -1, -1, -1, -1, -1, -1, -1 },
1204
{ 6, 14, 22, 30, 38, 46, 54, 62,
1205
70, 78, 86, 94, 102, 110, 118, 126,
1206
134, 142, 150, 158, 166, 174, -1, -1,
1207
-1, -1, -1, -1, -1, -1, -1, -1 },
1209
{ 7, 15, 23, 31, 39, 47, 55, 63,
1210
71, 79, 87, 95, 103, 111, 119, 127,
1211
135, -1, -1, -1, -1, -1, -1, -1,
1212
-1, -1, -1, -1, -1, -1, -1, -1 },
1161
{ 0, 8, 16, 24, 32, 40, 48, 56,
1162
64, 72, 80, 88, 96, -1, -1, -1,
1163
-1, -1, -1, -1, -1, -1, -1, -1,
1164
-1, -1, -1, -1, -1, -1, -1, -1 },
1166
{ 1, 9, 17, 25, 33, 41, 49, 57,
1167
65, 73, 81, 89, 97, 105, 113, 121,
1168
129, 137, 145, 153, 161, -1, -1, -1,
1169
-1, -1, -1, -1, -1, -1, -1, -1 },
1171
{ 2, 10, 18, 26, 34, 42, 50, 58,
1172
66, 74, 82, 90, 98, 106, 114, 122,
1173
-1, -1, -1, -1, -1, -1, -1, -1,
1174
-1, -1, -1, -1, -1, -1, -1, -1 },
1176
{ 3, 11, 19, 27, 35, 43, 51, 59,
1177
67, 75, 83, 91, 99, 107, 115, 123,
1178
131, 139, 147, 155, 163, 171, 179, 187,
1179
-1, -1, -1, -1, -1, -1, -1, -1 },
1181
{ 4, 12, 20, 28, 36, 44, 52, 60,
1182
68, 76, 84, 92, 100, 108, 116, 124,
1183
132, 140, 148, -1, -1, -1, -1, -1,
1184
-1, -1, -1, -1, -1, -1, -1, -1 },
1186
{ 5, 13, 21, 29, 37, 45, 53, 61,
1187
69, 77, 85, 93, 101, 109, -1, -1,
1188
-1, -1, -1, -1, -1, -1, -1, -1,
1189
-1, -1, -1, -1, -1, -1, -1, -1 },
1191
{ 6, 14, 22, 30, 38, 46, 54, 62,
1192
70, 78, 86, 94, 102, 110, 118, 126,
1193
134, 142, 150, 158, 166, 174, -1, -1,
1194
-1, -1, -1, -1, -1, -1, -1, -1 },
1196
{ 7, 15, 23, 31, 39, 47, 55, 63,
1197
71, 79, 87, 95, 103, 111, 119, 127,
1198
135, -1, -1, -1, -1, -1, -1, -1,
1199
-1, -1, -1, -1, -1, -1, -1, -1 },
1222
1209
static byte dmatrix[ DMATRIX_Y ][ DMATRIX_X ] = {
1224
0x0e, 0x8e, 0x2e, 0xae, 0x06, 0x86, 0x26, 0xa6,
1225
0x0c, 0x8c, 0x2c, 0xac, 0x04, 0x84, 0x24, 0xa4
1228
0xce, 0x4e, 0xee, 0x6e, 0xc6, 0x46, 0xe6, 0x66,
1229
0xcc, 0x4c, 0xec, 0x6c, 0xc4, 0x44, 0xe4, 0x64
1232
0x3e, 0xbe, 0x1e, 0x9e, 0x36, 0xb6, 0x16, 0x96,
1233
0x3c, 0xbc, 0x1c, 0x9c, 0x34, 0xb4, 0x14, 0x94
1236
0xfe, 0x7e, 0xde, 0x5e, 0xf6, 0x76, 0xd6, 0x56,
1237
0xfc, 0x7c, 0xdc, 0x5c, 0xf4, 0x74, 0xd4, 0x54
1240
0x01, 0x81, 0x21, 0xa1, 0x09, 0x89, 0x29, 0xa9,
1241
0x03, 0x83, 0x23, 0xa3, 0x0b, 0x8b, 0x2b, 0xab
1244
0xc1, 0x41, 0xe1, 0x61, 0xc9, 0x49, 0xe9, 0x69,
1245
0xc3, 0x43, 0xe3, 0x63, 0xcb, 0x4b, 0xeb, 0x6b
1248
0x31, 0xb1, 0x11, 0x91, 0x39, 0xb9, 0x19, 0x99,
1249
0x33, 0xb3, 0x13, 0x93, 0x3b, 0xbb, 0x1b, 0x9b
1252
0xf1, 0x71, 0xd1, 0x51, 0xf9, 0x79, 0xd9, 0x59,
1253
0xf3, 0x73, 0xd3, 0x53, 0xfb, 0x7b, 0xdb, 0x5b
1256
0x0d, 0x8d, 0x2d, 0xad, 0x05, 0x85, 0x25, 0xa5,
1257
0x0f, 0x8f, 0x2f, 0xaf, 0x07, 0x87, 0x27, 0xa7
1260
0xcd, 0x4d, 0xed, 0x6d, 0xc5, 0x45, 0xe5, 0x65,
1261
0xcf, 0x4f, 0xef, 0x6f, 0xc7, 0x47, 0xe7, 0x67
1264
0x3d, 0xbd, 0x1d, 0x9d, 0x35, 0xb5, 0x15, 0x95,
1265
0x3f, 0xbf, 0x1f, 0x9f, 0x37, 0xb7, 0x17, 0x97
1268
0xfd, 0x7d, 0xdd, 0x5d, 0xf5, 0x75, 0xd5, 0x55,
1269
0xff, 0x7f, 0xdf, 0x5f, 0xf7, 0x77, 0xd7, 0x57
1272
0x02, 0x82, 0x22, 0xa2, 0x0a, 0x8a, 0x2a, 0xaa,
1273
0x01, 0x80, 0x20, 0xa0, 0x08, 0x88, 0x28, 0xa8
1276
0xc2, 0x42, 0xe2, 0x62, 0xca, 0x4a, 0xea, 0x6a,
1277
0xc0, 0x40, 0xe0, 0x60, 0xc8, 0x48, 0xe8, 0x68
1280
0x32, 0xb2, 0x12, 0x92, 0x3a, 0xba, 0x1a, 0x9a,
1281
0x30, 0xb0, 0x10, 0x90, 0x38, 0xb8, 0x18, 0x98
1284
0xf2, 0x72, 0xd2, 0x52, 0xfa, 0x7a, 0xda, 0x5a,
1285
0xf0, 0x70, 0xd0, 0x50, 0xf8, 0x78, 0xd8, 0x58
1211
0x0e, 0x8e, 0x2e, 0xae, 0x06, 0x86, 0x26, 0xa6,
1212
0x0c, 0x8c, 0x2c, 0xac, 0x04, 0x84, 0x24, 0xa4
1215
0xce, 0x4e, 0xee, 0x6e, 0xc6, 0x46, 0xe6, 0x66,
1216
0xcc, 0x4c, 0xec, 0x6c, 0xc4, 0x44, 0xe4, 0x64
1219
0x3e, 0xbe, 0x1e, 0x9e, 0x36, 0xb6, 0x16, 0x96,
1220
0x3c, 0xbc, 0x1c, 0x9c, 0x34, 0xb4, 0x14, 0x94
1223
0xfe, 0x7e, 0xde, 0x5e, 0xf6, 0x76, 0xd6, 0x56,
1224
0xfc, 0x7c, 0xdc, 0x5c, 0xf4, 0x74, 0xd4, 0x54
1227
0x01, 0x81, 0x21, 0xa1, 0x09, 0x89, 0x29, 0xa9,
1228
0x03, 0x83, 0x23, 0xa3, 0x0b, 0x8b, 0x2b, 0xab
1231
0xc1, 0x41, 0xe1, 0x61, 0xc9, 0x49, 0xe9, 0x69,
1232
0xc3, 0x43, 0xe3, 0x63, 0xcb, 0x4b, 0xeb, 0x6b
1235
0x31, 0xb1, 0x11, 0x91, 0x39, 0xb9, 0x19, 0x99,
1236
0x33, 0xb3, 0x13, 0x93, 0x3b, 0xbb, 0x1b, 0x9b
1239
0xf1, 0x71, 0xd1, 0x51, 0xf9, 0x79, 0xd9, 0x59,
1240
0xf3, 0x73, 0xd3, 0x53, 0xfb, 0x7b, 0xdb, 0x5b
1243
0x0d, 0x8d, 0x2d, 0xad, 0x05, 0x85, 0x25, 0xa5,
1244
0x0f, 0x8f, 0x2f, 0xaf, 0x07, 0x87, 0x27, 0xa7
1247
0xcd, 0x4d, 0xed, 0x6d, 0xc5, 0x45, 0xe5, 0x65,
1248
0xcf, 0x4f, 0xef, 0x6f, 0xc7, 0x47, 0xe7, 0x67
1251
0x3d, 0xbd, 0x1d, 0x9d, 0x35, 0xb5, 0x15, 0x95,
1252
0x3f, 0xbf, 0x1f, 0x9f, 0x37, 0xb7, 0x17, 0x97
1255
0xfd, 0x7d, 0xdd, 0x5d, 0xf5, 0x75, 0xd5, 0x55,
1256
0xff, 0x7f, 0xdf, 0x5f, 0xf7, 0x77, 0xd7, 0x57
1259
0x02, 0x82, 0x22, 0xa2, 0x0a, 0x8a, 0x2a, 0xaa,
1260
0x01, 0x80, 0x20, 0xa0, 0x08, 0x88, 0x28, 0xa8
1263
0xc2, 0x42, 0xe2, 0x62, 0xca, 0x4a, 0xea, 0x6a,
1264
0xc0, 0x40, 0xe0, 0x60, 0xc8, 0x48, 0xe8, 0x68
1267
0x32, 0xb2, 0x12, 0x92, 0x3a, 0xba, 0x1a, 0x9a,
1268
0x30, 0xb0, 0x10, 0x90, 0x38, 0xb8, 0x18, 0x98
1271
0xf2, 0x72, 0xd2, 0x52, 0xfa, 0x7a, 0xda, 0x5a,
1272
0xf0, 0x70, 0xd0, 0x50, 0xf8, 0x78, 0xd8, 0x58
2775
2761
short *errs[ MAX_ED_LINES ];
2778
/* Get the rendering function */
2781
htone = htable[ render->dev->halftoner ].htone;
2782
offs = render->mono ? 0 : OFFS_K;
2786
/* Monochrome, do only the black */
2788
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2790
errs[ i ] = render->error[ i ][ OFFS_K ];
2792
hdata.render = render;
2793
hdata.data = data + OFFS_K;
2794
hdata.step = sizeof( byte );
2795
hdata.res = render->res[ OFFS_K ];
2800
(*htone)( &hdata, line );
2804
/* Colour. D black first */
2806
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2808
errs[ i ] = render->error[ i ][ OFFS_K ];
2810
hdata.render = render;
2811
hdata.step = sizeof( long );
2812
hdata.data = data + OFFS_K;
2813
hdata.res = render->res[ OFFS_K ];
2818
(*htone)( &hdata, line );
2820
/* Yellow has no intermediate ink. The already done black
2823
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2825
errs[ i ] = render->error[ i ][ OFFS_Y ];
2827
hdata.render = render;
2828
hdata.step = sizeof( long );
2829
hdata.data = data + OFFS_Y;
2830
hdata.res = render->res[ OFFS_Y ];
2831
hdata.block = dev->pureblack ? render->res[ OFFS_K ] : NULL;
2835
(*htone)( &hdata, line );
2837
/* Cyan and magenta has intermediate colour ink, black may inhibit */
2839
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2841
errs[ i ] = render->error[ i ][ OFFS_C ];
2843
hdata.data = data + OFFS_C;
2844
hdata.res = render->res[ OFFS_C ];
2845
hdata.block = dev->pureblack ? render->res[ OFFS_K ] : NULL;
2846
hdata.mval = dev->midcyan;
2848
(*htone)( &hdata, line );
2850
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2852
errs[ i ] = render->error[ i ][ OFFS_M ];
2854
hdata.data = data + OFFS_M;
2855
hdata.res = render->res[ OFFS_M ];
2856
hdata.block = dev->pureblack ? render->res[ OFFS_K ] : NULL;
2857
hdata.mval = dev->midmagenta;
2859
(*htone)( &hdata, line );
2862
/* Here we have create the raw device format scanlines */
2866
if ( render->xres == 1440 ) {
2868
PackLine( render->res[ OFFS_K ], render->width, 255, 2,
2869
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2871
PackLine( render->res[ OFFS_K ]+1, render->width-1, 255, 2,
2872
render->raw[ 1 ][ DEV_BLACK ]+ line % MAX_MARK );
2876
PackLine( render->res[ OFFS_K ], render->width, 255, 1,
2877
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2882
if ( render->xres == 1440 ) {
2884
PackLine( render->res[ OFFS_K ], render->width, 255, 2,
2885
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2887
PackLine( render->res[ OFFS_K ]+1, render->width-1, 255, 2,
2888
render->raw[ 1 ][ DEV_BLACK ]+ line % MAX_MARK );
2890
PackLine( render->res[ OFFS_C ], render->width, 255, 2,
2891
render->raw[ 0 ][ DEV_CYAN ]+ line % MAX_MARK );
2893
PackLine( render->res[ OFFS_C ]+1, render->width-1, 255, 2,
2894
render->raw[ 1 ][ DEV_CYAN ]+ line % MAX_MARK );
2896
PackLine( render->res[ OFFS_M ], render->width, 255, 2,
2897
render->raw[ 0 ][ DEV_MAGENTA ]+ line % MAX_MARK);
2899
PackLine( render->res[ OFFS_M ]+1, render->width-1, 255, 2,
2900
render->raw[ 1 ][ DEV_MAGENTA ]+ line % MAX_MARK);
2902
PackLine( render->res[ OFFS_Y ], render->width, 255, 2,
2903
render->raw[ 0 ][ DEV_YELLOW ]+ line % MAX_MARK );
2905
PackLine( render->res[ OFFS_Y ]+1, render->width-1, 255, 2,
2906
render->raw[ 1 ][ DEV_YELLOW ]+ line % MAX_MARK );
2908
PackLine( render->res[ OFFS_C ], render->width, dev->midcyan,
2909
2, render->raw[ 0 ][ DEV_LCYAN ]+ line % MAX_MARK );
2911
PackLine( render->res[ OFFS_C ]+1, render->width-1, dev->midcyan,
2912
2, render->raw[ 1 ][ DEV_LCYAN ]+ line % MAX_MARK );
2914
PackLine( render->res[ OFFS_M ], render->width, dev->midmagenta,
2915
2, render->raw[0][ DEV_LMAGENTA ]+ line % MAX_MARK );
2917
PackLine( render->res[ OFFS_M ]+1, render->width-1,dev->midmagenta,
2918
2, render->raw[1][ DEV_LMAGENTA ]+ line % MAX_MARK );
2922
PackLine( render->res[ OFFS_K ], render->width, 255, 1,
2923
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2925
PackLine( render->res[ OFFS_C ], render->width, 255, 1,
2926
render->raw[ 0 ][ DEV_CYAN ]+ line % MAX_MARK );
2928
PackLine( render->res[ OFFS_M ], render->width, 255, 1,
2929
render->raw[ 0 ][ DEV_MAGENTA ]+ line % MAX_MARK);
2931
PackLine( render->res[ OFFS_Y ], render->width, 255, 1,
2932
render->raw[ 0 ][ DEV_YELLOW ]+ line % MAX_MARK );
2934
PackLine( render->res[ OFFS_C ], render->width, dev->midcyan,
2935
1, render->raw[ 0 ][ DEV_LCYAN ]+ line % MAX_MARK );
2937
PackLine( render->res[ OFFS_M ], render->width, dev->midmagenta,
2938
1, render->raw[0][ DEV_LMAGENTA ]+ line % MAX_MARK );
2942
/* Call the halftoner specific end-of-line function */
2944
(*htable[ render->dev->halftoner ].hteol)( render, line );
2764
/* Get the rendering function */
2767
htone = htable[ render->dev->halftoner ].htone;
2768
offs = render->mono ? 0 : OFFS_K;
2772
/* Monochrome, do only the black */
2774
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2776
errs[ i ] = render->error[ i ][ OFFS_K ];
2778
hdata.render = render;
2779
hdata.data = data + OFFS_K;
2780
hdata.step = sizeof( byte );
2781
hdata.res = render->res[ OFFS_K ];
2786
(*htone)( &hdata, line );
2790
/* Colour. D black first */
2792
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2794
errs[ i ] = render->error[ i ][ OFFS_K ];
2796
hdata.render = render;
2797
hdata.step = sizeof( long );
2798
hdata.data = data + OFFS_K;
2799
hdata.res = render->res[ OFFS_K ];
2804
(*htone)( &hdata, line );
2806
/* Yellow has no intermediate ink. The already done black
2809
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2811
errs[ i ] = render->error[ i ][ OFFS_Y ];
2813
hdata.render = render;
2814
hdata.step = sizeof( long );
2815
hdata.data = data + OFFS_Y;
2816
hdata.res = render->res[ OFFS_Y ];
2817
hdata.block = dev->pureblack ? render->res[ OFFS_K ] : NULL;
2821
(*htone)( &hdata, line );
2823
/* Cyan and magenta has intermediate colour ink, black may inhibit */
2825
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2827
errs[ i ] = render->error[ i ][ OFFS_C ];
2829
hdata.data = data + OFFS_C;
2830
hdata.res = render->res[ OFFS_C ];
2831
hdata.block = dev->pureblack ? render->res[ OFFS_K ] : NULL;
2832
hdata.mval = dev->midcyan;
2834
(*htone)( &hdata, line );
2836
for ( i = 0 ; i < MAX_ED_LINES ; i++ )
2838
errs[ i ] = render->error[ i ][ OFFS_M ];
2840
hdata.data = data + OFFS_M;
2841
hdata.res = render->res[ OFFS_M ];
2842
hdata.block = dev->pureblack ? render->res[ OFFS_K ] : NULL;
2843
hdata.mval = dev->midmagenta;
2845
(*htone)( &hdata, line );
2848
/* Here we have create the raw device format scanlines */
2852
if ( render->xres == 1440 ) {
2854
PackLine( render->res[ OFFS_K ], render->width, 255, 2,
2855
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2857
PackLine( render->res[ OFFS_K ]+1, render->width-1, 255, 2,
2858
render->raw[ 1 ][ DEV_BLACK ]+ line % MAX_MARK );
2862
PackLine( render->res[ OFFS_K ], render->width, 255, 1,
2863
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2868
if ( render->xres == 1440 ) {
2870
PackLine( render->res[ OFFS_K ], render->width, 255, 2,
2871
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2873
PackLine( render->res[ OFFS_K ]+1, render->width-1, 255, 2,
2874
render->raw[ 1 ][ DEV_BLACK ]+ line % MAX_MARK );
2876
PackLine( render->res[ OFFS_C ], render->width, 255, 2,
2877
render->raw[ 0 ][ DEV_CYAN ]+ line % MAX_MARK );
2879
PackLine( render->res[ OFFS_C ]+1, render->width-1, 255, 2,
2880
render->raw[ 1 ][ DEV_CYAN ]+ line % MAX_MARK );
2882
PackLine( render->res[ OFFS_M ], render->width, 255, 2,
2883
render->raw[ 0 ][ DEV_MAGENTA ]+ line % MAX_MARK);
2885
PackLine( render->res[ OFFS_M ]+1, render->width-1, 255, 2,
2886
render->raw[ 1 ][ DEV_MAGENTA ]+ line % MAX_MARK);
2888
PackLine( render->res[ OFFS_Y ], render->width, 255, 2,
2889
render->raw[ 0 ][ DEV_YELLOW ]+ line % MAX_MARK );
2891
PackLine( render->res[ OFFS_Y ]+1, render->width-1, 255, 2,
2892
render->raw[ 1 ][ DEV_YELLOW ]+ line % MAX_MARK );
2894
PackLine( render->res[ OFFS_C ], render->width, dev->midcyan,
2895
2, render->raw[ 0 ][ DEV_LCYAN ]+ line % MAX_MARK );
2897
PackLine( render->res[ OFFS_C ]+1, render->width-1, dev->midcyan,
2898
2, render->raw[ 1 ][ DEV_LCYAN ]+ line % MAX_MARK );
2900
PackLine( render->res[ OFFS_M ], render->width, dev->midmagenta,
2901
2, render->raw[0][ DEV_LMAGENTA ]+ line % MAX_MARK );
2903
PackLine( render->res[ OFFS_M ]+1, render->width-1,dev->midmagenta,
2904
2, render->raw[1][ DEV_LMAGENTA ]+ line % MAX_MARK );
2908
PackLine( render->res[ OFFS_K ], render->width, 255, 1,
2909
render->raw[ 0 ][ DEV_BLACK ]+ line % MAX_MARK );
2911
PackLine( render->res[ OFFS_C ], render->width, 255, 1,
2912
render->raw[ 0 ][ DEV_CYAN ]+ line % MAX_MARK );
2914
PackLine( render->res[ OFFS_M ], render->width, 255, 1,
2915
render->raw[ 0 ][ DEV_MAGENTA ]+ line % MAX_MARK);
2917
PackLine( render->res[ OFFS_Y ], render->width, 255, 1,
2918
render->raw[ 0 ][ DEV_YELLOW ]+ line % MAX_MARK );
2920
PackLine( render->res[ OFFS_C ], render->width, dev->midcyan,
2921
1, render->raw[ 0 ][ DEV_LCYAN ]+ line % MAX_MARK );
2923
PackLine( render->res[ OFFS_M ], render->width, dev->midmagenta,
2924
1, render->raw[0][ DEV_LMAGENTA ]+ line % MAX_MARK );
2928
/* Call the halftoner specific end-of-line function */
2930
(*htable[ render->dev->halftoner ].hteol)( render, line );
2947
2933
/****************************************************************************/