summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/font/vfovf.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/font/vfovf.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/font/vfovf.w1480
1 files changed, 0 insertions, 1480 deletions
diff --git a/Build/source/texk/web2c/luatexdir/font/vfovf.w b/Build/source/texk/web2c/luatexdir/font/vfovf.w
deleted file mode 100644
index df970ff4d11..00000000000
--- a/Build/source/texk/web2c/luatexdir/font/vfovf.w
+++ /dev/null
@@ -1,1480 +0,0 @@
-% vfovf.w
-%
-% Copyright 1996-2006 Han The Thanh <thanh@@pdftex.org>
-% Copyright 2006-2013 Taco Hoekwater <taco@@luatex.org>
-%
-% This file is part of LuaTeX.
-%
-% LuaTeX is free software; you can redistribute it and/or modify it under
-% the terms of the GNU General Public License as published by the Free
-% Software Foundation; either version 2 of the License, or (at your
-% option) any later version.
-%
-% LuaTeX is distributed in the hope that it will be useful, but WITHOUT
-% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-% FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
-% License for more details.
-%
-% You should have received a copy of the GNU General Public License along
-% with LuaTeX; if not, see <http://www.gnu.org/licenses/>.
-
-@ @c
-
-
-#include "ptexlib.h"
-
-@ @c
-/* this is a hack! */
-#define font_max 5000
-
-#define set_char_0 0 /* typeset character 0 and move right */
-#define set1 128 /* typeset a character and move right */
-#define set2 129 /* typeset a character and move right */
-#define set3 130 /* typeset a character and move right */
-#define set4 131 /* typeset a character and move right */
-#define set_rule 132 /* typeset a rule and move right */
-#define put1 133 /* typeset a character without moving */
-#define put2 134 /* typeset a character without moving */
-#define put3 135 /* typeset a character without moving */
-#define put4 136 /* typeset a character without moving */
-#define put_rule 137 /* typeset a rule */
-#define nop 138 /* no operation */
-#define bop 139 /* beginning of page */
-#define eop 140 /* ending of page */
-#define push 141 /* save the current positions */
-#define pop 142 /* restore previous positions */
-#define right1 143 /* move right */
-#define right2 144 /* move right */
-#define right3 145 /* move right */
-#define right4 146 /* move right, 4 bytes */
-#define w0 147 /* move right by |w| */
-#define w1 148 /* move right and set |w| */
-#define w2 149 /* move right and set |w| */
-#define w3 150 /* move right and set |w| */
-#define w4 151 /* move right and set |w| */
-#define x0 152 /* move right by |x| */
-#define x1 153 /* move right and set |x| */
-#define x2 154 /* move right and set |x| */
-#define x3 155 /* move right and set |x| */
-#define x4 156 /* move right and set |x| */
-#define down1 157 /* move down */
-#define down2 158 /* move down */
-#define down3 159 /* move down */
-#define down4 160 /* move down, 4 bytes */
-#define y0 161 /* move down by |y| */
-#define y1 162 /* move down and set |y| */
-#define y2 163 /* move down and set |y| */
-#define y3 164 /* move down and set |y| */
-#define y4 165 /* move down and set |y| */
-#define z0 166 /* move down by |z| */
-#define z1 167 /* move down and set |z| */
-#define z2 168 /* move down and set |z| */
-#define z3 169 /* move down and set |z| */
-#define z4 170 /* move down and set |z| */
-#define fnt_num_0 171 /* set current font to 0 */
-#define fnt1 235 /* set current font */
-#define fnt2 236 /* set current font */
-#define fnt3 237 /* set current font */
-#define fnt4 238 /* set current font */
-#define xxx1 239 /* extension to DVI primitives */
-#define xxx2 240 /* extension to DVI primitives */
-#define xxx3 241 /* extension to DVI primitives */
-#define xxx4 242 /* potentially long extension to DVI primitives */
-#define fnt_def1 243 /* define the meaning of a font number */
-#define pre 247 /* preamble */
-#define post 248 /* postamble beginning */
-#define post_post 249 /* postamble ending */
-#define yyy1 250 /* PDF literal text */
-#define yyy2 251 /* PDF literal text */
-#define yyy3 252 /* PDF literal text */
-#define yyy4 253 /* PDF literal text */
-
-#define null_font 0
-
-#define long_char 242 /* \.{VF} command for general character packet */
-#define vf_id 202 /* identifies \.{VF} files */
-
-@ go out \.{VF} processing with an error message
-@c
-#define bad_vf(a) { \
- xfree(vf_buffer); \
- print_nlp(); \
- formatted_warning("virtual font","file '%s', %s, font will be ignored",font_name(f),a); \
- print_ln(); \
- return; \
-}
-
-#define lua_bad_vf(a) { \
- xfree(vf_buffer); \
- lua_settop(L,s_top); \
- lua_pushnil(L); \
- lua_pushstring(L,a); \
- return 2; \
-}
-
-#define tmp_b0 tmp_w.qqqq.b0
-#define tmp_b1 tmp_w.qqqq.b1
-#define tmp_b2 tmp_w.qqqq.b2
-#define tmp_b3 tmp_w.qqqq.b3
-#define tmp_int tmp_w.cint
-
-#define vf_stack_size 100 /* \.{DVI} files shouldn't |push| beyond this depth */
-
-@ @c
-typedef unsigned char vf_stack_index; /* an index into the stack */
-
-typedef struct vf_stack_record {
- scaled stack_w, stack_x, stack_y, stack_z;
-} vf_stack_record;
-
-@ get a byte from\.{VF} file
-@c
-#define vf_byte(a) \
-{ \
- eight_bits vf_tmp_b; \
- if (vf_cur >= vf_size) { \
- normal_error("virtual font","unexpected eof"); \
- } \
- vf_tmp_b = vf_buffer[vf_cur++]; \
- a = vf_tmp_b; \
-}
-
-@ @c
-#define vf_replace_z() \
-{ \
- vf_alpha = 16; \
- while (vf_z >= 040000000) { \
- vf_z = vf_z / 2; \
- vf_alpha += vf_alpha; \
- } \
- /*vf_beta = (char)(256 / vf_alpha);*/ \
- vf_alpha = (vf_alpha * vf_z); \
-}
-
-
-@ read |k| bytes as an integer from \.{VF} file
-beware: the |vf_read()| macro differs from |vf_read()| in vftovp.web for 1...3 byte words.
-@c
-#define vf_read(k, l) \
-{ \
- int itmp = 0, dtmp = (int)(k), jtmp = 0; \
- while (dtmp > 0) { \
- vf_byte(jtmp); \
- if ((dtmp == (int) k) && jtmp > 127) \
- jtmp = jtmp - 256; \
- itmp = itmp * 256 + jtmp; \
- decr(dtmp); \
- } \
- l = itmp; \
-}
-
-#define vf_read_u(k, l) \
-{ \
- int dtmp = (int)(k); \
- unsigned int itmp = 0, jtmp = 0; \
- while (dtmp-- > 0) { \
- vf_byte(jtmp); \
- itmp = itmp * 256 + jtmp; \
- } \
- l = itmp; \
-}
-
-@ @c
-void pdf_check_vf(internal_font_number f)
-{
- if (font_type(f) == virtual_font_type)
- normal_error("font", "command cannot be used with virtual font");
-}
-
-static void
-vf_local_font_warning(internal_font_number f, internal_font_number k, const char *s, int a, int b)
-{
- print_nlp();
- tprint(s);
- tprint(" in local font ");
- tprint(font_name(k));
- tprint(" (");
- print_int(b);
- tprint(" != ");
- print_int(a);
- tprint(") in virtual font ");
- tprint(font_name(f));
- tprint(".vf ignored.");
-}
-
-
-@ process a local font in \.{VF} file
-@c
-int level = 0;
-
-static internal_font_number
-vf_def_font(internal_font_number f, unsigned char *vf_buffer, int *vf_cr)
-{
- internal_font_number k;
- str_number s;
- char *st;
- scaled ds, fs;
- four_quarters cs;
- memory_word tmp_w; /* accumulator */
- int junk;
- unsigned int checksum;
- cs.b0 = vf_buffer[(*vf_cr)];
- cs.b1 = vf_buffer[(*vf_cr) + 1];
- cs.b2 = vf_buffer[(*vf_cr) + 2];
- cs.b3 = vf_buffer[(*vf_cr) + 3];
- (*vf_cr) += 4;
- checksum = (unsigned)
- (cs.b0 * 256 * 256 * 256 + cs.b1 * 256 * 256 + cs.b2 * 256 + cs.b3);
- k = vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- if (k > 127)
- k -= 256;
- k = k * 256 + vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- k = k * 256 + vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- k = k * 256 + vf_buffer[(*vf_cr)];
- (*vf_cr)++;
-
- fs = store_scaled_f(k, font_size(f));
-
- k = vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- if (k > 127)
- k -= 256;
- k = k * 256 + vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- k = k * 256 + vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- k = k * 256 + vf_buffer[(*vf_cr)];
- (*vf_cr)++;
-
- ds = k / 16;
-
-
- tmp_b0 = vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- tmp_b1 = vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- while (tmp_b0 > 0) {
- tmp_b0--;
- (*vf_cr)++; /* skip the font path */
- }
- str_room((unsigned) tmp_b1);
- while (tmp_b1 > 0) {
- tmp_b1--;
- junk = vf_buffer[(*vf_cr)];
- (*vf_cr)++;
- append_char(junk);
- }
- if (level > 5) {
- normal_warning("vf","quitting at recurse depth > 5");
- k = f ;
- } else if ((level > 1) && (fs > 65536*1024)) {
- normal_warning("vf","quitting when recursing at size > 65536*1024");
- k = f ;
- } else {
- level += 1 ;
- s = make_string();
- st = makecstring(s);
- k = tfm_lookup(st, fs);
- if (k == null_font)
- k = read_font_info(null_cs, st, fs, -1);
- free(st);
- level -= 1 ;
- if (k != null_font) {
- if (checksum != 0 && font_checksum(k) != 0
- && checksum != font_checksum(k))
- vf_local_font_warning(f, k, "checksum mismatch", (int) checksum, (int) font_checksum(k));
- if (ds != font_dsize(k))
- vf_local_font_warning(f, k, "design size mismatch", ds, font_dsize(k));
- }
- }
- return k;
-}
-
-@ @c
-static int open_vf_file(const char *fn, unsigned char **vbuffer, int *vsize)
-{
- boolean res; /* was the callback successful? */
- int callback_id;
- boolean file_read = false; /* was |vf_file| successfully read? */
- FILE *vf_file;
- const char *fname = luatex_find_file(fn, find_vf_file_callback);
- if (fname == NULL || strlen(fname) == 0) {
- /* fname = fn; */
- return 0;
- }
-
- callback_id = callback_defined(read_vf_file_callback);
- if (callback_id > 0) {
- res = run_callback(callback_id, "S->bSd", fname,
- &file_read, vbuffer, vsize);
- if (res && file_read && (*vsize > 0)) {
- return 1;
- }
- if (!file_read)
- return 0; /* -1 */
- } else {
- if (luatex_open_input
- (&(vf_file), fname, kpse_ovf_format, FOPEN_RBIN_MODE, false)
- || luatex_open_input(&(vf_file), fname, kpse_vf_format,
- FOPEN_RBIN_MODE, false)) {
- res = read_vf_file(vf_file, vbuffer, vsize);
- close_file(vf_file);
- if (res) {
- return 1;
- }
- } else {
- return 0; /* -1 */
- }
- }
- return 0;
-}
-
-
-
-@ The |do_vf| procedure attempts to read the \.{VF} file for a font, and sets
- |font_type()| to |real_font_type| if the \.{VF} file could not be found
- or loaded, otherwise sets |font_type()| to |virtual_font_type|. At this
- time, |tmp_f| is the internal font number of the current \.{TFM} font. To
- process font definitions in virtual font we call |vf_def_font|.
-
-@c
-#define append_packet(k) vpackets[vf_np++] = (eight_bits)(k)
-
-@ life is easier if all internal font commands are fnt4 and
- all character commands are set4 or put4
-
-@c
-#define append_fnt_set(k) \
-{ \
- assert(k > 0); \
- append_packet(packet_font_code); \
- append_four(k); \
-}
-
-#define append_four(k) \
-{ \
- append_packet((k & 0xFF000000) >> 24); \
- append_packet((k & 0x00FF0000) >> 16); \
- append_packet((k & 0x0000FF00) >> 8); \
- append_packet((k & 0x000000FF)); \
-}
-
-@ some of these things happen twice, adding a define is simplest
-
-@c
-#define test_checksum() { vf_byte(tmp_b0); vf_byte(tmp_b1); \
- vf_byte(tmp_b2); vf_byte(tmp_b3); \
- if (((tmp_b0 != 0) || (tmp_b1 != 0) || (tmp_b2 != 0) || (tmp_b3 != 0)) && \
- ((font_check_0(f) != 0) || (font_check_1(f) != 0) || \
- (font_check_2(f) != 0) || (font_check_3(f) != 0)) && \
- ((tmp_b0 != font_check_0(f)) || (tmp_b1 != font_check_1(f)) || \
- (tmp_b2 != font_check_2(f)) || (tmp_b3 != font_check_3(f)))) { \
- print_nlp(); \
- tprint("checksum mismatch in font "); \
- tprint(font_name(f)); \
- tprint(".vf ignored "); } }
-
-#define test_dsize() \
-{ \
- int read_tmp; \
- vf_read(4, read_tmp); \
- if ((read_tmp / 16) != font_dsize(f)) { \
- print_nlp(); \
- tprint("design size mismatch in font "); \
- tprint(font_name(f)); \
- tprint(".vf ignored"); \
- } \
-}
-
-@ @c
-static int count_packet_bytes(eight_bits * vf_buf, int cur_bute, int count)
-{
- unsigned k = 0;
- int ff = 0;
- int acc = 0;
- unsigned int cmd = 0;
- unsigned int d = 0;
- while (k < (unsigned) count) {
- cmd = vf_buf[cur_bute + (int) k];
- k++;
- if (cmd < set1) {
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- acc += 5;
- } else if ((fnt_num_0 <= cmd) && (cmd <= fnt_num_0 + 63)) {
- ff = 1;
- acc += 5;
- } else {
- switch (cmd) {
- case fnt1:
- acc += 5;
- k += 1;
- ff = 1;
- break;
- case fnt2:
- acc += 5;
- k += 2;
- ff = 1;
- break;
- case fnt3:
- acc += 5;
- k += 3;
- ff = 1;
- break;
- case fnt4:
- acc += 5;
- k += 4;
- ff = 1;
- break;
- case set_rule:
- acc += 9;
- k += 8;
- break;
- case put_rule:
- acc += 11;
- k += 8;
- break;
- case set1:
- acc += 5;
- k += 1;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case set2:
- acc += 5;
- k += 2;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case set3:
- acc += 5;
- k += 3;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case set4:
- acc += 5;
- k += 4;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case put1:
- acc += 7;
- k += 1;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case put2:
- acc += 7;
- k += 2;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case put3:
- acc += 7;
- k += 3;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case put4:
- acc += 7;
- k += 4;
- if (ff == 0) {
- ff = 1;
- acc += 5;
- }
- break;
- case right1:
- acc += 5;
- k += 1;
- break;
- case right2:
- acc += 5;
- k += 2;
- break;
- case right3:
- acc += 5;
- k += 3;
- break;
- case right4:
- acc += 5;
- k += 4;
- break;
- case w1:
- acc += 5;
- k += 1;
- break;
- case w2:
- acc += 5;
- k += 2;
- break;
- case w3:
- acc += 5;
- k += 3;
- break;
- case w4:
- acc += 5;
- k += 4;
- break;
- case x1:
- acc += 5;
- k += 1;
- break;
- case x2:
- acc += 5;
- k += 2;
- break;
- case x3:
- acc += 5;
- k += 3;
- break;
- case x4:
- acc += 5;
- k += 4;
- break;
- case down1:
- acc += 5;
- k += 1;
- break;
- case down2:
- acc += 5;
- k += 2;
- break;
- case down3:
- acc += 5;
- k += 3;
- break;
- case down4:
- acc += 5;
- k += 4;
- break;
- case y1:
- acc += 5;
- k += 1;
- break;
- case y2:
- acc += 5;
- k += 2;
- break;
- case y3:
- acc += 5;
- k += 3;
- break;
- case y4:
- acc += 5;
- k += 4;
- break;
- case z1:
- acc += 5;
- k += 1;
- break;
- case z2:
- acc += 5;
- k += 2;
- break;
- case z3:
- acc += 5;
- k += 3;
- break;
- case z4:
- acc += 5;
- k += 4;
- break;
- case xxx1:
- d = vf_buf[cur_bute + (int) k];
- k++;
- k += d;
- acc += 5 + (int) d;
- break;
- case xxx2:
- d = vf_buf[cur_bute + (int) k];
- k++;
- d = d * 256 + vf_buf[cur_bute + (int) k];
- k++;
- k += d;
- acc += 5 + (int) d;
- break;
- case xxx3:
- d = vf_buf[cur_bute + (int) k];
- k++;
- d = d * 256 + vf_buf[cur_bute + (int) k];
- k++;
- d = d * 256 + vf_buf[cur_bute + (int) k];
- k++;
- k += d;
- acc += 5 + (int) d;
- break;
- case xxx4:
- d = vf_buf[cur_bute + (int) k];
- k++;
- d = d * 256 + vf_buf[cur_bute + (int) k];
- k++;
- d = d * 256 + vf_buf[cur_bute + (int) k];
- k++;
- d = d * 256 + vf_buf[cur_bute + (int) k];
- k++;
- k += d;
- acc += 5 + (int) d;
- break;
- case w0:
- acc += 5;
- break;
- case x0:
- acc += 5;
- break;
- case y0:
- acc += 5;
- break;
- case z0:
- acc += 5;
- break;
- case nop:
- break;
- case push:
- acc += 1;
- break;
- case pop:
- acc += 1;
- break;
- }
- }
- }
- return (acc + 1);
-}
-
-@ @c
-void do_vf(internal_font_number f)
-{
- int k, i;
- unsigned cmd, n;
- scaled x, y, w, z, h, v;
- int cc, cmd_length;
- unsigned packet_length;
- charinfo *co;
- scaled tfm_width;
- int save_cur_byte;
- vf_stack_index stack_level;
- int vf_z; /* multiplier */
- int vf_alpha; /* correction for negative values */
- /*char vf_beta;*/ /* divisor */
- int vf_np;
- eight_bits *vpackets;
- memory_word tmp_w; /* accumulator */
- vf_stack_record vf_stack[256];
- int junk;
- unsigned utmp;
- unsigned char *vf_buffer;
- int vf_size;
- int vf_cur;
- unsigned *vf_local_fnts = NULL; /* external font ids */
- unsigned *vf_real_fnts = NULL; /* internal font ids */
- unsigned vf_nf = 0; /* local font counter */
-
- if (font_type(f) != unknown_font_type)
- return;
- set_font_type(f, real_font_type);
- stack_level = 0;
- /* Open |vf_file|, return if not found */
- vf_cur = 0;
- vf_buffer = NULL;
- vf_size = 0;
- if (!open_vf_file(font_name(f), &vf_buffer, &vf_size))
- return;
- /* Process the preamble */
- set_font_type(f, virtual_font_type);
- vf_byte(k);
- if (k != pre)
- bad_vf("PRE command expected");
- vf_byte(k);
- if (k != vf_id)
- bad_vf("wrong id byte");
- vf_byte(cmd_length);
- for (k = 1; k <= cmd_length; k++)
- vf_byte(junk);
- test_checksum();
- test_dsize();
- vf_z = font_size(f);
- vf_replace_z();
- /* Process the font definitions */
- /* scan forward to find the number of internal fonts */
- vf_nf = 0;
- save_cur_byte = vf_cur;
- vf_byte(cmd);
- while ((cmd >= fnt_def1) && (cmd <= (fnt_def1 + 3))) {
- vf_read_u((cmd - fnt_def1 + 1), utmp);
- vf_read(4, junk);
- vf_read(4, junk);
- vf_read(4, junk);
- vf_byte(k);
- vf_byte(junk);
- k += junk;
- while (k-- > 0) {
- vf_byte(junk);
- }
- incr(vf_nf);
- vf_byte(cmd);
- }
- vf_cur = save_cur_byte;
- vf_byte(cmd);
- /* malloc and fill the local font arrays */
- if (vf_nf > 0) {
- unsigned ii = (unsigned) ((unsigned) vf_nf * sizeof(int));
- vf_local_fnts = xmalloc(ii);
- memset(vf_local_fnts, 0, ii);
- vf_real_fnts = xmalloc(ii);
- memset(vf_real_fnts, 0, ii);
- vf_nf = 0;
- while ((cmd >= fnt_def1) && (cmd <= (fnt_def1 + 3))) {
- vf_read_u((cmd - fnt_def1 + 1), vf_local_fnts[vf_nf]);
- vf_real_fnts[vf_nf] = (unsigned) vf_def_font(f, vf_buffer, &vf_cur);
- incr(vf_nf);
- vf_byte(cmd);
- }
- }
-
-
- while (cmd <= long_char) {
- /* Build a character packet */
- vf_np = 0;
- if (cmd == long_char) {
- vf_read_u(4, packet_length);
- vf_read_u(4, utmp);
- cc = (int) utmp;
- if (!char_exists(f, cc)) {
- bad_vf("invalid character code");
- }
- vf_read(4, k);
- tfm_width = store_scaled_f(k, font_size(f));
- } else {
- packet_length = cmd;
- vf_byte(cc);
- if (!char_exists(f, cc)) {
- bad_vf("invalid character code");
- }
- vf_read_u(3, utmp);
- k = (int) utmp; /* cf. vftovp.web, line 1028 */
- tfm_width = store_scaled_f(k, font_size(f));
- }
-
-
- if (tfm_width != char_width(f, cc)) {
- if (tfm_width != char_width(f, cc)) {
- print_nlp();
- tprint("character width mismatch in font ");
- tprint(font_name(f));
- tprint(".vf ignored");
- }
- }
- k = count_packet_bytes(vf_buffer, vf_cur, (int) packet_length);
- vpackets = xmalloc((unsigned) (k + 1)); /* need one extra extra for |packet_end| */
- co = get_charinfo(f, cc);
- k = 0;
- w = 0;
- x = 0;
- y = 0;
- z = 0;
- while (packet_length > 0) {
- vf_byte(cmd);
- decr(packet_length);
-
- if (cmd < set1) {
- if (k == 0) {
- k = (int) vf_real_fnts[0];
- append_fnt_set(k);
- }
- append_packet(packet_char_code);
- append_four(cmd);
- cmd_length = 0;
- cmd = nop;
-
- } else if (((fnt_num_0 <= cmd) && (cmd <= fnt_num_0 + 63)) ||
- ((fnt1 <= cmd) && (cmd <= fnt1 + 3))) {
- if (cmd >= fnt1) {
- vf_read_u((cmd - fnt1 + 1), utmp);
- k = (int) utmp;
- packet_length -= (cmd - fnt1 + 1);
- } else {
- k = (int) cmd - fnt_num_0;
- }
-
- /* change from local to external font id */
- n = 0;
- while ((n < vf_nf) && (vf_local_fnts[n] != (unsigned) k))
- n++;
- if (n == vf_nf)
- bad_vf("undefined local font");
-
- k = (int) vf_real_fnts[n];
- append_fnt_set(k);
- cmd_length = 0;
- cmd = nop;
- } else {
- switch (cmd) {
- case set_rule:
- vf_read(4, h);
- vf_read(4, v);
- append_packet(packet_rule_code);
- append_four(h);
- append_four(v);
- packet_length -= 8;
- break;
- case put_rule:
- vf_read(4, h);
- vf_read(4, v);
- append_packet(packet_push_code);
- append_packet(packet_rule_code);
- append_four(h);
- append_four(v);
- append_packet(packet_pop_code);
- packet_length -= 8;
- break;
- case set1:
- case set2:
- case set3:
- case set4:
- if (k == 0) {
- k = (int) vf_real_fnts[0];
- append_fnt_set(k);
- }
- vf_read_u((cmd - set1 + 1), utmp);
- i = (int) utmp;
- append_packet(packet_char_code);
- append_four(i);
- packet_length -= (cmd - set1 + 1);
- break;
- case put1:
- case put2:
- case put3:
- case put4:
- if (k == 0) {
- k = (int) vf_real_fnts[0];
- append_fnt_set(k);
- }
- vf_read_u((cmd - put1 + 1), utmp);
- i = (int) utmp;
- append_packet(packet_push_code);
- append_packet(packet_char_code);
- append_four(i);
- append_packet(packet_pop_code);
- packet_length -= (cmd - put1 + 1);
- break;
- case right1:
- case right2:
- case right3:
- case right4:
- vf_read((cmd - right1 + 1), i);
- append_packet(packet_right_code);
- append_four(i);
- packet_length -= (cmd - right1 + 1);
- break;
- case w1:
- case w2:
- case w3:
- case w4:
- vf_read((cmd - w1 + 1), w);
- append_packet(packet_right_code);
- append_four(w);
- packet_length -= (cmd - w1 + 1);
- break;
- case x1:
- case x2:
- case x3:
- case x4:
- vf_read((cmd - x1 + 1), x);
- append_packet(packet_right_code);
- append_four(x);
- packet_length -= (cmd - x1 + 1);
- break;
- case down1:
- case down2:
- case down3:
- case down4:
- vf_read((cmd - down1 + 1), i);
- append_packet(packet_down_code);
- append_four(i);
- packet_length -= (cmd - down1 + 1);
- break;
- case y1:
- case y2:
- case y3:
- case y4:
- vf_read((cmd - y1 + 1), y);
- append_packet(packet_down_code);
- append_four(y);
- packet_length -= (cmd - y1 + 1);
- break;
- case z1:
- case z2:
- case z3:
- case z4:
- vf_read((cmd - z1 + 1), z);
- append_packet(packet_down_code);
- append_four(z);
- packet_length -= (cmd - z1 + 1);
- break;
- case xxx1:
- case xxx2:
- case xxx3:
- case xxx4:
- vf_read_u((cmd - xxx1 + 1), utmp);
- cmd_length = (int) utmp;
- packet_length -= (cmd - xxx1 + 1);
- if (cmd_length <= 0)
- bad_vf("special of negative length");
- packet_length -= (unsigned) cmd_length;
-
- append_packet(packet_special_code);
- append_four(cmd_length);
- while (cmd_length > 0) {
- cmd_length--;
- vf_byte(i);
- append_packet(i);
- }
- break;
- case w0:
- append_packet(packet_right_code);
- append_four(w);
- break;
- case x0:
- append_packet(packet_right_code);
- append_four(x);
- break;
- case y0:
- append_packet(packet_down_code);
- append_four(y);
- break;
- case z0:
- append_packet(packet_down_code);
- append_four(z);
- break;
- case nop:
- break;
- case push:
- if (stack_level == vf_stack_size) {
- overflow("virtual font stack size", vf_stack_size);
- } else {
- vf_stack[stack_level].stack_w = w;
- vf_stack[stack_level].stack_x = x;
- vf_stack[stack_level].stack_y = y;
- vf_stack[stack_level].stack_z = z;
- incr(stack_level);
- append_packet(packet_push_code);
- }
- break;
- case pop:
- if (stack_level == 0) {
- bad_vf("more POPs than PUSHs in character");
- } else {
- decr(stack_level);
- w = vf_stack[stack_level].stack_w;
- x = vf_stack[stack_level].stack_x;
- y = vf_stack[stack_level].stack_y;
- z = vf_stack[stack_level].stack_z;
- append_packet(packet_pop_code);
- }
- break;
- default:
- bad_vf("improver DVI command");
- }
- }
- }
- /* signal end of packet */
- append_packet(packet_end_code);
-
- if (stack_level != 0)
- bad_vf("more PUSHs than POPs in character packet");
- if (packet_length != 0)
- bad_vf("invalid packet length or DVI command in packet");
- /* \.{Store the packet being built} */
- set_charinfo_packets(co, vpackets);
- vf_byte(cmd);
- }
- if (cmd != post)
- bad_vf("POST command expected");
-
- xfree(vf_buffer);
-}
-
-@ @c
-#define make_command0(N,K) { \
- lua_newtable(L); \
- lua_pushstring(L, N); \
- lua_rawseti(L,-2, 1); \
- lua_rawseti(L,-2, K); \
- K++; }
-
-#define make_command1(N,V,K) { \
- lua_newtable(L); \
- lua_pushstring(L, N); \
- lua_rawseti(L,-2, 1); \
- lua_pushinteger(L, V); \
- lua_rawseti(L,-2, 2); \
- lua_rawseti(L,-2, K); \
- K++; }
-
-#define make_command2(N,V,W,K) { \
- lua_newtable(L); \
- lua_pushstring(L, N); \
- lua_rawseti(L,-2, 1); \
- lua_pushinteger(L, V); \
- lua_rawseti(L,-2, 2); \
- lua_pushinteger(L, W); \
- lua_rawseti(L,-2, 3); \
- lua_rawseti(L,-2, K); \
- K++; }
-
-#define make_commands(N,S,V,K) { \
- lua_newtable(L); \
- lua_pushstring(L, N); \
- lua_rawseti(L,-2, 1); \
- lua_pushlstring(L, S, V); \
- lua_rawseti(L,-2, 2); \
- lua_rawseti(L,-2, K); \
- K++; }
-
-
-int make_vf_table(lua_State * L, const char *cnom, scaled atsize)
-{
- int cmd, k, i;
- int cc;
- unsigned cmd_length, packet_length;
- scaled tfm_width;
- vf_stack_index stack_level;
- int vf_z; /* multiplier */
- int vf_alpha; /* correction for negative values */
- /*char vf_beta;*/ /* divisor */
- eight_bits *s;
- scaled h, v;
- scaled w, x, y, z;
- int s_top; /* lua stack */
- int vf_nf; /* local font counter */
- scaled ds, fs;
- four_quarters cs;
- memory_word tmp_w; /* accumulator */
- vf_stack_record vf_stack[256];
- unsigned char *vf_buffer;
- int vf_size;
- int vf_cur;
- unsigned utmp;
-
-
- stack_level = 0;
- /* Open |vf_file|, return if not found */
- vf_cur = 0;
- vf_buffer = NULL;
- vf_size = 0;
- if (!open_vf_file(cnom, &vf_buffer, &vf_size)) {
- lua_pushnil(L);
- return 1;
- }
-
- /* start by creating a table */
- s_top = lua_gettop(L);
- lua_newtable(L);
-
- /* Process the preamble */
- vf_byte(k);
- if (k != pre)
- lua_bad_vf("PRE command expected");
- vf_byte(k);
- if (k != vf_id)
- lua_bad_vf("wrong id byte");
- vf_byte(cmd_length);
-
- s = xmalloc(cmd_length);
- for (k = 1; k <= (int) cmd_length; k++)
- vf_byte(s[(k - 1)]);
-
- lua_pushlstring(L, (char *) s, (size_t) cmd_length);
- free(s);
- lua_setfield(L, -2, "header");
-
- vf_byte(cs.b0);
- vf_byte(cs.b1);
- vf_byte(cs.b2);
- vf_byte(cs.b3);
- lua_pushinteger(L, (lua_Number) ((cs.b0 << 24) + (cs.b1 << 16) + (cs.b2 << 8) + cs.b3));
- lua_setfield(L, -2, "checksum");
-
- vf_read(4, k);
- ds = k / 16;
- lua_pushinteger(L, ds);
- lua_setfield(L, -2, "designsize");
-
-
- lua_pushstring(L, cnom);
- lua_setfield(L, -2, "name");
-
- lua_pushinteger(L, atsize);
- lua_setfield(L, -2, "size");
-
- vf_z = atsize;
- vf_replace_z();
- /* Process the font definitions */
- vf_byte(cmd);
- lua_newtable(L);
-
- i = 1;
- while ((cmd >= fnt_def1) && (cmd <= fnt_def1 + 3)) {
-
- lua_newtable(L);
- vf_read_u((cmd - fnt_def1 + 1), utmp);
- vf_nf = (int) utmp;
- vf_nf++;
- /* checksum */
- vf_byte(cs.b0);
- vf_byte(cs.b1);
- vf_byte(cs.b2);
- vf_byte(cs.b3);
-
- vf_read(4, k);
- fs = store_scaled_f(k, atsize);
- lua_pushstring(L, "size");
- lua_pushinteger(L, fs);
- lua_rawset(L, -3);
-
- vf_read(4, k);
- ds = k / 16; /* dsize, not used */
-
- vf_byte(tmp_b0);
- vf_byte(tmp_b1);
- while (tmp_b0 > 0) {
- tmp_b0--;
- vf_byte(k);
- } /* skip the font path */
-
- s = xmalloc((unsigned) (tmp_b1 + 1));
- k = 0;
- while (tmp_b1-- > 0)
- vf_byte(s[k++]);
- s[k] = 0;
- lua_pushstring(L, "name");
- lua_pushstring(L, xstrdup((char *) s));
- free(s);
- lua_rawset(L, -3);
-
- lua_rawseti(L, -2, vf_nf);
- i++;
- vf_byte(cmd);
- }
-
- if (i > 1) {
- lua_setfield(L, -2, "fonts");
- } else {
- lua_pop(L, 1);
- }
-
- lua_newtable(L); /* 'characters' */
- while (cmd <= long_char) {
- /* Build a character packet */
- if (cmd == long_char) {
- vf_read_u(4, packet_length);
- vf_read_u(4, utmp);
- cc = (int) utmp;
- vf_read(4, tfm_width);
- } else {
- packet_length = (unsigned) cmd;
- vf_byte(cc);
- vf_read_u(3, utmp);
- tfm_width = (int) utmp;
- }
- lua_newtable(L); /* for this character */
- lua_pushinteger(L, tfm_width);
- lua_setfield(L, -2, "width");
- lua_newtable(L); /* for 'commands' */
- k = 1;
- vf_nf = 0;
- w = 0;
- x = 0;
- y = 0;
- z = 0;
- while (packet_length > 0) {
- vf_byte(cmd);
- decr(packet_length);
- if ((cmd >= set_char_0) && (cmd < set1)) {
- if (vf_nf == 0) {
- vf_nf = 1;
- make_command1("font", vf_nf, k);
- }
- make_command1("char", cmd, k);
- } else if (((fnt_num_0 <= cmd) && (cmd <= fnt_num_0 + 63)) ||
- ((fnt1 <= cmd) && (cmd <= fnt1 + 3))) {
- if (cmd >= fnt1) {
- vf_read_u((cmd - fnt1 + 1), utmp);
- vf_nf = (int) utmp;
- vf_nf++;
- packet_length -= (unsigned) (cmd - fnt1 + 1);
- } else {
- vf_nf = cmd - fnt_num_0 + 1;
- }
- make_command1("font", vf_nf, k);
- } else {
- switch (cmd) {
- case set_rule:
- vf_read(4, h);
- vf_read(4, v);
- make_command2("rule", store_scaled_f(h, atsize),
- store_scaled_f(v, atsize), k);
- packet_length -= 8;
- break;
- case put_rule:
- vf_read(4, h);
- vf_read(4, v);
- make_command0("push", k);
- make_command2("rule", store_scaled_f(h, atsize),
- store_scaled_f(v, atsize), k);
- make_command0("pop", k);
- packet_length -= 8;
- break;
- case set1:
- case set2:
- case set3:
- case set4:
- if (vf_nf == 0) {
- vf_nf = 1;
- make_command1("font", vf_nf, k);
- }
- vf_read_u((cmd - set1 + 1), utmp);
- i = (int) utmp;
- make_command1("char", i, k);
- packet_length -= (unsigned) (cmd - set1 + 1);
- break;
- case put1:
- case put2:
- case put3:
- case put4:
- if (vf_nf == 0) {
- vf_nf = 1;
- make_command1("font", vf_nf, k);
- }
- vf_read_u((cmd - put1 + 1), utmp);
- i = (int) utmp;
- make_command0("push", k);
- make_command1("char", i, k);
- make_command0("pop", k);
- packet_length -= (unsigned) (cmd - put1 + 1);
- break;
- case right1:
- case right2:
- case right3:
- case right4:
- vf_read((cmd - right1 + 1), i);
- make_command1("right", store_scaled_f(i, atsize), k);
- packet_length -= (unsigned) (cmd - right1 + 1);
- break;
- case w1:
- case w2:
- case w3:
- case w4:
- vf_read((cmd - w1 + 1), w);
- make_command1("right", store_scaled_f(w, atsize), k);
- packet_length -= (unsigned) (cmd - w1 + 1);
- break;
- case x1:
- case x2:
- case x3:
- case x4:
- vf_read((cmd - x1 + 1), x);
- make_command1("right", store_scaled_f(x, atsize), k);
- packet_length -= (unsigned) (cmd - x1 + 1);
- break;
- case down1:
- case down2:
- case down3:
- case down4:
- vf_read((cmd - down1 + 1), i);
- make_command1("down", store_scaled_f(i, atsize), k);
- packet_length -= (unsigned) (cmd - down1 + 1);
- break;
- case y1:
- case y2:
- case y3:
- case y4:
- vf_read((cmd - y1 + 1), y);
- make_command1("down", store_scaled_f(y, atsize), k);
- packet_length -= (unsigned) (cmd - y1 + 1);
- break;
- case z1:
- case z2:
- case z3:
- case z4:
- vf_read((cmd - z1 + 1), z);
- make_command1("down", store_scaled_f(z, atsize), k);
- packet_length -= (unsigned) (cmd - z1 + 1);
- break;
- case xxx1:
- case xxx2:
- case xxx3:
- case xxx4:
- vf_read_u((cmd - xxx1 + 1), cmd_length);
- packet_length -= (unsigned) (cmd - xxx1 + 1);
- if (cmd_length <= 0)
- lua_bad_vf("special of negative length");
- packet_length -= cmd_length;
-
- s = xmalloc((cmd_length + 1));
- i = 0;
- while (cmd_length > 0) {
- cmd_length--;
- vf_byte(s[i]);
- i++;
- }
- s[i] = 0;
- make_commands("special", xstrdup((char *) s), (size_t) i,
- k);
- free(s);
- break;
- case w0:
- make_command1("right", store_scaled_f(w, atsize), k);
- break;
- case x0:
- make_command1("right", store_scaled_f(x, atsize), k);
- break;
- case y0:
- make_command1("down", store_scaled_f(y, atsize), k);
- break;
- case z0:
- make_command1("down", store_scaled_f(z, atsize), k);
- break;
- case nop:
- break;
- case push:
- if (stack_level == vf_stack_size) {
- overflow("virtual font stack size", vf_stack_size);
- } else {
- vf_stack[stack_level].stack_w = w;
- vf_stack[stack_level].stack_x = x;
- vf_stack[stack_level].stack_y = y;
- vf_stack[stack_level].stack_z = z;
- incr(stack_level);
- make_command0("push", k);
- }
- break;
- case pop:
- if (stack_level == 0) {
- lua_bad_vf("more POPs than PUSHs in character");
- } else {
- decr(stack_level);
- w = vf_stack[stack_level].stack_w;
- x = vf_stack[stack_level].stack_x;
- y = vf_stack[stack_level].stack_y;
- z = vf_stack[stack_level].stack_z;
- make_command0("pop", k);
- }
- break;
- default:
- lua_bad_vf("improver DVI command");
- }
- }
- }
- /* signal end of packet */
- lua_setfield(L, -2, "commands");
-
- if (stack_level != 0)
- lua_bad_vf("more PUSHs than POPs in character packet");
- if (packet_length != 0)
- lua_bad_vf("invalid packet length or DVI command in packet");
-
- lua_rawseti(L, -2, cc);
-
- vf_byte(cmd);
- }
- lua_setfield(L, -2, "characters");
-
- if (cmd != post)
- lua_bad_vf("POST command expected");
- xfree(vf_buffer);
- return 1;
-}
-
-@ @c
-internal_font_number
-letter_space_font(internal_font_number f, int e, boolean nolig)
-{
- internal_font_number k;
- scaled w;
- int c;
- charinfo *co;
- char *new_font_name;
-
- /* read a new font and expand the character widths */
- k = copy_font(f);
-
- if (nolig)
- set_no_ligatures(k); /* disable ligatures for letter-spaced fonts */
-
- /* append eg '+100ls' to font name */
- new_font_name = xmalloc((unsigned) (strlen(font_name(k)) + 8)); /* |abs(e) <= 1000| */
- if (e > 0) {
- sprintf(new_font_name, "%s+%ils", font_name(k), (int) e);
- } else {
- /* minus from \%i */
- sprintf(new_font_name, "%s%ils", font_name(k), (int) e);
- }
- set_font_name(k, new_font_name);
-
- /* create the corresponding virtual font */
- set_font_type(k, virtual_font_type);
-
- for (c=font_bc(k);c<=font_ec(k);c++) {
- if (quick_char_exists(k, c)) {
- int half_w;
- int vf_np = 0;
- eight_bits *vpackets = xmalloc((unsigned) (10+10+1));
- if (e<0) {
- half_w = -round_xn_over_d(quad(k), -e, 2000);
- } else {
- half_w = round_xn_over_d(quad(k), e, 2000);
- }
- co = get_charinfo(k, c);
- w = char_width(k, c)+2*half_w;
- set_charinfo_width(co, w);
-
- append_packet(packet_right_code);
- append_four(half_w);
- append_fnt_set(f);
- append_packet(packet_char_code);
- append_four(c);
- append_packet(packet_right_code);
- append_four(half_w);
- append_packet(packet_end_code);
-
- set_charinfo_packets(co, vpackets);
- }
- }
- /* now patch the quad size */
- /* Patch 20100922: do not do this, to remain compatible with pdftex */
-#if 0
- if (e<0) {
- set_font_param(k, quad_code, -round_xn_over_d(quad(k), 1000-e, 1000));
- } else {
- set_font_param(k, quad_code, round_xn_over_d(quad(k), 1000+e, 1000));
- }
-#endif
- return k;
-}
-
-@ @c
-internal_font_number copy_font_info(internal_font_number f)
-{
- return copy_font(f);
-}