3 This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
5 Copyright (C) 2007-2012 by Jin-Hwan Cho and Shunsaku Hirata,
6 the dvipdfmx project team.
8 Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
44 #define VF_ALLOC_SIZE 16u
47 #define FIX_WORD_BASE 1048576.0
48 #define TEXPT2PT (72.0/72.27)
49 #define FW2PT (TEXPT2PT/((double)(FIX_WORD_BASE)))
51 static unsigned char verbose = 0;
53 void vf_set_verbose(void)
55 if (verbose < 255) verbose++;
59 signed long font_id /* id used internally in vf file */;
60 unsigned long checksum, size, design_size;
61 char *directory, *name;
62 int tfm_id; /* id returned by TFM module */
63 int dev_id; /* id returned by DEV module */
70 unsigned long design_size; /* A fixword-pts quantity */
71 int num_dev_fonts, max_dev_fonts;
72 struct font_def *dev_fonts;
73 unsigned char **ch_pkt;
74 unsigned long *pkt_len;
78 struct vf *vf_fonts = NULL;
79 int num_vf_fonts = 0, max_vf_fonts = 0;
81 static int read_header(FILE *vf_file, int thisfont)
83 int i, result = 1, ch;
85 /* Check for usual signature */
86 if ((ch = get_unsigned_byte (vf_file)) == PRE &&
87 (ch = get_unsigned_byte (vf_file)) == VF_ID) {
89 /* If here, assume it's a legitimate vf file */
90 ch = get_unsigned_byte (vf_file);
94 get_unsigned_byte (vf_file);
97 get_unsigned_quad(vf_file);
99 vf_fonts[thisfont].design_size =
100 get_unsigned_quad(vf_file);
101 } else { /* Try to fail gracefully and return an error to caller */
102 fprintf (stderr, "VF file may be corrupt\n");
109 static void resize_vf_fonts(int size)
112 if (size > max_vf_fonts) {
113 vf_fonts = RENEW (vf_fonts, size, struct vf);
114 for (i=max_vf_fonts; i<size; i++) {
115 vf_fonts[i].num_dev_fonts = 0;
116 vf_fonts[i].max_dev_fonts = 0;
117 vf_fonts[i].dev_fonts = NULL;
124 static void resize_one_vf_font (struct vf *a_vf, unsigned size)
127 if (size > (a_vf->num_chars)) {
128 size = MAX (size, a_vf->num_chars+256);
129 a_vf->ch_pkt = RENEW (a_vf->ch_pkt, size, unsigned char *);
130 a_vf->pkt_len = RENEW (a_vf->pkt_len, size, unsigned long);
131 for (i=a_vf->num_chars; i<size; i++) {
132 (a_vf->ch_pkt)[i] = NULL;
133 (a_vf->pkt_len)[i] = 0;
135 a_vf->num_chars = size;
139 static void read_a_char_def(FILE *vf_file, int thisfont, unsigned long pkt_len,
144 fprintf (stderr, "read_a_char_def: len=%ld, ch=%d\n", pkt_len, ch);
146 /* Resize and initialize character arrays if necessary */
147 if (ch >= vf_fonts[thisfont].num_chars) {
148 resize_one_vf_font (vf_fonts+thisfont, ch+1);
151 pkt = NEW (pkt_len, unsigned char);
152 if (fread (pkt, 1, pkt_len, vf_file) != pkt_len)
153 ERROR ("VF file ended prematurely.");
154 (vf_fonts[thisfont].ch_pkt)[ch] = pkt;
156 (vf_fonts[thisfont].pkt_len)[ch] = pkt_len;
160 static void read_a_font_def(FILE *vf_file, signed long font_id, int thisfont)
162 struct font_def *dev_font;
163 int dir_length, name_length;
165 fprintf (stderr, "read_a_font_def: font_id = %ld\n", font_id);
167 if (vf_fonts[thisfont].num_dev_fonts >=
168 vf_fonts[thisfont].max_dev_fonts) {
169 vf_fonts[thisfont].max_dev_fonts += VF_ALLOC_SIZE;
170 vf_fonts[thisfont].dev_fonts = RENEW
171 (vf_fonts[thisfont].dev_fonts,
172 vf_fonts[thisfont].max_dev_fonts,
175 dev_font = vf_fonts[thisfont].dev_fonts+
176 vf_fonts[thisfont].num_dev_fonts;
177 dev_font -> font_id = font_id;
178 dev_font -> checksum = get_unsigned_quad (vf_file);
179 dev_font -> size = get_unsigned_quad (vf_file);
180 dev_font -> design_size = get_unsigned_quad (vf_file);
181 dir_length = get_unsigned_byte (vf_file);
182 name_length = get_unsigned_byte (vf_file);
183 dev_font -> directory = NEW (dir_length+1, char);
184 dev_font -> name = NEW (name_length+1, char);
185 fread (dev_font -> directory, 1, dir_length, vf_file);
186 fread (dev_font -> name, 1, name_length, vf_file);
187 (dev_font -> directory)[dir_length] = 0;
188 (dev_font -> name)[name_length] = 0;
189 vf_fonts[thisfont].num_dev_fonts += 1;
190 dev_font->tfm_id = tfm_open (dev_font -> name, 1); /* must exist */
192 dvi_locate_font (dev_font->name,
193 sqxfw (vf_fonts[thisfont].ptsize,
196 fprintf (stderr, "[%s/%s]\n", dev_font -> directory, dev_font -> name);
202 static void process_vf_file (FILE *vf_file, int thisfont)
205 unsigned long font_id;
207 code = get_unsigned_byte (vf_file);
210 font_id = get_unsigned_byte (vf_file);
211 read_a_font_def (vf_file, font_id, thisfont);
214 font_id = get_unsigned_pair (vf_file);
215 read_a_font_def (vf_file, font_id, thisfont);
218 font_id = get_unsigned_triple(vf_file);
219 read_a_font_def (vf_file, font_id, thisfont);
222 font_id = get_signed_quad(vf_file);
223 read_a_font_def (vf_file, font_id, thisfont);
228 /* For a short packet, code is the pkt_len */
229 ch = get_unsigned_byte (vf_file);
230 /* Skip over TFM width since we already know it */
231 get_unsigned_triple (vf_file);
232 read_a_char_def (vf_file, thisfont, code, ch);
236 unsigned long pkt_len, ch;
237 pkt_len = get_unsigned_quad(vf_file);
238 ch = get_unsigned_quad (vf_file);
239 /* Skip over TFM width since we already know it */
240 get_unsigned_quad (vf_file);
242 read_a_char_def (vf_file, thisfont, pkt_len, ch);
244 fprintf (stderr, "char=%ld\n", ch);
245 ERROR ("Long character (>24 bits) in VF file.\nI can't handle long characters!\n");
253 fprintf (stderr, "Quitting on code=%d\n", code);
261 /* Unfortunately, the following code isn't smart enough
262 to load the vf only once for multiple point sizes.
263 You will get a separate copy of each VF in memory (and a separate
264 opening and reading of the file) for
265 each point size. Since VFs are pretty small, I guess
266 this is tolerable for now. In any case,
267 the PDF file will never repeat a physical font name */
268 /* Note: This code needs to be able to recurse */
269 /* Global variables such as num_vf_fonts require careful attention */
270 int vf_locate_font (const char *tex_name, spt_t ptsize)
272 int thisfont = -1, i;
273 char *full_vf_file_name;
275 /* Has this name and ptsize already been loaded as a VF? */
276 for (i=0; i<num_vf_fonts; i++) {
277 if (!strcmp (vf_fonts[i].tex_name, tex_name) &&
278 vf_fonts[i].ptsize == ptsize)
281 if (i != num_vf_fonts) {
284 /* It's hasn't already been loaded as a VF, so try to load it */
285 full_vf_file_name = kpse_find_file (tex_name,
288 if (!full_vf_file_name) {
289 full_vf_file_name = kpse_find_file (tex_name,
293 if (full_vf_file_name &&
294 (vf_file = MFOPEN (full_vf_file_name, FOPEN_RBIN_MODE)) != NULL) {
296 fprintf (stderr, "(VF:%s", tex_name);
298 fprintf (stderr, "(VF:%s", full_vf_file_name);
299 if (num_vf_fonts >= max_vf_fonts) {
300 resize_vf_fonts (max_vf_fonts + VF_ALLOC_SIZE);
302 thisfont = num_vf_fonts++;
303 { /* Initialize some pointers and such */
304 vf_fonts[thisfont].tex_name = NEW (strlen(tex_name)+1, char);
305 strcpy (vf_fonts[thisfont].tex_name, tex_name);
306 vf_fonts[thisfont].ptsize = ptsize;
307 vf_fonts[thisfont].num_chars = 0;
308 vf_fonts[thisfont].ch_pkt = NULL;
309 vf_fonts[thisfont].pkt_len = NULL;
311 read_header(vf_file, thisfont);
312 process_vf_file (vf_file, thisfont);
314 fprintf (stderr, ")");
317 if (full_vf_file_name)
318 RELEASE(full_vf_file_name);
323 #define next_byte() (*((*start)++))
324 static UNSIGNED_BYTE unsigned_byte (unsigned char **start, unsigned char *end)
326 UNSIGNED_BYTE byte = 0;
330 ERROR ("Premature end of DVI byte stream in VF font\n");
334 static SIGNED_BYTE signed_byte (unsigned char **start, unsigned char *end)
343 ERROR ("Premature end of DVI byte stream in VF font\n");
344 return (SIGNED_BYTE) byte;
347 static UNSIGNED_PAIR unsigned_pair (unsigned char **start, unsigned char *end)
351 UNSIGNED_PAIR pair = 0;
352 if (end-*start > 1) {
353 for (i=0; i<2; i++) {
355 pair = pair*0x100u + byte;
359 ERROR ("Premature end of DVI byte stream in VF font\n");
363 static SIGNED_PAIR signed_pair (unsigned char **start, unsigned char *end)
367 if (end - *start > 1) {
368 for (i=0; i<2; i++) {
369 pair = pair*0x100 + next_byte();
371 if (pair >= 0x8000) {
375 ERROR ("Premature end of DVI byte stream in VF font\n");
376 return (SIGNED_PAIR) pair;
379 static UNSIGNED_TRIPLE unsigned_triple(unsigned char **start, unsigned
384 if (end-*start > 2) {
385 for (i=0; i<3; i++) {
386 triple = triple*0x100u + next_byte();
389 ERROR ("Premature end of DVI byte stream in VF font\n");
390 return (UNSIGNED_TRIPLE) triple;
393 static SIGNED_TRIPLE signed_triple(unsigned char **start, unsigned char *end)
397 if (end-*start > 2) {
398 for (i=0; i<3; i++) {
399 triple = triple*0x100 + next_byte();
401 if (triple >= 0x800000l)
402 triple -= 0x1000000l;
404 ERROR ("Premature end of DVI byte stream in VF font\n");
405 return (SIGNED_TRIPLE) triple;
408 static SIGNED_QUAD signed_quad(unsigned char **start, unsigned char *end)
412 /* Check sign on first byte before reading others */
413 if (end-*start > 3) {
418 for (i=0; i<3; i++) {
419 quad = quad*0x100 + next_byte();
422 ERROR ("Premature end of DVI byte stream in VF font\n");
423 return (SIGNED_QUAD) quad;
426 static UNSIGNED_QUAD unsigned_quad(unsigned char **start, unsigned char *end)
429 unsigned long quad = 0;
430 if (end-*start > 3) {
431 for (i=0; i<4; i++) {
432 quad = quad*0x100u + next_byte();
435 ERROR ("Premature end of DVI byte stream in VF font\n");
436 return (UNSIGNED_QUAD) quad;
439 static void vf_set (SIGNED_QUAD ch)
441 /* Defer to the dvi_set() defined in dvi.c */
446 static void vf_set1(unsigned char **start, unsigned char *end)
448 vf_set (unsigned_byte(start, end));
452 static void vf_set2(unsigned char **start, unsigned char *end)
454 vf_set (unsigned_pair(start, end));
458 static void vf_set3(unsigned char **start, unsigned char *end)
460 vf_set (unsigned_triple(start, end));
464 static void vf_putrule(unsigned char **start, unsigned char *end, spt_t ptsize)
466 SIGNED_QUAD width, height;
467 height = signed_quad (start, end);
468 width = signed_quad (start, end);
469 if (width > 0 && height > 0) {
470 dvi_rule (sqxfw(ptsize,width), sqxfw(ptsize, height));
475 static void vf_setrule(unsigned char **start, unsigned char *end, spt_t ptsize)
477 SIGNED_QUAD width, height, s_width;
478 height = signed_quad (start, end);
479 width = signed_quad (start, end);
480 s_width = sqxfw(ptsize, width);
481 if (width > 0 && height > 0) {
482 dvi_rule (s_width, sqxfw(ptsize, height));
488 static void vf_put1(unsigned char **start, unsigned char *end)
490 dvi_put (unsigned_byte(start, end));
494 static void vf_put2(unsigned char **start, unsigned char *end)
496 dvi_put (unsigned_pair(start, end));
500 static void vf_put3(unsigned char **start, unsigned char *end)
502 dvi_put (unsigned_triple(start, end));
506 static void vf_push(void)
512 static void vf_pop(void)
518 static void vf_right (SIGNED_QUAD x, spt_t ptsize)
520 dvi_right ((SIGNED_QUAD) (sqxfw(ptsize, x)));
525 static void vf_right1(unsigned char **start, unsigned char *end, spt_t ptsize)
527 vf_right (signed_byte (start, end), ptsize);
531 static void vf_right2(unsigned char **start, unsigned char *end, spt_t ptsize)
533 vf_right (signed_pair (start, end), ptsize);
537 static void vf_right3(unsigned char **start, unsigned char *end, spt_t ptsize)
539 vf_right (signed_triple (start, end), ptsize);
543 static void vf_right4(unsigned char **start, unsigned char *end, spt_t ptsize)
545 vf_right (signed_quad (start, end), ptsize);
549 static void vf_w0(void)
555 static void vf_w (SIGNED_QUAD w, spt_t ptsize)
557 dvi_w ((SIGNED_QUAD) (sqxfw(ptsize, w)));
561 static void vf_w1(unsigned char **start, unsigned char *end, spt_t ptsize)
563 vf_w (signed_byte(start, end), ptsize);
567 static void vf_w2(unsigned char **start, unsigned char *end, spt_t ptsize)
569 vf_w (signed_pair(start, end), ptsize);
573 static void vf_w3(unsigned char **start, unsigned char *end, spt_t ptsize)
575 vf_w (signed_triple(start, end), ptsize);
579 static void vf_w4(unsigned char **start, unsigned char *end, spt_t ptsize)
581 vf_w (signed_quad(start, end), ptsize);
585 static void vf_x0(void)
591 static void vf_x (SIGNED_QUAD x, spt_t ptsize)
593 dvi_x ((SIGNED_QUAD) (sqxfw(ptsize, x)));
597 static void vf_x1(unsigned char **start, unsigned char *end, spt_t ptsize)
599 vf_x (signed_byte(start, end), ptsize);
603 static void vf_x2(unsigned char **start, unsigned char *end, spt_t ptsize)
605 vf_x (signed_pair(start, end), ptsize);
609 static void vf_x3(unsigned char **start, unsigned char *end, spt_t ptsize)
611 vf_x (signed_triple(start, end), ptsize);
615 static void vf_x4(unsigned char **start, unsigned char *end, spt_t ptsize)
617 vf_x (signed_quad(start, end), ptsize);
621 static void vf_down (SIGNED_QUAD y, spt_t ptsize)
623 dvi_down ((SIGNED_QUAD) (sqxfw(ptsize, y)));
627 static void vf_down1(unsigned char **start, unsigned char *end, spt_t ptsize)
629 vf_down (signed_byte(start, end), ptsize);
633 static void vf_down2(unsigned char **start, unsigned char *end, spt_t ptsize)
635 vf_down (signed_pair(start, end), ptsize);
639 static void vf_down3(unsigned char **start, unsigned char *end, spt_t ptsize)
641 vf_down (signed_triple(start, end), ptsize);
645 static void vf_down4(unsigned char **start, unsigned char *end, spt_t ptsize)
647 vf_down (signed_quad(start, end), ptsize);
651 static void vf_y0(void)
657 static void vf_y (SIGNED_QUAD y, spt_t ptsize)
659 dvi_y ((SIGNED_QUAD) (sqxfw(ptsize, y)));
664 static void vf_y1(unsigned char **start, unsigned char *end, spt_t ptsize)
666 vf_y (signed_byte(start, end), ptsize);
670 static void vf_y2(unsigned char **start, unsigned char *end, spt_t ptsize)
672 vf_y (signed_pair(start, end), ptsize);
676 static void vf_y3(unsigned char **start, unsigned char *end, spt_t ptsize)
678 vf_y (signed_triple(start, end), ptsize);
682 static void vf_y4(unsigned char **start, unsigned char *end, spt_t ptsize)
684 vf_y (signed_quad(start, end), ptsize);
688 static void vf_z0(void)
694 static void vf_z (SIGNED_QUAD z, spt_t ptsize)
696 dvi_z ((SIGNED_QUAD) (sqxfw(ptsize, z)));
700 static void vf_z1(unsigned char **start, unsigned char *end, spt_t ptsize)
702 vf_z (signed_byte(start, end), ptsize);
706 static void vf_z2(unsigned char **start, unsigned char *end, spt_t ptsize)
708 vf_z (signed_pair(start, end), ptsize);
712 static void vf_z3(unsigned char **start, unsigned char *end, spt_t ptsize)
714 vf_z (signed_triple(start, end), ptsize);
718 static void vf_z4(unsigned char **start, unsigned char *end, spt_t ptsize)
720 vf_z (signed_quad(start, end), ptsize);
724 static void vf_fnt (SIGNED_QUAD font_id, unsigned long vf_font)
727 for (i=0; i<vf_fonts[vf_font].num_dev_fonts; i++) {
728 if (font_id == ((vf_fonts[vf_font].dev_fonts)[i]).font_id) {
732 if (i < vf_fonts[vf_font].num_dev_fonts) { /* Font was found */
733 dvi_set_font ((vf_fonts[vf_font].dev_fonts[i]).dev_id);
735 fprintf (stderr, "Font_id: %ld not found in VF\n", font_id);
740 static void vf_fnt1(unsigned char **start, unsigned char *end,
741 unsigned long vf_font)
743 vf_fnt (unsigned_byte(start, end), vf_font);
747 static void vf_fnt2(unsigned char **start, unsigned char *end,
748 unsigned long vf_font)
750 vf_fnt (unsigned_pair(start, end), vf_font);
754 static void vf_fnt3(unsigned char **start, unsigned char *end,
755 unsigned long vf_font)
757 vf_fnt (unsigned_triple(start, end), vf_font);
761 static void vf_fnt4(unsigned char **start, unsigned char *end,
762 unsigned long vf_font)
764 vf_fnt (signed_quad(start, end), vf_font);
768 /* identical to do_xxx in dvi.c */
769 static void vf_xxx (SIGNED_QUAD len, unsigned char **start, unsigned char *end)
773 if (*start <= end - len) {
774 buffer = NEW(len+1, Ubyte);
775 memcpy(buffer, *start, len);
780 while (p < buffer+len && *p == ' ') p++;
782 * Warning message from virtual font.
784 if (!memcmp((char *)p, "Warning:", 8)) {
788 dvi_do_special(buffer, len);
793 ERROR ("Premature end of DVI byte stream in VF font.");
800 static void vf_xxx1(unsigned char **start, unsigned char *end)
802 vf_xxx (unsigned_byte(start, end), start, end);
806 static void vf_xxx2(unsigned char **start, unsigned char *end)
808 vf_xxx (unsigned_pair(start, end), start, end);
812 static void vf_xxx3(unsigned char **start, unsigned char *end)
814 vf_xxx (unsigned_triple(start, end), start, end);
818 static void vf_xxx4(unsigned char **start, unsigned char *end)
820 vf_xxx (unsigned_quad(start, end), start, end);
824 static void vf_dir(unsigned char **start, unsigned char *end)
826 dvi_dir (unsigned_byte(start, end));
830 void vf_set_char(SIGNED_QUAD ch, int vf_font)
832 unsigned char opcode;
833 unsigned char *start, *end;
835 int default_font = -1;
836 if (vf_font < num_vf_fonts) {
837 /* Initialize to the first font or -1 if undefined */
838 ptsize = vf_fonts[vf_font].ptsize;
839 if (vf_fonts[vf_font].num_dev_fonts > 0)
840 default_font = ((vf_fonts[vf_font].dev_fonts)[0]).dev_id;
841 dvi_vf_init (default_font);
842 if (ch >= vf_fonts[vf_font].num_chars ||
843 !(start = (vf_fonts[vf_font].ch_pkt)[ch])) {
844 fprintf (stderr, "\nchar=0x%lx(%ld)\n", ch, ch);
845 fprintf (stderr, "Tried to set a nonexistent character in a virtual font");
848 end = start + (vf_fonts[vf_font].pkt_len)[ch];
850 while (start && start < end) {
853 fprintf (stderr, "VF opcode: %d", opcode);
854 if (isprint (opcode)) fprintf (stderr, " (\'%c\')\n", opcode);
855 else fprintf (stderr, "\n");
860 vf_set1(&start, end);
863 vf_set2(&start, end);
866 vf_set3(&start, end);
869 ERROR ("Multibyte (>24 bits) character in VF packet.\nI can't handle this!");
872 vf_setrule(&start, end, ptsize);
875 vf_put1(&start, end);
878 vf_put2(&start, end);
881 vf_put3(&start, end);
884 ERROR ("Multibyte (>24 bits) character in VF packet.\nI can't handle this!");
887 vf_putrule(&start, end, ptsize);
898 vf_right1(&start, end, ptsize);
901 vf_right2(&start, end, ptsize);
904 vf_right3(&start, end, ptsize);
907 vf_right4(&start, end, ptsize);
913 vf_w1(&start, end, ptsize);
916 vf_w2(&start, end, ptsize);
919 vf_w3(&start, end, ptsize);
922 vf_w4(&start, end, ptsize);
928 vf_x1(&start, end, ptsize);
931 vf_x2(&start, end, ptsize);
934 vf_x3(&start, end, ptsize);
937 vf_x4(&start, end, ptsize);
940 vf_down1(&start, end, ptsize);
943 vf_down2(&start, end, ptsize);
946 vf_down3(&start, end, ptsize);
949 vf_down4(&start, end, ptsize);
955 vf_y1(&start, end, ptsize);
958 vf_y2(&start, end, ptsize);
961 vf_y3(&start, end, ptsize);
964 vf_y4(&start, end, ptsize);
970 vf_z1(&start, end, ptsize);
973 vf_z2(&start, end, ptsize);
976 vf_z3(&start, end, ptsize);
979 vf_z4(&start, end, ptsize);
982 vf_fnt1(&start, end, vf_font);
985 vf_fnt2(&start, end, vf_font);
988 vf_fnt3(&start, end, vf_font);
991 vf_fnt4(&start, end, vf_font);
994 vf_xxx1(&start, end);
997 vf_xxx2(&start, end);
1000 vf_xxx3(&start, end);
1003 vf_xxx4(&start, end);
1006 vf_dir(&start, end);
1009 if (opcode <= SET_CHAR_127) {
1011 } else if (opcode >= FNT_NUM_0 && opcode <= FNT_NUM_63) {
1012 vf_fnt (opcode - FNT_NUM_0, vf_font);
1014 fprintf (stderr, "Unexpected opcode: %d\n", opcode);
1015 ERROR ("Unexpected opcode in vf file\n");
1021 fprintf (stderr, "vf_set_char: font: %d", vf_font);
1022 ERROR ("Font not loaded\n");
1028 void vf_close_all_fonts(void)
1032 struct font_def *one_font;
1033 for (i=0; i<num_vf_fonts; i++) {
1034 /* Release the packet for each character */
1035 if (vf_fonts[i].ch_pkt) {
1036 for (j=0; j<vf_fonts[i].num_chars; j++) {
1037 if ((vf_fonts[i].ch_pkt)[j] != NULL)
1038 RELEASE ((vf_fonts[i].ch_pkt)[j]);
1040 RELEASE (vf_fonts[i].ch_pkt);
1042 if (vf_fonts[i].pkt_len)
1043 RELEASE (vf_fonts[i].pkt_len);
1044 if (vf_fonts[i].tex_name)
1045 RELEASE (vf_fonts[i].tex_name);
1046 /* Release each font record */
1047 for (j=0; j<vf_fonts[i].num_dev_fonts; j++) {
1048 one_font = &(vf_fonts[i].dev_fonts)[j];
1049 RELEASE (one_font -> directory);
1050 RELEASE (one_font -> name);
1052 if (vf_fonts[i].dev_fonts != NULL)
1053 RELEASE (vf_fonts[i].dev_fonts);
1055 if (vf_fonts != NULL)