17dd7cddfSDavid du Colombier /* Copyright (C) 1998 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.
93ff48bf5SDavid 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: gdevl31s.c,v 1.5 2004/09/02 21:30:53 giles Exp $ */
187dd7cddfSDavid du Colombier /*
197dd7cddfSDavid du Colombier * H-P LaserJet 3100 driver
207dd7cddfSDavid du Colombier *
217dd7cddfSDavid du Colombier * This is a driver for use with the H-P LaserJet 3100 Software.
227dd7cddfSDavid du Colombier * It requires installed H-P LaserJet 3100 Software to print.
237dd7cddfSDavid du Colombier * It can be used with smbclient to print from an UNIX box
247dd7cddfSDavid du Colombier * to a LaserJet 3100 printer attached to a MS-Windows box.
257dd7cddfSDavid du Colombier *
267dd7cddfSDavid du Colombier * Written by Ulrich Schmid, uschmid@mail.hh.provi.de.
277dd7cddfSDavid du Colombier */
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier #include "gdevprn.h"
307dd7cddfSDavid du Colombier #include "gdevmeds.h"
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier #define XCORRECTION 0.11
337dd7cddfSDavid du Colombier #define YCORRECTION 0.12
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier /* order matters! 0 1 2 3 4 5 6 7 8 */
367dd7cddfSDavid du Colombier const char *media[10] = {"a4", "letter", "legal", "com10", "c5", "dl", "b5", "monarch", "executive", 0};
377dd7cddfSDavid du Colombier const int height[2][10] = {{3447, 3240, 4140, 5587, 2644, 5083, 2975, 4387, 3090, 0},
387dd7cddfSDavid du Colombier {6894, 6480, 8280, 11167, 5288, 10159, 5950, 8767, 6180, 0}};
397dd7cddfSDavid du Colombier const int width[2] = {2528,
407dd7cddfSDavid du Colombier 5056};
417dd7cddfSDavid du Colombier #define LARGEST_MEDIUM 2 /* legal */
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier /* These codes correspond to sequences of pixels with the same color.
447dd7cddfSDavid du Colombier * After the code for a sequence < 64 pixels the color changes.
457dd7cddfSDavid du Colombier * After the code for a sequence with 64 pixels the previous color continues. */
467dd7cddfSDavid du Colombier private struct {
477dd7cddfSDavid du Colombier uint bits;
487dd7cddfSDavid du Colombier uint length; /* number of valid bits */
497dd7cddfSDavid du Colombier } code[2][65] =
507dd7cddfSDavid du Colombier /* White */
517dd7cddfSDavid du Colombier {{{0x0ac, 8}, {0x038, 6}, {0x00e, 4}, {0x001, 4}, {0x00d, 4}, {0x003, 4}, {0x007, 4}, {0x00f, 4},
527dd7cddfSDavid du Colombier {0x019, 5}, {0x005, 5}, {0x01c, 5}, {0x002, 5}, {0x004, 6}, {0x030, 6}, {0x00b, 6}, {0x02b, 6},
537dd7cddfSDavid du Colombier {0x015, 6}, {0x035, 6}, {0x072, 7}, {0x018, 7}, {0x008, 7}, {0x074, 7}, {0x060, 7}, {0x010, 7},
547dd7cddfSDavid du Colombier {0x00a, 7}, {0x06a, 7}, {0x064, 7}, {0x012, 7}, {0x00c, 7}, {0x040, 8}, {0x0c0, 8}, {0x058, 8},
557dd7cddfSDavid du Colombier {0x0d8, 8}, {0x048, 8}, {0x0c8, 8}, {0x028, 8}, {0x0a8, 8}, {0x068, 8}, {0x0e8, 8}, {0x014, 8},
567dd7cddfSDavid du Colombier {0x094, 8}, {0x054, 8}, {0x0d4, 8}, {0x034, 8}, {0x0b4, 8}, {0x020, 8}, {0x0a0, 8}, {0x050, 8},
577dd7cddfSDavid du Colombier {0x0d0, 8}, {0x04a, 8}, {0x0ca, 8}, {0x02a, 8}, {0x0aa, 8}, {0x024, 8}, {0x0a4, 8}, {0x01a, 8},
587dd7cddfSDavid du Colombier {0x09a, 8}, {0x05a, 8}, {0x0da, 8}, {0x052, 8}, {0x0d2, 8}, {0x04c, 8}, {0x0cc, 8}, {0x02c, 8},
597dd7cddfSDavid du Colombier {0x01b, 5}},
607dd7cddfSDavid du Colombier /* Black */
617dd7cddfSDavid du Colombier {{0x3b0, 10}, {0x002, 3}, {0x003, 2}, {0x001, 2}, {0x006, 3}, {0x00c, 4}, {0x004, 4}, {0x018, 5},
627dd7cddfSDavid du Colombier {0x028, 6}, {0x008, 6}, {0x010, 7}, {0x050, 7}, {0x070, 7}, {0x020, 8}, {0x0e0, 8}, {0x030, 9},
637dd7cddfSDavid du Colombier {0x3a0, 10}, {0x060, 10}, {0x040, 10}, {0x730, 11}, {0x0b0, 11}, {0x1b0, 11}, {0x760, 11}, {0x0a0, 11},
647dd7cddfSDavid du Colombier {0x740, 11}, {0x0c0, 11}, {0x530, 12}, {0xd30, 12}, {0x330, 12}, {0xb30, 12}, {0x160, 12}, {0x960, 12},
657dd7cddfSDavid du Colombier {0x560, 12}, {0xd60, 12}, {0x4b0, 12}, {0xcb0, 12}, {0x2b0, 12}, {0xab0, 12}, {0x6b0, 12}, {0xeb0, 12},
667dd7cddfSDavid du Colombier {0x360, 12}, {0xb60, 12}, {0x5b0, 12}, {0xdb0, 12}, {0x2a0, 12}, {0xaa0, 12}, {0x6a0, 12}, {0xea0, 12},
677dd7cddfSDavid du Colombier {0x260, 12}, {0xa60, 12}, {0x4a0, 12}, {0xca0, 12}, {0x240, 12}, {0xec0, 12}, {0x1c0, 12}, {0xe40, 12},
687dd7cddfSDavid du Colombier {0x140, 12}, {0x1a0, 12}, {0x9a0, 12}, {0xd40, 12}, {0x340, 12}, {0x5a0, 12}, {0x660, 12}, {0xe60, 12},
697dd7cddfSDavid du Colombier {0x3c0, 10}}};
707dd7cddfSDavid du Colombier
717dd7cddfSDavid du Colombier /* Define the default, maximum resolutions. */
727dd7cddfSDavid du Colombier #ifndef X_DPI
737dd7cddfSDavid du Colombier # define X_DPI 600
747dd7cddfSDavid du Colombier #endif
757dd7cddfSDavid du Colombier #ifndef Y_DPI
767dd7cddfSDavid du Colombier # define Y_DPI 600
777dd7cddfSDavid du Colombier #endif
787dd7cddfSDavid du Colombier
797dd7cddfSDavid du Colombier /* The device descriptors */
807dd7cddfSDavid du Colombier private dev_proc_print_page_copies(lj3100sw_print_page_copies);
817dd7cddfSDavid du Colombier private dev_proc_close_device(lj3100sw_close);
827dd7cddfSDavid du Colombier
837dd7cddfSDavid du Colombier private gx_device_procs prn_lj3100sw_procs =
847dd7cddfSDavid du Colombier prn_params_procs(gdev_prn_open, gdev_prn_output_page, lj3100sw_close,
857dd7cddfSDavid du Colombier gdev_prn_get_params, gdev_prn_put_params);
867dd7cddfSDavid du Colombier
877dd7cddfSDavid du Colombier /* workaround to emulate the missing prn_device_margins_copies macro */
887dd7cddfSDavid du Colombier #define gx_default_print_page_copies lj3100sw_print_page_copies
897dd7cddfSDavid du Colombier gx_device_printer far_data gs_lj3100sw_device =
907dd7cddfSDavid du Colombier prn_device_margins/*_copies*/(prn_lj3100sw_procs, "lj3100sw",
917dd7cddfSDavid du Colombier DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
927dd7cddfSDavid du Colombier X_DPI, Y_DPI,
937dd7cddfSDavid du Colombier XCORRECTION, YCORRECTION,
947dd7cddfSDavid du Colombier 0.25, 0.2, 0.25, 0.2,
957dd7cddfSDavid du Colombier 1, 0 /* lj3100sw_print_page_copies */);
967dd7cddfSDavid du Colombier #undef gx_default_print_page_copies
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier #define ppdev ((gx_device_printer *)pdev)
997dd7cddfSDavid du Colombier
1007dd7cddfSDavid du Colombier #define BUFFERSIZE 0x1000
1017dd7cddfSDavid du Colombier
1027dd7cddfSDavid du Colombier private void
lj3100sw_output_section_header(FILE * prn_stream,int type,int arg1,int arg2)1037dd7cddfSDavid du Colombier lj3100sw_output_section_header(FILE *prn_stream, int type, int arg1, int arg2)
1047dd7cddfSDavid du Colombier {
1057dd7cddfSDavid du Colombier fputc(type & 0xff, prn_stream);
1067dd7cddfSDavid du Colombier fputc(type >> 8 & 0xff, prn_stream);
1077dd7cddfSDavid du Colombier fputc(arg1 & 0xff, prn_stream);
1087dd7cddfSDavid du Colombier fputc(arg1 >> 8 & 0xff, prn_stream);
1097dd7cddfSDavid du Colombier fputc(arg2 & 0xff, prn_stream);
1107dd7cddfSDavid du Colombier fputc(arg2 >> 8 & 0xff, prn_stream);
1117dd7cddfSDavid du Colombier }
1127dd7cddfSDavid du Colombier
1137dd7cddfSDavid du Colombier private void
lj3100sw_flush_buffer(FILE * prn_stream,char * buffer,char ** pptr)1147dd7cddfSDavid du Colombier lj3100sw_flush_buffer(FILE *prn_stream, char *buffer, char **pptr)
1157dd7cddfSDavid du Colombier {
1167dd7cddfSDavid du Colombier int size = *pptr - buffer;
1177dd7cddfSDavid du Colombier if (size) {
1187dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 0, size, 0);
1197dd7cddfSDavid du Colombier fwrite(buffer, 1, size, prn_stream);
1207dd7cddfSDavid du Colombier *pptr = buffer;
1217dd7cddfSDavid du Colombier }
1227dd7cddfSDavid du Colombier }
1237dd7cddfSDavid du Colombier
1247dd7cddfSDavid du Colombier private void
lj3100sw_output_data_byte(FILE * prn_stream,char * buffer,char ** pptr,int val)1257dd7cddfSDavid du Colombier lj3100sw_output_data_byte(FILE *prn_stream, char *buffer, char **pptr, int val)
1267dd7cddfSDavid du Colombier {
1277dd7cddfSDavid du Colombier if (*pptr >= buffer + BUFFERSIZE)
1287dd7cddfSDavid du Colombier lj3100sw_flush_buffer(prn_stream, buffer, pptr);
1297dd7cddfSDavid du Colombier *(*pptr)++ = val;
1307dd7cddfSDavid du Colombier }
1317dd7cddfSDavid du Colombier
1327dd7cddfSDavid du Colombier private void
lj3100sw_output_repeated_data_bytes(FILE * prn_stream,char * buffer,char ** pptr,int val,int num)1337dd7cddfSDavid du Colombier lj3100sw_output_repeated_data_bytes(FILE *prn_stream, char *buffer, char **pptr, int val, int num)
1347dd7cddfSDavid du Colombier {
1357dd7cddfSDavid du Colombier int size;
1367dd7cddfSDavid du Colombier while (num) {
1377dd7cddfSDavid du Colombier if (*pptr >= buffer + BUFFERSIZE)
1387dd7cddfSDavid du Colombier lj3100sw_flush_buffer(prn_stream, buffer, pptr);
1397dd7cddfSDavid du Colombier size = min(num, buffer + BUFFERSIZE - *pptr);
1407dd7cddfSDavid du Colombier memset(*pptr, val, size);
1417dd7cddfSDavid du Colombier *pptr += size;
1427dd7cddfSDavid du Colombier num -= size;
1437dd7cddfSDavid du Colombier }
1447dd7cddfSDavid du Colombier }
1457dd7cddfSDavid du Colombier
1467dd7cddfSDavid du Colombier private void
lj3100sw_output_newline(FILE * prn_stream,char * buffer,char ** pptr)1477dd7cddfSDavid du Colombier lj3100sw_output_newline(FILE *prn_stream, char *buffer, char **pptr)
1487dd7cddfSDavid du Colombier {
1497dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0);
1507dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0);
1517dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x80);
1527dd7cddfSDavid du Colombier }
1537dd7cddfSDavid du Colombier
1547dd7cddfSDavid du Colombier private void
lj3100sw_output_empty_line(FILE * prn_stream,char * buffer,char ** pptr,bool high_resolution)1557dd7cddfSDavid du Colombier lj3100sw_output_empty_line(FILE *prn_stream, char *buffer, char **pptr, bool high_resolution)
1567dd7cddfSDavid du Colombier {
1577dd7cddfSDavid du Colombier if (high_resolution) {
1587dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x80);
1597dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x0f);
1607dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x78);
1617dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0xac);
1627dd7cddfSDavid du Colombier } else {
1637dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x80);
1647dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x87);
1657dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, pptr, 0x0d);
1667dd7cddfSDavid du Colombier }
1677dd7cddfSDavid du Colombier }
1687dd7cddfSDavid du Colombier
1697dd7cddfSDavid du Colombier private int
lj3100sw_print_page_copies(gx_device_printer * pdev,FILE * prn_stream,int num_copies)1707dd7cddfSDavid du Colombier lj3100sw_print_page_copies(gx_device_printer *pdev, FILE *prn_stream, int num_copies /* ignored */)
1717dd7cddfSDavid du Colombier {
1727dd7cddfSDavid du Colombier int i, j;
1737dd7cddfSDavid du Colombier char buffer[BUFFERSIZE], *ptr = buffer;
1747dd7cddfSDavid du Colombier int medium_index = select_medium(pdev, media, LARGEST_MEDIUM);
1757dd7cddfSDavid du Colombier bool high_resolution = (pdev->x_pixels_per_inch > 300);
1767dd7cddfSDavid du Colombier int printer_height = height[high_resolution ? 1 : 0][medium_index];
1777dd7cddfSDavid du Colombier int printer_width = width[high_resolution ? 1 : 0];
1787dd7cddfSDavid du Colombier int paper_height = pdev->height;
1797dd7cddfSDavid du Colombier int paper_width = pdev->width;
1807dd7cddfSDavid du Colombier int line_size = gdev_prn_raster(pdev);
181*593dc095SDavid du Colombier gs_memory_t *mem = pdev->memory;
182*593dc095SDavid du Colombier byte *in = (byte *)gs_malloc(mem, line_size, 1, "lj3100sw_print_page");
1837dd7cddfSDavid du Colombier byte *data;
1847dd7cddfSDavid du Colombier if (in == 0)
1857dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
1867dd7cddfSDavid du Colombier if (gdev_prn_file_is_new(pdev)) {
1877dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 1, 0, 0);
1887dd7cddfSDavid du Colombier lj3100sw_output_repeated_data_bytes(prn_stream, buffer, &ptr, 0x1b, 12);
1897dd7cddfSDavid du Colombier ptr += sprintf(ptr, "\r\nBD");
1907dd7cddfSDavid du Colombier lj3100sw_output_repeated_data_bytes(prn_stream, buffer, &ptr, 0, 5520);
1917dd7cddfSDavid du Colombier ptr += sprintf(ptr, "%s\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n",
1927dd7cddfSDavid du Colombier "NJ",
1937dd7cddfSDavid du Colombier "PQ", -1,
1947dd7cddfSDavid du Colombier "RE", high_resolution ? 6 : 2,
1957dd7cddfSDavid du Colombier "SL", printer_width,
1967dd7cddfSDavid du Colombier "LM", 0,
1977dd7cddfSDavid du Colombier "PS", medium_index,
1987dd7cddfSDavid du Colombier "PC", 0);
1997dd7cddfSDavid du Colombier lj3100sw_flush_buffer(prn_stream, buffer, &ptr);
2007dd7cddfSDavid du Colombier }
2017dd7cddfSDavid du Colombier
2027dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 3, ppdev->NumCopies, 0);
2037dd7cddfSDavid du Colombier ptr += sprintf(ptr, "%s %d\r\n%s\r\n",
2047dd7cddfSDavid du Colombier "CM", 1,
2057dd7cddfSDavid du Colombier "PD");
2067dd7cddfSDavid du Colombier *ptr++ = 0;
2077dd7cddfSDavid du Colombier lj3100sw_output_newline(prn_stream, buffer, &ptr);
2087dd7cddfSDavid du Colombier
2097dd7cddfSDavid du Colombier for (i = 0; i < printer_height; i++) {
2107dd7cddfSDavid du Colombier if (i < paper_height) {
2117dd7cddfSDavid du Colombier int color = 0; /* white */
2127dd7cddfSDavid du Colombier int count = 0;
2137dd7cddfSDavid du Colombier int bit_index = 0;
2147dd7cddfSDavid du Colombier uint tmp = 0;
2157dd7cddfSDavid du Colombier gdev_prn_get_bits(pdev, i, in, &data);
2167dd7cddfSDavid du Colombier for (j = 0; j <= printer_width; j++) {
2177dd7cddfSDavid du Colombier int xoffset = (printer_width - paper_width) / 2;
2187dd7cddfSDavid du Colombier int newcolor = 0;
2197dd7cddfSDavid du Colombier if (j >= xoffset && j < xoffset + paper_width)
2207dd7cddfSDavid du Colombier newcolor = (data[(j - xoffset) / 8] >> (7 - (j - xoffset) % 8)) & 1;
2217dd7cddfSDavid du Colombier if (j == printer_width)
2227dd7cddfSDavid du Colombier newcolor = !color; /* force output */
2237dd7cddfSDavid du Colombier if (newcolor == color)
2247dd7cddfSDavid du Colombier count++;
2257dd7cddfSDavid du Colombier else if (count == printer_width && color == 0) /* implies j == printer_width */
2267dd7cddfSDavid du Colombier lj3100sw_output_empty_line(prn_stream, buffer, &ptr, high_resolution);
2277dd7cddfSDavid du Colombier else /* print a sequence of pixels with a uniform color */
2287dd7cddfSDavid du Colombier while (newcolor != color) {
2297dd7cddfSDavid du Colombier int size = min(count, 64);
2307dd7cddfSDavid du Colombier tmp |= code[color][size].bits << bit_index;
2317dd7cddfSDavid du Colombier bit_index += code[color][size].length;
2327dd7cddfSDavid du Colombier while (bit_index >= 8) {
2337dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, &ptr, tmp & 0xff);
2347dd7cddfSDavid du Colombier tmp >>= 8;
2357dd7cddfSDavid du Colombier bit_index -= 8;
2367dd7cddfSDavid du Colombier }
2377dd7cddfSDavid du Colombier if (size == 64)
2387dd7cddfSDavid du Colombier count -= 64;
2397dd7cddfSDavid du Colombier else {
2407dd7cddfSDavid du Colombier color = newcolor;
2417dd7cddfSDavid du Colombier count = 1;
2427dd7cddfSDavid du Colombier }
2437dd7cddfSDavid du Colombier }
2447dd7cddfSDavid du Colombier }
2457dd7cddfSDavid du Colombier if (bit_index)
2467dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, &ptr, tmp & 0xff);
2477dd7cddfSDavid du Colombier }
2487dd7cddfSDavid du Colombier else
2497dd7cddfSDavid du Colombier lj3100sw_output_empty_line(prn_stream, buffer, &ptr, high_resolution);
2507dd7cddfSDavid du Colombier lj3100sw_output_newline(prn_stream, buffer, &ptr);
2517dd7cddfSDavid du Colombier }
2527dd7cddfSDavid du Colombier
2537dd7cddfSDavid du Colombier for (i = 0; i < 3; i++ ) {
2547dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, &ptr, 0x00);
2557dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, &ptr, 0x08);
2567dd7cddfSDavid du Colombier lj3100sw_output_data_byte(prn_stream, buffer, &ptr, 0x80);
2577dd7cddfSDavid du Colombier }
2587dd7cddfSDavid du Colombier lj3100sw_output_repeated_data_bytes(prn_stream, buffer, &ptr, 0, 520);
2597dd7cddfSDavid du Colombier lj3100sw_flush_buffer(prn_stream, buffer, &ptr);
2607dd7cddfSDavid du Colombier
2617dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 4, 0, 0);
2627dd7cddfSDavid du Colombier for (i = 0; i < 4 * ppdev->NumCopies; i++)
2637dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 54, 0, 0);
2647dd7cddfSDavid du Colombier
265*593dc095SDavid du Colombier gs_free(mem, (char *)in, line_size, 1, "lj3100sw_print_page");
2667dd7cddfSDavid du Colombier return 0;
2677dd7cddfSDavid du Colombier }
2687dd7cddfSDavid du Colombier
2697dd7cddfSDavid du Colombier private int
lj3100sw_close(gx_device * pdev)2707dd7cddfSDavid du Colombier lj3100sw_close(gx_device *pdev)
2717dd7cddfSDavid du Colombier {
2727dd7cddfSDavid du Colombier int i;
2737dd7cddfSDavid du Colombier FILE *prn_stream = ((gx_device_printer *)pdev)->file;
2747dd7cddfSDavid du Colombier
2757dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 0, 4, 0);
2767dd7cddfSDavid du Colombier fputs("XX\r\n", prn_stream);
2777dd7cddfSDavid du Colombier for (i = 0; i < 4 * ppdev->NumCopies; i++)
2787dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 54, 0, 0);
2797dd7cddfSDavid du Colombier lj3100sw_output_section_header(prn_stream, 2, 0, 0);
2807dd7cddfSDavid du Colombier
2817dd7cddfSDavid du Colombier return gdev_prn_close(pdev);
2827dd7cddfSDavid du Colombier }
283