115
114
/* Standard DMP device */
116
115
const gx_device_printer far_data gs_appledmp_device =
117
116
prn_device(prn_std_procs, "appledmp",
118
85, /* width_10ths, 8.5" */
119
110, /* height_10ths, 11" */
120
120, 72, /* X_DPI, Y_DPI */
121
0, 0.5, 0.5, 0, /* margins */
117
85, /* width_10ths, 8.5" */
118
110, /* height_10ths, 11" */
119
120, 72, /* X_DPI, Y_DPI */
120
0, 0.5, 0.5, 0, /* margins */
125
123
/* lowrez Imagewriter device */
126
124
const gx_device_printer far_data gs_iwlo_device =
127
125
prn_device(prn_std_procs, "iwlo",
128
85, /* width_10ths, 8.5" */
129
110, /* height_10ths, 11" */
130
160, 72, /* X_DPI, Y_DPI */
131
0, 0.5, 0.5, 0, /* margins */
126
85, /* width_10ths, 8.5" */
127
110, /* height_10ths, 11" */
128
160, 72, /* X_DPI, Y_DPI */
129
0, 0.5, 0.5, 0, /* margins */
135
132
/* hirez Imagewriter device */
136
133
const gx_device_printer far_data gs_iwhi_device =
137
134
prn_device(prn_std_procs, "iwhi",
138
85, /* width_10ths, 8.5" */
139
110, /* height_10ths, 11" */
140
160, 144, /* X_DPI, Y_DPI */
141
0, 0.5, 0.5, 0, /* margins */
135
85, /* width_10ths, 8.5" */
136
110, /* height_10ths, 11" */
137
160, 144, /* X_DPI, Y_DPI */
138
0, 0.5, 0.5, 0, /* margins */
145
141
/* LQ hirez Imagewriter device */
146
142
const gx_device_printer far_data gs_iwlq_device =
147
143
prn_device(prn_std_procs, "iwlq",
148
85, /* width_10ths, 8.5" */
149
110, /* height_10ths, 11" */
151
0, 0, 0.5, 0, /* margins */
144
85, /* width_10ths, 8.5" */
145
110, /* height_10ths, 11" */
147
0, 0, 0.5, 0, /* margins */
155
150
/* ------ Internal routines ------ */
162
157
/* Send the page to the printer. */
164
159
dmp_print_page(gx_device_printer *pdev, FILE *prn_stream)
168
int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
169
/* Note that in_size is a multiple of 8. */
170
int in_size = line_size * 8;
172
byte *buf1 = (byte *)gs_malloc(pdev->memory, in_size, 1, "dmp_print_page(buf1)");
173
byte *buf2 = (byte *)gs_malloc(pdev->memory, in_size, 1, "dmp_print_page(buf2)");
174
byte *prn = (byte *)gs_malloc(pdev->memory, 3*in_size, 1, "dmp_print_page(prn)");
180
/* Check allocations */
181
if ( buf1 == 0 || buf2 == 0 || prn == 0 )
184
gs_free(pdev->memory, (char *)buf1, in_size, 1,
185
"dmp_print_page(buf1)");
187
gs_free(pdev->memory, (char *)buf2, in_size, 1,
188
"dmp_print_page(buf2)");
190
gs_free(pdev->memory, (char *)prn, in_size, 1,
191
"dmp_print_page(prn)");
192
return_error(gs_error_VMerror);
195
if ( pdev->y_pixels_per_inch == 216 )
197
else if ( pdev->y_pixels_per_inch == 144 )
199
else if ( pdev->x_pixels_per_inch == 160 )
204
/* Initialize the printer and reset the margins. */
206
fputs("\r\n\033>\033T16", prn_stream);
211
fputs("\033P\033a3", prn_stream);
215
fputs("\033P", prn_stream);
219
fputs("\033q", prn_stream);
223
/* Print lines of graphics */
224
while ( lnum < pdev->height )
231
byte *prn_blk, *prn_end, *prn_tmp;
163
int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
164
/* Note that in_size is a multiple of 8. */
165
int in_size = line_size * 8;
167
byte *buf1 = (byte *)gs_malloc(pdev->memory, in_size, 1, "dmp_print_page(buf1)");
168
byte *buf2 = (byte *)gs_malloc(pdev->memory, in_size, 1, "dmp_print_page(buf2)");
169
byte *prn = (byte *)gs_malloc(pdev->memory, 3*in_size, 1, "dmp_print_page(prn)");
175
/* Check allocations */
176
if ( buf1 == 0 || buf2 == 0 || prn == 0 )
179
gs_free(pdev->memory, (char *)buf1, in_size, 1,
180
"dmp_print_page(buf1)");
182
gs_free(pdev->memory, (char *)buf2, in_size, 1,
183
"dmp_print_page(buf2)");
185
gs_free(pdev->memory, (char *)prn, in_size, 1,
186
"dmp_print_page(prn)");
187
return_error(gs_error_VMerror);
190
if ( pdev->y_pixels_per_inch == 216 )
192
else if ( pdev->y_pixels_per_inch == 144 )
194
else if ( pdev->x_pixels_per_inch == 160 )
199
/* Initialize the printer and reset the margins. */
201
fputs("\r\n\033>\033T16", prn_stream);
206
fputs("\033P\033a3", prn_stream);
210
fputs("\033P", prn_stream);
214
fputs("\033q", prn_stream);
218
/* Print lines of graphics */
219
while ( lnum < pdev->height )
226
byte *prn_blk, *prn_end, *prn_tmp;
233
228
/* The apple DMP printer seems to be odd in that the bit order on
234
229
* each line is reverse what might be expected. Meaning, an
237
232
* scan line in reverse order.
242
case IWLQ: passes = 3; break;
243
case IWHI: passes = 2; break;
246
default: passes = 1; break;
249
for (count = 0; count < passes; count++)
251
for (lcnt=0; lcnt<8; lcnt++)
255
case IWLQ: ltmp = lcnt + 8*count; break;
256
case IWHI: ltmp = 2*lcnt + count; break;
259
default: ltmp = lcnt; break;
262
if ((lnum+ltmp)>pdev->height)
263
memset(in+lcnt*line_size,0,line_size);
265
gdev_prn_copy_scan_lines(pdev,
266
lnum+ltmp, in + line_size*(7 - lcnt),
272
in_end = inp + line_size;
273
for ( ; inp < in_end; inp++, out_end += 8 )
275
gdev_prn_transpose_8x8(inp, line_size,
283
case IWLQ: prn_end = prn + count; break;
284
case IWHI: prn_end = prn + in_size*count; break;
287
default: prn_end = prn; break;
290
while ( (int)(out_end-out) < in_size)
292
*prn_end = *(out_end++);
293
if ((dev_type) == IWLQ) prn_end += 3;
302
prn_end = prn_blk + in_size * 3;
303
while (prn_end > prn && prn_end[-1] == 0 &&
304
prn_end[-2] == 0 && prn_end[-3] == 0)
308
while (prn_blk < prn_end && prn_blk[0] == 0 &&
309
prn_blk[1] == 0 && prn_blk[2] == 0)
313
if (prn_end != prn_blk)
315
if ((prn_blk - prn) > 7)
316
fprintf(prn_stream,"\033U%04d%c%c%c",
317
(int)((prn_blk - prn)/3),
321
fprintf(prn_stream,"\033C%04d",
322
(int)((prn_end - prn_blk)/3));
323
fwrite(prn_blk, 1, (int)(prn_end - prn_blk),
328
for (count = 0; count < 2; count++)
330
prn_blk = prn_tmp = prn + in_size*count;
331
prn_end = prn_blk + in_size;
332
while (prn_end > prn_blk && prn_end[-1] == 0)
334
while (prn_blk < prn_end && prn_blk[0] == 0)
336
if (prn_end != prn_blk)
338
if ((prn_blk - prn_tmp) > 7)
341
(int)(prn_blk-prn_tmp),
345
fprintf(prn_stream,"\033G%04d",
346
(int)(prn_end - prn_blk));
348
(int)(prn_end - prn_blk),
351
if (!count) fputs("\033T01\r\n",prn_stream);
353
fputs("\033T15",prn_stream);
359
prn_end = prn_blk + in_size;
360
while (prn_end > prn_blk && prn_end[-1] == 0)
362
while (prn_blk < prn_end && prn_blk[0] == 0)
364
if (prn_end != prn_blk)
366
if ((prn_blk - prn) > 7)
367
fprintf(prn_stream,"\033V%04d%c",
368
(int)(prn_blk - prn), 0);
371
fprintf(prn_stream,"\033G%04d",
372
(int)(prn_end - prn_blk));
373
fwrite(prn_blk, 1, (int)(prn_end - prn_blk),
379
fputs("\r\n",prn_stream);
383
case IWLQ: lnum += 24 ; break;
384
case IWHI: lnum += 16 ; break;
387
default: lnum += 8 ; break;
391
/* ImageWriter will skip a whole page if too close to end */
392
/* so skip back more than an inch */
393
if ( !(dev_type == DMP) )
394
fputs("\033T99\n\n\033r\n\n\n\n\033f", prn_stream);
396
/* Formfeed and Reset printer */
397
fputs("\033T16\f\033<\033B\033E", prn_stream);
400
gs_free(pdev->memory, (char *)prn, in_size, 1, "dmp_print_page(prn)");
401
gs_free(pdev->memory, (char *)buf2, in_size, 1, "dmp_print_page(buf2)");
402
gs_free(pdev->memory, (char *)buf1, in_size, 1, "dmp_print_page(buf1)");
237
case IWLQ: passes = 3; break;
238
case IWHI: passes = 2; break;
241
default: passes = 1; break;
244
for (count = 0; count < passes; count++)
246
for (lcnt=0; lcnt<8; lcnt++)
250
case IWLQ: ltmp = lcnt + 8*count; break;
251
case IWHI: ltmp = 2*lcnt + count; break;
254
default: ltmp = lcnt; break;
257
if ((lnum+ltmp)>pdev->height)
258
memset(in+lcnt*line_size,0,line_size);
260
gdev_prn_copy_scan_lines(pdev,
261
lnum+ltmp, in + line_size*(7 - lcnt),
267
in_end = inp + line_size;
268
for ( ; inp < in_end; inp++, out_end += 8 )
270
gdev_prn_transpose_8x8(inp, line_size,
278
case IWLQ: prn_end = prn + count; break;
279
case IWHI: prn_end = prn + in_size*count; break;
282
default: prn_end = prn; break;
285
while ( (int)(out_end-out) < in_size)
287
*prn_end = *(out_end++);
288
if ((dev_type) == IWLQ) prn_end += 3;
297
prn_end = prn_blk + in_size * 3;
298
while (prn_end > prn && prn_end[-1] == 0 &&
299
prn_end[-2] == 0 && prn_end[-3] == 0)
303
while (prn_blk < prn_end && prn_blk[0] == 0 &&
304
prn_blk[1] == 0 && prn_blk[2] == 0)
308
if (prn_end != prn_blk)
310
if ((prn_blk - prn) > 7)
311
fprintf(prn_stream,"\033U%04d%c%c%c",
312
(int)((prn_blk - prn)/3),
316
fprintf(prn_stream,"\033C%04d",
317
(int)((prn_end - prn_blk)/3));
318
fwrite(prn_blk, 1, (int)(prn_end - prn_blk),
323
for (count = 0; count < 2; count++)
325
prn_blk = prn_tmp = prn + in_size*count;
326
prn_end = prn_blk + in_size;
327
while (prn_end > prn_blk && prn_end[-1] == 0)
329
while (prn_blk < prn_end && prn_blk[0] == 0)
331
if (prn_end != prn_blk)
333
if ((prn_blk - prn_tmp) > 7)
336
(int)(prn_blk-prn_tmp),
340
fprintf(prn_stream,"\033G%04d",
341
(int)(prn_end - prn_blk));
343
(int)(prn_end - prn_blk),
346
if (!count) fputs("\033T01\r\n",prn_stream);
348
fputs("\033T15",prn_stream);
354
prn_end = prn_blk + in_size;
355
while (prn_end > prn_blk && prn_end[-1] == 0)
357
while (prn_blk < prn_end && prn_blk[0] == 0)
359
if (prn_end != prn_blk)
361
if ((prn_blk - prn) > 7)
362
fprintf(prn_stream,"\033V%04d%c",
363
(int)(prn_blk - prn), 0);
366
fprintf(prn_stream,"\033G%04d",
367
(int)(prn_end - prn_blk));
368
fwrite(prn_blk, 1, (int)(prn_end - prn_blk),
374
fputs("\r\n",prn_stream);
378
case IWLQ: lnum += 24 ; break;
379
case IWHI: lnum += 16 ; break;
382
default: lnum += 8 ; break;
386
/* ImageWriter will skip a whole page if too close to end */
387
/* so skip back more than an inch */
388
if ( !(dev_type == DMP) )
389
fputs("\033T99\n\n\033r\n\n\n\n\033f", prn_stream);
391
/* Formfeed and Reset printer */
392
fputs("\033T16\f\033<\033B\033E", prn_stream);
395
gs_free(pdev->memory, (char *)prn, in_size, 1, "dmp_print_page(prn)");
396
gs_free(pdev->memory, (char *)buf2, in_size, 1, "dmp_print_page(buf2)");
397
gs_free(pdev->memory, (char *)buf1, in_size, 1, "dmp_print_page(buf1)");