7 char dev_dir
[PATHLEN
]; /* device directory */
8 int dev_res
; /* device resolution */
9 int dev_uwid
; /* device unitwidth */
10 int dev_hor
; /* minimum horizontal movement */
11 int dev_ver
; /* minimum vertical movement */
14 static char fn_name
[NFONTS
][FNLEN
]; /* font names */
15 static struct font
*fn_font
[NFONTS
]; /* font structs */
16 static int fn_n
; /* number of mounted fonts */
18 static void skipline(FILE* filp
)
23 } while (c
!= '\n' && c
!= EOF
);
26 static void dev_prologue(void)
29 out("x res %d %d %d\n", dev_res
, dev_hor
, dev_ver
);
33 int dev_mnt(int pos
, char *id
, char *name
)
37 sprintf(path
, "%s/%s", dev_dir
, name
);
42 font_close(fn_font
[pos
]);
43 if (fn_name
[pos
] != name
) /* ignore if fn_name[pos] is passed */
44 strcpy(fn_name
[pos
], id
);
46 out("x font %d %s\n", pos
, name
);
50 int dev_open(char *dir
)
57 sprintf(path
, "%s/DESC", dir
);
58 desc
= fopen(path
, "r");
59 while (fscanf(desc
, "%s", tok
) == 1) {
64 if (!strcmp("fonts", tok
)) {
65 fscanf(desc
, "%d", &fn_n
);
66 for (i
= 0; i
< fn_n
; i
++)
67 fscanf(desc
, "%s", fn_name
[i
+ 1]);
71 if (!strcmp("sizes", tok
)) {
72 while (fscanf(desc
, "%s", tok
) == 1)
73 if (!strcmp("0", tok
))
77 if (!strcmp("res", tok
)) {
78 fscanf(desc
, "%d", &dev_res
);
81 if (!strcmp("unitwidth", tok
)) {
82 fscanf(desc
, "%d", &dev_uwid
);
85 if (!strcmp("hor", tok
)) {
86 fscanf(desc
, "%d", &dev_hor
);
89 if (!strcmp("ver", tok
)) {
90 fscanf(desc
, "%d", &dev_ver
);
93 if (!strcmp("charset", tok
)) {
99 for (i
= 0; i
< fn_n
; i
++)
101 dev_mnt(i
, fn_name
[i
], fn_name
[i
]);
105 static void dev_epilogue(void)
115 for (i
= 0; i
< fn_n
; i
++) {
117 font_close(fn_font
[i
]);
122 /* glyph handling functions */
124 struct glyph
*dev_glyph(char *c
, int fn
)
128 if ((c
[0] == c_ec
|| c
[0] == c_ni
) && c
[1] == c_ec
)
130 if (c
[0] == c_ec
&& c
[1] == '(')
132 g
= font_find(fn_font
[fn
], c
);
135 for (i
= 0; i
< fn_n
; i
++)
136 if (fn_font
[i
] && fn_font
[i
]->special
)
137 if ((g
= font_find(fn_font
[i
], c
)))
142 struct glyph
*dev_glyph_byid(char *id
, int fn
)
144 return font_glyph(fn_font
[fn
], id
);
147 struct glyph
*dev_ligature(char **s
, int n
)
152 int dev_kernpair(char *c1
, char *c2
)
157 int dev_spacewid(void)
159 return fn_font
[n_f
]->spacewid
;
162 int dev_font(char *id
)
165 if (isdigit(id
[0])) {
167 if (num
< 0 || num
>= fn_n
|| !fn_font
[num
]) {
168 errmsg("bad font position\n");
173 for (i
= 0; i
< fn_n
; i
++)
174 if (!strcmp(fn_name
[i
], id
))
176 return dev_mnt(0, id
, id
);
179 int charwid(int wid
, int sz
)
181 /* the original troff rounds the widths up */
182 return (wid
* sz
+ dev_uwid
/ 2) / dev_uwid
;