blob: 9a50657e87359e55e197a979544989859d569951 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/*
* Copyright (c) 1987, 1989 University of Maryland
* Department of Computer Science. All rights reserved.
* Permission to copy for any purpose is hereby granted
* so long as this copyright notice remains intact.
*/
/*
* TFM file information.
*/
/*
* TFM files start with a series of unsigned 16 bit integers. We
* read this into the structure `tfm_header'. These are type i32
* so that they may be used as integer quantities without concern
* as to sign extension.
*/
struct tfmheader {
i32 th_lf; /* length of the file (16 bit words) */
i32 th_lh; /* length of the header data (words) */
i32 th_bc; /* beginning character */
i32 th_ec; /* ending character (inclusive) */
i32 th_nw; /* number of words in width table */
i32 th_nh; /* number of words in height table */
i32 th_nd; /* number of words in depth table */
i32 th_ni; /* words in italic correction table */
i32 th_nl; /* words in ligature/kern table */
i32 th_nk; /* words in kern table */
i32 th_ne; /* words in extensible character table */
i32 th_np; /* number of font parameter words */
};
/*
* The remainder of the TFM file comprises the following information,
* all of which are 32 bit quantities:
*
* header: array [0..lh-1] of stuff
* char_info: array [bc..ec] of char_info_word
* width: array [0..nw-1] of fix_word
* height: array [0..nh-1] of fix_word
* depth: array [0..nd-1] of fix_word
* italic: array [0..ni-1] of fix_word
* lig_kern: array [0..nl-1] of lig_kern_command
* kern: array [0..ne-1] of extensible_recipie
* param: array [0..np-1] of fix_word
*/
/*
* A char_info_word is built of four unsigned eight-bit quantities. The first
* is an index into the width table (this saves 24 bits for every
* character that has the same width as another character). The
* second is a composite height and depth index. The third is a
* composite italic index and tag, and the fourth is a remainder.
*
* XXX needs explaining
*/
struct char_info_word {
char ci_width; /* width index */
char ci_h_d; /* height and depth index */
char ci_i_t; /* italic index and tag */
char ci_remainder; /* ??? */
};
/*
* These macros split up h_and_d and i_and_t values.
*/
#define T_CI_H(ci) (((ci)->ci_h_d >> 4) & 0xf)
#define T_CI_D(ci) ((ci)->ci_h_d & 0xf)
#define T_CI_I(ci) (((ci)->ci_i_t >> 2) & 0x3f)
#define T_CI_T(ci) ((ci)->ci_i_t & 3)
/*
* This structure contains everything one might need to know about
* a TFM file at run-time.
*
* XXX incomplete, or wrong, as yet
*/
struct tfmdata {
struct tfmheader t_hdr; /* full header */
struct char_info_word *t_ci; /* char info */
i32 *t_width; /* widths table */
i32 *t_height; /* heights */
i32 *t_depth; /* depths */
};
|