17dd7cddfSDavid du Colombier /* Copyright (C) 1989, 1995 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gdevadmp.c,v 1.6 2004/08/10 13:02:36 stefan Exp $*/
187dd7cddfSDavid du Colombier /*
197dd7cddfSDavid du Colombier * Apple DMP / Imagewriter driver
207dd7cddfSDavid du Colombier *
217dd7cddfSDavid du Colombier * This is a modification of Mark Wedel's Apple DMP and
227dd7cddfSDavid du Colombier * Jonathan Luckey's Imagewriter II driver to
237dd7cddfSDavid du Colombier * support the Imagewriter LQ's higher resolution (320x216):
247dd7cddfSDavid du Colombier * appledmp: 120dpi x 72dpi is still supported (yuck)
257dd7cddfSDavid du Colombier * iwlo: 160dpi x 72dpi
267dd7cddfSDavid du Colombier * iwhi: 160dpi x 144dpi
277dd7cddfSDavid du Colombier * iwlq: 320dpi x 216dpi
287dd7cddfSDavid du Colombier *
297dd7cddfSDavid du Colombier * This is also my first attempt to work with gs. I have not included the LQ's
307dd7cddfSDavid du Colombier * ability to print in colour. Perhaps at a later date I will tackle that.
317dd7cddfSDavid du Colombier *
327dd7cddfSDavid du Colombier * BTW, to get your Imagewriter LQ serial printer to work with a PC, attach it
337dd7cddfSDavid du Colombier * with a nullmodem serial cable.
347dd7cddfSDavid du Colombier *
357dd7cddfSDavid du Colombier * Scott Barker (barkers@cuug.ab.ca)
367dd7cddfSDavid du Colombier */
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier /*
397dd7cddfSDavid du Colombier * This is a modification of Mark Wedel's Apple DMP driver to
407dd7cddfSDavid du Colombier * support 2 higher resolutions:
417dd7cddfSDavid du Colombier * appledmp: 120dpi x 72dpi is still supported (yuck)
427dd7cddfSDavid du Colombier * iwlo: 160dpi x 72dpi
437dd7cddfSDavid du Colombier * iwhi: 160dpi x 144dpi
447dd7cddfSDavid du Colombier *
457dd7cddfSDavid du Colombier * The Imagewriter II is a bit odd. In pinfeed mode, it thinks its
467dd7cddfSDavid du Colombier * First line is 1 inch from the top of the page. If you set the top
477dd7cddfSDavid du Colombier * form so that it starts printing at the top of the page, and print
487dd7cddfSDavid du Colombier * to near the bottom, it thinks it has run onto the next page and
497dd7cddfSDavid du Colombier * the formfeed will skip a whole page. As a work around, I reverse
507dd7cddfSDavid du Colombier * the paper about a 1.5 inches at the end of the page before the
517dd7cddfSDavid du Colombier * formfeed to make it think its on the 'right' page. bah. hack!
527dd7cddfSDavid du Colombier *
537dd7cddfSDavid du Colombier * This is my first attempt to work with gs, so your milage may vary
547dd7cddfSDavid du Colombier *
557dd7cddfSDavid du Colombier * Jonathan Luckey (luckey@rtfm.mlb.fl.us)
567dd7cddfSDavid du Colombier */
577dd7cddfSDavid du Colombier
587dd7cddfSDavid du Colombier /* This is a bare bones driver I developed for my apple Dot Matrix Printer.
597dd7cddfSDavid du Colombier * This code originally was from the epson driver, but I removed a lot
607dd7cddfSDavid du Colombier * of stuff that was not needed.
617dd7cddfSDavid du Colombier *
627dd7cddfSDavid du Colombier * The Dot Matrix Printer was a predecessor to the apple Imagewriter. Its
637dd7cddfSDavid du Colombier * main difference being that it was parallel.
647dd7cddfSDavid du Colombier *
657dd7cddfSDavid du Colombier * This code should work fine on Imagewriters, as they have a superset
667dd7cddfSDavid du Colombier * of commands compared to the DMP printer.
677dd7cddfSDavid du Colombier *
687dd7cddfSDavid du Colombier * This driver does not produce the smalles output files possible. To
697dd7cddfSDavid du Colombier * do that, it should look through the output strings and find repeat
707dd7cddfSDavid du Colombier * occurances of characters, and use the escape sequence that allows
717dd7cddfSDavid du Colombier * printing repeat sequences. However, as I see it, this the limiting
727dd7cddfSDavid du Colombier * factor in printing is not transmission speed to the printer itself,
737dd7cddfSDavid du Colombier * but rather, how fast the print head can move. This is assuming the
747dd7cddfSDavid du Colombier * printer is set up with a reasonable speed (9600 bps)
757dd7cddfSDavid du Colombier *
767dd7cddfSDavid du Colombier * WHAT THE CODE DOES AND DOES NOT DO:
777dd7cddfSDavid du Colombier *
787dd7cddfSDavid du Colombier * To print out images, it sets the printer for unidirection printing
797dd7cddfSDavid du Colombier * and 15 cpi (120 dpi). IT sets line feed to 1/9 of an inch (72 dpi).
807dd7cddfSDavid du Colombier * When finished, it sets things back to bidirection print, 1/8" line
817dd7cddfSDavid du Colombier * feeds, and 12 cpi. There does not appear to be a way to reset
827dd7cddfSDavid du Colombier * things to initial values.
837dd7cddfSDavid du Colombier *
847dd7cddfSDavid du Colombier * This code does not set for 8 bit characters (which is required). It
857dd7cddfSDavid du Colombier * also assumes that carriage return/newline is needed, and not just
867dd7cddfSDavid du Colombier * carriage return. These are all switch settings on the DMP, and
877dd7cddfSDavid du Colombier * I have configured them for 8 bit data and cr only.
887dd7cddfSDavid du Colombier *
897dd7cddfSDavid du Colombier * You can search for the strings Init and Reset to find the strings
907dd7cddfSDavid du Colombier * that set up the printer and clear things when finished, and change
917dd7cddfSDavid du Colombier * them to meet your needs.
927dd7cddfSDavid du Colombier *
937dd7cddfSDavid du Colombier * Also, you need to make sure that the printer daemon (assuming unix)
947dd7cddfSDavid du Colombier * doesn't change the data as it is being printed. I have set my
957dd7cddfSDavid du Colombier * printcap file (sunos 4.1.1) with the string:
967dd7cddfSDavid du Colombier * ms=pass8,-opost
977dd7cddfSDavid du Colombier * and it works fine.
987dd7cddfSDavid du Colombier *
997dd7cddfSDavid du Colombier * Feel free to improve this code if you want. However, please make
1007dd7cddfSDavid du Colombier * sure that the old DMP will still be supported by any changes. This
1017dd7cddfSDavid du Colombier * may mean making an imagewriter device, and just copying this file
1027dd7cddfSDavid du Colombier * to something like gdevimage.c.
1037dd7cddfSDavid du Colombier *
1047dd7cddfSDavid du Colombier * The limiting factor of the DMP is the vertical resolution. However, I
1057dd7cddfSDavid du Colombier * see no way to do anything about this. Horizontal resolution could
1067dd7cddfSDavid du Colombier * be increased by using 17 cpi (136 dpi). I believe the Imagewriter
1077dd7cddfSDavid du Colombier * supports 24 cpi (192 dpi). However, the higher dpi, the slower
1087dd7cddfSDavid du Colombier * the printing.
1097dd7cddfSDavid du Colombier *
1107dd7cddfSDavid du Colombier * Dot Matrix Code by Mark Wedel (master@cats.ucsc.edu)
1117dd7cddfSDavid du Colombier */
1127dd7cddfSDavid du Colombier
1137dd7cddfSDavid du Colombier
1147dd7cddfSDavid du Colombier #include "gdevprn.h"
1157dd7cddfSDavid du Colombier
1167dd7cddfSDavid du Colombier /* The device descriptors */
1177dd7cddfSDavid du Colombier private dev_proc_print_page(dmp_print_page);
1187dd7cddfSDavid du Colombier
1197dd7cddfSDavid du Colombier /* Standard DMP device */
1203ff48bf5SDavid du Colombier const gx_device_printer far_data gs_appledmp_device =
1217dd7cddfSDavid du Colombier prn_device(prn_std_procs, "appledmp",
1227dd7cddfSDavid du Colombier 85, /* width_10ths, 8.5" */
1237dd7cddfSDavid du Colombier 110, /* height_10ths, 11" */
1247dd7cddfSDavid du Colombier 120, 72, /* X_DPI, Y_DPI */
1257dd7cddfSDavid du Colombier 0, 0.5, 0.5, 0, /* margins */
1267dd7cddfSDavid du Colombier 1, dmp_print_page);
1277dd7cddfSDavid du Colombier
1287dd7cddfSDavid du Colombier
1297dd7cddfSDavid du Colombier /* lowrez Imagewriter device */
1303ff48bf5SDavid du Colombier const gx_device_printer far_data gs_iwlo_device =
1317dd7cddfSDavid du Colombier prn_device(prn_std_procs, "iwlo",
1327dd7cddfSDavid du Colombier 85, /* width_10ths, 8.5" */
1337dd7cddfSDavid du Colombier 110, /* height_10ths, 11" */
1347dd7cddfSDavid du Colombier 160, 72, /* X_DPI, Y_DPI */
1357dd7cddfSDavid du Colombier 0, 0.5, 0.5, 0, /* margins */
1367dd7cddfSDavid du Colombier 1, dmp_print_page);
1377dd7cddfSDavid du Colombier
1387dd7cddfSDavid du Colombier
1397dd7cddfSDavid du Colombier /* hirez Imagewriter device */
1403ff48bf5SDavid du Colombier const gx_device_printer far_data gs_iwhi_device =
1417dd7cddfSDavid du Colombier prn_device(prn_std_procs, "iwhi",
1427dd7cddfSDavid du Colombier 85, /* width_10ths, 8.5" */
1437dd7cddfSDavid du Colombier 110, /* height_10ths, 11" */
1447dd7cddfSDavid du Colombier 160, 144, /* X_DPI, Y_DPI */
1457dd7cddfSDavid du Colombier 0, 0.5, 0.5, 0, /* margins */
1467dd7cddfSDavid du Colombier 1, dmp_print_page);
1477dd7cddfSDavid du Colombier
1487dd7cddfSDavid du Colombier
1497dd7cddfSDavid du Colombier /* LQ hirez Imagewriter device */
1503ff48bf5SDavid du Colombier const gx_device_printer far_data gs_iwlq_device =
1517dd7cddfSDavid du Colombier prn_device(prn_std_procs, "iwlq",
1527dd7cddfSDavid du Colombier 85, /* width_10ths, 8.5" */
1537dd7cddfSDavid du Colombier 110, /* height_10ths, 11" */
1547dd7cddfSDavid du Colombier 320, 216,
1557dd7cddfSDavid du Colombier 0, 0, 0.5, 0, /* margins */
1567dd7cddfSDavid du Colombier 1, dmp_print_page);
1577dd7cddfSDavid du Colombier
1587dd7cddfSDavid du Colombier
1597dd7cddfSDavid du Colombier /* ------ Internal routines ------ */
1607dd7cddfSDavid du Colombier
1617dd7cddfSDavid du Colombier #define DMP 1
1627dd7cddfSDavid du Colombier #define IWLO 2
1637dd7cddfSDavid du Colombier #define IWHI 3
1647dd7cddfSDavid du Colombier #define IWLQ 4
1657dd7cddfSDavid du Colombier
1667dd7cddfSDavid du Colombier /* Send the page to the printer. */
1677dd7cddfSDavid du Colombier private int
dmp_print_page(gx_device_printer * pdev,FILE * prn_stream)1687dd7cddfSDavid du Colombier dmp_print_page(gx_device_printer *pdev, FILE *prn_stream)
1697dd7cddfSDavid du Colombier {
1707dd7cddfSDavid du Colombier int dev_type;
1717dd7cddfSDavid du Colombier
1727dd7cddfSDavid du Colombier int line_size = gdev_mem_bytes_per_scan_line((gx_device *)pdev);
1737dd7cddfSDavid du Colombier /* Note that in_size is a multiple of 8. */
1747dd7cddfSDavid du Colombier int in_size = line_size * 8;
1757dd7cddfSDavid du Colombier
176*593dc095SDavid du Colombier byte *buf1 = (byte *)gs_malloc(pdev->memory, in_size, 1, "dmp_print_page(buf1)");
177*593dc095SDavid du Colombier byte *buf2 = (byte *)gs_malloc(pdev->memory, in_size, 1, "dmp_print_page(buf2)");
178*593dc095SDavid du Colombier byte *prn = (byte *)gs_malloc(pdev->memory, 3*in_size, 1, "dmp_print_page(prn)");
1797dd7cddfSDavid du Colombier
1807dd7cddfSDavid du Colombier byte *in = buf1;
1817dd7cddfSDavid du Colombier byte *out = buf2;
1827dd7cddfSDavid du Colombier int lnum = 0;
1837dd7cddfSDavid du Colombier
1847dd7cddfSDavid du Colombier /* Check allocations */
1857dd7cddfSDavid du Colombier if ( buf1 == 0 || buf2 == 0 || prn == 0 )
1867dd7cddfSDavid du Colombier {
1877dd7cddfSDavid du Colombier if ( buf1 )
188*593dc095SDavid du Colombier gs_free(pdev->memory, (char *)buf1, in_size, 1,
1897dd7cddfSDavid du Colombier "dmp_print_page(buf1)");
1907dd7cddfSDavid du Colombier if ( buf2 )
191*593dc095SDavid du Colombier gs_free(pdev->memory, (char *)buf2, in_size, 1,
1927dd7cddfSDavid du Colombier "dmp_print_page(buf2)");
1937dd7cddfSDavid du Colombier if ( prn )
194*593dc095SDavid du Colombier gs_free(pdev->memory, (char *)prn, in_size, 1,
1957dd7cddfSDavid du Colombier "dmp_print_page(prn)");
1967dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
1977dd7cddfSDavid du Colombier }
1987dd7cddfSDavid du Colombier
1997dd7cddfSDavid du Colombier if ( pdev->y_pixels_per_inch == 216 )
2007dd7cddfSDavid du Colombier dev_type = IWLQ;
2017dd7cddfSDavid du Colombier else if ( pdev->y_pixels_per_inch == 144 )
2027dd7cddfSDavid du Colombier dev_type = IWHI;
2037dd7cddfSDavid du Colombier else if ( pdev->x_pixels_per_inch == 160 )
2047dd7cddfSDavid du Colombier dev_type = IWLO;
2057dd7cddfSDavid du Colombier else
2067dd7cddfSDavid du Colombier dev_type = DMP;
2077dd7cddfSDavid du Colombier
2087dd7cddfSDavid du Colombier /* Initialize the printer and reset the margins. */
2097dd7cddfSDavid du Colombier
2107dd7cddfSDavid du Colombier fputs("\r\n\033>\033T16", prn_stream);
2117dd7cddfSDavid du Colombier
2127dd7cddfSDavid du Colombier switch(dev_type)
2137dd7cddfSDavid du Colombier {
2147dd7cddfSDavid du Colombier case IWLQ:
2157dd7cddfSDavid du Colombier fputs("\033P\033a3", prn_stream);
2167dd7cddfSDavid du Colombier break;
2177dd7cddfSDavid du Colombier case IWHI:
2187dd7cddfSDavid du Colombier case IWLO:
2197dd7cddfSDavid du Colombier fputs("\033P", prn_stream);
2207dd7cddfSDavid du Colombier break;
2217dd7cddfSDavid du Colombier case DMP:
2227dd7cddfSDavid du Colombier default:
2237dd7cddfSDavid du Colombier fputs("\033q", prn_stream);
2247dd7cddfSDavid du Colombier break;
2257dd7cddfSDavid du Colombier }
2267dd7cddfSDavid du Colombier
2277dd7cddfSDavid du Colombier /* Print lines of graphics */
2287dd7cddfSDavid du Colombier while ( lnum < pdev->height )
2297dd7cddfSDavid du Colombier {
2307dd7cddfSDavid du Colombier byte *inp;
2317dd7cddfSDavid du Colombier byte *in_end;
2327dd7cddfSDavid du Colombier byte *out_end;
2337dd7cddfSDavid du Colombier int lcnt,ltmp;
2347dd7cddfSDavid du Colombier int count, passes;
2357dd7cddfSDavid du Colombier byte *prn_blk, *prn_end, *prn_tmp;
2367dd7cddfSDavid du Colombier
2377dd7cddfSDavid du Colombier /* The apple DMP printer seems to be odd in that the bit order on
2387dd7cddfSDavid du Colombier * each line is reverse what might be expected. Meaning, an
2397dd7cddfSDavid du Colombier * underscore would be done as a series of 0x80, while on overscore
2407dd7cddfSDavid du Colombier * would be done as a series of 0x01. So we get each
2417dd7cddfSDavid du Colombier * scan line in reverse order.
2427dd7cddfSDavid du Colombier */
2437dd7cddfSDavid du Colombier
2447dd7cddfSDavid du Colombier switch (dev_type)
2457dd7cddfSDavid du Colombier {
2467dd7cddfSDavid du Colombier case IWLQ: passes = 3; break;
2477dd7cddfSDavid du Colombier case IWHI: passes = 2; break;
2487dd7cddfSDavid du Colombier case IWLO:
2497dd7cddfSDavid du Colombier case DMP:
2507dd7cddfSDavid du Colombier default: passes = 1; break;
2517dd7cddfSDavid du Colombier }
2527dd7cddfSDavid du Colombier
2537dd7cddfSDavid du Colombier for (count = 0; count < passes; count++)
2547dd7cddfSDavid du Colombier {
2557dd7cddfSDavid du Colombier for (lcnt=0; lcnt<8; lcnt++)
2567dd7cddfSDavid du Colombier {
2577dd7cddfSDavid du Colombier switch(dev_type)
2587dd7cddfSDavid du Colombier {
2597dd7cddfSDavid du Colombier case IWLQ: ltmp = lcnt + 8*count; break;
2607dd7cddfSDavid du Colombier case IWHI: ltmp = 2*lcnt + count; break;
2617dd7cddfSDavid du Colombier case IWLO:
2627dd7cddfSDavid du Colombier case DMP:
2637dd7cddfSDavid du Colombier default: ltmp = lcnt; break;
2647dd7cddfSDavid du Colombier }
2657dd7cddfSDavid du Colombier
2667dd7cddfSDavid du Colombier if ((lnum+ltmp)>pdev->height)
2677dd7cddfSDavid du Colombier memset(in+lcnt*line_size,0,line_size);
2687dd7cddfSDavid du Colombier else
2697dd7cddfSDavid du Colombier gdev_prn_copy_scan_lines(pdev,
2707dd7cddfSDavid du Colombier lnum+ltmp, in + line_size*(7 - lcnt),
2717dd7cddfSDavid du Colombier line_size);
2727dd7cddfSDavid du Colombier }
2737dd7cddfSDavid du Colombier
2747dd7cddfSDavid du Colombier out_end = out;
2757dd7cddfSDavid du Colombier inp = in;
2767dd7cddfSDavid du Colombier in_end = inp + line_size;
2777dd7cddfSDavid du Colombier for ( ; inp < in_end; inp++, out_end += 8 )
2787dd7cddfSDavid du Colombier {
2797dd7cddfSDavid du Colombier gdev_prn_transpose_8x8(inp, line_size,
2807dd7cddfSDavid du Colombier out_end, 1);
2817dd7cddfSDavid du Colombier }
2827dd7cddfSDavid du Colombier
2837dd7cddfSDavid du Colombier out_end = out;
2847dd7cddfSDavid du Colombier
2857dd7cddfSDavid du Colombier switch (dev_type)
2867dd7cddfSDavid du Colombier {
2877dd7cddfSDavid du Colombier case IWLQ: prn_end = prn + count; break;
2887dd7cddfSDavid du Colombier case IWHI: prn_end = prn + in_size*count; break;
2897dd7cddfSDavid du Colombier case IWLO:
2907dd7cddfSDavid du Colombier case DMP:
2917dd7cddfSDavid du Colombier default: prn_end = prn; break;
2927dd7cddfSDavid du Colombier }
2937dd7cddfSDavid du Colombier
2947dd7cddfSDavid du Colombier while ( (int)(out_end-out) < in_size)
2957dd7cddfSDavid du Colombier {
2967dd7cddfSDavid du Colombier *prn_end = *(out_end++);
2977dd7cddfSDavid du Colombier if ((dev_type) == IWLQ) prn_end += 3;
2987dd7cddfSDavid du Colombier else prn_end++;
2997dd7cddfSDavid du Colombier }
3007dd7cddfSDavid du Colombier }
3017dd7cddfSDavid du Colombier
3027dd7cddfSDavid du Colombier switch (dev_type)
3037dd7cddfSDavid du Colombier {
3047dd7cddfSDavid du Colombier case IWLQ:
3057dd7cddfSDavid du Colombier prn_blk = prn;
3067dd7cddfSDavid du Colombier prn_end = prn_blk + in_size * 3;
3077dd7cddfSDavid du Colombier while (prn_end > prn && prn_end[-1] == 0 &&
3087dd7cddfSDavid du Colombier prn_end[-2] == 0 && prn_end[-3] == 0)
3097dd7cddfSDavid du Colombier {
3107dd7cddfSDavid du Colombier prn_end -= 3;
3117dd7cddfSDavid du Colombier }
3127dd7cddfSDavid du Colombier while (prn_blk < prn_end && prn_blk[0] == 0 &&
3137dd7cddfSDavid du Colombier prn_blk[1] == 0 && prn_blk[2] == 0)
3147dd7cddfSDavid du Colombier {
3157dd7cddfSDavid du Colombier prn_blk += 3;
3167dd7cddfSDavid du Colombier }
3177dd7cddfSDavid du Colombier if (prn_end != prn_blk)
3187dd7cddfSDavid du Colombier {
3197dd7cddfSDavid du Colombier if ((prn_blk - prn) > 7)
3207dd7cddfSDavid du Colombier fprintf(prn_stream,"\033U%04d%c%c%c",
3217dd7cddfSDavid du Colombier (int)((prn_blk - prn)/3),
3227dd7cddfSDavid du Colombier 0, 0, 0);
3237dd7cddfSDavid du Colombier else
3247dd7cddfSDavid du Colombier prn_blk = prn;
3257dd7cddfSDavid du Colombier fprintf(prn_stream,"\033C%04d",
3267dd7cddfSDavid du Colombier (int)((prn_end - prn_blk)/3));
3277dd7cddfSDavid du Colombier fwrite(prn_blk, 1, (int)(prn_end - prn_blk),
3287dd7cddfSDavid du Colombier prn_stream);
3297dd7cddfSDavid du Colombier }
3307dd7cddfSDavid du Colombier break;
3317dd7cddfSDavid du Colombier case IWHI:
3327dd7cddfSDavid du Colombier for (count = 0; count < 2; count++)
3337dd7cddfSDavid du Colombier {
3347dd7cddfSDavid du Colombier prn_blk = prn_tmp = prn + in_size*count;
3357dd7cddfSDavid du Colombier prn_end = prn_blk + in_size;
3367dd7cddfSDavid du Colombier while (prn_end > prn_blk && prn_end[-1] == 0)
3377dd7cddfSDavid du Colombier prn_end--;
3387dd7cddfSDavid du Colombier while (prn_blk < prn_end && prn_blk[0] == 0)
3397dd7cddfSDavid du Colombier prn_blk++;
3407dd7cddfSDavid du Colombier if (prn_end != prn_blk)
3417dd7cddfSDavid du Colombier {
3427dd7cddfSDavid du Colombier if ((prn_blk - prn_tmp) > 7)
3437dd7cddfSDavid du Colombier fprintf(prn_stream,
3447dd7cddfSDavid du Colombier "\033V%04d%c",
3457dd7cddfSDavid du Colombier (int)(prn_blk-prn_tmp),
3467dd7cddfSDavid du Colombier 0);
3477dd7cddfSDavid du Colombier else
3487dd7cddfSDavid du Colombier prn_blk = prn_tmp;
3497dd7cddfSDavid du Colombier fprintf(prn_stream,"\033G%04d",
3507dd7cddfSDavid du Colombier (int)(prn_end - prn_blk));
3517dd7cddfSDavid du Colombier fwrite(prn_blk, 1,
3527dd7cddfSDavid du Colombier (int)(prn_end - prn_blk),
3537dd7cddfSDavid du Colombier prn_stream);
3547dd7cddfSDavid du Colombier }
3557dd7cddfSDavid du Colombier if (!count) fputs("\033T01\r\n",prn_stream);
3567dd7cddfSDavid du Colombier }
3577dd7cddfSDavid du Colombier fputs("\033T15",prn_stream);
3587dd7cddfSDavid du Colombier break;
3597dd7cddfSDavid du Colombier case IWLO:
3607dd7cddfSDavid du Colombier case DMP:
3617dd7cddfSDavid du Colombier default:
3627dd7cddfSDavid du Colombier prn_blk = prn;
3637dd7cddfSDavid du Colombier prn_end = prn_blk + in_size;
3647dd7cddfSDavid du Colombier while (prn_end > prn_blk && prn_end[-1] == 0)
3657dd7cddfSDavid du Colombier prn_end--;
3667dd7cddfSDavid du Colombier while (prn_blk < prn_end && prn_blk[0] == 0)
3677dd7cddfSDavid du Colombier prn_blk++;
3687dd7cddfSDavid du Colombier if (prn_end != prn_blk)
3697dd7cddfSDavid du Colombier {
3707dd7cddfSDavid du Colombier if ((prn_blk - prn) > 7)
3717dd7cddfSDavid du Colombier fprintf(prn_stream,"\033V%04d%c",
3727dd7cddfSDavid du Colombier (int)(prn_blk - prn), 0);
3737dd7cddfSDavid du Colombier else
3747dd7cddfSDavid du Colombier prn_blk = prn;
3757dd7cddfSDavid du Colombier fprintf(prn_stream,"\033G%04d",
3767dd7cddfSDavid du Colombier (int)(prn_end - prn_blk));
3777dd7cddfSDavid du Colombier fwrite(prn_blk, 1, (int)(prn_end - prn_blk),
3787dd7cddfSDavid du Colombier prn_stream);
3797dd7cddfSDavid du Colombier }
3807dd7cddfSDavid du Colombier break;
3817dd7cddfSDavid du Colombier }
3827dd7cddfSDavid du Colombier
3837dd7cddfSDavid du Colombier fputs("\r\n",prn_stream);
3847dd7cddfSDavid du Colombier
3857dd7cddfSDavid du Colombier switch (dev_type)
3867dd7cddfSDavid du Colombier {
3877dd7cddfSDavid du Colombier case IWLQ: lnum += 24 ; break;
3887dd7cddfSDavid du Colombier case IWHI: lnum += 16 ; break;
3897dd7cddfSDavid du Colombier case IWLO:
3907dd7cddfSDavid du Colombier case DMP:
3917dd7cddfSDavid du Colombier default: lnum += 8 ; break;
3927dd7cddfSDavid du Colombier }
3937dd7cddfSDavid du Colombier }
3947dd7cddfSDavid du Colombier
3957dd7cddfSDavid du Colombier /* ImageWriter will skip a whole page if too close to end */
3967dd7cddfSDavid du Colombier /* so skip back more than an inch */
3977dd7cddfSDavid du Colombier if ( !(dev_type == DMP) )
3987dd7cddfSDavid du Colombier fputs("\033T99\n\n\033r\n\n\n\n\033f", prn_stream);
3997dd7cddfSDavid du Colombier
4007dd7cddfSDavid du Colombier /* Formfeed and Reset printer */
4017dd7cddfSDavid du Colombier fputs("\033T16\f\033<\033B\033E", prn_stream);
4027dd7cddfSDavid du Colombier fflush(prn_stream);
4037dd7cddfSDavid du Colombier
404*593dc095SDavid du Colombier gs_free(pdev->memory, (char *)prn, in_size, 1, "dmp_print_page(prn)");
405*593dc095SDavid du Colombier gs_free(pdev->memory, (char *)buf2, in_size, 1, "dmp_print_page(buf2)");
406*593dc095SDavid du Colombier gs_free(pdev->memory, (char *)buf1, in_size, 1, "dmp_print_page(buf1)");
4077dd7cddfSDavid du Colombier return 0;
4087dd7cddfSDavid du Colombier }
409