xref: /plan9/sys/src/cmd/gs/src/gdevcljc.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1998, 1999, 2000 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gdevcljc.c,v 1.7 2004/05/26 04:10:58 dan Exp $ */
18 /*
19  * H-P Color LaserJet 5/5M contone device; based on the gdevclj.c.
20  */
21 #include "math_.h"
22 #include "gdevprn.h"
23 #include "gdevpcl.h"
24 
25 /* X_DPI and Y_DPI must be the same */
26 #define X_DPI 300
27 #define Y_DPI 300
28 
29 /* Send the page to the printer.  Compress each scan line.  NB - the
30  * render mode as well as color parameters - bpp etc. are all
31  * hardwired.
32  */
33 private int
cljc_print_page(gx_device_printer * pdev,FILE * prn_stream)34 cljc_print_page(gx_device_printer * pdev, FILE * prn_stream)
35 {
36     gs_memory_t *mem = pdev->memory;
37     uint raster = gx_device_raster((gx_device *)pdev, false);
38     int i;
39     int worst_case_comp_size = raster + (raster / 8) + 1;
40     byte *data = 0;
41     byte *cdata = 0;
42     byte *prow = 0;
43     int code = 0;
44 
45     /* allocate memory for the raw data and compressed data.  */
46     if (((data = gs_alloc_bytes(mem, raster, "cljc_print_page(data)")) == 0) ||
47 	((cdata = gs_alloc_bytes(mem, worst_case_comp_size, "cljc_print_page(cdata)")) == 0) ||
48 	((prow = gs_alloc_bytes(mem, worst_case_comp_size, "cljc_print_page(prow)")) == 0)) {
49 	code = gs_note_error(gs_error_VMerror);
50 	goto out;
51     }
52     /* send a reset and the the paper definition */
53     fprintf(prn_stream, "\033E\033&u300D\033&l%dA",
54 	    gdev_pcl_paper_size((gx_device *) pdev));
55     /* turn off source and pattern transparency */
56     fprintf(prn_stream, "\033*v1N\033*v1O");
57     /* set color render mode and the requested resolution */
58     fprintf(prn_stream, "\033*t4J\033*t%dR", (int)(pdev->HWResolution[0]));
59     /* set up the color model - NB currently hardwired to direct by
60        pixel which requires 8 bits per component.  See PCL color
61        technical reference manual for other possible encodings. */
62     fprintf(prn_stream, "\033*v6W%c%c%c%c%c%c", 0, 3, 0, 8, 8, 8);
63     /* set up raster width and height, compression mode 3 */
64     fprintf(prn_stream, "\033&l0e-180u36Z\033*p0x0Y\033*r1A\033*b3M");
65     /* initialize the seed row */
66     memset(prow, 0, worst_case_comp_size);
67     /* process each scanline */
68     for (i = 0; i < pdev->height; i++) {
69 	int compressed_size;
70 
71 	code = gdev_prn_copy_scan_lines(pdev, i, (byte *) data, raster);
72 	if (code < 0)
73 	    break;
74 	compressed_size = gdev_pcl_mode3compress(raster, data, prow, cdata);
75 	fprintf(prn_stream, "\033*b%dW", compressed_size);
76 	fwrite(cdata, sizeof(byte), compressed_size, prn_stream);
77     }
78     /* PCL will take care of blank lines at the end */
79     fputs("\033*rC\f", prn_stream);
80 out:
81     gs_free_object(mem, prow, "cljc_print_page(prow)");
82     gs_free_object(mem, cdata, "cljc_print_page(cdata)");
83     gs_free_object(mem, data, "cljc_print_page(data)");
84     return code;
85 }
86 
87 /* CLJ device methods */
88 private gx_device_procs cljc_procs =
89 prn_color_procs(gdev_prn_open, gdev_prn_output_page, gdev_prn_close,
90 		gx_default_rgb_map_rgb_color, gx_default_rgb_map_color_rgb);
91 
92 /* the CLJ device */
93 const gx_device_printer gs_cljet5c_device =
94 {
95     prn_device_body(gx_device_printer, cljc_procs, "cljet5c",
96 		    85, 110, X_DPI, Y_DPI,
97 		    0.167, 0.167,
98 		    0.167, 0.167,
99 		    3, 24, 255, 255, 256, 256,
100 		    cljc_print_page)
101 };
102