1 /* Copyright (C) 1998 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: gdevbjcl.c,v 1.4 2002/02/21 22:24:51 giles Exp $*/
18 /* Canon BJC command generation library */
19 #include "std.h"
20 #include "gdevbjcl.h"
21
22 /****** PRELIMINARY, SUBJECT TO CHANGE WITHOUT NOTICE. ******/
23
24 /* ---------------- Utilities ---------------- */
25
26 private void
bjc_put_bytes(stream * s,const byte * data,uint count)27 bjc_put_bytes(stream *s, const byte *data, uint count)
28 {
29 uint ignore;
30
31 sputs(s, data, count, &ignore);
32 }
33
34 private void
bjc_put_hi_lo(stream * s,int value)35 bjc_put_hi_lo(stream *s, int value)
36 {
37 spputc(s, value >> 8);
38 spputc(s, value & 0xff);
39 }
40
41 private void
bjc_put_lo_hi(stream * s,int value)42 bjc_put_lo_hi(stream *s, int value)
43 {
44 spputc(s, value & 0xff);
45 spputc(s, value >> 8);
46 }
47
48 private void
bjc_put_command(stream * s,int ch,int count)49 bjc_put_command(stream *s, int ch, int count)
50 {
51 spputc(s, 033 /*ESC*/);
52 spputc(s, '(');
53 spputc(s, ch);
54 bjc_put_lo_hi(s, count);
55 }
56
57 /* ---------------- Commands ---------------- */
58
59 /* Line feed (^J) */
60 void
bjc_put_LF(stream * s)61 bjc_put_LF(stream *s)
62 {
63 spputc(s, 0x0a);
64 }
65
66 /* Form feed (^L) */
67 void
bjc_put_FF(stream * s)68 bjc_put_FF(stream *s)
69 {
70 spputc(s, 0x0c);
71 }
72
73 /* Carriage return (^M) */
74 void
bjc_put_CR(stream * s)75 bjc_put_CR(stream *s)
76 {
77 spputc(s, 0x0d);
78 }
79
80 /* Return to initial condition (ESC @) */
81 void
bjc_put_initialize(stream * s)82 bjc_put_initialize(stream *s)
83 {
84 bjc_put_bytes(s, (const byte *)"\033@", 2);
85 }
86
87 /* Set initial condition (ESC [ K <count> <init> <id> <parm1> <parm2>) */
88 void
bjc_put_set_initial(stream * s)89 bjc_put_set_initial(stream *s)
90 {
91 bjc_put_bytes(s, (const byte *)"\033[K\002\000\000\017", 7);
92 }
93
94 /* Set data compression (ESC [ b <count> <state>) */
95 void
bjc_put_set_compression(stream * s,bjc_raster_compression_t compression)96 bjc_put_set_compression(stream *s, bjc_raster_compression_t compression)
97 {
98 bjc_put_command(s, 'b', 1);
99 spputc(s, compression);
100 }
101
102 /* Select print method (ESC ( c <count> <parm1> <parm2> [<parm3>]) */
103 void
bjc_put_print_method_short(stream * s,bjc_print_color_short_t color)104 bjc_put_print_method_short(stream *s, bjc_print_color_short_t color)
105 {
106 bjc_put_command(s, 'c', 1);
107 spputc(s, color);
108 }
109 void
bjc_put_print_method(stream * s,bjc_print_color_t color,bjc_print_media_t media,bjc_print_quality_t quality,bjc_black_density_t density)110 bjc_put_print_method(stream *s, bjc_print_color_t color,
111 bjc_print_media_t media, bjc_print_quality_t quality,
112 bjc_black_density_t density)
113 {
114 bjc_put_command(s, 'c', 2 + (density != 0));
115 spputc(s, 0x10 | color);
116 spputc(s, (media << 4) | quality);
117 if (density)
118 spputc(s, density << 4);
119 }
120
121 /* Set raster resolution (ESC ( d <count> <y_res> [<x_res>]) */
122 void
bjc_put_raster_resolution(stream * s,int x_resolution,int y_resolution)123 bjc_put_raster_resolution(stream *s, int x_resolution, int y_resolution)
124 {
125 if (x_resolution == y_resolution) {
126 bjc_put_command(s, 'd', 2);
127 } else {
128 bjc_put_command(s, 'd', 4);
129 bjc_put_hi_lo(s, y_resolution);
130 }
131 bjc_put_hi_lo(s, x_resolution);
132 }
133
134 /* Raster skip (ESC ( e <count> <skip>) */
135 void
bjc_put_raster_skip(stream * s,int skip)136 bjc_put_raster_skip(stream *s, int skip)
137 {
138 bjc_put_command(s, 'e', 2);
139 bjc_put_hi_lo(s, skip);
140 }
141
142 /* Set page margins (ESC ( g <count> <length> <lm> <rm> <top>) */
143 void
bjc_put_page_margins(stream * s,int length,int lm,int rm,int top)144 bjc_put_page_margins(stream *s, int length, int lm, int rm, int top)
145 {
146 byte parms[4];
147 int count;
148
149 parms[0] = length, parms[1] = lm, parms[2] = rm, parms[3] = top;
150 count = 4; /* could be 1..3 */
151 bjc_put_command(s, 'g', count);
152 bjc_put_bytes(s, parms, count);
153 }
154
155 /* Set media supply method (ESC * l <count> <parm1> <parm2>) */
156 void
bjc_put_media_supply(stream * s,bjc_media_supply_t supply,bjc_media_type_t type)157 bjc_put_media_supply(stream *s, bjc_media_supply_t supply,
158 bjc_media_type_t type)
159 {
160 bjc_put_command(s, 'l', 2);
161 spputc(s, 0x10 | supply);
162 spputc(s, type << 4);
163 }
164
165 /* Identify ink cartridge (ESC ( m <count> <type>) */
166 void
bjc_put_identify_cartridge(stream * s,bjc_identify_cartridge_command_t command)167 bjc_put_identify_cartridge(stream *s,
168 bjc_identify_cartridge_command_t command)
169 {
170 bjc_put_command(s, 'm', 1);
171 spputc(s, command);
172 }
173
174 /* CMYK raster image (ESC ( A <count> <color>) */
175 void
bjc_put_cmyk_image(stream * s,bjc_cmyk_image_component_t component,const byte * data,int count)176 bjc_put_cmyk_image(stream *s, bjc_cmyk_image_component_t component,
177 const byte *data, int count)
178 {
179 bjc_put_command(s, 'A', count + 1);
180 spputc(s, component);
181 bjc_put_bytes(s, data, count);
182 }
183
184 /* Move by raster lines (ESC ( n <count> <lines>) */
185 void
bjc_put_move_lines(stream * s,int lines)186 bjc_put_move_lines(stream *s, int lines)
187 {
188 bjc_put_command(s, 'n', 2);
189 bjc_put_hi_lo(s, lines);
190 }
191
192 /* Set unit for movement by raster lines (ESC ( o <count> <unit>) */
193 void
bjc_put_move_lines_unit(stream * s,int unit)194 bjc_put_move_lines_unit(stream *s, int unit)
195 {
196 bjc_put_command(s, 'o', 2);
197 bjc_put_hi_lo(s, unit);
198 }
199
200 /* Set extended margins (ESC ( p <count> <length60ths> <lm60ths> */
201 /* <rm60ths> <top60ths>) */
202 void
bjc_put_extended_margins(stream * s,int length,int lm,int rm,int top)203 bjc_put_extended_margins(stream *s, int length, int lm, int rm, int top)
204 {
205 bjc_put_command(s, 'p', 8);
206 bjc_put_hi_lo(s, length);
207 bjc_put_hi_lo(s, lm);
208 bjc_put_hi_lo(s, rm);
209 bjc_put_hi_lo(s, top);
210 }
211
212 /* Set image format (ESC ( t <count> <depth> <format> <ink>) */
213 void
bjc_put_image_format(stream * s,int depth,bjc_image_format_t format,bjc_ink_system_t ink)214 bjc_put_image_format(stream *s, int depth, bjc_image_format_t format,
215 bjc_ink_system_t ink)
216
217 {
218 bjc_put_command(s, 't', 3);
219 spputc(s, depth);
220 spputc(s, format);
221 spputc(s, ink);
222 }
223
224 /* Page ID (ESC ( q <count> <id>) */
225 void
bjc_put_page_id(stream * s,int id)226 bjc_put_page_id(stream *s, int id)
227 {
228 bjc_put_command(s, 'q', 1);
229 spputc(s, id);
230 }
231
232 /* Continue raster image (ESC ( F <count> <data>) */
233 void
bjc_put_continue_image(stream * s,const byte * data,int count)234 bjc_put_continue_image(stream *s, const byte *data, int count)
235 {
236 bjc_put_command(s, 'F', count);
237 bjc_put_bytes(s, data, count);
238 }
239
240 /* BJ indexed image (ESC ( f <count> R <dot_rows> <dot_cols> <layers> */
241 /* <index>) */
242 void
bjc_put_indexed_image(stream * s,int dot_rows,int dot_cols,int layers)243 bjc_put_indexed_image(stream *s, int dot_rows, int dot_cols, int layers)
244 {
245 bjc_put_command(s, 'f', 5);
246 spputc(s, 'R'); /* per spec */
247 spputc(s, dot_rows);
248 spputc(s, dot_cols);
249 spputc(s, layers);
250 }
251