3 % Copyright
1996-2006 Han The Thanh
<thanh@@pdftex.org
>
4 % Copyright
2006-2013 Taco Hoekwater
<taco@@luatex.org
>
6 % This file is part of LuaTeX.
8 % LuaTeX is free software
; you can redistribute it and
/or modify it under
9 % the terms of the GNU General Public License as published by the Free
10 % Software Foundation
; either version
2 of the License
, or
(at your
11 % option
) any later version.
13 % LuaTeX is distributed in the hope that it will be useful
, but WITHOUT
14 % ANY WARRANTY
; without even the implied warranty of MERCHANTABILITY or
15 % FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 % License for more details.
18 % You should have received a copy of the GNU General Public License along
19 % with LuaTeX
; if not
, see
<http
://www.gnu.org
/licenses
/>.
30 #define set_char_0
0 /* typeset character
0 and move right
*/
31 #define set1
128 /* typeset a character and move right
*/
32 #define set2
129 /* typeset a character and move right
*/
33 #define set3
130 /* typeset a character and move right
*/
34 #define set4
131 /* typeset a character and move right
*/
35 #define set_rule
132 /* typeset a rule and move right
*/
36 #define put1
133 /* typeset a character without moving
*/
37 #define put2
134 /* typeset a character without moving
*/
38 #define put3
135 /* typeset a character without moving
*/
39 #define put4
136 /* typeset a character without moving
*/
40 #define put_rule
137 /* typeset a rule
*/
41 #define nop
138 /* no operation
*/
42 #define bop
139 /* beginning of page
*/
43 #define eop
140 /* ending of page
*/
44 #define push
141 /* save the current positions
*/
45 #define pop
142 /* restore previous positions
*/
46 #define right1
143 /* move right
*/
47 #define right2
144 /* move right
*/
48 #define right3
145 /* move right
*/
49 #define right4
146 /* move right
, 4 bytes
*/
50 #define w0
147 /* move right by |w|
*/
51 #define w1
148 /* move right and set |w|
*/
52 #define w2
149 /* move right and set |w|
*/
53 #define w3
150 /* move right and set |w|
*/
54 #define w4
151 /* move right and set |w|
*/
55 #define x0
152 /* move right by |x|
*/
56 #define x1
153 /* move right and set |x|
*/
57 #define x2
154 /* move right and set |x|
*/
58 #define x3
155 /* move right and set |x|
*/
59 #define x4
156 /* move right and set |x|
*/
60 #define down1
157 /* move down
*/
61 #define down2
158 /* move down
*/
62 #define down3
159 /* move down
*/
63 #define down4
160 /* move down
, 4 bytes
*/
64 #define y0
161 /* move down by |y|
*/
65 #define y1
162 /* move down and set |y|
*/
66 #define y2
163 /* move down and set |y|
*/
67 #define y3
164 /* move down and set |y|
*/
68 #define y4
165 /* move down and set |y|
*/
69 #define z0
166 /* move down by |z|
*/
70 #define z1
167 /* move down and set |z|
*/
71 #define z2
168 /* move down and set |z|
*/
72 #define z3
169 /* move down and set |z|
*/
73 #define z4
170 /* move down and set |z|
*/
74 #define fnt_num_0
171 /* set current font to
0 */
75 #define fnt1
235 /* set current font
*/
76 #define fnt2
236 /* set current font
*/
77 #define fnt3
237 /* set current font
*/
78 #define fnt4
238 /* set current font
*/
79 #define xxx1
239 /* extension to DVI primitives
*/
80 #define xxx2
240 /* extension to DVI primitives
*/
81 #define xxx3
241 /* extension to DVI primitives
*/
82 #define xxx4
242 /* potentially long extension to DVI primitives
*/
83 #define fnt_def1
243 /* define the meaning of a font number
*/
84 #define pre
247 /* preamble
*/
85 #define post
248 /* postamble beginning
*/
86 #define post_post
249 /* postamble ending
*/
87 #define yyy1
250 /* PDF literal text
*/
88 #define yyy2
251 /* PDF literal text
*/
89 #define yyy3
252 /* PDF literal text
*/
90 #define yyy4
253 /* PDF literal text
*/
94 #define long_char
242 /* \.
{VF
} command for general character packet
*/
95 #define vf_id
202 /* identifies \.
{VF
} files
*/
97 @ go out \.
{VF
} processing with an error message
102 formatted_warning
("virtual font","file '%s', %s, font will be ignored",font_name
(f
),a
); \
107 #define lua_bad_vf
(a
) { \
109 lua_settop
(L
,s_top
); \
111 lua_pushstring
(L
,a
); \
115 #define tmp_b0 tmp_w.qqqq.b0
116 #define tmp_b1 tmp_w.qqqq.b1
117 #define tmp_b2 tmp_w.qqqq.b2
118 #define tmp_b3 tmp_w.qqqq.b3
119 #define tmp_int tmp_w.cint
121 #define vf_stack_size
100 /* \.
{DVI
} files shouldn't |push| beyond this depth
*/
124 typedef unsigned char vf_stack_index
; /* an index into the stack
*/
126 typedef struct vf_stack_record
{
127 scaled stack_w
, stack_x
, stack_y
, stack_z
;
130 @ get a byte from\.
{VF
} file
134 eight_bits vf_tmp_b
; \
135 if
(vf_cur
>= vf_size
) { \
136 normal_error
("virtual font","unexpected eof"); \
138 vf_tmp_b
= vf_buffer
[vf_cur
++]; \
143 #define vf_replace_z
() \
146 while
(vf_z
>= 040000000) { \
148 vf_alpha
+= vf_alpha
; \
150 /*vf_beta
= (char
)(256 / vf_alpha
);*/ \
151 vf_alpha
= (vf_alpha
* vf_z
); \
155 @ read |k| bytes as an integer from \.
{VF
} file
156 beware
: the |vf_read
()| macro differs from |vf_read
()| in vftovp.web for
1..
.3 byte words.
158 #define vf_read
(k
, l
) \
160 int itmp
= 0, dtmp
= (int
)(k
), jtmp
= 0; \
163 if
((dtmp
== (int
) k
) && jtmp > 127) \
165 itmp
= itmp
* 256 + jtmp
; \
171 #define vf_read_u
(k
, l
) \
173 int dtmp
= (int
)(k
); \
174 unsigned int itmp
= 0, jtmp
= 0; \
175 while
(dtmp--
> 0) { \
177 itmp
= itmp
* 256 + jtmp
; \
183 void pdf_check_vf
(internal_font_number f
)
185 if
(font_type
(f
) == virtual_font_type
)
186 normal_error
("font", "command cannot be used with virtual font");
190 vf_local_font_warning
(internal_font_number f
, internal_font_number k
, const char
*s
, int a
, int b
)
194 tprint
(" in local font ");
195 tprint
(font_name
(k
));
200 tprint
(") in virtual font ");
201 tprint
(font_name
(f
));
202 tprint
(".vf ignored.");
206 @ process a local font in \.
{VF
} file
210 static internal_font_number
211 vf_def_font
(internal_font_number f
, unsigned char
*vf_buffer
, int
*vf_cr
)
213 internal_font_number k
;
218 memory_word tmp_w
; /* accumulator
*/
220 unsigned int checksum
;
221 cs.b0
= vf_buffer
[(*vf_cr
)];
222 cs.b1
= vf_buffer
[(*vf_cr
) + 1];
223 cs.b2
= vf_buffer
[(*vf_cr
) + 2];
224 cs.b3
= vf_buffer
[(*vf_cr
) + 3];
226 checksum
= (unsigned
)
227 (cs.b0
* 256 * 256 * 256 + cs.b1
* 256 * 256 + cs.b2
* 256 + cs.b3
);
228 k
= vf_buffer
[(*vf_cr
)];
232 k
= k
* 256 + vf_buffer
[(*vf_cr
)];
234 k
= k
* 256 + vf_buffer
[(*vf_cr
)];
236 k
= k
* 256 + vf_buffer
[(*vf_cr
)];
239 fs
= store_scaled_f
(k
, font_size
(f
));
241 k
= vf_buffer
[(*vf_cr
)];
245 k
= k
* 256 + vf_buffer
[(*vf_cr
)];
247 k
= k
* 256 + vf_buffer
[(*vf_cr
)];
249 k
= k
* 256 + vf_buffer
[(*vf_cr
)];
255 tmp_b0
= vf_buffer
[(*vf_cr
)];
257 tmp_b1
= vf_buffer
[(*vf_cr
)];
261 (*vf_cr
)++; /* skip the font path
*/
263 str_room
((unsigned
) tmp_b1
);
266 junk
= vf_buffer
[(*vf_cr
)];
271 normal_warning
("vf","quitting at recurse depth > 5");
273 } else if
((level
> 1) && (fs > 65536*1024)) {
274 normal_warning
("vf","quitting when recursing at size > 65536*1024");
280 k
= tfm_lookup
(st
, fs
);
282 k
= read_font_info
(null_cs
, st
, fs
, -1);
285 if
(k
!= null_font
) {
286 if
(checksum
!= 0 && font_checksum(k) != 0
287 && checksum != font_checksum(k))
288 vf_local_font_warning
(f
, k
, "checksum mismatch", (int
) checksum
, (int
) font_checksum
(k
));
289 if
(ds
!= font_dsize
(k
))
290 vf_local_font_warning
(f
, k
, "design size mismatch", ds
, font_dsize
(k
));
297 static int open_vf_file
(const char
*fn
, unsigned char
**vbuffer
, int
*vsize
)
299 boolean res
; /* was the callback successful?
*/
301 boolean file_read
= false
; /* was |vf_file| successfully read?
*/
303 const char
*fname
= luatex_find_file
(fn
, find_vf_file_callback
);
304 if
(fname
== NULL || strlen
(fname
) == 0) {
309 callback_id
= callback_defined
(read_vf_file_callback
);
310 if
(callback_id
> 0) {
311 res
= run_callback
(callback_id
, "S->bSd", fname
,
312 &file_read, vbuffer, vsize);
313 if
(res
&& file_read && (*vsize > 0)) {
319 if
(luatex_open_input
320 (&(vf_file), fname, kpse_ovf_format, FOPEN_RBIN_MODE, false)
321 || luatex_open_input
(&(vf_file), fname, kpse_vf_format,
322 FOPEN_RBIN_MODE
, false
)) {
323 res
= read_vf_file
(vf_file
, vbuffer
, vsize
);
337 @ The |do_vf| procedure attempts to read the \.
{VF
} file for a font
, and sets
338 |font_type
()| to |real_font_type| if the \.
{VF
} file could not be found
339 or loaded
, otherwise sets |font_type
()| to |virtual_font_type|. At this
340 time
, |tmp_f| is the internal font number of the current \.
{TFM
} font. To
341 process font definitions in virtual font we call |vf_def_font|.
344 #define append_packet
(k
) vpackets
[vf_np
++] = (eight_bits
)(k
)
346 @ life is easier if all internal font commands are fnt4 and
347 all character commands are set4 or put4
350 #define append_fnt_set
(k
) \
353 append_packet
(packet_font_code
); \
357 #define append_four
(k
) \
359 append_packet
((k
& 0xFF000000) >> 24); \
360 append_packet
((k
& 0x00FF0000) >> 16); \
361 append_packet
((k
& 0x0000FF00) >> 8); \
362 append_packet
((k
& 0x000000FF)); \
365 @ some of these things happen twice
, adding a define is simplest
368 #define test_checksum
() { vf_byte
(tmp_b0
); vf_byte
(tmp_b1
); \
369 vf_byte
(tmp_b2
); vf_byte
(tmp_b3
); \
370 if
(((tmp_b0
!= 0) ||
(tmp_b1
!= 0) ||
(tmp_b2
!= 0) ||
(tmp_b3
!= 0)) && \
371 ((font_check_0
(f
) != 0) ||
(font_check_1
(f
) != 0) || \
372 (font_check_2
(f
) != 0) ||
(font_check_3
(f
) != 0)) && \
373 ((tmp_b0
!= font_check_0
(f
)) ||
(tmp_b1
!= font_check_1
(f
)) || \
374 (tmp_b2
!= font_check_2
(f
)) ||
(tmp_b3
!= font_check_3
(f
)))) { \
376 tprint
("checksum mismatch in font "); \
377 tprint
(font_name
(f
)); \
378 tprint
(".vf ignored "); } }
380 #define test_dsize
() \
383 vf_read
(4, read_tmp
); \
384 if
((read_tmp
/ 16) != font_dsize
(f
)) { \
386 tprint
("design size mismatch in font "); \
387 tprint
(font_name
(f
)); \
388 tprint
(".vf ignored"); \
393 static int count_packet_bytes
(eight_bits
* vf_buf
, int cur_bute
, int count
)
398 unsigned int cmd
= 0;
400 while
(k
< (unsigned
) count
) {
401 cmd
= vf_buf
[cur_bute
+ (int
) k
];
409 } else if
((fnt_num_0
<= cmd
) && (cmd <= fnt_num_0 + 63)) {
603 d
= vf_buf
[cur_bute
+ (int
) k
];
609 d
= vf_buf
[cur_bute
+ (int
) k
];
611 d
= d
* 256 + vf_buf
[cur_bute
+ (int
) k
];
617 d
= vf_buf
[cur_bute
+ (int
) k
];
619 d
= d
* 256 + vf_buf
[cur_bute
+ (int
) k
];
621 d
= d
* 256 + vf_buf
[cur_bute
+ (int
) k
];
627 d
= vf_buf
[cur_bute
+ (int
) k
];
629 d
= d
* 256 + vf_buf
[cur_bute
+ (int
) k
];
631 d
= d
* 256 + vf_buf
[cur_bute
+ (int
) k
];
633 d
= d
* 256 + vf_buf
[cur_bute
+ (int
) k
];
665 void do_vf
(internal_font_number f
)
669 scaled x
, y
, w
, z
, h
, v
;
671 unsigned packet_length
;
675 vf_stack_index stack_level
;
676 int vf_z
; /* multiplier
*/
677 int vf_alpha
; /* correction for negative values
*/
678 /*char vf_beta
;*/ /* divisor
*/
680 eight_bits
*vpackets
;
681 memory_word tmp_w
; /* accumulator
*/
682 vf_stack_record vf_stack
[256];
685 unsigned char
*vf_buffer
;
688 unsigned
*vf_local_fnts
= NULL; /* external font ids
*/
689 unsigned
*vf_real_fnts
= NULL; /* internal font ids
*/
690 unsigned vf_nf
= 0; /* local font counter
*/
692 if
(font_type
(f
) != unknown_font_type
)
694 set_font_type
(f
, real_font_type
);
696 /* Open |vf_file|
, return if not found
*/
700 if
(!open_vf_file
(font_name
(f
), &vf_buffer, &vf_size))
702 /* Process the preamble
*/
703 set_font_type
(f
, virtual_font_type
);
706 bad_vf
("PRE command expected");
709 bad_vf
("wrong id byte");
711 for
(k
= 1; k
<= cmd_length
; k
++)
717 /* Process the font definitions
*/
718 /* scan forward to find the number of internal fonts
*/
720 save_cur_byte
= vf_cur
;
722 while
((cmd
>= fnt_def1
) && (cmd <= (fnt_def1 + 3))) {
723 vf_read_u
((cmd
- fnt_def1
+ 1), utmp
);
736 vf_cur
= save_cur_byte
;
738 /* malloc and fill the local font arrays
*/
740 unsigned ii
= (unsigned
) ((unsigned
) vf_nf
* sizeof
(int
));
741 vf_local_fnts
= xmalloc
(ii
);
742 memset
(vf_local_fnts
, 0, ii
);
743 vf_real_fnts
= xmalloc
(ii
);
744 memset
(vf_real_fnts
, 0, ii
);
746 while
((cmd
>= fnt_def1
) && (cmd <= (fnt_def1 + 3))) {
747 vf_read_u
((cmd
- fnt_def1
+ 1), vf_local_fnts
[vf_nf
]);
748 vf_real_fnts
[vf_nf
] = (unsigned
) vf_def_font
(f
, vf_buffer
, &vf_cur);
755 while
(cmd
<= long_char
) {
756 /* Build a character packet
*/
758 if
(cmd
== long_char
) {
759 vf_read_u
(4, packet_length
);
762 if
(!char_exists
(f
, cc
)) {
763 bad_vf
("invalid character code");
766 tfm_width
= store_scaled_f
(k
, font_size
(f
));
770 if
(!char_exists
(f
, cc
)) {
771 bad_vf
("invalid character code");
774 k
= (int
) utmp
; /* cf. vftovp.web
, line
1028 */
775 tfm_width
= store_scaled_f
(k
, font_size
(f
));
779 if
(tfm_width
!= char_width
(f
, cc
)) {
780 if
(tfm_width
!= char_width
(f
, cc
)) {
782 tprint
("character width mismatch in font ");
783 tprint
(font_name
(f
));
784 tprint
(".vf ignored");
787 k
= count_packet_bytes
(vf_buffer
, vf_cur
, (int
) packet_length
);
788 vpackets
= xmalloc
((unsigned
) (k
+ 1)); /* need one extra extra for |packet_end|
*/
789 co
= get_charinfo
(f
, cc
);
795 while
(packet_length
> 0) {
801 k
= (int
) vf_real_fnts
[0];
804 append_packet
(packet_char_code
);
809 } else if
(((fnt_num_0
<= cmd
) && (cmd <= fnt_num_0 + 63)) ||
810 ((fnt1
<= cmd
) && (cmd <= fnt1 + 3))) {
812 vf_read_u
((cmd
- fnt1
+ 1), utmp
);
814 packet_length
-= (cmd
- fnt1
+ 1);
816 k
= (int
) cmd
- fnt_num_0
;
819 /* change from local to external font id
*/
821 while
((n
< vf_nf
) && (vf_local_fnts[n] != (unsigned) k))
824 bad_vf
("undefined local font");
826 k
= (int
) vf_real_fnts
[n
];
835 append_packet
(packet_rule_code
);
843 append_packet
(packet_push_code
);
844 append_packet
(packet_rule_code
);
847 append_packet
(packet_pop_code
);
855 k
= (int
) vf_real_fnts
[0];
858 vf_read_u
((cmd
- set1
+ 1), utmp
);
860 append_packet
(packet_char_code
);
862 packet_length
-= (cmd
- set1
+ 1);
869 k
= (int
) vf_real_fnts
[0];
872 vf_read_u
((cmd
- put1
+ 1), utmp
);
874 append_packet
(packet_push_code
);
875 append_packet
(packet_char_code
);
877 append_packet
(packet_pop_code
);
878 packet_length
-= (cmd
- put1
+ 1);
884 vf_read
((cmd
- right1
+ 1), i
);
885 append_packet
(packet_right_code
);
887 packet_length
-= (cmd
- right1
+ 1);
893 vf_read
((cmd
- w1
+ 1), w
);
894 append_packet
(packet_right_code
);
896 packet_length
-= (cmd
- w1
+ 1);
902 vf_read
((cmd
- x1
+ 1), x
);
903 append_packet
(packet_right_code
);
905 packet_length
-= (cmd
- x1
+ 1);
911 vf_read
((cmd
- down1
+ 1), i
);
912 append_packet
(packet_down_code
);
914 packet_length
-= (cmd
- down1
+ 1);
920 vf_read
((cmd
- y1
+ 1), y
);
921 append_packet
(packet_down_code
);
923 packet_length
-= (cmd
- y1
+ 1);
929 vf_read
((cmd
- z1
+ 1), z
);
930 append_packet
(packet_down_code
);
932 packet_length
-= (cmd
- z1
+ 1);
938 vf_read_u
((cmd
- xxx1
+ 1), utmp
);
939 cmd_length
= (int
) utmp
;
940 packet_length
-= (cmd
- xxx1
+ 1);
942 bad_vf
("special of negative length");
943 packet_length
-= (unsigned
) cmd_length
;
945 append_packet
(packet_special_code
);
946 append_four
(cmd_length
);
947 while
(cmd_length
> 0) {
954 append_packet
(packet_right_code
);
958 append_packet
(packet_right_code
);
962 append_packet
(packet_down_code
);
966 append_packet
(packet_down_code
);
972 if
(stack_level
== vf_stack_size
) {
973 overflow
("virtual font stack size", vf_stack_size
);
975 vf_stack
[stack_level
].stack_w
= w
;
976 vf_stack
[stack_level
].stack_x
= x
;
977 vf_stack
[stack_level
].stack_y
= y
;
978 vf_stack
[stack_level
].stack_z
= z
;
980 append_packet
(packet_push_code
);
984 if
(stack_level
== 0) {
985 bad_vf
("more POPs than PUSHs in character");
988 w
= vf_stack
[stack_level
].stack_w
;
989 x
= vf_stack
[stack_level
].stack_x
;
990 y
= vf_stack
[stack_level
].stack_y
;
991 z
= vf_stack
[stack_level
].stack_z
;
992 append_packet
(packet_pop_code
);
996 bad_vf
("improver DVI command");
1000 /* signal end of packet
*/
1001 append_packet
(packet_end_code
);
1003 if
(stack_level
!= 0)
1004 bad_vf
("more PUSHs than POPs in character packet");
1005 if
(packet_length
!= 0)
1006 bad_vf
("invalid packet length or DVI command in packet");
1007 /* \.
{Store the packet being built
} */
1008 set_charinfo_packets
(co
, vpackets
);
1012 bad_vf
("POST command expected");
1018 #define make_command0
(N
,K
) { \
1020 lua_pushstring
(L
, N
); \
1021 lua_rawseti
(L
,-2, 1); \
1022 lua_rawseti
(L
,-2, K
); \
1025 #define make_command1
(N
,V
,K
) { \
1027 lua_pushstring
(L
, N
); \
1028 lua_rawseti
(L
,-2, 1); \
1029 lua_pushinteger
(L
, V
); \
1030 lua_rawseti
(L
,-2, 2); \
1031 lua_rawseti
(L
,-2, K
); \
1034 #define make_command2
(N
,V
,W
,K
) { \
1036 lua_pushstring
(L
, N
); \
1037 lua_rawseti
(L
,-2, 1); \
1038 lua_pushinteger
(L
, V
); \
1039 lua_rawseti
(L
,-2, 2); \
1040 lua_pushinteger
(L
, W
); \
1041 lua_rawseti
(L
,-2, 3); \
1042 lua_rawseti
(L
,-2, K
); \
1045 #define make_commands
(N
,S
,V
,K
) { \
1047 lua_pushstring
(L
, N
); \
1048 lua_rawseti
(L
,-2, 1); \
1049 lua_pushlstring
(L
, S
, V
); \
1050 lua_rawseti
(L
,-2, 2); \
1051 lua_rawseti
(L
,-2, K
); \
1055 int make_vf_table
(lua_State
* L
, const char
*cnom
, scaled atsize
)
1059 unsigned cmd_length
, packet_length
;
1061 vf_stack_index stack_level
;
1062 int vf_z
; /* multiplier
*/
1063 int vf_alpha
; /* correction for negative values
*/
1064 /*char vf_beta
;*/ /* divisor
*/
1068 int s_top
; /* lua stack
*/
1069 int vf_nf
; /* local font counter
*/
1072 memory_word tmp_w
; /* accumulator
*/
1073 vf_stack_record vf_stack
[256];
1074 unsigned char
*vf_buffer
;
1081 /* Open |vf_file|
, return if not found
*/
1085 if
(!open_vf_file
(cnom
, &vf_buffer, &vf_size)) {
1090 /* start by creating a table
*/
1091 s_top
= lua_gettop
(L
);
1094 /* Process the preamble
*/
1097 lua_bad_vf
("PRE command expected");
1100 lua_bad_vf
("wrong id byte");
1101 vf_byte
(cmd_length
);
1103 s
= xmalloc
(cmd_length
);
1104 for
(k
= 1; k
<= (int
) cmd_length
; k
++)
1105 vf_byte
(s
[(k
- 1)]);
1107 lua_pushlstring
(L
, (char
*) s
, (size_t
) cmd_length
);
1109 lua_setfield
(L
, -2, "header");
1115 lua_pushinteger
(L
, (lua_Number
) ((cs.b0
<< 24) + (cs.b1
<< 16) + (cs.b2
<< 8) + cs.b3
));
1116 lua_setfield
(L
, -2, "checksum");
1120 lua_pushinteger
(L
, ds
);
1121 lua_setfield
(L
, -2, "designsize");
1124 lua_pushstring
(L
, cnom
);
1125 lua_setfield
(L
, -2, "name");
1127 lua_pushinteger
(L
, atsize
);
1128 lua_setfield
(L
, -2, "size");
1132 /* Process the font definitions
*/
1137 while
((cmd
>= fnt_def1
) && (cmd <= fnt_def1 + 3)) {
1140 vf_read_u
((cmd
- fnt_def1
+ 1), utmp
);
1150 fs
= store_scaled_f
(k
, atsize
);
1151 lua_pushstring
(L
, "size");
1152 lua_pushinteger
(L
, fs
);
1156 ds
= k
/ 16; /* dsize
, not used
*/
1160 while
(tmp_b0
> 0) {
1163 } /* skip the font path
*/
1165 s
= xmalloc
((unsigned
) (tmp_b1
+ 1));
1167 while
(tmp_b1--
> 0)
1170 lua_pushstring
(L
, "name");
1171 lua_pushstring
(L
, xstrdup
((char
*) s
));
1175 lua_rawseti
(L
, -2, vf_nf
);
1181 lua_setfield
(L
, -2, "fonts");
1186 lua_newtable
(L
); /* 'characters'
*/
1187 while
(cmd
<= long_char
) {
1188 /* Build a character packet
*/
1189 if
(cmd
== long_char
) {
1190 vf_read_u
(4, packet_length
);
1193 vf_read
(4, tfm_width
);
1195 packet_length
= (unsigned
) cmd
;
1198 tfm_width
= (int
) utmp
;
1200 lua_newtable
(L
); /* for this character
*/
1201 lua_pushinteger
(L
, tfm_width
);
1202 lua_setfield
(L
, -2, "width");
1203 lua_newtable
(L
); /* for 'commands'
*/
1210 while
(packet_length
> 0) {
1212 decr
(packet_length
);
1213 if
((cmd
>= set_char_0
) && (cmd < set1)) {
1216 make_command1
("font", vf_nf
, k
);
1218 make_command1
("char", cmd
, k
);
1219 } else if
(((fnt_num_0
<= cmd
) && (cmd <= fnt_num_0 + 63)) ||
1220 ((fnt1
<= cmd
) && (cmd <= fnt1 + 3))) {
1222 vf_read_u
((cmd
- fnt1
+ 1), utmp
);
1225 packet_length
-= (unsigned
) (cmd
- fnt1
+ 1);
1227 vf_nf
= cmd
- fnt_num_0
+ 1;
1229 make_command1
("font", vf_nf
, k
);
1235 make_command2
("rule", store_scaled_f
(h
, atsize
),
1236 store_scaled_f
(v
, atsize
), k
);
1242 make_command0
("push", k
);
1243 make_command2
("rule", store_scaled_f
(h
, atsize
),
1244 store_scaled_f
(v
, atsize
), k
);
1245 make_command0
("pop", k
);
1254 make_command1
("font", vf_nf
, k
);
1256 vf_read_u
((cmd
- set1
+ 1), utmp
);
1258 make_command1
("char", i
, k
);
1259 packet_length
-= (unsigned
) (cmd
- set1
+ 1);
1267 make_command1
("font", vf_nf
, k
);
1269 vf_read_u
((cmd
- put1
+ 1), utmp
);
1271 make_command0
("push", k
);
1272 make_command1
("char", i
, k
);
1273 make_command0
("pop", k
);
1274 packet_length
-= (unsigned
) (cmd
- put1
+ 1);
1280 vf_read
((cmd
- right1
+ 1), i
);
1281 make_command1
("right", store_scaled_f
(i
, atsize
), k
);
1282 packet_length
-= (unsigned
) (cmd
- right1
+ 1);
1288 vf_read
((cmd
- w1
+ 1), w
);
1289 make_command1
("right", store_scaled_f
(w
, atsize
), k
);
1290 packet_length
-= (unsigned
) (cmd
- w1
+ 1);
1296 vf_read
((cmd
- x1
+ 1), x
);
1297 make_command1
("right", store_scaled_f
(x
, atsize
), k
);
1298 packet_length
-= (unsigned
) (cmd
- x1
+ 1);
1304 vf_read
((cmd
- down1
+ 1), i
);
1305 make_command1
("down", store_scaled_f
(i
, atsize
), k
);
1306 packet_length
-= (unsigned
) (cmd
- down1
+ 1);
1312 vf_read
((cmd
- y1
+ 1), y
);
1313 make_command1
("down", store_scaled_f
(y
, atsize
), k
);
1314 packet_length
-= (unsigned
) (cmd
- y1
+ 1);
1320 vf_read
((cmd
- z1
+ 1), z
);
1321 make_command1
("down", store_scaled_f
(z
, atsize
), k
);
1322 packet_length
-= (unsigned
) (cmd
- z1
+ 1);
1328 vf_read_u
((cmd
- xxx1
+ 1), cmd_length
);
1329 packet_length
-= (unsigned
) (cmd
- xxx1
+ 1);
1330 if
(cmd_length
<= 0)
1331 lua_bad_vf
("special of negative length");
1332 packet_length
-= cmd_length
;
1334 s
= xmalloc
((cmd_length
+ 1));
1336 while
(cmd_length
> 0) {
1342 make_commands
("special", xstrdup
((char
*) s
), (size_t
) i
,
1347 make_command1
("right", store_scaled_f
(w
, atsize
), k
);
1350 make_command1
("right", store_scaled_f
(x
, atsize
), k
);
1353 make_command1
("down", store_scaled_f
(y
, atsize
), k
);
1356 make_command1
("down", store_scaled_f
(z
, atsize
), k
);
1361 if
(stack_level
== vf_stack_size
) {
1362 overflow
("virtual font stack size", vf_stack_size
);
1364 vf_stack
[stack_level
].stack_w
= w
;
1365 vf_stack
[stack_level
].stack_x
= x
;
1366 vf_stack
[stack_level
].stack_y
= y
;
1367 vf_stack
[stack_level
].stack_z
= z
;
1369 make_command0
("push", k
);
1373 if
(stack_level
== 0) {
1374 lua_bad_vf
("more POPs than PUSHs in character");
1377 w
= vf_stack
[stack_level
].stack_w
;
1378 x
= vf_stack
[stack_level
].stack_x
;
1379 y
= vf_stack
[stack_level
].stack_y
;
1380 z
= vf_stack
[stack_level
].stack_z
;
1381 make_command0
("pop", k
);
1385 lua_bad_vf
("improver DVI command");
1389 /* signal end of packet
*/
1390 lua_setfield
(L
, -2, "commands");
1392 if
(stack_level
!= 0)
1393 lua_bad_vf
("more PUSHs than POPs in character packet");
1394 if
(packet_length
!= 0)
1395 lua_bad_vf
("invalid packet length or DVI command in packet");
1397 lua_rawseti
(L
, -2, cc
);
1401 lua_setfield
(L
, -2, "characters");
1404 lua_bad_vf
("POST command expected");
1410 internal_font_number
1411 letter_space_font
(internal_font_number f
, int e
, boolean nolig
)
1413 internal_font_number k
;
1417 char
*new_font_name
;
1419 /* read a new font and expand the character widths
*/
1423 set_no_ligatures
(k
); /* disable ligatures for letter-spaced fonts
*/
1425 /* append eg '
+100ls' to font name
*/
1426 new_font_name
= xmalloc
((unsigned
) (strlen
(font_name
(k
)) + 8)); /* |abs
(e
) <= 1000|
*/
1428 sprintf
(new_font_name
, "%s+%ils", font_name
(k
), (int
) e
);
1430 /* minus from \
%i
*/
1431 sprintf
(new_font_name
, "%s%ils", font_name
(k
), (int
) e
);
1433 set_font_name
(k
, new_font_name
);
1435 /* create the corresponding virtual font
*/
1436 set_font_type
(k
, virtual_font_type
);
1438 for
(c
=font_bc
(k
);c
<=font_ec
(k
);c
++) {
1439 if
(quick_char_exists
(k
, c
)) {
1442 eight_bits
*vpackets
= xmalloc
((unsigned
) (10+10+1));
1444 half_w
= -round_xn_over_d
(quad
(k
), -e
, 2000);
1446 half_w
= round_xn_over_d
(quad
(k
), e
, 2000);
1448 co
= get_charinfo
(k
, c
);
1449 w
= char_width
(k
, c
)+2*half_w
;
1450 set_charinfo_width
(co
, w
);
1452 append_packet
(packet_right_code
);
1453 append_four
(half_w
);
1455 append_packet
(packet_char_code
);
1457 append_packet
(packet_right_code
);
1458 append_four
(half_w
);
1459 append_packet
(packet_end_code
);
1461 set_charinfo_packets
(co
, vpackets
);
1464 /* now patch the quad size
*/
1465 /* Patch
20100922: do not do this
, to remain compatible with pdftex
*/
1468 set_font_param
(k
, quad_code
, -round_xn_over_d
(quad
(k
), 1000-e
, 1000));
1470 set_font_param
(k
, quad_code
, round_xn_over_d
(quad
(k
), 1000+e
, 1000));
1477 internal_font_number copy_font_info
(internal_font_number f
)
1479 return copy_font
(f
);