Mercurial > vim
annotate src/hardcopy.c @ 34686:83875247fbc0 v9.1.0224
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Commit: https://github.com/vim/vim/commit/515f734e687f28f7199b2a8042197624d9f3ec15
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Thu Mar 28 12:01:14 2024 +0100
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Problem: If a line has "right" & "below" virtual text properties,
where the "below" property may be stored first due to lack of
ordering between them, then the line height is calculated to
be 1 more and causes the cursor to far over the line.
Solution: Remove some unnecessary setting of a
`next_right_goes_below = TRUE` flag for "below" and "above"
text properties. (Dylan Thacker-Smith)
I modified a regression test I recently added to cover this case,
leveraging the fact that "after", "right" & "below" text properties are
being stored in the reverse of the order they are added in. The
previous version of this regression test was crafted to workaround this
issue so it can be addressed by this separate patch.
closes: #14317
Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 28 Mar 2024 12:15:03 +0100 |
parents | 1629cc65d78d |
children |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9027
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
442 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 /* | |
11 * hardcopy.c: printing to paper | |
12 */ | |
13 | |
14 #include "vim.h" | |
15 #include "version.h" | |
16 | |
17 #if defined(FEAT_PRINTER) || defined(PROTO) | |
18 /* | |
19 * To implement printing on a platform, the following functions must be | |
20 * defined: | |
21 * | |
22 * int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) | |
23 * Called once. Code should display printer dialogue (if appropriate) and | |
24 * determine printer font and margin settings. Reset has_color if the printer | |
25 * doesn't support colors at all. | |
26 * Returns FAIL to abort. | |
27 * | |
28 * int mch_print_begin(prt_settings_T *settings) | |
29 * Called to start the print job. | |
30 * Return FALSE to abort. | |
31 * | |
32 * int mch_print_begin_page(char_u *msg) | |
33 * Called at the start of each page. | |
34 * "msg" indicates the progress of the print job, can be NULL. | |
35 * Return FALSE to abort. | |
36 * | |
37 * int mch_print_end_page() | |
38 * Called at the end of each page. | |
39 * Return FALSE to abort. | |
40 * | |
41 * int mch_print_blank_page() | |
42 * Called to generate a blank page for collated, duplex, multiple copy | |
43 * document. Return FALSE to abort. | |
44 * | |
45 * void mch_print_end(prt_settings_T *psettings) | |
46 * Called at normal end of print job. | |
47 * | |
48 * void mch_print_cleanup() | |
49 * Called if print job ends normally or is abandoned. Free any memory, close | |
50 * devices and handles. Also called when mch_print_begin() fails, but not | |
51 * when mch_print_init() fails. | |
52 * | |
53 * void mch_print_set_font(int Bold, int Italic, int Underline); | |
54 * Called whenever the font style changes. | |
55 * | |
843 | 56 * void mch_print_set_bg(long_u bgcol); |
442 | 57 * Called to set the background color for the following text. Parameter is an |
58 * RGB value. | |
59 * | |
843 | 60 * void mch_print_set_fg(long_u fgcol); |
442 | 61 * Called to set the foreground color for the following text. Parameter is an |
62 * RGB value. | |
63 * | |
64 * mch_print_start_line(int margin, int page_line) | |
65 * Sets the current position at the start of line "page_line". | |
66 * If margin is TRUE start in the left margin (for header and line number). | |
67 * | |
68 * int mch_print_text_out(char_u *p, int len); | |
69 * Output one character of text p[len] at the current position. | |
70 * Return TRUE if there is no room for another character in the same line. | |
71 * | |
72 * Note that the generic code has no idea of margins. The machine code should | |
73 * simply make the page look smaller! The header and the line numbers are | |
74 * printed in the margin. | |
75 */ | |
76 | |
77 #ifdef FEAT_SYN_HL | |
78 static const long_u cterm_color_8[8] = | |
79 { | |
80 (long_u)0x000000L, (long_u)0xff0000L, (long_u)0x00ff00L, (long_u)0xffff00L, | |
81 (long_u)0x0000ffL, (long_u)0xff00ffL, (long_u)0x00ffffL, (long_u)0xffffffL | |
82 }; | |
83 | |
84 static const long_u cterm_color_16[16] = | |
85 { | |
86 (long_u)0x000000L, (long_u)0x0000c0L, (long_u)0x008000L, (long_u)0x004080L, | |
87 (long_u)0xc00000L, (long_u)0xc000c0L, (long_u)0x808000L, (long_u)0xc0c0c0L, | |
88 (long_u)0x808080L, (long_u)0x6060ffL, (long_u)0x00ff00L, (long_u)0x00ffffL, | |
89 (long_u)0xff8080L, (long_u)0xff40ffL, (long_u)0xffff00L, (long_u)0xffffffL | |
90 }; | |
91 | |
92 static int current_syn_id; | |
93 #endif | |
94 | |
95 #define PRCOLOR_BLACK (long_u)0 | |
96 #define PRCOLOR_WHITE (long_u)0xFFFFFFL | |
97 | |
98 static int curr_italic; | |
99 static int curr_bold; | |
100 static int curr_underline; | |
101 static long_u curr_bg; | |
102 static long_u curr_fg; | |
103 static int page_count; | |
104 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
105 #if defined(FEAT_POSTSCRIPT) |
442 | 106 # define OPT_MBFONT_USECOURIER 0 |
107 # define OPT_MBFONT_ASCII 1 | |
108 # define OPT_MBFONT_REGULAR 2 | |
856 | 109 # define OPT_MBFONT_BOLD 3 |
442 | 110 # define OPT_MBFONT_OBLIQUE 4 |
111 # define OPT_MBFONT_BOLDOBLIQUE 5 | |
112 # define OPT_MBFONT_NUM_OPTIONS 6 | |
113 | |
114 static option_table_T mbfont_opts[OPT_MBFONT_NUM_OPTIONS] = | |
115 { | |
116 {"c", FALSE, 0, NULL, 0, FALSE}, | |
117 {"a", FALSE, 0, NULL, 0, FALSE}, | |
118 {"r", FALSE, 0, NULL, 0, FALSE}, | |
119 {"b", FALSE, 0, NULL, 0, FALSE}, | |
120 {"i", FALSE, 0, NULL, 0, FALSE}, | |
121 {"o", FALSE, 0, NULL, 0, FALSE}, | |
122 }; | |
123 #endif | |
124 | |
125 /* | |
126 * These values determine the print position on a page. | |
127 */ | |
128 typedef struct | |
129 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
130 int lead_spaces; // remaining spaces for a TAB |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
131 int print_pos; // virtual column for computing TABs |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
132 colnr_T column; // byte column |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
133 linenr_T file_line; // line nr in the buffer |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
134 long_u bytes_printed; // bytes printed so far |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
135 int ff; // seen form feed character |
442 | 136 } prt_pos_T; |
137 | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
138 static char *parse_list_options(char_u *option_str, option_table_T *table, int table_size); |
442 | 139 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6759
diff
changeset
|
140 static colnr_T hardcopy_line(prt_settings_T *psettings, int page_line, prt_pos_T *ppos); |
442 | 141 |
142 /* | |
143 * Parse 'printoptions' and set the flags in "printer_opts". | |
144 * Returns an error message or NULL; | |
145 */ | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
146 char * |
31996
ca6bc7c04163
patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents:
31667
diff
changeset
|
147 parse_printoptions(optset_T *args UNUSED) |
442 | 148 { |
149 return parse_list_options(p_popt, printer_opts, OPT_PRINT_NUM_OPTIONS); | |
150 } | |
151 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
152 #if defined(FEAT_POSTSCRIPT) || defined(PROTO) |
442 | 153 /* |
8969
c83e2c1e7f2b
commit https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd
Christian Brabandt <cb@256bit.org>
parents:
8829
diff
changeset
|
154 * Parse 'printmbfont' and set the flags in "mbfont_opts". |
442 | 155 * Returns an error message or NULL; |
156 */ | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
157 char * |
31996
ca6bc7c04163
patch 9.0.1330: handling new value of an option has a long "else if" chain
Bram Moolenaar <Bram@vim.org>
parents:
31667
diff
changeset
|
158 parse_printmbfont(optset_T *args UNUSED) |
442 | 159 { |
160 return parse_list_options(p_pmfn, mbfont_opts, OPT_MBFONT_NUM_OPTIONS); | |
161 } | |
162 #endif | |
163 | |
164 /* | |
165 * Parse a list of options in the form | |
166 * option:value,option:value,option:value | |
167 * | |
168 * "value" can start with a number which is parsed out, e.g. margin:12mm | |
169 * | |
170 * Returns an error message for an illegal option, NULL otherwise. | |
171 * Only used for the printer at the moment... | |
172 */ | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
173 static char * |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
174 parse_list_options( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
175 char_u *option_str, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
176 option_table_T *table, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
177 int table_size) |
442 | 178 { |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
179 option_table_T *old_opts; |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
180 char *ret = NULL; |
442 | 181 char_u *stringp; |
182 char_u *colonp; | |
183 char_u *commap; | |
184 char_u *p; | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
185 int idx = 0; // init for GCC |
442 | 186 int len; |
187 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
188 // Save the old values, so that they can be restored in case of an error. |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16621
diff
changeset
|
189 old_opts = ALLOC_MULT(option_table_T, table_size); |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
190 if (old_opts == NULL) |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
191 return NULL; |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
192 |
442 | 193 for (idx = 0; idx < table_size; ++idx) |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
194 { |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
195 old_opts[idx] = table[idx]; |
442 | 196 table[idx].present = FALSE; |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
197 } |
442 | 198 |
199 /* | |
200 * Repeat for all comma separated parts. | |
201 */ | |
202 stringp = option_str; | |
203 while (*stringp) | |
204 { | |
205 colonp = vim_strchr(stringp, ':'); | |
206 if (colonp == NULL) | |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
207 { |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26915
diff
changeset
|
208 ret = e_missing_colon_3; |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
209 break; |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
210 } |
442 | 211 commap = vim_strchr(stringp, ','); |
212 if (commap == NULL) | |
213 commap = option_str + STRLEN(option_str); | |
214 | |
215 len = (int)(colonp - stringp); | |
216 | |
217 for (idx = 0; idx < table_size; ++idx) | |
218 if (STRNICMP(stringp, table[idx].name, len) == 0) | |
219 break; | |
220 | |
221 if (idx == table_size) | |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
222 { |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26915
diff
changeset
|
223 ret = e_illegal_component; |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
224 break; |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
225 } |
442 | 226 p = colonp + 1; |
227 table[idx].present = TRUE; | |
228 | |
229 if (table[idx].hasnum) | |
230 { | |
231 if (!VIM_ISDIGIT(*p)) | |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
232 { |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26915
diff
changeset
|
233 ret = e_digit_expected_2; |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
234 break; |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
235 } |
442 | 236 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
237 table[idx].number = getdigits(&p); // advances p |
442 | 238 } |
239 | |
240 table[idx].string = p; | |
241 table[idx].strlen = (int)(commap - p); | |
242 | |
243 stringp = commap; | |
244 if (*stringp == ',') | |
245 ++stringp; | |
246 } | |
247 | |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
248 if (ret != NULL) |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
249 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
250 // Restore old options in case of error |
8829
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
251 for (idx = 0; idx < table_size; ++idx) |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
252 table[idx] = old_opts[idx]; |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
253 } |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
254 vim_free(old_opts); |
a2c27f6aaf3a
commit https://github.com/vim/vim/commit/4afc7c5d4a73340831077a02bfe1f74935e7f4a1
Christian Brabandt <cb@256bit.org>
parents:
8524
diff
changeset
|
255 return ret; |
442 | 256 } |
257 | |
258 | |
259 #ifdef FEAT_SYN_HL | |
260 /* | |
261 * If using a dark background, the colors will probably be too bright to show | |
262 * up well on white paper, so reduce their brightness. | |
263 */ | |
264 static long_u | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
265 darken_rgb(long_u rgb) |
442 | 266 { |
267 return ((rgb >> 17) << 16) | |
268 + (((rgb & 0xff00) >> 9) << 8) | |
269 + ((rgb & 0xff) >> 1); | |
270 } | |
271 | |
272 static long_u | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
273 prt_get_term_color(int colorindex) |
442 | 274 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
275 // TODO: Should check for xterm with 88 or 256 colors. |
442 | 276 if (t_colors > 8) |
277 return cterm_color_16[colorindex % 16]; | |
278 return cterm_color_8[colorindex % 8]; | |
279 } | |
280 | |
281 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
282 prt_get_attr( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
283 int hl_id, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
284 prt_text_attr_T *pattr, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
285 int modec) |
442 | 286 { |
287 int colorindex; | |
288 long_u fg_color; | |
289 long_u bg_color; | |
290 char *color; | |
291 | |
292 pattr->bold = (highlight_has_attr(hl_id, HL_BOLD, modec) != NULL); | |
293 pattr->italic = (highlight_has_attr(hl_id, HL_ITALIC, modec) != NULL); | |
294 pattr->underline = (highlight_has_attr(hl_id, HL_UNDERLINE, modec) != NULL); | |
295 pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL); | |
29328
60977de70684
patch 9.0.0007: no support for double, dotted and dashed underlines
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
296 // TODO: HL_UNDERDOUBLE, HL_UNDERDOTTED, HL_UNDERDASHED |
442 | 297 |
9027
773d627cac0b
commit https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162
Christian Brabandt <cb@256bit.org>
parents:
8969
diff
changeset
|
298 # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) |
8969
c83e2c1e7f2b
commit https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd
Christian Brabandt <cb@256bit.org>
parents:
8829
diff
changeset
|
299 if (USE_24BIT) |
442 | 300 { |
301 bg_color = highlight_gui_color_rgb(hl_id, FALSE); | |
302 if (bg_color == PRCOLOR_BLACK) | |
303 bg_color = PRCOLOR_WHITE; | |
304 | |
305 fg_color = highlight_gui_color_rgb(hl_id, TRUE); | |
306 } | |
307 else | |
308 # endif | |
309 { | |
310 bg_color = PRCOLOR_WHITE; | |
311 | |
312 color = (char *)highlight_color(hl_id, (char_u *)"fg", modec); | |
313 if (color == NULL) | |
314 colorindex = 0; | |
315 else | |
316 colorindex = atoi(color); | |
317 | |
318 if (colorindex >= 0 && colorindex < t_colors) | |
319 fg_color = prt_get_term_color(colorindex); | |
320 else | |
321 fg_color = PRCOLOR_BLACK; | |
322 } | |
323 | |
324 if (fg_color == PRCOLOR_WHITE) | |
325 fg_color = PRCOLOR_BLACK; | |
326 else if (*p_bg == 'd') | |
327 fg_color = darken_rgb(fg_color); | |
328 | |
329 pattr->fg_color = fg_color; | |
330 pattr->bg_color = bg_color; | |
331 } | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
332 #endif // FEAT_SYN_HL |
442 | 333 |
334 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
335 prt_set_fg(long_u fg) |
442 | 336 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
337 if (fg == curr_fg) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
338 return; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
339 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
340 curr_fg = fg; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
341 mch_print_set_fg(fg); |
442 | 342 } |
343 | |
344 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
345 prt_set_bg(long_u bg) |
442 | 346 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
347 if (bg == curr_bg) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
348 return; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
349 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
350 curr_bg = bg; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
351 mch_print_set_bg(bg); |
442 | 352 } |
353 | |
354 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
355 prt_set_font(int bold, int italic, int underline) |
442 | 356 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
357 if (curr_bold == bold |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
358 && curr_italic == italic |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
359 && curr_underline == underline) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
360 return; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
361 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
362 curr_underline = underline; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
363 curr_italic = italic; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
364 curr_bold = bold; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
365 mch_print_set_font(bold, italic, underline); |
442 | 366 } |
367 | |
368 /* | |
369 * Print the line number in the left margin. | |
370 */ | |
371 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
372 prt_line_number( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
373 prt_settings_T *psettings, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
374 int page_line, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
375 linenr_T lnum) |
442 | 376 { |
377 int i; | |
378 char_u tbuf[20]; | |
379 | |
380 prt_set_fg(psettings->number.fg_color); | |
381 prt_set_bg(psettings->number.bg_color); | |
382 prt_set_font(psettings->number.bold, psettings->number.italic, psettings->number.underline); | |
383 mch_print_start_line(TRUE, page_line); | |
384 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
385 // Leave two spaces between the number and the text; depends on |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
386 // PRINT_NUMBER_WIDTH. |
442 | 387 sprintf((char *)tbuf, "%6ld", (long)lnum); |
388 for (i = 0; i < 6; i++) | |
389 (void)mch_print_text_out(&tbuf[i], 1); | |
390 | |
391 #ifdef FEAT_SYN_HL | |
392 if (psettings->do_syntax) | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
393 // Set colors for next character. |
442 | 394 current_syn_id = -1; |
395 else | |
396 #endif | |
397 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
398 // Set colors and font back to normal. |
442 | 399 prt_set_fg(PRCOLOR_BLACK); |
400 prt_set_bg(PRCOLOR_WHITE); | |
401 prt_set_font(FALSE, FALSE, FALSE); | |
402 } | |
403 } | |
404 | |
405 /* | |
406 * Get the currently effective header height. | |
407 */ | |
408 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
409 prt_header_height(void) |
442 | 410 { |
411 if (printer_opts[OPT_PRINT_HEADERHEIGHT].present) | |
412 return printer_opts[OPT_PRINT_HEADERHEIGHT].number; | |
413 return 2; | |
414 } | |
415 | |
416 /* | |
417 * Return TRUE if using a line number for printing. | |
418 */ | |
419 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
420 prt_use_number(void) |
442 | 421 { |
422 return (printer_opts[OPT_PRINT_NUMBER].present | |
423 && TOLOWER_ASC(printer_opts[OPT_PRINT_NUMBER].string[0]) == 'y'); | |
424 } | |
425 | |
426 /* | |
427 * Return the unit used in a margin item in 'printoptions'. | |
428 * Returns PRT_UNIT_NONE if not recognized. | |
429 */ | |
430 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
431 prt_get_unit(int idx) |
442 | 432 { |
433 int u = PRT_UNIT_NONE; | |
434 int i; | |
435 static char *(units[4]) = PRT_UNIT_NAMES; | |
436 | |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
437 if (!printer_opts[idx].present) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
438 return PRT_UNIT_NONE; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
439 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
440 for (i = 0; i < 4; ++i) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
441 if (STRNICMP(printer_opts[idx].string, units[i], 2) == 0) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
442 { |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
443 u = i; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
444 break; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
445 } |
442 | 446 return u; |
447 } | |
448 | |
449 /* | |
450 * Print the page header. | |
451 */ | |
452 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
453 prt_header( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
454 prt_settings_T *psettings, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
455 int pagenum, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
456 linenr_T lnum UNUSED) |
442 | 457 { |
458 int width = psettings->chars_per_line; | |
459 int page_line; | |
460 char_u *tbuf; | |
461 char_u *p; | |
462 int l; | |
463 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
464 // Also use the space for the line number. |
442 | 465 if (prt_use_number()) |
466 width += PRINT_NUMBER_WIDTH; | |
467 | |
468 tbuf = alloc(width + IOSIZE); | |
469 if (tbuf == NULL) | |
470 return; | |
471 | |
472 #ifdef FEAT_STL_OPT | |
473 if (*p_header != NUL) | |
474 { | |
475 linenr_T tmp_lnum, tmp_topline, tmp_botline; | |
476 | |
477 /* | |
478 * Need to (temporarily) set current line number and first/last line | |
479 * number on the 'window'. Since we don't know how long the page is, | |
480 * set the first and current line number to the top line, and guess | |
481 * that the page length is 64. | |
482 */ | |
483 tmp_lnum = curwin->w_cursor.lnum; | |
484 tmp_topline = curwin->w_topline; | |
485 tmp_botline = curwin->w_botline; | |
486 curwin->w_cursor.lnum = lnum; | |
487 curwin->w_topline = lnum; | |
488 curwin->w_botline = lnum + 63; | |
489 printer_page_num = pagenum; | |
490 | |
31018
9716c7d24c12
patch 9.0.0844: handling 'statusline' errors is spread out
Bram Moolenaar <Bram@vim.org>
parents:
29328
diff
changeset
|
491 build_stl_str_hl(curwin, tbuf, (size_t)(width + IOSIZE), p_header, |
9716c7d24c12
patch 9.0.0844: handling 'statusline' errors is spread out
Bram Moolenaar <Bram@vim.org>
parents:
29328
diff
changeset
|
492 (char_u *)"printheader", 0, ' ', width, NULL, NULL); |
442 | 493 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
494 // Reset line numbers |
442 | 495 curwin->w_cursor.lnum = tmp_lnum; |
496 curwin->w_topline = tmp_topline; | |
497 curwin->w_botline = tmp_botline; | |
498 } | |
499 else | |
500 #endif | |
501 sprintf((char *)tbuf, _("Page %d"), pagenum); | |
502 | |
503 prt_set_fg(PRCOLOR_BLACK); | |
504 prt_set_bg(PRCOLOR_WHITE); | |
505 prt_set_font(TRUE, FALSE, FALSE); | |
506 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
507 // Use a negative line number to indicate printing in the top margin. |
442 | 508 page_line = 0 - prt_header_height(); |
509 mch_print_start_line(TRUE, page_line); | |
510 for (p = tbuf; *p != NUL; ) | |
511 { | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
512 if (mch_print_text_out(p, (l = (*mb_ptr2len)(p)))) |
442 | 513 { |
514 ++page_line; | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
515 if (page_line >= 0) // out of room in header |
442 | 516 break; |
517 mch_print_start_line(TRUE, page_line); | |
518 } | |
519 p += l; | |
520 } | |
521 | |
522 vim_free(tbuf); | |
523 | |
524 #ifdef FEAT_SYN_HL | |
525 if (psettings->do_syntax) | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
526 // Set colors for next character. |
442 | 527 current_syn_id = -1; |
528 else | |
529 #endif | |
530 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
531 // Set colors and font back to normal. |
442 | 532 prt_set_fg(PRCOLOR_BLACK); |
533 prt_set_bg(PRCOLOR_WHITE); | |
534 prt_set_font(FALSE, FALSE, FALSE); | |
535 } | |
536 } | |
537 | |
538 /* | |
539 * Display a print status message. | |
540 */ | |
541 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
542 prt_message(char_u *s) |
442 | 543 { |
544 screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0); | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
545 screen_puts(s, (int)Rows - 1, 0, HL_ATTR(HLF_R)); |
442 | 546 out_flush(); |
547 } | |
548 | |
549 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
550 ex_hardcopy(exarg_T *eap) |
442 | 551 { |
552 linenr_T lnum; | |
553 int collated_copies, uncollated_copies; | |
554 prt_settings_T settings; | |
555 long_u bytes_to_print = 0; | |
556 int page_line; | |
557 int jobsplit; | |
558 | |
20007
aadd1cae2ff5
patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents:
18798
diff
changeset
|
559 CLEAR_FIELD(settings); |
442 | 560 settings.has_color = TRUE; |
561 | |
562 # ifdef FEAT_POSTSCRIPT | |
563 if (*eap->arg == '>') | |
564 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
565 char *errormsg = NULL; |
442 | 566 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
567 // Expand things like "%.ps". |
442 | 568 if (expand_filename(eap, eap->cmdlinep, &errormsg) == FAIL) |
569 { | |
570 if (errormsg != NULL) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
571 emsg(errormsg); |
442 | 572 return; |
573 } | |
574 settings.outfile = skipwhite(eap->arg + 1); | |
575 } | |
576 else if (*eap->arg != NUL) | |
577 settings.arguments = eap->arg; | |
578 # endif | |
579 | |
580 /* | |
581 * Initialise for printing. Ask the user for settings, unless forceit is | |
582 * set. | |
583 * The mch_print_init() code should set up margins if applicable. (It may | |
584 * not be a real printer - for example the engine might generate HTML or | |
585 * PS.) | |
586 */ | |
587 if (mch_print_init(&settings, | |
588 curbuf->b_fname == NULL | |
25852
336e2d9924e6
patch 8.2.3460: some type casts are not needed
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
589 ? buf_spname(curbuf) |
442 | 590 : curbuf->b_sfname == NULL |
591 ? curbuf->b_fname | |
592 : curbuf->b_sfname, | |
593 eap->forceit) == FAIL) | |
594 return; | |
595 | |
596 #ifdef FEAT_SYN_HL | |
597 # ifdef FEAT_GUI | |
598 if (gui.in_use) | |
599 settings.modec = 'g'; | |
600 else | |
601 # endif | |
602 if (t_colors > 1) | |
603 settings.modec = 'c'; | |
604 else | |
605 settings.modec = 't'; | |
606 | |
2250
1bac28a53fae
Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
607 if (!syntax_present(curwin)) |
442 | 608 settings.do_syntax = FALSE; |
609 else if (printer_opts[OPT_PRINT_SYNTAX].present | |
610 && TOLOWER_ASC(printer_opts[OPT_PRINT_SYNTAX].string[0]) != 'a') | |
611 settings.do_syntax = | |
612 (TOLOWER_ASC(printer_opts[OPT_PRINT_SYNTAX].string[0]) == 'y'); | |
613 else | |
614 settings.do_syntax = settings.has_color; | |
615 #endif | |
616 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
617 // Set up printing attributes for line numbers |
442 | 618 settings.number.fg_color = PRCOLOR_BLACK; |
619 settings.number.bg_color = PRCOLOR_WHITE; | |
620 settings.number.bold = FALSE; | |
621 settings.number.italic = TRUE; | |
622 settings.number.underline = FALSE; | |
623 #ifdef FEAT_SYN_HL | |
624 /* | |
625 * Syntax highlighting of line numbers. | |
626 */ | |
627 if (prt_use_number() && settings.do_syntax) | |
628 { | |
744 | 629 int id; |
630 | |
442 | 631 id = syn_name2id((char_u *)"LineNr"); |
632 if (id > 0) | |
633 id = syn_get_final_id(id); | |
634 | |
635 prt_get_attr(id, &settings.number, settings.modec); | |
636 } | |
744 | 637 #endif |
442 | 638 |
639 /* | |
640 * Estimate the total lines to be printed | |
641 */ | |
642 for (lnum = eap->line1; lnum <= eap->line2; lnum++) | |
643 bytes_to_print += (long_u)STRLEN(skipwhite(ml_get(lnum))); | |
644 if (bytes_to_print == 0) | |
645 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
646 msg(_("No text to be printed")); |
442 | 647 goto print_fail_no_begin; |
648 } | |
649 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
650 // Set colors and font to normal. |
442 | 651 curr_bg = (long_u)0xffffffffL; |
652 curr_fg = (long_u)0xffffffffL; | |
653 curr_italic = MAYBE; | |
654 curr_bold = MAYBE; | |
655 curr_underline = MAYBE; | |
656 | |
657 prt_set_fg(PRCOLOR_BLACK); | |
658 prt_set_bg(PRCOLOR_WHITE); | |
659 prt_set_font(FALSE, FALSE, FALSE); | |
660 #ifdef FEAT_SYN_HL | |
661 current_syn_id = -1; | |
662 #endif | |
663 | |
664 jobsplit = (printer_opts[OPT_PRINT_JOBSPLIT].present | |
665 && TOLOWER_ASC(printer_opts[OPT_PRINT_JOBSPLIT].string[0]) == 'y'); | |
666 | |
667 if (!mch_print_begin(&settings)) | |
668 goto print_fail_no_begin; | |
669 | |
670 /* | |
671 * Loop over collated copies: 1 2 3, 1 2 3, ... | |
672 */ | |
673 page_count = 0; | |
674 for (collated_copies = 0; | |
675 collated_copies < settings.n_collated_copies; | |
676 collated_copies++) | |
677 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
678 prt_pos_T prtpos; // current print position |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
679 prt_pos_T page_prtpos; // print position at page start |
442 | 680 int side; |
681 | |
20007
aadd1cae2ff5
patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents:
18798
diff
changeset
|
682 CLEAR_FIELD(page_prtpos); |
442 | 683 page_prtpos.file_line = eap->line1; |
684 prtpos = page_prtpos; | |
685 | |
686 if (jobsplit && collated_copies > 0) | |
687 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
688 // Splitting jobs: Stop a previous job and start a new one. |
442 | 689 mch_print_end(&settings); |
690 if (!mch_print_begin(&settings)) | |
691 goto print_fail_no_begin; | |
692 } | |
693 | |
694 /* | |
695 * Loop over all pages in the print job: 1 2 3 ... | |
696 */ | |
697 for (page_count = 0; prtpos.file_line <= eap->line2; ++page_count) | |
698 { | |
699 /* | |
700 * Loop over uncollated copies: 1 1 1, 2 2 2, 3 3 3, ... | |
701 * For duplex: 12 12 12 34 34 34, ... | |
702 */ | |
703 for (uncollated_copies = 0; | |
704 uncollated_copies < settings.n_uncollated_copies; | |
705 uncollated_copies++) | |
706 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
707 // Set the print position to the start of this page. |
442 | 708 prtpos = page_prtpos; |
709 | |
710 /* | |
711 * Do front and rear side of a page. | |
712 */ | |
713 for (side = 0; side <= settings.duplex; ++side) | |
714 { | |
715 /* | |
716 * Print one page. | |
717 */ | |
718 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
719 // Check for interrupt character every page. |
442 | 720 ui_breakcheck(); |
721 if (got_int || settings.user_abort) | |
722 goto print_fail; | |
723 | |
724 sprintf((char *)IObuff, _("Printing page %d (%d%%)"), | |
725 page_count + 1 + side, | |
726 prtpos.bytes_printed > 1000000 | |
727 ? (int)(prtpos.bytes_printed / | |
728 (bytes_to_print / 100)) | |
729 : (int)((prtpos.bytes_printed * 100) | |
730 / bytes_to_print)); | |
731 if (!mch_print_begin_page(IObuff)) | |
732 goto print_fail; | |
733 | |
734 if (settings.n_collated_copies > 1) | |
735 sprintf((char *)IObuff + STRLEN(IObuff), | |
736 _(" Copy %d of %d"), | |
737 collated_copies + 1, | |
738 settings.n_collated_copies); | |
739 prt_message(IObuff); | |
740 | |
741 /* | |
742 * Output header if required | |
743 */ | |
744 if (prt_header_height() > 0) | |
745 prt_header(&settings, page_count + 1 + side, | |
746 prtpos.file_line); | |
747 | |
748 for (page_line = 0; page_line < settings.lines_per_page; | |
749 ++page_line) | |
750 { | |
751 prtpos.column = hardcopy_line(&settings, | |
752 page_line, &prtpos); | |
753 if (prtpos.column == 0) | |
754 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
755 // finished a file line |
442 | 756 prtpos.bytes_printed += |
757 STRLEN(skipwhite(ml_get(prtpos.file_line))); | |
758 if (++prtpos.file_line > eap->line2) | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
759 break; // reached the end |
442 | 760 } |
761 else if (prtpos.ff) | |
762 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
763 // Line had a formfeed in it - start new page but |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
764 // stay on the current line |
442 | 765 break; |
766 } | |
767 } | |
768 | |
769 if (!mch_print_end_page()) | |
770 goto print_fail; | |
771 if (prtpos.file_line > eap->line2) | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
772 break; // reached the end |
442 | 773 } |
774 | |
775 /* | |
776 * Extra blank page for duplexing with odd number of pages and | |
777 * more copies to come. | |
778 */ | |
779 if (prtpos.file_line > eap->line2 && settings.duplex | |
780 && side == 0 | |
781 && uncollated_copies + 1 < settings.n_uncollated_copies) | |
782 { | |
783 if (!mch_print_blank_page()) | |
784 goto print_fail; | |
785 } | |
786 } | |
787 if (settings.duplex && prtpos.file_line <= eap->line2) | |
788 ++page_count; | |
789 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
790 // Remember the position where the next page starts. |
442 | 791 page_prtpos = prtpos; |
792 } | |
793 | |
794 vim_snprintf((char *)IObuff, IOSIZE, _("Printed: %s"), | |
795 settings.jobname); | |
796 prt_message(IObuff); | |
797 } | |
798 | |
799 print_fail: | |
800 if (got_int || settings.user_abort) | |
801 { | |
802 sprintf((char *)IObuff, "%s", _("Printing aborted")); | |
803 prt_message(IObuff); | |
804 } | |
805 mch_print_end(&settings); | |
806 | |
807 print_fail_no_begin: | |
808 mch_print_cleanup(); | |
809 } | |
810 | |
811 /* | |
812 * Print one page line. | |
813 * Return the next column to print, or zero if the line is finished. | |
814 */ | |
815 static colnr_T | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
816 hardcopy_line( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
817 prt_settings_T *psettings, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
818 int page_line, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
819 prt_pos_T *ppos) |
442 | 820 { |
821 colnr_T col; | |
822 char_u *line; | |
823 int need_break = FALSE; | |
824 int outputlen; | |
825 int tab_spaces; | |
826 long_u print_pos; | |
827 #ifdef FEAT_SYN_HL | |
828 prt_text_attr_T attr; | |
829 int id; | |
830 #endif | |
831 | |
832 if (ppos->column == 0 || ppos->ff) | |
833 { | |
834 print_pos = 0; | |
835 tab_spaces = 0; | |
836 if (!ppos->ff && prt_use_number()) | |
837 prt_line_number(psettings, page_line, ppos->file_line); | |
838 ppos->ff = FALSE; | |
839 } | |
840 else | |
841 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
842 // left over from wrap halfway a tab |
442 | 843 print_pos = ppos->print_pos; |
844 tab_spaces = ppos->lead_spaces; | |
845 } | |
846 | |
847 mch_print_start_line(0, page_line); | |
848 line = ml_get(ppos->file_line); | |
849 | |
850 /* | |
851 * Loop over the columns until the end of the file line or right margin. | |
852 */ | |
853 for (col = ppos->column; line[col] != NUL && !need_break; col += outputlen) | |
854 { | |
855 outputlen = 1; | |
474 | 856 if (has_mbyte && (outputlen = (*mb_ptr2len)(line + col)) < 1) |
442 | 857 outputlen = 1; |
858 #ifdef FEAT_SYN_HL | |
859 /* | |
860 * syntax highlighting stuff. | |
861 */ | |
862 if (psettings->do_syntax) | |
863 { | |
1504 | 864 id = syn_get_id(curwin, ppos->file_line, col, 1, NULL, FALSE); |
442 | 865 if (id > 0) |
866 id = syn_get_final_id(id); | |
867 else | |
868 id = 0; | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
869 // Get the line again, a multi-line regexp may invalidate it. |
442 | 870 line = ml_get(ppos->file_line); |
871 | |
872 if (id != current_syn_id) | |
873 { | |
874 current_syn_id = id; | |
875 prt_get_attr(id, &attr, psettings->modec); | |
876 prt_set_font(attr.bold, attr.italic, attr.underline); | |
877 prt_set_fg(attr.fg_color); | |
878 prt_set_bg(attr.bg_color); | |
879 } | |
880 } | |
744 | 881 #endif |
442 | 882 |
883 /* | |
884 * Appropriately expand any tabs to spaces. | |
885 */ | |
886 if (line[col] == TAB || tab_spaces != 0) | |
887 { | |
888 if (tab_spaces == 0) | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14077
diff
changeset
|
889 #ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14077
diff
changeset
|
890 tab_spaces = tabstop_padding(print_pos, curbuf->b_p_ts, |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14077
diff
changeset
|
891 curbuf->b_p_vts_array); |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14077
diff
changeset
|
892 #else |
835 | 893 tab_spaces = (int)(curbuf->b_p_ts - (print_pos % curbuf->b_p_ts)); |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14077
diff
changeset
|
894 #endif |
442 | 895 |
896 while (tab_spaces > 0) | |
897 { | |
898 need_break = mch_print_text_out((char_u *)" ", 1); | |
899 print_pos++; | |
900 tab_spaces--; | |
901 if (need_break) | |
902 break; | |
903 } | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
904 // Keep the TAB if we didn't finish it. |
442 | 905 if (need_break && tab_spaces > 0) |
906 break; | |
907 } | |
908 else if (line[col] == FF | |
909 && printer_opts[OPT_PRINT_FORMFEED].present | |
910 && TOLOWER_ASC(printer_opts[OPT_PRINT_FORMFEED].string[0]) | |
911 == 'y') | |
912 { | |
913 ppos->ff = TRUE; | |
914 need_break = 1; | |
915 } | |
916 else | |
917 { | |
918 need_break = mch_print_text_out(line + col, outputlen); | |
919 if (has_mbyte) | |
920 print_pos += (*mb_ptr2cells)(line + col); | |
921 else | |
922 print_pos++; | |
923 } | |
924 } | |
925 | |
926 ppos->lead_spaces = tab_spaces; | |
835 | 927 ppos->print_pos = (int)print_pos; |
442 | 928 |
929 /* | |
930 * Start next line of file if we clip lines, or have reached end of the | |
931 * line, unless we are doing a formfeed. | |
932 */ | |
933 if (!ppos->ff | |
934 && (line[col] == NUL | |
935 || (printer_opts[OPT_PRINT_WRAP].present | |
936 && TOLOWER_ASC(printer_opts[OPT_PRINT_WRAP].string[0]) | |
937 == 'n'))) | |
938 return 0; | |
939 return col; | |
940 } | |
941 | |
942 # if defined(FEAT_POSTSCRIPT) || defined(PROTO) | |
943 | |
944 /* | |
945 * PS printer stuff. | |
946 * | |
947 * Sources of information to help maintain the PS printing code: | |
948 * | |
949 * 1. PostScript Language Reference, 3rd Edition, | |
950 * Addison-Wesley, 1999, ISBN 0-201-37922-8 | |
951 * 2. PostScript Language Program Design, | |
952 * Addison-Wesley, 1988, ISBN 0-201-14396-8 | |
953 * 3. PostScript Tutorial and Cookbook, | |
954 * Addison Wesley, 1985, ISBN 0-201-10179-3 | |
955 * 4. PostScript Language Document Structuring Conventions Specification, | |
956 * version 3.0, | |
957 * Adobe Technote 5001, 25th September 1992 | |
958 * 5. PostScript Printer Description File Format Specification, Version 4.3, | |
959 * Adobe technote 5003, 9th February 1996 | |
960 * 6. Adobe Font Metrics File Format Specification, Version 4.1, | |
961 * Adobe Technote 5007, 7th October 1998 | |
962 * 7. Adobe CMap and CIDFont Files Specification, Version 1.0, | |
963 * Adobe Technote 5014, 8th October 1996 | |
964 * 8. Adobe CJKV Character Collections and CMaps for CID-Keyed Fonts, | |
965 * Adoboe Technote 5094, 8th September, 2001 | |
966 * 9. CJKV Information Processing, 2nd Edition, | |
967 * O'Reilly, 2002, ISBN 1-56592-224-7 | |
968 * | |
969 * Some of these documents can be found in PDF form on Adobe's web site - | |
970 * http://www.adobe.com | |
971 */ | |
972 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
973 #define PRT_PS_DEFAULT_DPI (72) // Default user space resolution |
442 | 974 #define PRT_PS_DEFAULT_FONTSIZE (10) |
975 #define PRT_PS_DEFAULT_BUFFER_SIZE (80) | |
976 | |
977 struct prt_mediasize_S | |
978 { | |
979 char *name; | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
980 float width; // width and height in points for portrait |
442 | 981 float height; |
982 }; | |
983 | |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
984 #define PRT_MEDIASIZE_LEN ARRAY_LENGTH(prt_mediasize) |
442 | 985 |
986 static struct prt_mediasize_S prt_mediasize[] = | |
987 { | |
988 {"A4", 595.0, 842.0}, | |
989 {"letter", 612.0, 792.0}, | |
990 {"10x14", 720.0, 1008.0}, | |
991 {"A3", 842.0, 1191.0}, | |
992 {"A5", 420.0, 595.0}, | |
993 {"B4", 729.0, 1032.0}, | |
994 {"B5", 516.0, 729.0}, | |
995 {"executive", 522.0, 756.0}, | |
996 {"folio", 595.0, 935.0}, | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
997 {"ledger", 1224.0, 792.0}, // Yes, it is wider than taller! |
442 | 998 {"legal", 612.0, 1008.0}, |
999 {"quarto", 610.0, 780.0}, | |
1000 {"statement", 396.0, 612.0}, | |
1001 {"tabloid", 792.0, 1224.0} | |
1002 }; | |
1003 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1004 // PS font names, must be in Roman, Bold, Italic, Bold-Italic order |
442 | 1005 struct prt_ps_font_S |
1006 { | |
1007 int wx; | |
1008 int uline_offset; | |
1009 int uline_width; | |
1010 int bbox_min_y; | |
1011 int bbox_max_y; | |
1012 char *(ps_fontname[4]); | |
1013 }; | |
1014 | |
1015 #define PRT_PS_FONT_ROMAN (0) | |
1016 #define PRT_PS_FONT_BOLD (1) | |
1017 #define PRT_PS_FONT_OBLIQUE (2) | |
1018 #define PRT_PS_FONT_BOLDOBLIQUE (3) | |
1019 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1020 // Standard font metrics for Courier family |
442 | 1021 static struct prt_ps_font_S prt_ps_courier_font = |
1022 { | |
1023 600, | |
1024 -100, 50, | |
1025 -250, 805, | |
1026 {"Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique"} | |
1027 }; | |
1028 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1029 // Generic font metrics for multi-byte fonts |
442 | 1030 static struct prt_ps_font_S prt_ps_mb_font = |
1031 { | |
1032 1000, | |
1033 -100, 50, | |
1034 -250, 805, | |
1035 {NULL, NULL, NULL, NULL} | |
1036 }; | |
1037 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1038 // Pointer to current font set being used |
442 | 1039 static struct prt_ps_font_S* prt_ps_font; |
1040 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1041 // Structures to map user named encoding and mapping to PS equivalents for |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1042 // building CID font name |
442 | 1043 struct prt_ps_encoding_S |
1044 { | |
1045 char *encoding; | |
1046 char *cmap_encoding; | |
1047 int needs_charset; | |
1048 }; | |
1049 | |
1050 struct prt_ps_charset_S | |
1051 { | |
1052 char *charset; | |
1053 char *cmap_charset; | |
1054 int has_charset; | |
1055 }; | |
1056 | |
1057 | |
1058 #define CS_JIS_C_1978 (0x01) | |
1059 #define CS_JIS_X_1983 (0x02) | |
1060 #define CS_JIS_X_1990 (0x04) | |
856 | 1061 #define CS_NEC (0x08) |
1062 #define CS_MSWINDOWS (0x10) | |
1063 #define CS_CP932 (0x20) | |
1064 #define CS_KANJITALK6 (0x40) | |
442 | 1065 #define CS_KANJITALK7 (0x80) |
1066 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1067 // Japanese encodings and charsets |
442 | 1068 static struct prt_ps_encoding_S j_encodings[] = |
1069 { | |
1070 {"iso-2022-jp", NULL, (CS_JIS_C_1978|CS_JIS_X_1983|CS_JIS_X_1990| | |
856 | 1071 CS_NEC)}, |
1072 {"euc-jp", "EUC", (CS_JIS_C_1978|CS_JIS_X_1983|CS_JIS_X_1990)}, | |
1073 {"sjis", "RKSJ", (CS_JIS_C_1978|CS_JIS_X_1983|CS_MSWINDOWS| | |
1074 CS_KANJITALK6|CS_KANJITALK7)}, | |
442 | 1075 {"cp932", "RKSJ", CS_JIS_X_1983}, |
1076 {"ucs-2", "UCS2", CS_JIS_X_1990}, | |
1077 {"utf-8", "UTF8" , CS_JIS_X_1990} | |
1078 }; | |
1079 static struct prt_ps_charset_S j_charsets[] = | |
1080 { | |
1081 {"JIS_C_1978", "78", CS_JIS_C_1978}, | |
1082 {"JIS_X_1983", NULL, CS_JIS_X_1983}, | |
1083 {"JIS_X_1990", "Hojo", CS_JIS_X_1990}, | |
856 | 1084 {"NEC", "Ext", CS_NEC}, |
442 | 1085 {"MSWINDOWS", "90ms", CS_MSWINDOWS}, |
1086 {"CP932", "90ms", CS_JIS_X_1983}, | |
1087 {"KANJITALK6", "83pv", CS_KANJITALK6}, | |
1088 {"KANJITALK7", "90pv", CS_KANJITALK7} | |
1089 }; | |
1090 | |
1091 #define CS_GB_2312_80 (0x01) | |
1092 #define CS_GBT_12345_90 (0x02) | |
856 | 1093 #define CS_GBK2K (0x04) |
1094 #define CS_SC_MAC (0x08) | |
1095 #define CS_GBT_90_MAC (0x10) | |
1096 #define CS_GBK (0x20) | |
442 | 1097 #define CS_SC_ISO10646 (0x40) |
1098 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1099 // Simplified Chinese encodings and charsets |
442 | 1100 static struct prt_ps_encoding_S sc_encodings[] = |
1101 { | |
1102 {"iso-2022", NULL, (CS_GB_2312_80|CS_GBT_12345_90)}, | |
1103 {"gb18030", NULL, CS_GBK2K}, | |
1104 {"euc-cn", "EUC", (CS_GB_2312_80|CS_GBT_12345_90|CS_SC_MAC| | |
856 | 1105 CS_GBT_90_MAC)}, |
1106 {"gbk", "EUC", CS_GBK}, | |
442 | 1107 {"ucs-2", "UCS2", CS_SC_ISO10646}, |
1108 {"utf-8", "UTF8", CS_SC_ISO10646} | |
1109 }; | |
1110 static struct prt_ps_charset_S sc_charsets[] = | |
1111 { | |
1112 {"GB_2312-80", "GB", CS_GB_2312_80}, | |
1113 {"GBT_12345-90","GBT", CS_GBT_12345_90}, | |
856 | 1114 {"MAC", "GBpc", CS_SC_MAC}, |
1115 {"GBT-90_MAC", "GBTpc", CS_GBT_90_MAC}, | |
1116 {"GBK", "GBK", CS_GBK}, | |
442 | 1117 {"GB18030", "GBK2K", CS_GBK2K}, |
1118 {"ISO10646", "UniGB", CS_SC_ISO10646} | |
1119 }; | |
1120 | |
1121 #define CS_CNS_PLANE_1 (0x01) | |
1122 #define CS_CNS_PLANE_2 (0x02) | |
1123 #define CS_CNS_PLANE_1_2 (0x04) | |
856 | 1124 #define CS_B5 (0x08) |
1125 #define CS_ETEN (0x10) | |
1126 #define CS_HK_GCCS (0x20) | |
1127 #define CS_HK_SCS (0x40) | |
1128 #define CS_HK_SCS_ETEN (0x80) | |
1129 #define CS_MTHKL (0x100) | |
1130 #define CS_MTHKS (0x200) | |
1131 #define CS_DLHKL (0x400) | |
1132 #define CS_DLHKS (0x800) | |
1133 #define CS_TC_ISO10646 (0x1000) | |
442 | 1134 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1135 // Traditional Chinese encodings and charsets |
442 | 1136 static struct prt_ps_encoding_S tc_encodings[] = |
1137 { | |
1138 {"iso-2022", NULL, (CS_CNS_PLANE_1|CS_CNS_PLANE_2)}, | |
1139 {"euc-tw", "EUC", CS_CNS_PLANE_1_2}, | |
856 | 1140 {"big5", "B5", (CS_B5|CS_ETEN|CS_HK_GCCS|CS_HK_SCS| |
1141 CS_HK_SCS_ETEN|CS_MTHKL|CS_MTHKS|CS_DLHKL| | |
1142 CS_DLHKS)}, | |
442 | 1143 {"cp950", "B5", CS_B5}, |
1144 {"ucs-2", "UCS2", CS_TC_ISO10646}, | |
1145 {"utf-8", "UTF8", CS_TC_ISO10646}, | |
1146 {"utf-16", "UTF16", CS_TC_ISO10646}, | |
1147 {"utf-32", "UTF32", CS_TC_ISO10646} | |
1148 }; | |
1149 static struct prt_ps_charset_S tc_charsets[] = | |
1150 { | |
1151 {"CNS_1992_1", "CNS1", CS_CNS_PLANE_1}, | |
1152 {"CNS_1992_2", "CNS2", CS_CNS_PLANE_2}, | |
1153 {"CNS_1993", "CNS", CS_CNS_PLANE_1_2}, | |
856 | 1154 {"BIG5", NULL, CS_B5}, |
1155 {"CP950", NULL, CS_B5}, | |
1156 {"ETEN", "ETen", CS_ETEN}, | |
1157 {"HK_GCCS", "HKgccs", CS_HK_GCCS}, | |
1158 {"SCS", "HKscs", CS_HK_SCS}, | |
442 | 1159 {"SCS_ETEN", "ETHK", CS_HK_SCS_ETEN}, |
1160 {"MTHKL", "HKm471", CS_MTHKL}, | |
1161 {"MTHKS", "HKm314", CS_MTHKS}, | |
1162 {"DLHKL", "HKdla", CS_DLHKL}, | |
1163 {"DLHKS", "HKdlb", CS_DLHKS}, | |
1164 {"ISO10646", "UniCNS", CS_TC_ISO10646} | |
1165 }; | |
1166 | |
856 | 1167 #define CS_KR_X_1992 (0x01) |
1168 #define CS_KR_MAC (0x02) | |
442 | 1169 #define CS_KR_X_1992_MS (0x04) |
1170 #define CS_KR_ISO10646 (0x08) | |
1171 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1172 // Korean encodings and charsets |
442 | 1173 static struct prt_ps_encoding_S k_encodings[] = |
1174 { | |
1175 {"iso-2022-kr", NULL, CS_KR_X_1992}, | |
1176 {"euc-kr", "EUC", (CS_KR_X_1992|CS_KR_MAC)}, | |
1177 {"johab", "Johab", CS_KR_X_1992}, | |
1178 {"cp1361", "Johab", CS_KR_X_1992}, | |
856 | 1179 {"uhc", "UHC", CS_KR_X_1992_MS}, |
442 | 1180 {"cp949", "UHC", CS_KR_X_1992_MS}, |
1181 {"ucs-2", "UCS2", CS_KR_ISO10646}, | |
1182 {"utf-8", "UTF8", CS_KR_ISO10646} | |
1183 }; | |
1184 static struct prt_ps_charset_S k_charsets[] = | |
1185 { | |
1186 {"KS_X_1992", "KSC", CS_KR_X_1992}, | |
1187 {"CP1361", "KSC", CS_KR_X_1992}, | |
856 | 1188 {"MAC", "KSCpc", CS_KR_MAC}, |
442 | 1189 {"MSWINDOWS", "KSCms", CS_KR_X_1992_MS}, |
1190 {"CP949", "KSCms", CS_KR_X_1992_MS}, | |
1191 {"WANSUNG", "KSCms", CS_KR_X_1992_MS}, | |
1192 {"ISO10646", "UniKS", CS_KR_ISO10646} | |
1193 }; | |
1194 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1195 // Collections of encodings and charsets for multi-byte printing |
442 | 1196 struct prt_ps_mbfont_S |
1197 { | |
856 | 1198 int num_encodings; |
1199 struct prt_ps_encoding_S *encodings; | |
1200 int num_charsets; | |
1201 struct prt_ps_charset_S *charsets; | |
1202 char *ascii_enc; | |
1203 char *defcs; | |
442 | 1204 }; |
1205 | |
1206 static struct prt_ps_mbfont_S prt_ps_mbfonts[] = | |
1207 { | |
1208 { | |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1209 ARRAY_LENGTH(j_encodings), |
856 | 1210 j_encodings, |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1211 ARRAY_LENGTH(j_charsets), |
856 | 1212 j_charsets, |
1213 "jis_roman", | |
1214 "JIS_X_1983" | |
442 | 1215 }, |
1216 { | |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1217 ARRAY_LENGTH(sc_encodings), |
856 | 1218 sc_encodings, |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1219 ARRAY_LENGTH(sc_charsets), |
856 | 1220 sc_charsets, |
1221 "gb_roman", | |
1222 "GB_2312-80" | |
442 | 1223 }, |
1224 { | |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1225 ARRAY_LENGTH(tc_encodings), |
856 | 1226 tc_encodings, |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1227 ARRAY_LENGTH(tc_charsets), |
856 | 1228 tc_charsets, |
1229 "cns_roman", | |
1230 "BIG5" | |
442 | 1231 }, |
1232 { | |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1233 ARRAY_LENGTH(k_encodings), |
856 | 1234 k_encodings, |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1235 ARRAY_LENGTH(k_charsets), |
856 | 1236 k_charsets, |
1237 "ks_roman", | |
1238 "KS_X_1992" | |
442 | 1239 } |
1240 }; | |
1241 | |
1242 struct prt_ps_resource_S | |
1243 { | |
1244 char_u name[64]; | |
1245 char_u filename[MAXPATHL + 1]; | |
1246 int type; | |
1247 char_u title[256]; | |
1248 char_u version[256]; | |
1249 }; | |
1250 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1251 // Types of PS resource file currently used |
442 | 1252 #define PRT_RESOURCE_TYPE_PROCSET (0) |
1253 #define PRT_RESOURCE_TYPE_ENCODING (1) | |
1254 #define PRT_RESOURCE_TYPE_CMAP (2) | |
1255 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1256 // The PS prolog file version number has to match - if the prolog file is |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1257 // updated, increment the number in the file and here. Version checking was |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1258 // added as of VIM 6.2. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1259 // The CID prolog file version number behaves as per PS prolog. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1260 // Table of VIM and prolog versions: |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1261 // |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1262 // VIM Prolog CIDProlog |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1263 // 6.2 1.3 |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1264 // 7.0 1.4 1.0 |
442 | 1265 #define PRT_PROLOG_VERSION ((char_u *)"1.4") |
1266 #define PRT_CID_PROLOG_VERSION ((char_u *)"1.0") | |
1267 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1268 // String versions of PS resource types - indexed by constants above so don't |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1269 // re-order! |
442 | 1270 static char *prt_resource_types[] = |
1271 { | |
1272 "procset", | |
1273 "encoding", | |
1274 "cmap" | |
1275 }; | |
1276 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1277 // Strings to look for in a PS resource file |
442 | 1278 #define PRT_RESOURCE_HEADER "%!PS-Adobe-" |
1279 #define PRT_RESOURCE_RESOURCE "Resource-" | |
1280 #define PRT_RESOURCE_PROCSET "ProcSet" | |
1281 #define PRT_RESOURCE_ENCODING "Encoding" | |
856 | 1282 #define PRT_RESOURCE_CMAP "CMap" |
442 | 1283 |
1284 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1285 // Data for table based DSC comment recognition, easy to extend if VIM needs to |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1286 // read more comments. |
856 | 1287 #define PRT_DSC_MISC_TYPE (-1) |
1288 #define PRT_DSC_TITLE_TYPE (1) | |
1289 #define PRT_DSC_VERSION_TYPE (2) | |
442 | 1290 #define PRT_DSC_ENDCOMMENTS_TYPE (3) |
1291 | |
856 | 1292 #define PRT_DSC_TITLE "%%Title:" |
1293 #define PRT_DSC_VERSION "%%Version:" | |
1294 #define PRT_DSC_ENDCOMMENTS "%%EndComments:" | |
442 | 1295 |
1296 struct prt_dsc_comment_S | |
1297 { | |
1298 char *string; | |
1299 int len; | |
1300 int type; | |
1301 }; | |
1302 | |
1303 struct prt_dsc_line_S | |
1304 { | |
1305 int type; | |
1306 char_u *string; | |
1307 int len; | |
1308 }; | |
1309 | |
1310 | |
1311 #define SIZEOF_CSTR(s) (sizeof(s) - 1) | |
1312 static struct prt_dsc_comment_S prt_dsc_table[] = | |
1313 { | |
1314 {PRT_DSC_TITLE, SIZEOF_CSTR(PRT_DSC_TITLE), PRT_DSC_TITLE_TYPE}, | |
1315 {PRT_DSC_VERSION, SIZEOF_CSTR(PRT_DSC_VERSION), | |
1316 PRT_DSC_VERSION_TYPE}, | |
1317 {PRT_DSC_ENDCOMMENTS, SIZEOF_CSTR(PRT_DSC_ENDCOMMENTS), | |
1318 PRT_DSC_ENDCOMMENTS_TYPE} | |
1319 }; | |
1320 | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6759
diff
changeset
|
1321 static void prt_write_file_len(char_u *buffer, int bytes); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6759
diff
changeset
|
1322 static int prt_next_dsc(struct prt_dsc_line_S *p_dsc_line); |
442 | 1323 |
1324 /* | |
1325 * Variables for the output PostScript file. | |
1326 */ | |
1327 static FILE *prt_ps_fd; | |
1328 static int prt_file_error; | |
1329 static char_u *prt_ps_file_name = NULL; | |
1330 | |
1331 /* | |
1332 * Various offsets and dimensions in default PostScript user space (points). | |
1333 * Used for text positioning calculations | |
1334 */ | |
1335 static float prt_page_width; | |
1336 static float prt_page_height; | |
1337 static float prt_left_margin; | |
1338 static float prt_right_margin; | |
1339 static float prt_top_margin; | |
1340 static float prt_bottom_margin; | |
1341 static float prt_line_height; | |
1342 static float prt_first_line_height; | |
1343 static float prt_char_width; | |
1344 static float prt_number_width; | |
1345 static float prt_bgcol_offset; | |
1346 static float prt_pos_x_moveto = 0.0; | |
1347 static float prt_pos_y_moveto = 0.0; | |
1348 | |
1349 /* | |
1350 * Various control variables used to decide when and how to change the | |
1351 * PostScript graphics state. | |
1352 */ | |
1353 static int prt_need_moveto; | |
1354 static int prt_do_moveto; | |
1355 static int prt_need_font; | |
1356 static int prt_font; | |
1357 static int prt_need_underline; | |
1358 static int prt_underline; | |
1359 static int prt_do_underline; | |
1360 static int prt_need_fgcol; | |
1361 static int prt_fgcol; | |
1362 static int prt_need_bgcol; | |
1363 static int prt_do_bgcol; | |
1364 static int prt_bgcol; | |
1365 static int prt_new_bgcol; | |
1366 static int prt_attribute_change; | |
1367 static float prt_text_run; | |
1368 static int prt_page_num; | |
1369 static int prt_bufsiz; | |
1370 | |
1371 /* | |
1372 * Variables controlling physical printing. | |
1373 */ | |
1374 static int prt_media; | |
1375 static int prt_portrait; | |
1376 static int prt_num_copies; | |
1377 static int prt_duplex; | |
1378 static int prt_tumble; | |
1379 static int prt_collate; | |
1380 | |
1381 /* | |
1382 * Buffers used when generating PostScript output | |
1383 */ | |
1384 static char_u prt_line_buffer[257]; | |
1385 static garray_T prt_ps_buffer; | |
1386 | |
1387 static int prt_do_conv; | |
1388 static vimconv_T prt_conv; | |
1389 | |
1390 static int prt_out_mbyte; | |
1391 static int prt_custom_cmap; | |
1392 static char prt_cmap[80]; | |
1393 static int prt_use_courier; | |
1394 static int prt_in_ascii; | |
1395 static int prt_half_width; | |
1396 static char *prt_ascii_encoding; | |
1397 static char_u prt_hexchar[] = "0123456789abcdef"; | |
1398 | |
1399 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1400 prt_write_file_raw_len(char_u *buffer, int bytes) |
442 | 1401 { |
1402 if (!prt_file_error | |
1403 && fwrite(buffer, sizeof(char_u), bytes, prt_ps_fd) | |
1404 != (size_t)bytes) | |
1405 { | |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
1406 emsg(_(e_error_writing_to_postscript_output_file)); |
442 | 1407 prt_file_error = TRUE; |
1408 } | |
1409 } | |
1410 | |
1411 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1412 prt_write_file(char_u *buffer) |
442 | 1413 { |
835 | 1414 prt_write_file_len(buffer, (int)STRLEN(buffer)); |
442 | 1415 } |
1416 | |
1417 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1418 prt_write_file_len(char_u *buffer, int bytes) |
442 | 1419 { |
1420 prt_write_file_raw_len(buffer, bytes); | |
1421 } | |
1422 | |
1423 /* | |
1424 * Write a string. | |
1425 */ | |
1426 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1427 prt_write_string(char *s) |
442 | 1428 { |
1429 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), "%s", s); | |
1430 prt_write_file(prt_line_buffer); | |
1431 } | |
1432 | |
1433 /* | |
1434 * Write an int and a space. | |
1435 */ | |
1436 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1437 prt_write_int(int i) |
442 | 1438 { |
1439 sprintf((char *)prt_line_buffer, "%d ", i); | |
1440 prt_write_file(prt_line_buffer); | |
1441 } | |
1442 | |
1443 /* | |
1444 * Write a boolean and a space. | |
1445 */ | |
1446 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1447 prt_write_boolean(int b) |
442 | 1448 { |
1449 sprintf((char *)prt_line_buffer, "%s ", (b ? "T" : "F")); | |
1450 prt_write_file(prt_line_buffer); | |
1451 } | |
1452 | |
1453 /* | |
1454 * Write PostScript to re-encode and define the font. | |
1455 */ | |
1456 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1457 prt_def_font( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1458 char *new_name, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1459 char *encoding, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1460 int height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1461 char *font) |
442 | 1462 { |
1463 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1464 "/_%s /VIM-%s /%s ref\n", new_name, encoding, font); | |
1465 prt_write_file(prt_line_buffer); | |
1466 if (prt_out_mbyte) | |
856 | 1467 sprintf((char *)prt_line_buffer, "/%s %d %f /_%s sffs\n", |
442 | 1468 new_name, height, 500./prt_ps_courier_font.wx, new_name); |
1469 else | |
1470 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1471 "/%s %d /_%s ffs\n", new_name, height, new_name); | |
1472 prt_write_file(prt_line_buffer); | |
1473 } | |
1474 | |
1475 /* | |
1476 * Write a line to define the CID font. | |
1477 */ | |
1478 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1479 prt_def_cidfont(char *new_name, int height, char *cidfont) |
442 | 1480 { |
1481 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1482 "/_%s /%s[/%s] vim_composefont\n", new_name, prt_cmap, cidfont); | |
1483 prt_write_file(prt_line_buffer); | |
1484 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1485 "/%s %d /_%s ffs\n", new_name, height, new_name); | |
1486 prt_write_file(prt_line_buffer); | |
1487 } | |
1488 | |
1489 /* | |
1490 * Write a line to define a duplicate of a CID font | |
1491 */ | |
1492 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1493 prt_dup_cidfont(char *original_name, char *new_name) |
442 | 1494 { |
1495 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1496 "/%s %s d\n", new_name, original_name); | |
1497 prt_write_file(prt_line_buffer); | |
1498 } | |
1499 | |
1500 /* | |
1501 * Convert a real value into an integer and fractional part as integers, with | |
1502 * the fractional part being in the range [0,10^precision). The fractional part | |
1503 * is also rounded based on the precision + 1'th fractional digit. | |
1504 */ | |
1505 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1506 prt_real_bits( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1507 double real, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1508 int precision, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1509 int *pinteger, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1510 int *pfraction) |
442 | 1511 { |
1512 int i; | |
1513 int integer; | |
1514 float fraction; | |
1515 | |
1516 integer = (int)real; | |
1517 fraction = (float)(real - integer); | |
1518 if (real < (double)integer) | |
1519 fraction = -fraction; | |
1520 for (i = 0; i < precision; i++) | |
1521 fraction *= 10.0; | |
1522 | |
1523 *pinteger = integer; | |
1524 *pfraction = (int)(fraction + 0.5); | |
1525 } | |
1526 | |
1527 /* | |
1528 * Write a real and a space. Save bytes if real value has no fractional part! | |
1529 * We use prt_real_bits() as %f in sprintf uses the locale setting to decide | |
1530 * what decimal point character to use, but PS always requires a '.'. | |
1531 */ | |
1532 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1533 prt_write_real(double val, int prec) |
442 | 1534 { |
1535 int integer; | |
1536 int fraction; | |
1537 | |
1538 prt_real_bits(val, prec, &integer, &fraction); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1539 // Emit integer part |
442 | 1540 sprintf((char *)prt_line_buffer, "%d", integer); |
1541 prt_write_file(prt_line_buffer); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1542 // Only emit fraction if necessary |
442 | 1543 if (fraction != 0) |
1544 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1545 // Remove any trailing zeros |
442 | 1546 while ((fraction % 10) == 0) |
1547 { | |
1548 prec--; | |
1549 fraction /= 10; | |
1550 } | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1551 // Emit fraction left padded with zeros |
442 | 1552 sprintf((char *)prt_line_buffer, ".%0*d", prec, fraction); |
1553 prt_write_file(prt_line_buffer); | |
1554 } | |
1555 sprintf((char *)prt_line_buffer, " "); | |
1556 prt_write_file(prt_line_buffer); | |
1557 } | |
1558 | |
1559 /* | |
1560 * Write a line to define a numeric variable. | |
1561 */ | |
1562 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1563 prt_def_var(char *name, double value, int prec) |
442 | 1564 { |
1565 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1566 "/%s ", name); | |
1567 prt_write_file(prt_line_buffer); | |
1568 prt_write_real(value, prec); | |
1569 sprintf((char *)prt_line_buffer, "d\n"); | |
1570 prt_write_file(prt_line_buffer); | |
1571 } | |
1572 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1573 // Convert size from font space to user space at current font scale |
442 | 1574 #define PRT_PS_FONT_TO_USER(scale, size) ((size) * ((scale)/1000.0)) |
1575 | |
1576 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1577 prt_flush_buffer(void) |
442 | 1578 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1579 if (prt_ps_buffer.ga_len <= 0) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1580 return; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1581 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1582 // Any background color must be drawn first |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1583 if (prt_do_bgcol && (prt_new_bgcol != PRCOLOR_WHITE)) |
442 | 1584 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1585 int r, g, b; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1586 |
442 | 1587 if (prt_do_moveto) |
1588 { | |
1589 prt_write_real(prt_pos_x_moveto, 2); | |
1590 prt_write_real(prt_pos_y_moveto, 2); | |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1591 prt_write_string("m\n"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1592 prt_do_moveto = FALSE; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1593 } |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1594 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1595 // Size of rect of background color on which text is printed |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1596 prt_write_real(prt_text_run, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1597 prt_write_real(prt_line_height, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1598 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1599 // Lastly add the color of the background |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1600 r = ((unsigned)prt_new_bgcol & 0xff0000) >> 16; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1601 g = ((unsigned)prt_new_bgcol & 0xff00) >> 8; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1602 b = prt_new_bgcol & 0xff; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1603 prt_write_real(r / 255.0, 3); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1604 prt_write_real(g / 255.0, 3); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1605 prt_write_real(b / 255.0, 3); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1606 prt_write_string("bg\n"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1607 } |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1608 // Draw underlines before the text as it makes it slightly easier to |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1609 // find the starting point. |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1610 if (prt_do_underline) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1611 { |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1612 if (prt_do_moveto) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1613 { |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1614 prt_write_real(prt_pos_x_moveto, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1615 prt_write_real(prt_pos_y_moveto, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1616 prt_write_string("m\n"); |
442 | 1617 prt_do_moveto = FALSE; |
1618 } | |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1619 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1620 // Underline length of text run |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1621 prt_write_real(prt_text_run, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1622 prt_write_string("ul\n"); |
442 | 1623 } |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1624 // Draw the text |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1625 if (prt_out_mbyte) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1626 prt_write_string("<"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1627 else |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1628 prt_write_string("("); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1629 prt_write_file_raw_len(prt_ps_buffer.ga_data, prt_ps_buffer.ga_len); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1630 if (prt_out_mbyte) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1631 prt_write_string(">"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1632 else |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1633 prt_write_string(")"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1634 // Add a moveto if need be and use the appropriate show procedure |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1635 if (prt_do_moveto) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1636 { |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1637 prt_write_real(prt_pos_x_moveto, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1638 prt_write_real(prt_pos_y_moveto, 2); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1639 // moveto and a show |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1640 prt_write_string("ms\n"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1641 prt_do_moveto = FALSE; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1642 } |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1643 else // Simple show |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1644 prt_write_string("s\n"); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1645 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1646 ga_clear(&prt_ps_buffer); |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
1647 ga_init2(&prt_ps_buffer, sizeof(char), prt_bufsiz); |
442 | 1648 } |
1649 | |
1650 | |
1651 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1652 prt_resource_name(char_u *filename, void *cookie) |
442 | 1653 { |
1654 char_u *resource_filename = cookie; | |
1655 | |
1656 if (STRLEN(filename) >= MAXPATHL) | |
1657 *resource_filename = NUL; | |
1658 else | |
1659 STRCPY(resource_filename, filename); | |
1660 } | |
1661 | |
1662 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1663 prt_find_resource(char *name, struct prt_ps_resource_S *resource) |
442 | 1664 { |
2770 | 1665 char_u *buffer; |
1666 int retval; | |
1667 | |
1668 buffer = alloc(MAXPATHL + 1); | |
1669 if (buffer == NULL) | |
1670 return FALSE; | |
442 | 1671 |
2768 | 1672 vim_strncpy(resource->name, (char_u *)name, 63); |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1673 // Look for named resource file in runtimepath |
442 | 1674 STRCPY(buffer, "print"); |
1675 add_pathsep(buffer); | |
2768 | 1676 vim_strcat(buffer, (char_u *)name, MAXPATHL); |
1677 vim_strcat(buffer, (char_u *)".ps", MAXPATHL); | |
442 | 1678 resource->filename[0] = NUL; |
8524
2f57bbe870ea
commit https://github.com/vim/vim/commit/7f8989dd8a627af2185df381195351a913f3777f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
1679 retval = (do_in_runtimepath(buffer, 0, prt_resource_name, |
442 | 1680 resource->filename) |
1681 && resource->filename[0] != NUL); | |
2770 | 1682 vim_free(buffer); |
1683 return retval; | |
442 | 1684 } |
1685 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1686 // PS CR and LF characters have platform independent values |
442 | 1687 #define PSLF (0x0a) |
1688 #define PSCR (0x0d) | |
1689 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1690 // Static buffer to read initial comments in a resource file, some can have a |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1691 // couple of KB of comments! |
442 | 1692 #define PRT_FILE_BUFFER_LEN (2048) |
1693 struct prt_resfile_buffer_S | |
1694 { | |
1695 char_u buffer[PRT_FILE_BUFFER_LEN]; | |
1696 int len; | |
1697 int line_start; | |
1698 int line_end; | |
1699 }; | |
1700 | |
1701 static struct prt_resfile_buffer_S prt_resfile; | |
1702 | |
1703 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1704 prt_resfile_next_line(void) |
442 | 1705 { |
944 | 1706 int idx; |
442 | 1707 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1708 // Move to start of next line and then find end of line |
944 | 1709 idx = prt_resfile.line_end + 1; |
1710 while (idx < prt_resfile.len) | |
442 | 1711 { |
944 | 1712 if (prt_resfile.buffer[idx] != PSLF && prt_resfile.buffer[idx] != PSCR) |
856 | 1713 break; |
944 | 1714 idx++; |
442 | 1715 } |
944 | 1716 prt_resfile.line_start = idx; |
1717 | |
1718 while (idx < prt_resfile.len) | |
442 | 1719 { |
944 | 1720 if (prt_resfile.buffer[idx] == PSLF || prt_resfile.buffer[idx] == PSCR) |
856 | 1721 break; |
944 | 1722 idx++; |
442 | 1723 } |
944 | 1724 prt_resfile.line_end = idx; |
1725 | |
1726 return (idx < prt_resfile.len); | |
442 | 1727 } |
1728 | |
1729 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1730 prt_resfile_strncmp(int offset, char *string, int len) |
442 | 1731 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1732 // Force not equal if string is longer than remainder of line |
442 | 1733 if (len > (prt_resfile.line_end - (prt_resfile.line_start + offset))) |
856 | 1734 return 1; |
442 | 1735 |
1736 return STRNCMP(&prt_resfile.buffer[prt_resfile.line_start + offset], | |
856 | 1737 string, len); |
442 | 1738 } |
1739 | |
1740 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1741 prt_resfile_skip_nonws(int offset) |
442 | 1742 { |
944 | 1743 int idx; |
1744 | |
1745 idx = prt_resfile.line_start + offset; | |
1746 while (idx < prt_resfile.line_end) | |
442 | 1747 { |
34074
1629cc65d78d
patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents:
32120
diff
changeset
|
1748 if (SAFE_isspace(prt_resfile.buffer[idx])) |
944 | 1749 return idx - prt_resfile.line_start; |
1750 idx++; | |
442 | 1751 } |
1752 return -1; | |
1753 } | |
1754 | |
1755 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1756 prt_resfile_skip_ws(int offset) |
442 | 1757 { |
944 | 1758 int idx; |
1759 | |
1760 idx = prt_resfile.line_start + offset; | |
1761 while (idx < prt_resfile.line_end) | |
442 | 1762 { |
34074
1629cc65d78d
patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents:
32120
diff
changeset
|
1763 if (!SAFE_isspace(prt_resfile.buffer[idx])) |
944 | 1764 return idx - prt_resfile.line_start; |
1765 idx++; | |
442 | 1766 } |
1767 return -1; | |
1768 } | |
1769 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1770 // prt_next_dsc() - returns detail on next DSC comment line found. Returns true |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1771 // if a DSC comment is found, else false |
442 | 1772 static int |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1773 prt_next_dsc(struct prt_dsc_line_S *p_dsc_line) |
442 | 1774 { |
1775 int comment; | |
1776 int offset; | |
1777 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1778 // Move to start of next line |
442 | 1779 if (!prt_resfile_next_line()) |
856 | 1780 return FALSE; |
442 | 1781 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1782 // DSC comments always start %% |
442 | 1783 if (prt_resfile_strncmp(0, "%%", 2) != 0) |
856 | 1784 return FALSE; |
442 | 1785 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1786 // Find type of DSC comment |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1787 for (comment = 0; comment < (int)ARRAY_LENGTH(prt_dsc_table); comment++) |
856 | 1788 if (prt_resfile_strncmp(0, prt_dsc_table[comment].string, |
1789 prt_dsc_table[comment].len) == 0) | |
1790 break; | |
442 | 1791 |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
1792 if (comment != ARRAY_LENGTH(prt_dsc_table)) |
442 | 1793 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1794 // Return type of comment |
856 | 1795 p_dsc_line->type = prt_dsc_table[comment].type; |
1796 offset = prt_dsc_table[comment].len; | |
442 | 1797 } |
1798 else | |
1799 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1800 // Unrecognised DSC comment, skip to ws after comment leader |
856 | 1801 p_dsc_line->type = PRT_DSC_MISC_TYPE; |
1802 offset = prt_resfile_skip_nonws(0); | |
1803 if (offset == -1) | |
1804 return FALSE; | |
442 | 1805 } |
1806 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1807 // Skip ws to comment value |
442 | 1808 offset = prt_resfile_skip_ws(offset); |
1809 if (offset == -1) | |
856 | 1810 return FALSE; |
442 | 1811 |
1812 p_dsc_line->string = &prt_resfile.buffer[prt_resfile.line_start + offset]; | |
1813 p_dsc_line->len = prt_resfile.line_end - (prt_resfile.line_start + offset); | |
1814 | |
1815 return TRUE; | |
1816 } | |
1817 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1818 /* |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1819 * Improved hand crafted parser to get the type, title, and version number of a |
442 | 1820 * PS resource file so the file details can be added to the DSC header comments. |
1821 */ | |
1822 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1823 prt_open_resource(struct prt_ps_resource_S *resource) |
442 | 1824 { |
856 | 1825 int offset; |
1826 int seen_all; | |
1827 int seen_title; | |
1828 int seen_version; | |
442 | 1829 FILE *fd_resource; |
1830 struct prt_dsc_line_S dsc_line; | |
1831 | |
1832 fd_resource = mch_fopen((char *)resource->filename, READBIN); | |
1833 if (fd_resource == NULL) | |
1834 { | |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1835 semsg(_(e_cant_open_file_str_3), resource->filename); |
442 | 1836 return FALSE; |
1837 } | |
20007
aadd1cae2ff5
patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents:
18798
diff
changeset
|
1838 CLEAR_FIELD(prt_resfile.buffer); |
442 | 1839 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1840 // Parse first line to ensure valid resource file |
835 | 1841 prt_resfile.len = (int)fread((char *)prt_resfile.buffer, sizeof(char_u), |
856 | 1842 PRT_FILE_BUFFER_LEN, fd_resource); |
442 | 1843 if (ferror(fd_resource)) |
1844 { | |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
1845 semsg(_(e_cant_read_postscript_resource_file_str), |
442 | 1846 resource->filename); |
1847 fclose(fd_resource); | |
1848 return FALSE; | |
1849 } | |
2445
04dae202d316
Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents:
2250
diff
changeset
|
1850 fclose(fd_resource); |
442 | 1851 |
1852 prt_resfile.line_end = -1; | |
1853 prt_resfile.line_start = 0; | |
1854 if (!prt_resfile_next_line()) | |
856 | 1855 return FALSE; |
442 | 1856 |
1857 offset = 0; | |
1858 | |
1859 if (prt_resfile_strncmp(offset, PRT_RESOURCE_HEADER, | |
835 | 1860 (int)STRLEN(PRT_RESOURCE_HEADER)) != 0) |
442 | 1861 { |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1862 semsg(_(e_file_str_is_not_postscript_resource_file), |
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1863 resource->filename); |
442 | 1864 return FALSE; |
1865 } | |
1866 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1867 // Skip over any version numbers and following ws |
835 | 1868 offset += (int)STRLEN(PRT_RESOURCE_HEADER); |
442 | 1869 offset = prt_resfile_skip_nonws(offset); |
1870 if (offset == -1) | |
856 | 1871 return FALSE; |
442 | 1872 offset = prt_resfile_skip_ws(offset); |
1873 if (offset == -1) | |
856 | 1874 return FALSE; |
442 | 1875 |
1876 if (prt_resfile_strncmp(offset, PRT_RESOURCE_RESOURCE, | |
835 | 1877 (int)STRLEN(PRT_RESOURCE_RESOURCE)) != 0) |
442 | 1878 { |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1879 semsg(_(e_file_str_is_not_supported_postscript_resource_file), |
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1880 resource->filename); |
442 | 1881 return FALSE; |
1882 } | |
835 | 1883 offset += (int)STRLEN(PRT_RESOURCE_RESOURCE); |
442 | 1884 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1885 // Decide type of resource in the file |
442 | 1886 if (prt_resfile_strncmp(offset, PRT_RESOURCE_PROCSET, |
835 | 1887 (int)STRLEN(PRT_RESOURCE_PROCSET)) == 0) |
442 | 1888 resource->type = PRT_RESOURCE_TYPE_PROCSET; |
1889 else if (prt_resfile_strncmp(offset, PRT_RESOURCE_ENCODING, | |
835 | 1890 (int)STRLEN(PRT_RESOURCE_ENCODING)) == 0) |
442 | 1891 resource->type = PRT_RESOURCE_TYPE_ENCODING; |
1892 else if (prt_resfile_strncmp(offset, PRT_RESOURCE_CMAP, | |
835 | 1893 (int)STRLEN(PRT_RESOURCE_CMAP)) == 0) |
442 | 1894 resource->type = PRT_RESOURCE_TYPE_CMAP; |
1895 else | |
1896 { | |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1897 semsg(_(e_file_str_is_not_supported_postscript_resource_file), |
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1898 resource->filename); |
442 | 1899 return FALSE; |
1900 } | |
1901 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1902 // Look for title and version of resource |
442 | 1903 resource->title[0] = '\0'; |
1904 resource->version[0] = '\0'; | |
1905 seen_title = FALSE; | |
1906 seen_version = FALSE; | |
1907 seen_all = FALSE; | |
1908 while (!seen_all && prt_next_dsc(&dsc_line)) | |
1909 { | |
856 | 1910 switch (dsc_line.type) |
1911 { | |
1912 case PRT_DSC_TITLE_TYPE: | |
1913 vim_strncpy(resource->title, dsc_line.string, dsc_line.len); | |
1914 seen_title = TRUE; | |
1915 if (seen_version) | |
1916 seen_all = TRUE; | |
1917 break; | |
1918 | |
1919 case PRT_DSC_VERSION_TYPE: | |
1920 vim_strncpy(resource->version, dsc_line.string, dsc_line.len); | |
1921 seen_version = TRUE; | |
1922 if (seen_title) | |
1923 seen_all = TRUE; | |
1924 break; | |
1925 | |
1926 case PRT_DSC_ENDCOMMENTS_TYPE: | |
25852
336e2d9924e6
patch 8.2.3460: some type casts are not needed
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
1927 // Won't find title or resource after this comment, stop searching |
856 | 1928 seen_all = TRUE; |
1929 break; | |
1930 | |
1931 case PRT_DSC_MISC_TYPE: | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1932 // Not interested in whatever comment this line had |
856 | 1933 break; |
1934 } | |
442 | 1935 } |
1936 | |
1937 if (!seen_title || !seen_version) | |
1938 { | |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1939 semsg(_(e_file_str_is_not_supported_postscript_resource_file), |
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1940 resource->filename); |
442 | 1941 return FALSE; |
1942 } | |
1943 | |
1944 return TRUE; | |
1945 } | |
1946 | |
1947 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1948 prt_check_resource(struct prt_ps_resource_S *resource, char_u *version) |
442 | 1949 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1950 // Version number m.n should match, the revision number does not matter |
442 | 1951 if (STRNCMP(resource->version, version, STRLEN(version))) |
1952 { | |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1953 semsg(_(e_str_resource_file_has_wrong_version), |
442 | 1954 resource->name); |
1955 return FALSE; | |
1956 } | |
1957 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1958 // Other checks to be added as needed |
442 | 1959 return TRUE; |
1960 } | |
1961 | |
1962 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1963 prt_dsc_start(void) |
442 | 1964 { |
1965 prt_write_string("%!PS-Adobe-3.0\n"); | |
1966 } | |
1967 | |
1968 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1969 prt_dsc_noarg(char *comment) |
442 | 1970 { |
1971 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1972 "%%%%%s\n", comment); | |
1973 prt_write_file(prt_line_buffer); | |
1974 } | |
1975 | |
1976 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1977 prt_dsc_textline(char *comment, char *text) |
442 | 1978 { |
1979 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
1980 "%%%%%s: %s\n", comment, text); | |
1981 prt_write_file(prt_line_buffer); | |
1982 } | |
1983 | |
1984 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1985 prt_dsc_text(char *comment, char *text) |
442 | 1986 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1987 // TODO - should scan 'text' for any chars needing escaping! |
442 | 1988 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), |
1989 "%%%%%s: (%s)\n", comment, text); | |
1990 prt_write_file(prt_line_buffer); | |
1991 } | |
1992 | |
1993 #define prt_dsc_atend(c) prt_dsc_text((c), "atend") | |
1994 | |
1995 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1996 prt_dsc_ints(char *comment, int count, int *ints) |
442 | 1997 { |
1998 int i; | |
1999 | |
2000 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
2001 "%%%%%s:", comment); | |
2002 prt_write_file(prt_line_buffer); | |
2003 | |
2004 for (i = 0; i < count; i++) | |
2005 { | |
2006 sprintf((char *)prt_line_buffer, " %d", ints[i]); | |
2007 prt_write_file(prt_line_buffer); | |
2008 } | |
2009 | |
2010 prt_write_string("\n"); | |
2011 } | |
2012 | |
2013 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2014 prt_dsc_resources( |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2015 char *comment, // if NULL add to previous |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2016 char *type, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2017 char *string) |
442 | 2018 { |
2019 if (comment != NULL) | |
2020 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
2021 "%%%%%s: %s", comment, type); | |
2022 else | |
2023 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
2024 "%%%%+ %s", type); | |
2025 prt_write_file(prt_line_buffer); | |
2026 | |
2027 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
2028 " %s\n", string); | |
2029 prt_write_file(prt_line_buffer); | |
2030 } | |
2031 | |
2032 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2033 prt_dsc_font_resource(char *resource, struct prt_ps_font_S *ps_font) |
442 | 2034 { |
2035 int i; | |
2036 | |
2037 prt_dsc_resources(resource, "font", | |
856 | 2038 ps_font->ps_fontname[PRT_PS_FONT_ROMAN]); |
442 | 2039 for (i = PRT_PS_FONT_BOLD ; i <= PRT_PS_FONT_BOLDOBLIQUE ; i++) |
856 | 2040 if (ps_font->ps_fontname[i] != NULL) |
2041 prt_dsc_resources(NULL, "font", ps_font->ps_fontname[i]); | |
442 | 2042 } |
2043 | |
2044 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2045 prt_dsc_requirements( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2046 int duplex, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2047 int tumble, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2048 int collate, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2049 int color, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2050 int num_copies) |
442 | 2051 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2052 // Only output the comment if we need to. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2053 // Note: tumble is ignored if we are not duplexing |
442 | 2054 if (!(duplex || collate || color || (num_copies > 1))) |
2055 return; | |
2056 | |
2057 sprintf((char *)prt_line_buffer, "%%%%Requirements:"); | |
2058 prt_write_file(prt_line_buffer); | |
2059 | |
2060 if (duplex) | |
2061 { | |
2062 prt_write_string(" duplex"); | |
2063 if (tumble) | |
2064 prt_write_string("(tumble)"); | |
2065 } | |
2066 if (collate) | |
2067 prt_write_string(" collate"); | |
2068 if (color) | |
2069 prt_write_string(" color"); | |
2070 if (num_copies > 1) | |
2071 { | |
2072 prt_write_string(" numcopies("); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2073 // Note: no space wanted so don't use prt_write_int() |
442 | 2074 sprintf((char *)prt_line_buffer, "%d", num_copies); |
2075 prt_write_file(prt_line_buffer); | |
2076 prt_write_string(")"); | |
2077 } | |
2078 prt_write_string("\n"); | |
2079 } | |
2080 | |
2081 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2082 prt_dsc_docmedia( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2083 char *paper_name, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2084 double width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2085 double height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2086 double weight, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2087 char *colour, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2088 char *type) |
442 | 2089 { |
2090 vim_snprintf((char *)prt_line_buffer, sizeof(prt_line_buffer), | |
2091 "%%%%DocumentMedia: %s ", paper_name); | |
2092 prt_write_file(prt_line_buffer); | |
2093 prt_write_real(width, 2); | |
2094 prt_write_real(height, 2); | |
2095 prt_write_real(weight, 2); | |
2096 if (colour == NULL) | |
2097 prt_write_string("()"); | |
2098 else | |
2099 prt_write_string(colour); | |
2100 prt_write_string(" "); | |
2101 if (type == NULL) | |
2102 prt_write_string("()"); | |
2103 else | |
2104 prt_write_string(type); | |
2105 prt_write_string("\n"); | |
2106 } | |
2107 | |
2108 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2109 mch_print_cleanup(void) |
442 | 2110 { |
2111 if (prt_out_mbyte) | |
2112 { | |
856 | 2113 int i; |
2114 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2115 // Free off all CID font names created, but first clear duplicate |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2116 // pointers to the same string (when the same font is used for more than |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2117 // one style). |
856 | 2118 for (i = PRT_PS_FONT_ROMAN; i <= PRT_PS_FONT_BOLDOBLIQUE; i++) |
2119 { | |
2120 if (prt_ps_mb_font.ps_fontname[i] != NULL) | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2121 VIM_CLEAR(prt_ps_mb_font.ps_fontname[i]); |
856 | 2122 } |
442 | 2123 } |
2124 | |
2125 if (prt_do_conv) | |
2126 { | |
2127 convert_setup(&prt_conv, NULL, NULL); | |
2128 prt_do_conv = FALSE; | |
2129 } | |
2130 if (prt_ps_fd != NULL) | |
2131 { | |
2132 fclose(prt_ps_fd); | |
2133 prt_ps_fd = NULL; | |
2134 prt_file_error = FALSE; | |
2135 } | |
2136 if (prt_ps_file_name != NULL) | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2137 VIM_CLEAR(prt_ps_file_name); |
442 | 2138 } |
2139 | |
2140 static float | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2141 to_device_units(int idx, double physsize, int def_number) |
442 | 2142 { |
2143 float ret; | |
2144 int u; | |
2145 int nr; | |
2146 | |
2147 u = prt_get_unit(idx); | |
2148 if (u == PRT_UNIT_NONE) | |
2149 { | |
2150 u = PRT_UNIT_PERC; | |
2151 nr = def_number; | |
2152 } | |
2153 else | |
2154 nr = printer_opts[idx].number; | |
2155 | |
2156 switch (u) | |
2157 { | |
2158 case PRT_UNIT_INCH: | |
2159 ret = (float)(nr * PRT_PS_DEFAULT_DPI); | |
2160 break; | |
2161 case PRT_UNIT_MM: | |
2162 ret = (float)(nr * PRT_PS_DEFAULT_DPI) / (float)25.4; | |
2163 break; | |
2164 case PRT_UNIT_POINT: | |
2165 ret = (float)nr; | |
2166 break; | |
2167 case PRT_UNIT_PERC: | |
2168 default: | |
2169 ret = (float)(physsize * nr) / 100; | |
2170 break; | |
2171 } | |
2172 | |
2173 return ret; | |
2174 } | |
2175 | |
2176 /* | |
2177 * Calculate margins for given width and height from printoptions settings. | |
2178 */ | |
2179 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2180 prt_page_margins( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2181 double width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2182 double height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2183 double *left, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2184 double *right, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2185 double *top, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2186 double *bottom) |
442 | 2187 { |
2188 *left = to_device_units(OPT_PRINT_LEFT, width, 10); | |
2189 *right = width - to_device_units(OPT_PRINT_RIGHT, width, 5); | |
2190 *top = height - to_device_units(OPT_PRINT_TOP, height, 5); | |
2191 *bottom = to_device_units(OPT_PRINT_BOT, height, 5); | |
2192 } | |
2193 | |
2194 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2195 prt_font_metrics(int font_scale) |
442 | 2196 { |
2197 prt_line_height = (float)font_scale; | |
2198 prt_char_width = (float)PRT_PS_FONT_TO_USER(font_scale, prt_ps_font->wx); | |
2199 } | |
2200 | |
2201 | |
2202 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2203 prt_get_cpl(void) |
442 | 2204 { |
2205 if (prt_use_number()) | |
2206 { | |
2207 prt_number_width = PRINT_NUMBER_WIDTH * prt_char_width; | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2208 // If we are outputting multi-byte characters then line numbers will be |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2209 // printed with half width characters |
856 | 2210 if (prt_out_mbyte) |
2211 prt_number_width /= 2; | |
442 | 2212 prt_left_margin += prt_number_width; |
2213 } | |
2214 else | |
2215 prt_number_width = 0.0; | |
2216 | |
2217 return (int)((prt_right_margin - prt_left_margin) / prt_char_width); | |
2218 } | |
2219 | |
2220 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2221 prt_build_cid_fontname(int font, char_u *name, int name_len) |
442 | 2222 { |
2223 char *fontname; | |
2224 | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16621
diff
changeset
|
2225 fontname = alloc(name_len + 1); |
442 | 2226 if (fontname == NULL) |
856 | 2227 return FALSE; |
442 | 2228 vim_strncpy((char_u *)fontname, name, name_len); |
2229 prt_ps_mb_font.ps_fontname[font] = fontname; | |
2230 | |
2231 return TRUE; | |
2232 } | |
2233 | |
2234 /* | |
2235 * Get number of lines of text that fit on a page (excluding the header). | |
2236 */ | |
2237 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2238 prt_get_lpp(void) |
442 | 2239 { |
2240 int lpp; | |
2241 | |
2242 /* | |
2243 * Calculate offset to lower left corner of background rect based on actual | |
2244 * font height (based on its bounding box) and the line height, handling the | |
2245 * case where the font height can exceed the line height. | |
2246 */ | |
2247 prt_bgcol_offset = (float)PRT_PS_FONT_TO_USER(prt_line_height, | |
2248 prt_ps_font->bbox_min_y); | |
2249 if ((prt_ps_font->bbox_max_y - prt_ps_font->bbox_min_y) < 1000.0) | |
2250 { | |
2251 prt_bgcol_offset -= (float)PRT_PS_FONT_TO_USER(prt_line_height, | |
2252 (1000.0 - (prt_ps_font->bbox_max_y - | |
2253 prt_ps_font->bbox_min_y)) / 2); | |
2254 } | |
2255 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2256 // Get height for topmost line based on background rect offset. |
442 | 2257 prt_first_line_height = prt_line_height + prt_bgcol_offset; |
2258 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2259 // Calculate lpp |
442 | 2260 lpp = (int)((prt_top_margin - prt_bottom_margin) / prt_line_height); |
2261 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2262 // Adjust top margin if there is a header |
442 | 2263 prt_top_margin -= prt_line_height * prt_header_height(); |
2264 | |
2265 return lpp - prt_header_height(); | |
2266 } | |
2267 | |
2268 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2269 prt_match_encoding( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2270 char *p_encoding, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2271 struct prt_ps_mbfont_S *p_cmap, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2272 struct prt_ps_encoding_S **pp_mbenc) |
442 | 2273 { |
2274 int mbenc; | |
2275 int enc_len; | |
2276 struct prt_ps_encoding_S *p_mbenc; | |
2277 | |
2278 *pp_mbenc = NULL; | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2279 // Look for recognised encoding |
835 | 2280 enc_len = (int)STRLEN(p_encoding); |
442 | 2281 p_mbenc = p_cmap->encodings; |
2282 for (mbenc = 0; mbenc < p_cmap->num_encodings; mbenc++) | |
2283 { | |
856 | 2284 if (STRNICMP(p_mbenc->encoding, p_encoding, enc_len) == 0) |
2285 { | |
2286 *pp_mbenc = p_mbenc; | |
2287 return TRUE; | |
2288 } | |
2289 p_mbenc++; | |
442 | 2290 } |
2291 return FALSE; | |
2292 } | |
2293 | |
2294 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2295 prt_match_charset( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2296 char *p_charset, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2297 struct prt_ps_mbfont_S *p_cmap, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2298 struct prt_ps_charset_S **pp_mbchar) |
442 | 2299 { |
2300 int mbchar; | |
2301 int char_len; | |
2302 struct prt_ps_charset_S *p_mbchar; | |
2303 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2304 // Look for recognised character set, using default if one is not given |
442 | 2305 if (*p_charset == NUL) |
856 | 2306 p_charset = p_cmap->defcs; |
835 | 2307 char_len = (int)STRLEN(p_charset); |
442 | 2308 p_mbchar = p_cmap->charsets; |
2309 for (mbchar = 0; mbchar < p_cmap->num_charsets; mbchar++) | |
2310 { | |
856 | 2311 if (STRNICMP(p_mbchar->charset, p_charset, char_len) == 0) |
2312 { | |
2313 *pp_mbchar = p_mbchar; | |
2314 return TRUE; | |
2315 } | |
2316 p_mbchar++; | |
442 | 2317 } |
2318 return FALSE; | |
2319 } | |
2320 | |
2321 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2322 mch_print_init( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2323 prt_settings_T *psettings, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2324 char_u *jobname, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2325 int forceit UNUSED) |
442 | 2326 { |
2327 int i; | |
2328 char *paper_name; | |
2329 int paper_strlen; | |
2330 int fontsize; | |
2331 char_u *p; | |
2332 double left; | |
2333 double right; | |
2334 double top; | |
2335 double bottom; | |
856 | 2336 int props; |
2337 int cmap = 0; | |
442 | 2338 char_u *p_encoding; |
2339 struct prt_ps_encoding_S *p_mbenc; | |
2340 struct prt_ps_encoding_S *p_mbenc_first; | |
944 | 2341 struct prt_ps_charset_S *p_mbchar = NULL; |
442 | 2342 |
2343 #if 0 | |
2344 /* | |
2345 * TODO: | |
2346 * If "forceit" is false: pop up a dialog to select: | |
2347 * - printer name | |
2348 * - copies | |
2349 * - collated/uncollated | |
2350 * - duplex off/long side/short side | |
2351 * - paper size | |
2352 * - portrait/landscape | |
2353 * - font size | |
2354 * | |
2355 * If "forceit" is true: use the default printer and settings | |
2356 */ | |
2357 if (forceit) | |
2358 s_pd.Flags |= PD_RETURNDEFAULT; | |
2359 #endif | |
2360 | |
2361 /* | |
2362 * Set up font and encoding. | |
2363 */ | |
2364 p_encoding = enc_skip(p_penc); | |
2365 if (*p_encoding == NUL) | |
856 | 2366 p_encoding = enc_skip(p_enc); |
442 | 2367 |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2368 // Look for a multi-byte font that matches the encoding and character set. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2369 // Only look if multi-byte character set is defined, or using multi-byte |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2370 // encoding other than Unicode. This is because a Unicode encoding does not |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2371 // uniquely identify a CJK character set to use. |
442 | 2372 p_mbenc = NULL; |
819 | 2373 props = enc_canon_props(p_encoding); |
864 | 2374 if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE))) |
819 | 2375 { |
6759 | 2376 int cmap_first = 0; |
6745 | 2377 |
856 | 2378 p_mbenc_first = NULL; |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
2379 for (cmap = 0; cmap < (int)ARRAY_LENGTH(prt_ps_mbfonts); cmap++) |
856 | 2380 if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap], |
442 | 2381 &p_mbenc)) |
856 | 2382 { |
2383 if (p_mbenc_first == NULL) | |
6745 | 2384 { |
856 | 2385 p_mbenc_first = p_mbenc; |
6745 | 2386 cmap_first = cmap; |
2387 } | |
856 | 2388 if (prt_match_charset((char *)p_pmcs, &prt_ps_mbfonts[cmap], |
442 | 2389 &p_mbchar)) |
856 | 2390 break; |
2391 } | |
2392 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2393 // Use first encoding matched if no charset matched |
856 | 2394 if (p_mbchar == NULL && p_mbenc_first != NULL) |
6745 | 2395 { |
856 | 2396 p_mbenc = p_mbenc_first; |
6745 | 2397 cmap = cmap_first; |
2398 } | |
819 | 2399 } |
442 | 2400 |
2401 prt_out_mbyte = (p_mbenc != NULL); | |
2402 if (prt_out_mbyte) | |
2403 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2404 // Build CMap name - will be same for all multi-byte fonts used |
856 | 2405 prt_cmap[0] = NUL; |
2406 | |
2407 prt_custom_cmap = (p_mbchar == NULL); | |
2408 if (!prt_custom_cmap) | |
2409 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2410 // Check encoding and character set are compatible |
856 | 2411 if ((p_mbenc->needs_charset & p_mbchar->has_charset) == 0) |
2412 { | |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
2413 emsg(_(e_incompatible_multi_byte_encoding_and_character_set)); |
856 | 2414 return FALSE; |
2415 } | |
2416 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2417 // Add charset name if not empty |
856 | 2418 if (p_mbchar->cmap_charset != NULL) |
2419 { | |
2420 vim_strncpy((char_u *)prt_cmap, | |
442 | 2421 (char_u *)p_mbchar->cmap_charset, sizeof(prt_cmap) - 3); |
856 | 2422 STRCAT(prt_cmap, "-"); |
2423 } | |
2424 } | |
2425 else | |
2426 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2427 // Add custom CMap character set name |
856 | 2428 if (*p_pmcs == NUL) |
2429 { | |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
2430 emsg(_(e_printmbcharset_cannot_be_empty_with_multi_byte_encoding)); |
856 | 2431 return FALSE; |
2432 } | |
2433 vim_strncpy((char_u *)prt_cmap, p_pmcs, sizeof(prt_cmap) - 3); | |
2434 STRCAT(prt_cmap, "-"); | |
2435 } | |
2436 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2437 // CMap name ends with (optional) encoding name and -H for horizontal |
856 | 2438 if (p_mbenc->cmap_encoding != NULL && STRLEN(prt_cmap) |
442 | 2439 + STRLEN(p_mbenc->cmap_encoding) + 3 < sizeof(prt_cmap)) |
856 | 2440 { |
2441 STRCAT(prt_cmap, p_mbenc->cmap_encoding); | |
2442 STRCAT(prt_cmap, "-"); | |
2443 } | |
2444 STRCAT(prt_cmap, "H"); | |
2445 | |
2446 if (!mbfont_opts[OPT_MBFONT_REGULAR].present) | |
2447 { | |
26952
b34ddbca305c
patch 8.2.4005: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26948
diff
changeset
|
2448 emsg(_(e_no_default_font_specified_for_multi_byte_printing)); |
856 | 2449 return FALSE; |
2450 } | |
2451 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2452 // Derive CID font names with fallbacks if not defined |
856 | 2453 if (!prt_build_cid_fontname(PRT_PS_FONT_ROMAN, |
2454 mbfont_opts[OPT_MBFONT_REGULAR].string, | |
2455 mbfont_opts[OPT_MBFONT_REGULAR].strlen)) | |
2456 return FALSE; | |
2457 if (mbfont_opts[OPT_MBFONT_BOLD].present) | |
2458 if (!prt_build_cid_fontname(PRT_PS_FONT_BOLD, | |
2459 mbfont_opts[OPT_MBFONT_BOLD].string, | |
2460 mbfont_opts[OPT_MBFONT_BOLD].strlen)) | |
2461 return FALSE; | |
2462 if (mbfont_opts[OPT_MBFONT_OBLIQUE].present) | |
2463 if (!prt_build_cid_fontname(PRT_PS_FONT_OBLIQUE, | |
2464 mbfont_opts[OPT_MBFONT_OBLIQUE].string, | |
2465 mbfont_opts[OPT_MBFONT_OBLIQUE].strlen)) | |
2466 return FALSE; | |
2467 if (mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].present) | |
2468 if (!prt_build_cid_fontname(PRT_PS_FONT_BOLDOBLIQUE, | |
442 | 2469 mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].string, |
2470 mbfont_opts[OPT_MBFONT_BOLDOBLIQUE].strlen)) | |
856 | 2471 return FALSE; |
2472 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2473 // Check if need to use Courier for ASCII code range, and if so pick up |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2474 // the encoding to use |
856 | 2475 prt_use_courier = mbfont_opts[OPT_MBFONT_USECOURIER].present && |
2476 (TOLOWER_ASC(mbfont_opts[OPT_MBFONT_USECOURIER].string[0]) == 'y'); | |
2477 if (prt_use_courier) | |
2478 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2479 // Use national ASCII variant unless ASCII wanted |
856 | 2480 if (mbfont_opts[OPT_MBFONT_ASCII].present && |
2481 (TOLOWER_ASC(mbfont_opts[OPT_MBFONT_ASCII].string[0]) == 'y')) | |
2482 prt_ascii_encoding = "ascii"; | |
2483 else | |
2484 prt_ascii_encoding = prt_ps_mbfonts[cmap].ascii_enc; | |
2485 } | |
2486 | |
2487 prt_ps_font = &prt_ps_mb_font; | |
442 | 2488 } |
2489 else | |
2490 { | |
856 | 2491 prt_use_courier = FALSE; |
2492 prt_ps_font = &prt_ps_courier_font; | |
442 | 2493 } |
2494 | |
2495 /* | |
2496 * Find the size of the paper and set the margins. | |
2497 */ | |
2498 prt_portrait = (!printer_opts[OPT_PRINT_PORTRAIT].present | |
2499 || TOLOWER_ASC(printer_opts[OPT_PRINT_PORTRAIT].string[0]) == 'y'); | |
2500 if (printer_opts[OPT_PRINT_PAPER].present) | |
2501 { | |
2502 paper_name = (char *)printer_opts[OPT_PRINT_PAPER].string; | |
2503 paper_strlen = printer_opts[OPT_PRINT_PAPER].strlen; | |
2504 } | |
2505 else | |
2506 { | |
2507 paper_name = "A4"; | |
2508 paper_strlen = 2; | |
2509 } | |
1880 | 2510 for (i = 0; i < (int)PRT_MEDIASIZE_LEN; ++i) |
442 | 2511 if (STRLEN(prt_mediasize[i].name) == (unsigned)paper_strlen |
2512 && STRNICMP(prt_mediasize[i].name, paper_name, | |
2513 paper_strlen) == 0) | |
2514 break; | |
2515 if (i == PRT_MEDIASIZE_LEN) | |
2516 i = 0; | |
2517 prt_media = i; | |
2518 | |
2519 /* | |
2520 * Set PS pagesize based on media dimensions and print orientation. | |
2521 * Note: Media and page sizes have defined meanings in PostScript and should | |
2522 * be kept distinct. Media is the paper (or transparency, or ...) that is | |
2523 * printed on, whereas the page size is the area that the PostScript | |
2524 * interpreter renders into. | |
2525 */ | |
2526 if (prt_portrait) | |
2527 { | |
2528 prt_page_width = prt_mediasize[i].width; | |
2529 prt_page_height = prt_mediasize[i].height; | |
2530 } | |
2531 else | |
2532 { | |
2533 prt_page_width = prt_mediasize[i].height; | |
2534 prt_page_height = prt_mediasize[i].width; | |
2535 } | |
2536 | |
2537 /* | |
2538 * Set PS page margins based on the PS pagesize, not the mediasize - this | |
2539 * needs to be done before the cpl and lpp are calculated. | |
2540 */ | |
2541 prt_page_margins(prt_page_width, prt_page_height, &left, &right, &top, | |
2542 &bottom); | |
2543 prt_left_margin = (float)left; | |
2544 prt_right_margin = (float)right; | |
2545 prt_top_margin = (float)top; | |
2546 prt_bottom_margin = (float)bottom; | |
2547 | |
2548 /* | |
2549 * Set up the font size. | |
2550 */ | |
2551 fontsize = PRT_PS_DEFAULT_FONTSIZE; | |
2552 for (p = p_pfn; (p = vim_strchr(p, ':')) != NULL; ++p) | |
2553 if (p[1] == 'h' && VIM_ISDIGIT(p[2])) | |
2554 fontsize = atoi((char *)p + 2); | |
2555 prt_font_metrics(fontsize); | |
2556 | |
2557 /* | |
2558 * Return the number of characters per line, and lines per page for the | |
2559 * generic print code. | |
2560 */ | |
2561 psettings->chars_per_line = prt_get_cpl(); | |
2562 psettings->lines_per_page = prt_get_lpp(); | |
2563 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2564 // Catch margin settings that leave no space for output! |
442 | 2565 if (psettings->chars_per_line <= 0 || psettings->lines_per_page <= 0) |
2566 return FAIL; | |
2567 | |
2568 /* | |
2569 * Sort out the number of copies to be printed. PS by default will do | |
2570 * uncollated copies for you, so once we know how many uncollated copies are | |
2571 * wanted cache it away and lie to the generic code that we only want one | |
2572 * uncollated copy. | |
2573 */ | |
2574 psettings->n_collated_copies = 1; | |
2575 psettings->n_uncollated_copies = 1; | |
2576 prt_num_copies = 1; | |
2577 prt_collate = (!printer_opts[OPT_PRINT_COLLATE].present | |
2578 || TOLOWER_ASC(printer_opts[OPT_PRINT_COLLATE].string[0]) == 'y'); | |
2579 if (prt_collate) | |
2580 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2581 // TODO: Get number of collated copies wanted. |
442 | 2582 psettings->n_collated_copies = 1; |
2583 } | |
2584 else | |
2585 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2586 // TODO: Get number of uncollated copies wanted and update the cached |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2587 // count. |
442 | 2588 prt_num_copies = 1; |
2589 } | |
2590 | |
2591 psettings->jobname = jobname; | |
2592 | |
2593 /* | |
2594 * Set up printer duplex and tumble based on Duplex option setting - default | |
2595 * is long sided duplex printing (i.e. no tumble). | |
2596 */ | |
2597 prt_duplex = TRUE; | |
2598 prt_tumble = FALSE; | |
2599 psettings->duplex = 1; | |
2600 if (printer_opts[OPT_PRINT_DUPLEX].present) | |
2601 { | |
2602 if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "off", 3) == 0) | |
2603 { | |
2604 prt_duplex = FALSE; | |
2605 psettings->duplex = 0; | |
2606 } | |
2607 else if (STRNICMP(printer_opts[OPT_PRINT_DUPLEX].string, "short", 5) | |
2608 == 0) | |
2609 prt_tumble = TRUE; | |
2610 } | |
2611 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2612 // For now user abort not supported |
442 | 2613 psettings->user_abort = 0; |
2614 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2615 // If the user didn't specify a file name, use a temp file. |
442 | 2616 if (psettings->outfile == NULL) |
2617 { | |
6721 | 2618 prt_ps_file_name = vim_tempname('p', TRUE); |
442 | 2619 if (prt_ps_file_name == NULL) |
2620 { | |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
2621 emsg(_(e_cant_get_temp_file_name)); |
442 | 2622 return FAIL; |
2623 } | |
2624 prt_ps_fd = mch_fopen((char *)prt_ps_file_name, WRITEBIN); | |
2625 } | |
2626 else | |
2627 { | |
2628 p = expand_env_save(psettings->outfile); | |
2629 if (p != NULL) | |
2630 { | |
2631 prt_ps_fd = mch_fopen((char *)p, WRITEBIN); | |
2632 vim_free(p); | |
2633 } | |
2634 } | |
2635 if (prt_ps_fd == NULL) | |
2636 { | |
26909
aa65d1808bd0
patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
2637 emsg(_(e_cant_open_postscript_output_file)); |
442 | 2638 mch_print_cleanup(); |
2639 return FAIL; | |
2640 } | |
2641 | |
2642 prt_bufsiz = psettings->chars_per_line; | |
2643 if (prt_out_mbyte) | |
856 | 2644 prt_bufsiz *= 2; |
27028
c9474ae175f4
patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents:
26952
diff
changeset
|
2645 ga_init2(&prt_ps_buffer, sizeof(char), prt_bufsiz); |
442 | 2646 |
2647 prt_page_num = 0; | |
2648 | |
2649 prt_attribute_change = FALSE; | |
2650 prt_need_moveto = FALSE; | |
2651 prt_need_font = FALSE; | |
2652 prt_need_fgcol = FALSE; | |
2653 prt_need_bgcol = FALSE; | |
2654 prt_need_underline = FALSE; | |
2655 | |
2656 prt_file_error = FALSE; | |
2657 | |
2658 return OK; | |
2659 } | |
2660 | |
2661 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2662 prt_add_resource(struct prt_ps_resource_S *resource) |
442 | 2663 { |
2664 FILE* fd_resource; | |
2665 char_u resource_buffer[512]; | |
2666 size_t bytes_read; | |
2667 | |
2668 fd_resource = mch_fopen((char *)resource->filename, READBIN); | |
2669 if (fd_resource == NULL) | |
2670 { | |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2671 semsg(_(e_cant_open_file_str_2), resource->filename); |
442 | 2672 return FALSE; |
2673 } | |
2674 prt_dsc_resources("BeginResource", prt_resource_types[resource->type], | |
2675 (char *)resource->title); | |
2676 | |
2677 prt_dsc_textline("BeginDocument", (char *)resource->filename); | |
2678 | |
2679 for (;;) | |
2680 { | |
2681 bytes_read = fread((char *)resource_buffer, sizeof(char_u), | |
2682 sizeof(resource_buffer), fd_resource); | |
2683 if (ferror(fd_resource)) | |
2684 { | |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2685 semsg(_(e_cant_read_postscript_resource_file_str), |
442 | 2686 resource->filename); |
2687 fclose(fd_resource); | |
2688 return FALSE; | |
2689 } | |
2690 if (bytes_read == 0) | |
2691 break; | |
835 | 2692 prt_write_file_raw_len(resource_buffer, (int)bytes_read); |
442 | 2693 if (prt_file_error) |
2694 { | |
2695 fclose(fd_resource); | |
2696 return FALSE; | |
2697 } | |
2698 } | |
2699 fclose(fd_resource); | |
2700 | |
2701 prt_dsc_noarg("EndDocument"); | |
2702 | |
2703 prt_dsc_noarg("EndResource"); | |
2704 | |
2705 return TRUE; | |
2706 } | |
2707 | |
2708 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2709 mch_print_begin(prt_settings_T *psettings) |
442 | 2710 { |
2711 int bbox[4]; | |
2712 double left; | |
2713 double right; | |
2714 double top; | |
2715 double bottom; | |
2770 | 2716 struct prt_ps_resource_S *res_prolog; |
2717 struct prt_ps_resource_S *res_encoding; | |
442 | 2718 char buffer[256]; |
2719 char_u *p_encoding; | |
2770 | 2720 struct prt_ps_resource_S *res_cidfont; |
2721 struct prt_ps_resource_S *res_cmap; | |
2722 int retval = FALSE; | |
2723 | |
32120
97255d909654
patch 9.0.1391: "clear" macros are not always used
Bram Moolenaar <Bram@vim.org>
parents:
31996
diff
changeset
|
2724 res_prolog = ALLOC_ONE(struct prt_ps_resource_S); |
97255d909654
patch 9.0.1391: "clear" macros are not always used
Bram Moolenaar <Bram@vim.org>
parents:
31996
diff
changeset
|
2725 res_encoding = ALLOC_ONE(struct prt_ps_resource_S); |
97255d909654
patch 9.0.1391: "clear" macros are not always used
Bram Moolenaar <Bram@vim.org>
parents:
31996
diff
changeset
|
2726 res_cidfont = ALLOC_ONE(struct prt_ps_resource_S); |
97255d909654
patch 9.0.1391: "clear" macros are not always used
Bram Moolenaar <Bram@vim.org>
parents:
31996
diff
changeset
|
2727 res_cmap = ALLOC_ONE(struct prt_ps_resource_S); |
2770 | 2728 if (res_prolog == NULL || res_encoding == NULL |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
2729 || res_cidfont == NULL || res_cmap == NULL) |
2770 | 2730 goto theend; |
442 | 2731 |
2732 /* | |
2733 * PS DSC Header comments - no PS code! | |
2734 */ | |
2735 prt_dsc_start(); | |
2736 prt_dsc_textline("Title", (char *)psettings->jobname); | |
2737 if (!get_user_name((char_u *)buffer, 256)) | |
856 | 2738 STRCPY(buffer, "Unknown"); |
442 | 2739 prt_dsc_textline("For", buffer); |
2740 prt_dsc_textline("Creator", VIM_VERSION_LONG); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2741 // Note: to ensure Clean8bit I don't think we can use LC_TIME |
16621
7ad3fc329e08
patch 8.1.1313: warnings for using localtime() and ctime()
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2742 |
7ad3fc329e08
patch 8.1.1313: warnings for using localtime() and ctime()
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2743 prt_dsc_textline("CreationDate", get_ctime(time(NULL), FALSE)); |
442 | 2744 prt_dsc_textline("DocumentData", "Clean8Bit"); |
2745 prt_dsc_textline("Orientation", "Portrait"); | |
2746 prt_dsc_atend("Pages"); | |
2747 prt_dsc_textline("PageOrder", "Ascend"); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2748 // The bbox does not change with orientation - it is always in the default |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2749 // user coordinate system! We have to recalculate right and bottom |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2750 // coordinates based on the font metrics for the bbox to be accurate. |
442 | 2751 prt_page_margins(prt_mediasize[prt_media].width, |
2752 prt_mediasize[prt_media].height, | |
2753 &left, &right, &top, &bottom); | |
2754 bbox[0] = (int)left; | |
2755 if (prt_portrait) | |
2756 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2757 // In portrait printing the fixed point is the top left corner so we |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2758 // derive the bbox from that point. We have the expected cpl chars |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2759 // across the media and lpp lines down the media. |
442 | 2760 bbox[1] = (int)(top - (psettings->lines_per_page + prt_header_height()) |
27453
c7f614c9ceb3
patch 8.2.4255: theoretical computation overflow
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
2761 * (double)prt_line_height); |
c7f614c9ceb3
patch 8.2.4255: theoretical computation overflow
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
2762 bbox[2] = (int)(left + psettings->chars_per_line |
c7f614c9ceb3
patch 8.2.4255: theoretical computation overflow
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
2763 * (double)prt_char_width + 0.5); |
442 | 2764 bbox[3] = (int)(top + 0.5); |
2765 } | |
2766 else | |
2767 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2768 // In landscape printing the fixed point is the bottom left corner so we |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2769 // derive the bbox from that point. We have lpp chars across the media |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2770 // and cpl lines up the media. |
442 | 2771 bbox[1] = (int)bottom; |
2772 bbox[2] = (int)(left + ((psettings->lines_per_page | |
2773 + prt_header_height()) * prt_line_height) + 0.5); | |
27453
c7f614c9ceb3
patch 8.2.4255: theoretical computation overflow
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
2774 bbox[3] = (int)(bottom + psettings->chars_per_line |
c7f614c9ceb3
patch 8.2.4255: theoretical computation overflow
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
2775 * (double)prt_char_width + 0.5); |
442 | 2776 } |
2777 prt_dsc_ints("BoundingBox", 4, bbox); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2778 // The media width and height does not change with landscape printing! |
442 | 2779 prt_dsc_docmedia(prt_mediasize[prt_media].name, |
2780 prt_mediasize[prt_media].width, | |
2781 prt_mediasize[prt_media].height, | |
2782 (double)0, NULL, NULL); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2783 // Define fonts needed |
442 | 2784 if (!prt_out_mbyte || prt_use_courier) |
856 | 2785 prt_dsc_font_resource("DocumentNeededResources", &prt_ps_courier_font); |
442 | 2786 if (prt_out_mbyte) |
2787 { | |
856 | 2788 prt_dsc_font_resource((prt_use_courier ? NULL |
27453
c7f614c9ceb3
patch 8.2.4255: theoretical computation overflow
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
2789 : "DocumentNeededResources"), &prt_ps_mb_font); |
856 | 2790 if (!prt_custom_cmap) |
2791 prt_dsc_resources(NULL, "cmap", prt_cmap); | |
442 | 2792 } |
2793 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2794 // Search for external resources VIM supplies |
2770 | 2795 if (!prt_find_resource("prolog", res_prolog)) |
442 | 2796 { |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2797 semsg(_(e_cant_find_postscript_resource_file_str_ps), "prolog"); |
6404 | 2798 goto theend; |
442 | 2799 } |
2770 | 2800 if (!prt_open_resource(res_prolog)) |
6404 | 2801 goto theend; |
2770 | 2802 if (!prt_check_resource(res_prolog, PRT_PROLOG_VERSION)) |
6404 | 2803 goto theend; |
442 | 2804 if (prt_out_mbyte) |
2805 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2806 // Look for required version of multi-byte printing procset |
2770 | 2807 if (!prt_find_resource("cidfont", res_cidfont)) |
856 | 2808 { |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2809 semsg(_(e_cant_find_postscript_resource_file_str_ps), "cidfont"); |
6404 | 2810 goto theend; |
856 | 2811 } |
2770 | 2812 if (!prt_open_resource(res_cidfont)) |
6404 | 2813 goto theend; |
2770 | 2814 if (!prt_check_resource(res_cidfont, PRT_CID_PROLOG_VERSION)) |
6404 | 2815 goto theend; |
442 | 2816 } |
2817 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2818 // Find an encoding to use for printing. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2819 // Check 'printencoding'. If not set or not found, then use 'encoding'. If |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2820 // that cannot be found then default to "latin1". |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2821 // Note: VIM specific encoding header is always skipped. |
442 | 2822 if (!prt_out_mbyte) |
2823 { | |
856 | 2824 p_encoding = enc_skip(p_penc); |
2825 if (*p_encoding == NUL | |
2770 | 2826 || !prt_find_resource((char *)p_encoding, res_encoding)) |
856 | 2827 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2828 // 'printencoding' not set or not supported - find alternate |
856 | 2829 int props; |
2830 | |
2831 p_encoding = enc_skip(p_enc); | |
2832 props = enc_canon_props(p_encoding); | |
2833 if (!(props & ENC_8BIT) | |
2770 | 2834 || !prt_find_resource((char *)p_encoding, res_encoding)) |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2835 // 8-bit 'encoding' is not supported |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2836 { |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2837 // Use latin1 as default printing encoding |
856 | 2838 p_encoding = (char_u *)"latin1"; |
2770 | 2839 if (!prt_find_resource((char *)p_encoding, res_encoding)) |
856 | 2840 { |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2841 semsg(_(e_cant_find_postscript_resource_file_str_ps), |
856 | 2842 p_encoding); |
6404 | 2843 goto theend; |
856 | 2844 } |
2845 } | |
2846 } | |
2770 | 2847 if (!prt_open_resource(res_encoding)) |
6404 | 2848 goto theend; |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2849 // For the moment there are no checks on encoding resource files to |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2850 // perform |
442 | 2851 } |
2852 else | |
2853 { | |
856 | 2854 p_encoding = enc_skip(p_penc); |
2855 if (*p_encoding == NUL) | |
2856 p_encoding = enc_skip(p_enc); | |
2857 if (prt_use_courier) | |
2858 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2859 // Include ASCII range encoding vector |
2770 | 2860 if (!prt_find_resource(prt_ascii_encoding, res_encoding)) |
856 | 2861 { |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2862 semsg(_(e_cant_find_postscript_resource_file_str_ps), |
442 | 2863 prt_ascii_encoding); |
6404 | 2864 goto theend; |
856 | 2865 } |
2770 | 2866 if (!prt_open_resource(res_encoding)) |
6404 | 2867 goto theend; |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2868 // For the moment there are no checks on encoding resource files to |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2869 // perform |
856 | 2870 } |
442 | 2871 } |
2872 | |
2873 prt_conv.vc_type = CONV_NONE; | |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
2874 if (!(enc_canon_props(p_enc) & enc_canon_props(p_encoding) & ENC_8BIT)) |
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
2875 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2876 // Set up encoding conversion if required |
442 | 2877 if (FAIL == convert_setup(&prt_conv, p_enc, p_encoding)) |
2878 { | |
26948
51ddf6740ac6
patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
2879 semsg(_(e_unable_to_convert_to_print_encoding_str), p_encoding); |
6404 | 2880 goto theend; |
442 | 2881 } |
2882 prt_do_conv = TRUE; | |
2883 } | |
2884 prt_do_conv = prt_conv.vc_type != CONV_NONE; | |
2885 | |
2886 if (prt_out_mbyte && prt_custom_cmap) | |
2887 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2888 // Find user supplied CMap |
2770 | 2889 if (!prt_find_resource(prt_cmap, res_cmap)) |
856 | 2890 { |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
2891 semsg(_(e_cant_find_postscript_resource_file_str_ps), prt_cmap); |
6404 | 2892 goto theend; |
856 | 2893 } |
2770 | 2894 if (!prt_open_resource(res_cmap)) |
6404 | 2895 goto theend; |
442 | 2896 } |
2897 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2898 // List resources supplied |
2770 | 2899 STRCPY(buffer, res_prolog->title); |
442 | 2900 STRCAT(buffer, " "); |
2770 | 2901 STRCAT(buffer, res_prolog->version); |
442 | 2902 prt_dsc_resources("DocumentSuppliedResources", "procset", buffer); |
2903 if (prt_out_mbyte) | |
2904 { | |
2770 | 2905 STRCPY(buffer, res_cidfont->title); |
856 | 2906 STRCAT(buffer, " "); |
2770 | 2907 STRCAT(buffer, res_cidfont->version); |
856 | 2908 prt_dsc_resources(NULL, "procset", buffer); |
2909 | |
2910 if (prt_custom_cmap) | |
2911 { | |
2770 | 2912 STRCPY(buffer, res_cmap->title); |
856 | 2913 STRCAT(buffer, " "); |
2770 | 2914 STRCAT(buffer, res_cmap->version); |
856 | 2915 prt_dsc_resources(NULL, "cmap", buffer); |
2916 } | |
442 | 2917 } |
2918 if (!prt_out_mbyte || prt_use_courier) | |
2919 { | |
2770 | 2920 STRCPY(buffer, res_encoding->title); |
856 | 2921 STRCAT(buffer, " "); |
2770 | 2922 STRCAT(buffer, res_encoding->version); |
856 | 2923 prt_dsc_resources(NULL, "encoding", buffer); |
442 | 2924 } |
2925 prt_dsc_requirements(prt_duplex, prt_tumble, prt_collate, | |
2926 #ifdef FEAT_SYN_HL | |
2927 psettings->do_syntax | |
2928 #else | |
2929 0 | |
2930 #endif | |
2931 , prt_num_copies); | |
2932 prt_dsc_noarg("EndComments"); | |
2933 | |
2934 /* | |
2935 * PS Document page defaults | |
2936 */ | |
2937 prt_dsc_noarg("BeginDefaults"); | |
2938 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2939 // List font resources most likely common to all pages |
442 | 2940 if (!prt_out_mbyte || prt_use_courier) |
856 | 2941 prt_dsc_font_resource("PageResources", &prt_ps_courier_font); |
442 | 2942 if (prt_out_mbyte) |
2943 { | |
856 | 2944 prt_dsc_font_resource((prt_use_courier ? NULL : "PageResources"), |
2945 &prt_ps_mb_font); | |
2946 if (!prt_custom_cmap) | |
2947 prt_dsc_resources(NULL, "cmap", prt_cmap); | |
442 | 2948 } |
2949 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2950 // Paper will be used for all pages |
442 | 2951 prt_dsc_textline("PageMedia", prt_mediasize[prt_media].name); |
2952 | |
2953 prt_dsc_noarg("EndDefaults"); | |
2954 | |
2955 /* | |
2956 * PS Document prolog inclusion - all required procsets. | |
2957 */ | |
2958 prt_dsc_noarg("BeginProlog"); | |
2959 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2960 // Add required procsets - NOTE: order is important! |
2770 | 2961 if (!prt_add_resource(res_prolog)) |
6404 | 2962 goto theend; |
442 | 2963 if (prt_out_mbyte) |
2964 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2965 // Add CID font procset, and any user supplied CMap |
2770 | 2966 if (!prt_add_resource(res_cidfont)) |
6404 | 2967 goto theend; |
2770 | 2968 if (prt_custom_cmap && !prt_add_resource(res_cmap)) |
6404 | 2969 goto theend; |
442 | 2970 } |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
2971 |
442 | 2972 if (!prt_out_mbyte || prt_use_courier) |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2973 // There will be only one Roman font encoding to be included in the PS |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2974 // file. |
2770 | 2975 if (!prt_add_resource(res_encoding)) |
6404 | 2976 goto theend; |
442 | 2977 |
2978 prt_dsc_noarg("EndProlog"); | |
2979 | |
2980 /* | |
2981 * PS Document setup - must appear after the prolog | |
2982 */ | |
2983 prt_dsc_noarg("BeginSetup"); | |
2984 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2985 // Device setup - page size and number of uncollated copies |
442 | 2986 prt_write_int((int)prt_mediasize[prt_media].width); |
2987 prt_write_int((int)prt_mediasize[prt_media].height); | |
2988 prt_write_int(0); | |
2989 prt_write_string("sps\n"); | |
2990 prt_write_int(prt_num_copies); | |
2991 prt_write_string("nc\n"); | |
2992 prt_write_boolean(prt_duplex); | |
2993 prt_write_boolean(prt_tumble); | |
2994 prt_write_string("dt\n"); | |
2995 prt_write_boolean(prt_collate); | |
2996 prt_write_string("c\n"); | |
2997 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2998 // Font resource inclusion and definition |
442 | 2999 if (!prt_out_mbyte || prt_use_courier) |
3000 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3001 // When using Courier for ASCII range when printing multi-byte, need to |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3002 // pick up ASCII encoding to use with it. |
856 | 3003 if (prt_use_courier) |
3004 p_encoding = (char_u *)prt_ascii_encoding; | |
3005 prt_dsc_resources("IncludeResource", "font", | |
3006 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_ROMAN]); | |
3007 prt_def_font("F0", (char *)p_encoding, (int)prt_line_height, | |
3008 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_ROMAN]); | |
3009 prt_dsc_resources("IncludeResource", "font", | |
3010 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLD]); | |
3011 prt_def_font("F1", (char *)p_encoding, (int)prt_line_height, | |
3012 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLD]); | |
3013 prt_dsc_resources("IncludeResource", "font", | |
3014 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); | |
3015 prt_def_font("F2", (char *)p_encoding, (int)prt_line_height, | |
3016 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); | |
3017 prt_dsc_resources("IncludeResource", "font", | |
3018 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); | |
3019 prt_def_font("F3", (char *)p_encoding, (int)prt_line_height, | |
3020 prt_ps_courier_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); | |
442 | 3021 } |
3022 if (prt_out_mbyte) | |
3023 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3024 // Define the CID fonts to be used in the job. Typically CJKV fonts do |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3025 // not have an italic form being a western style, so where no font is |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3026 // defined for these faces VIM falls back to an existing face. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3027 // Note: if using Courier for the ASCII range then the printout will |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3028 // have bold/italic/bolditalic regardless of the setting of printmbfont. |
856 | 3029 prt_dsc_resources("IncludeResource", "font", |
3030 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_ROMAN]); | |
3031 if (!prt_custom_cmap) | |
3032 prt_dsc_resources("IncludeResource", "cmap", prt_cmap); | |
3033 prt_def_cidfont("CF0", (int)prt_line_height, | |
3034 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_ROMAN]); | |
3035 | |
3036 if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD] != NULL) | |
3037 { | |
3038 prt_dsc_resources("IncludeResource", "font", | |
3039 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD]); | |
3040 if (!prt_custom_cmap) | |
3041 prt_dsc_resources("IncludeResource", "cmap", prt_cmap); | |
3042 prt_def_cidfont("CF1", (int)prt_line_height, | |
3043 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLD]); | |
3044 } | |
3045 else | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3046 // Use ROMAN for BOLD |
856 | 3047 prt_dup_cidfont("CF0", "CF1"); |
3048 | |
3049 if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE] != NULL) | |
3050 { | |
3051 prt_dsc_resources("IncludeResource", "font", | |
3052 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); | |
3053 if (!prt_custom_cmap) | |
3054 prt_dsc_resources("IncludeResource", "cmap", prt_cmap); | |
3055 prt_def_cidfont("CF2", (int)prt_line_height, | |
3056 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_OBLIQUE]); | |
3057 } | |
3058 else | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3059 // Use ROMAN for OBLIQUE |
856 | 3060 prt_dup_cidfont("CF0", "CF2"); |
3061 | |
3062 if (prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE] != NULL) | |
3063 { | |
3064 prt_dsc_resources("IncludeResource", "font", | |
3065 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); | |
3066 if (!prt_custom_cmap) | |
3067 prt_dsc_resources("IncludeResource", "cmap", prt_cmap); | |
3068 prt_def_cidfont("CF3", (int)prt_line_height, | |
3069 prt_ps_mb_font.ps_fontname[PRT_PS_FONT_BOLDOBLIQUE]); | |
3070 } | |
3071 else | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3072 // Use BOLD for BOLDOBLIQUE |
856 | 3073 prt_dup_cidfont("CF1", "CF3"); |
442 | 3074 } |
3075 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3076 // Misc constant vars used for underlining and background rects |
442 | 3077 prt_def_var("UO", PRT_PS_FONT_TO_USER(prt_line_height, |
3078 prt_ps_font->uline_offset), 2); | |
3079 prt_def_var("UW", PRT_PS_FONT_TO_USER(prt_line_height, | |
3080 prt_ps_font->uline_width), 2); | |
3081 prt_def_var("BO", prt_bgcol_offset, 2); | |
3082 | |
3083 prt_dsc_noarg("EndSetup"); | |
3084 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3085 // Fail if any problems writing out to the PS file |
2770 | 3086 retval = !prt_file_error; |
3087 | |
3088 theend: | |
3089 vim_free(res_prolog); | |
3090 vim_free(res_encoding); | |
3091 vim_free(res_cidfont); | |
3092 vim_free(res_cmap); | |
3093 | |
3094 return retval; | |
442 | 3095 } |
3096 | |
3097 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3098 mch_print_end(prt_settings_T *psettings) |
442 | 3099 { |
3100 prt_dsc_noarg("Trailer"); | |
3101 | |
3102 /* | |
3103 * Output any info we don't know in toto until we finish | |
3104 */ | |
3105 prt_dsc_ints("Pages", 1, &prt_page_num); | |
3106 | |
3107 prt_dsc_noarg("EOF"); | |
3108 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3109 // Write CTRL-D to close serial communication link if used. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3110 // NOTHING MUST BE WRITTEN AFTER THIS! |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3111 prt_write_file((char_u *)"\004"); |
442 | 3112 |
3113 if (!prt_file_error && psettings->outfile == NULL | |
3114 && !got_int && !psettings->user_abort) | |
3115 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3116 // Close the file first. |
442 | 3117 if (prt_ps_fd != NULL) |
3118 { | |
3119 fclose(prt_ps_fd); | |
3120 prt_ps_fd = NULL; | |
3121 } | |
3122 prt_message((char_u *)_("Sending to printer...")); | |
3123 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3124 // Not printing to a file: use 'printexpr' to print the file. |
442 | 3125 if (eval_printexpr(prt_ps_file_name, psettings->arguments) == FAIL) |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26909
diff
changeset
|
3126 emsg(_(e_failed_to_print_postscript_file)); |
442 | 3127 else |
3128 prt_message((char_u *)_("Print job sent.")); | |
3129 } | |
3130 | |
3131 mch_print_cleanup(); | |
3132 } | |
3133 | |
3134 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3135 mch_print_end_page(void) |
442 | 3136 { |
3137 prt_flush_buffer(); | |
3138 | |
3139 prt_write_string("re sp\n"); | |
3140 | |
3141 prt_dsc_noarg("PageTrailer"); | |
3142 | |
3143 return !prt_file_error; | |
3144 } | |
3145 | |
3146 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3147 mch_print_begin_page(char_u *str UNUSED) |
442 | 3148 { |
3149 int page_num[2]; | |
3150 | |
3151 prt_page_num++; | |
3152 | |
3153 page_num[0] = page_num[1] = prt_page_num; | |
3154 prt_dsc_ints("Page", 2, page_num); | |
3155 | |
3156 prt_dsc_noarg("BeginPageSetup"); | |
3157 | |
3158 prt_write_string("sv\n0 g\n"); | |
3159 prt_in_ascii = !prt_out_mbyte; | |
3160 if (prt_out_mbyte) | |
856 | 3161 prt_write_string("CF0 sf\n"); |
442 | 3162 else |
856 | 3163 prt_write_string("F0 sf\n"); |
442 | 3164 prt_fgcol = PRCOLOR_BLACK; |
3165 prt_bgcol = PRCOLOR_WHITE; | |
3166 prt_font = PRT_PS_FONT_ROMAN; | |
3167 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3168 // Set up page transformation for landscape printing. |
442 | 3169 if (!prt_portrait) |
3170 { | |
3171 prt_write_int(-((int)prt_mediasize[prt_media].width)); | |
3172 prt_write_string("sl\n"); | |
3173 } | |
3174 | |
3175 prt_dsc_noarg("EndPageSetup"); | |
3176 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3177 // We have reset the font attributes, force setting them again. |
442 | 3178 curr_bg = (long_u)0xffffffff; |
3179 curr_fg = (long_u)0xffffffff; | |
3180 curr_bold = MAYBE; | |
3181 | |
3182 return !prt_file_error; | |
3183 } | |
3184 | |
3185 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3186 mch_print_blank_page(void) |
442 | 3187 { |
3188 return (mch_print_begin_page(NULL) ? (mch_print_end_page()) : FALSE); | |
3189 } | |
3190 | |
3191 static float prt_pos_x = 0; | |
3192 static float prt_pos_y = 0; | |
3193 | |
3194 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3195 mch_print_start_line(int margin, int page_line) |
442 | 3196 { |
3197 prt_pos_x = prt_left_margin; | |
3198 if (margin) | |
3199 prt_pos_x -= prt_number_width; | |
3200 | |
3201 prt_pos_y = prt_top_margin - prt_first_line_height - | |
3202 page_line * prt_line_height; | |
3203 | |
3204 prt_attribute_change = TRUE; | |
3205 prt_need_moveto = TRUE; | |
3206 prt_half_width = FALSE; | |
3207 } | |
3208 | |
3209 int | |
14077
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3210 mch_print_text_out(char_u *textp, int len UNUSED) |
442 | 3211 { |
14077
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3212 char_u *p = textp; |
442 | 3213 int need_break; |
3214 char_u ch; | |
3215 char_u ch_buff[8]; | |
3216 float char_width; | |
3217 float next_pos; | |
856 | 3218 int in_ascii; |
3219 int half_width; | |
13258
6acb9148d83e
patch 8.0.1503: access memory beyond end of string
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
3220 char_u *tofree = NULL; |
442 | 3221 |
3222 char_width = prt_char_width; | |
3223 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3224 // Ideally VIM would create a rearranged CID font to combine a Roman and |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3225 // CJKV font to do what VIM is doing here - use a Roman font for characters |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3226 // in the ASCII range, and the original CID font for everything else. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3227 // The problem is that GhostScript still (as of 8.13) does not support |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3228 // rearranged fonts even though they have been documented by Adobe for 7 |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3229 // years! If they ever do, a lot of this code will disappear. |
442 | 3230 if (prt_use_courier) |
3231 { | |
856 | 3232 in_ascii = (len == 1 && *p < 0x80); |
3233 if (prt_in_ascii) | |
3234 { | |
3235 if (!in_ascii) | |
3236 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3237 // No longer in ASCII range - need to switch font |
856 | 3238 prt_in_ascii = FALSE; |
3239 prt_need_font = TRUE; | |
3240 prt_attribute_change = TRUE; | |
3241 } | |
3242 } | |
3243 else if (in_ascii) | |
3244 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3245 // Now in ASCII range - need to switch font |
856 | 3246 prt_in_ascii = TRUE; |
3247 prt_need_font = TRUE; | |
3248 prt_attribute_change = TRUE; | |
3249 } | |
442 | 3250 } |
3251 if (prt_out_mbyte) | |
3252 { | |
856 | 3253 half_width = ((*mb_ptr2cells)(p) == 1); |
3254 if (half_width) | |
3255 char_width /= 2; | |
3256 if (prt_half_width) | |
3257 { | |
3258 if (!half_width) | |
3259 { | |
3260 prt_half_width = FALSE; | |
3261 prt_pos_x += prt_char_width/4; | |
3262 prt_need_moveto = TRUE; | |
3263 prt_attribute_change = TRUE; | |
3264 } | |
3265 } | |
3266 else if (half_width) | |
3267 { | |
3268 prt_half_width = TRUE; | |
3269 prt_pos_x += prt_char_width/4; | |
3270 prt_need_moveto = TRUE; | |
3271 prt_attribute_change = TRUE; | |
3272 } | |
442 | 3273 } |
3274 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3275 // Output any required changes to the graphics state, after flushing any |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3276 // text buffered so far. |
442 | 3277 if (prt_attribute_change) |
3278 { | |
3279 prt_flush_buffer(); | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3280 // Reset count of number of chars that will be printed |
442 | 3281 prt_text_run = 0; |
3282 | |
3283 if (prt_need_moveto) | |
3284 { | |
3285 prt_pos_x_moveto = prt_pos_x; | |
3286 prt_pos_y_moveto = prt_pos_y; | |
3287 prt_do_moveto = TRUE; | |
3288 | |
3289 prt_need_moveto = FALSE; | |
3290 } | |
3291 if (prt_need_font) | |
3292 { | |
856 | 3293 if (!prt_in_ascii) |
3294 prt_write_string("CF"); | |
3295 else | |
3296 prt_write_string("F"); | |
3297 prt_write_int(prt_font); | |
3298 prt_write_string("sf\n"); | |
3299 prt_need_font = FALSE; | |
442 | 3300 } |
3301 if (prt_need_fgcol) | |
3302 { | |
3303 int r, g, b; | |
3304 r = ((unsigned)prt_fgcol & 0xff0000) >> 16; | |
3305 g = ((unsigned)prt_fgcol & 0xff00) >> 8; | |
3306 b = prt_fgcol & 0xff; | |
3307 | |
3308 prt_write_real(r / 255.0, 3); | |
3309 if (r == g && g == b) | |
3310 prt_write_string("g\n"); | |
3311 else | |
3312 { | |
3313 prt_write_real(g / 255.0, 3); | |
3314 prt_write_real(b / 255.0, 3); | |
3315 prt_write_string("r\n"); | |
3316 } | |
3317 prt_need_fgcol = FALSE; | |
3318 } | |
3319 | |
3320 if (prt_bgcol != PRCOLOR_WHITE) | |
3321 { | |
3322 prt_new_bgcol = prt_bgcol; | |
3323 if (prt_need_bgcol) | |
3324 prt_do_bgcol = TRUE; | |
3325 } | |
3326 else | |
3327 prt_do_bgcol = FALSE; | |
3328 prt_need_bgcol = FALSE; | |
3329 | |
3330 if (prt_need_underline) | |
3331 prt_do_underline = prt_underline; | |
3332 prt_need_underline = FALSE; | |
3333 | |
3334 prt_attribute_change = FALSE; | |
3335 } | |
3336 | |
3337 if (prt_do_conv) | |
14077
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3338 { |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3339 // Convert from multi-byte to 8-bit encoding |
13258
6acb9148d83e
patch 8.0.1503: access memory beyond end of string
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
3340 tofree = p = string_convert(&prt_conv, p, &len); |
14077
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3341 if (p == NULL) |
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3342 { |
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3343 p = (char_u *)""; |
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3344 len = 0; |
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3345 } |
873542706b0b
patch 8.1.0056: crash when using :hardcopy with illegal byte
Christian Brabandt <cb@256bit.org>
parents:
13258
diff
changeset
|
3346 } |
442 | 3347 |
3348 if (prt_out_mbyte) | |
3349 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3350 // Multi-byte character strings are represented more efficiently as hex |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3351 // strings when outputting clean 8 bit PS. |
13258
6acb9148d83e
patch 8.0.1503: access memory beyond end of string
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
3352 while (len-- > 0) |
856 | 3353 { |
3354 ch = prt_hexchar[(unsigned)(*p) >> 4]; | |
3355 ga_append(&prt_ps_buffer, ch); | |
3356 ch = prt_hexchar[(*p) & 0xf]; | |
3357 ga_append(&prt_ps_buffer, ch); | |
3358 p++; | |
3359 } | |
442 | 3360 } |
3361 else | |
3362 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3363 // Add next character to buffer of characters to output. |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3364 // Note: One printed character may require several PS characters to |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3365 // represent it, but we only count them as one printed character. |
856 | 3366 ch = *p; |
3367 if (ch < 32 || ch == '(' || ch == ')' || ch == '\\') | |
3368 { | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3369 // Convert non-printing characters to either their escape or octal |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3370 // sequence, ensures PS sent over a serial line does not interfere |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3371 // with the comms protocol. |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3372 ga_append(&prt_ps_buffer, '\\'); |
856 | 3373 switch (ch) |
3374 { | |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3375 case BS: ga_append(&prt_ps_buffer, 'b'); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3376 case TAB: ga_append(&prt_ps_buffer, 't'); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3377 case NL: ga_append(&prt_ps_buffer, 'n'); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3378 case FF: ga_append(&prt_ps_buffer, 'f'); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3379 case CAR: ga_append(&prt_ps_buffer, 'r'); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3380 case '(': ga_append(&prt_ps_buffer, '('); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3381 case ')': ga_append(&prt_ps_buffer, ')'); break; |
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27453
diff
changeset
|
3382 case '\\': ga_append(&prt_ps_buffer, '\\'); break; |
856 | 3383 |
3384 default: | |
3385 sprintf((char *)ch_buff, "%03o", (unsigned int)ch); | |
3386 ga_append(&prt_ps_buffer, ch_buff[0]); | |
3387 ga_append(&prt_ps_buffer, ch_buff[1]); | |
3388 ga_append(&prt_ps_buffer, ch_buff[2]); | |
3389 break; | |
3390 } | |
3391 } | |
3392 else | |
3393 ga_append(&prt_ps_buffer, ch); | |
442 | 3394 } |
3395 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3396 // Need to free any translated characters |
13258
6acb9148d83e
patch 8.0.1503: access memory beyond end of string
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
3397 vim_free(tofree); |
442 | 3398 |
3399 prt_text_run += char_width; | |
3400 prt_pos_x += char_width; | |
3401 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3402 // The downside of fp - use relative error on right margin check |
442 | 3403 next_pos = prt_pos_x + prt_char_width; |
3404 need_break = (next_pos > prt_right_margin) && | |
856 | 3405 ((next_pos - prt_right_margin) > (prt_right_margin*1e-5)); |
442 | 3406 |
3407 if (need_break) | |
3408 prt_flush_buffer(); | |
3409 | |
3410 return need_break; | |
3411 } | |
3412 | |
3413 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3414 mch_print_set_font(int iBold, int iItalic, int iUnderline) |
442 | 3415 { |
3416 int font = 0; | |
3417 | |
3418 if (iBold) | |
3419 font |= 0x01; | |
3420 if (iItalic) | |
3421 font |= 0x02; | |
3422 | |
3423 if (font != prt_font) | |
3424 { | |
3425 prt_font = font; | |
3426 prt_attribute_change = TRUE; | |
3427 prt_need_font = TRUE; | |
3428 } | |
3429 if (prt_underline != iUnderline) | |
3430 { | |
3431 prt_underline = iUnderline; | |
3432 prt_attribute_change = TRUE; | |
3433 prt_need_underline = TRUE; | |
3434 } | |
3435 } | |
3436 | |
3437 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3438 mch_print_set_bg(long_u bgcol) |
442 | 3439 { |
835 | 3440 prt_bgcol = (int)bgcol; |
442 | 3441 prt_attribute_change = TRUE; |
3442 prt_need_bgcol = TRUE; | |
3443 } | |
3444 | |
3445 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3446 mch_print_set_fg(long_u fgcol) |
442 | 3447 { |
31667
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
3448 if (fgcol == (long_u)prt_fgcol) |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
3449 return; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
3450 |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
3451 prt_fgcol = (int)fgcol; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
3452 prt_attribute_change = TRUE; |
b89cfd86e18e
patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31018
diff
changeset
|
3453 prt_need_fgcol = TRUE; |
442 | 3454 } |
3455 | |
18798
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3456 # endif //FEAT_POSTSCRIPT |
f0f9692d4487
patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
3457 #endif //FEAT_PRINTER |