4 * convert X font metrics into troff font metrics
14 #include "XFontName.h"
24 extern Bool
XParseFontName();
25 extern Bool
XFormatFontName();
27 #define charWidth(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].width)
28 #define charHeight(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].ascent)
29 #define charDepth(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].descent)
30 #define charLBearing(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].lbearing)
31 #define charRBearing(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].rbearing)
35 unsigned resolution
= 75;
36 unsigned point_size
= 10;
38 int charExists (fi
, c
)
44 if (c
< fi
->min_char_or_byte2
|| c
> fi
->max_char_or_byte2
)
46 p
= fi
->per_char
+ (c
- fi
->min_char_or_byte2
);
47 return (p
->lbearing
!= 0 || p
->rbearing
!= 0 || p
->width
!= 0
48 || p
->ascent
!= 0 || p
->descent
!= 0 || p
->attributes
!= 0);
51 /* Canonicalize the font name by replacing scalable parts by *s. */
54 CanonicalizeFontName (font_name
, canon_font_name
)
55 char *font_name
, *canon_font_name
;
57 unsigned int attributes
;
60 if (!XParseFontName(font_name
, &parsed
, &attributes
)) {
61 fprintf (stderr
, "not a standard name: %s\n", font_name
);
65 attributes
&= ~(FontNamePixelSize
|FontNameAverageWidth
67 |FontNameResolutionX
|FontNameResolutionY
);
68 XFormatFontName(&parsed
, attributes
, canon_font_name
);
73 FontNamesAmbiguous(font_name
, names
, count
)
78 char name1
[2048], name2
[2048];
84 for (i
= 0; i
< count
; i
++) {
85 if (!CanonicalizeFontName(names
[i
], i
== 0 ? name1
: name2
)) {
86 fprintf(stderr
, "bad font name: %s\n", names
[i
]);
89 if (i
> 0 && strcmp(name1
, name2
) != 0) {
90 fprintf(stderr
, "ambiguous font name: %s\n", font_name
);
91 fprintf(stderr
, " matches %s\n", names
[0]);
92 fprintf(stderr
, " and %s\n", names
[i
]);
101 MapFont (font_name
, troff_name
)
110 unsigned int attributes
;
113 DviCharNameMap
*char_map
;
117 char name_string
[2048];
119 if (!XParseFontName(font_name
, &parsed
, &attributes
)) {
120 fprintf (stderr
, "not a standard name: %s\n", font_name
);
124 attributes
&= ~(FontNamePixelSize
|FontNameAverageWidth
);
125 attributes
|= FontNameResolutionX
;
126 attributes
|= FontNameResolutionY
;
127 attributes
|= FontNamePointSize
;
128 parsed
.ResolutionX
= resolution
;
129 parsed
.ResolutionY
= resolution
;
130 parsed
.PointSize
= point_size
*10;
131 XFormatFontName(&parsed
, attributes
, name_string
);
133 names
= XListFonts (dpy
, name_string
, 100000, &count
);
135 fprintf (stderr
, "bad font name: %s\n", font_name
);
139 if (FontNamesAmbiguous(font_name
, names
, count
))
142 XParseFontName(names
[0], &parsed
, &attributes
);
143 sprintf (encoding
, "%s-%s", parsed
.CharSetRegistry
,
144 parsed
.CharSetEncoding
);
145 for (s
= encoding
; *s
; s
++)
148 char_map
= DviFindMap (encoding
);
150 fprintf (stderr
, "not a standard encoding: %s\n", encoding
);
154 fi
= XLoadQueryFont (dpy
, names
[0]);
156 fprintf (stderr
, "font does not exist: %s\n", names
[0]);
160 printf ("%s -> %s\n", names
[0], troff_name
);
162 { /* Avoid race while opening file */
164 (void) unlink (troff_name
);
165 fd
= open (troff_name
, O_WRONLY
| O_CREAT
| O_EXCL
, 0600);
166 out
= fdopen (fd
, "w");
173 fprintf (out
, "name %s\n", troff_name
);
174 if (!strcmp (char_map
->encoding
, "adobe-fontspecific"))
175 fprintf (out
, "special\n");
176 if (charExists (fi
, ' ')) {
177 int w
= charWidth (fi
, ' ');
179 fprintf (out
, "spacewidth %d\n", w
);
181 fprintf (out
, "charset\n");
182 for (c
= fi
->min_char_or_byte2
; c
<= fi
->max_char_or_byte2
; c
++) {
183 char *name
= DviCharName (char_map
,c
,0);
184 if (charExists (fi
, c
) && (groff_flag
|| name
)) {
186 wid
= charWidth (fi
, c
);
188 fprintf (out
, "%s\t%d",
193 param
[0] = charHeight (fi
, c
);
194 param
[1] = charDepth (fi
, c
);
195 param
[2] = 0 /* charRBearing (fi, c) - wid */;
196 param
[3] = 0 /* charLBearing (fi, c) */;
197 param
[4] = 0; /* XXX */
198 for (j
= 0; j
< 5; j
++)
201 for (j
= 4; j
>= 0; j
--)
204 for (k
= 0; k
<= j
; k
++)
205 fprintf (out
, ",%d", param
[k
]);
207 fprintf (out
, "\t0\t0%o\n", c
);
210 for (k
= 1; DviCharName(char_map
,c
,k
); k
++) {
211 fprintf (out
, "%s\t\"\n",
212 DviCharName (char_map
,c
,k
));
217 XUnloadFont (dpy
, fi
->fid
);
227 "usage: %s [-g] [-r resolution] [-s pointsize] FontMap\n",
233 /* For use by DviChar.c */
240 fprintf(stderr
, "Out of memory\n");
250 char troff_name
[1024];
251 char font_name
[1024];
260 while ((opt
= getopt(argc
, argv
, "gr:s:")) != EOF
) {
266 sscanf(optarg
, "%u", &resolution
);
269 sscanf(optarg
, "%u", &point_size
);
275 if (argc
- optind
!= 1)
278 dpy
= XOpenDisplay (0);
280 fprintf (stderr
, "Can't connect to the X server.\n");
281 fprintf (stderr
, "Make sure the DISPLAY environment variable is set correctly.\n");
286 map
= fopen (argv
[optind
], "r");
288 perror (argv
[optind
]);
292 while (fgets (line
, sizeof (line
), map
)) {
293 for (a
=line
,b
=troff_name
; *a
; a
++,b
++) {
295 if (c
== ' ' || c
== '\t')
299 while (*a
&& (*a
== ' ' || *a
== '\t'))
301 for (b
=font_name
; *a
; a
++,b
++)
302 if ((*b
= *a
) == '\n')
305 if (!MapFont (font_name
, troff_name
))
315 c-continued-statement-offset: 8
319 c-tab-always-indent: nil