Graphviz 12.0.1~dev.20240716.0800
Loading...
Searching...
No Matches
textspan_lut.c
Go to the documentation of this file.
1
3#include <assert.h>
4#include <cgraph/agxbuf.h>
5#include <cgraph/gv_ctype.h>
6#include <common/render.h>
8#include <common/types.h>
9#include <common/utils.h>
10#include <ctype.h>
11#include <math.h>
12#include <stddef.h>
13#include <stdio.h>
14#include <string.h>
15
16// Currently we just store the width of every ASCII character, which seems to
17// produce good enough results. We could also store kerning metrics and line
18// heights for each font if we want to be more thorough.
20 // A case-insensitive NULL-terminated list of font family names which these
21 // metrics correspond to. If multiple font families are listed, they should be
22 // metrically equivalent.
23 const char **font_name;
24 // Widths are stored in (units_per_em * 1) pt. (that is how TrueType works
25 // internally). A value of -1 indicates that the width for that character is
26 // unknown.
28 short widths_regular[128];
29 short widths_bold[128];
30 short widths_italic[128];
32};
33
34static const struct FontFamilyMetrics all_font_metrics[] = {
35 // Times_New_Roman.ttf (+ variants) from ttf-mscorefonts-installer.
36 {
37 (const char *[]){"times", "timesroman", "timesnewroman", "freeserif",
38 "liberationserif", "nimbusroman", "texgyretermes",
39 "tinos", "thorndale", NULL},
40 2048,
41 {
42 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
43 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
44 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512,
45 682, 836, 1024, 1024, 1706, 1593, 369, 682, 682, 1024, 1155,
46 512, 682, 512, 569, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
47 1024, 1024, 1024, 569, 569, 1155, 1155, 1155, 909, 1886, 1479,
48 1366, 1366, 1479, 1251, 1139, 1479, 1479, 682, 797, 1479, 1251,
49 1821, 1479, 1479, 1139, 1479, 1366, 1139, 1251, 1479, 1479, 1933,
50 1479, 1479, 1251, 682, 569, 682, 961, 1024, 682, 909, 1024,
51 909, 1024, 909, 682, 1024, 1024, 569, 569, 1024, 569, 1593,
52 1024, 1024, 1024, 1024, 682, 797, 569, 1024, 1024, 1479, 1024,
53 1024, 909, 983, 410, 983, 1108, -1,
54 },
55 {
56 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
57 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
58 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512,
59 682, 1137, 1024, 1024, 2048, 1706, 569, 682, 682, 1024, 1167,
60 512, 682, 512, 569, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
61 1024, 1024, 1024, 682, 682, 1167, 1167, 1167, 1024, 1905, 1479,
62 1366, 1479, 1479, 1366, 1251, 1593, 1593, 797, 1024, 1593, 1366,
63 1933, 1479, 1593, 1251, 1593, 1479, 1139, 1366, 1479, 1479, 2048,
64 1479, 1479, 1366, 682, 569, 682, 1190, 1024, 682, 1024, 1139,
65 909, 1139, 909, 682, 1024, 1139, 569, 682, 1139, 569, 1706,
66 1139, 1024, 1139, 1139, 909, 797, 682, 1139, 1024, 1479, 1024,
67 1024, 909, 807, 451, 807, 1065, -1,
68 },
69 {
70 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
71 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
72 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512,
73 682, 860, 1024, 1024, 1706, 1593, 438, 682, 682, 1024, 1382,
74 512, 682, 512, 569, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
75 1024, 1024, 1024, 682, 682, 1382, 1382, 1382, 1024, 1884, 1251,
76 1251, 1366, 1479, 1251, 1251, 1479, 1479, 682, 909, 1366, 1139,
77 1706, 1366, 1479, 1251, 1479, 1251, 1024, 1139, 1479, 1251, 1706,
78 1251, 1139, 1139, 797, 569, 797, 864, 1024, 682, 1024, 1024,
79 909, 1024, 909, 569, 1024, 1024, 569, 569, 909, 569, 1479,
80 1024, 1024, 1024, 1024, 797, 797, 569, 1024, 909, 1366, 909,
81 909, 797, 819, 563, 819, 1108, -1,
82 },
83 {
84 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
85 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
86 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512,
87 797, 1137, 1024, 1024, 1706, 1593, 569, 682, 682, 1024, 1167,
88 512, 682, 512, 569, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
89 1024, 1024, 1024, 682, 682, 1167, 1167, 1167, 1024, 1704, 1366,
90 1366, 1366, 1479, 1366, 1366, 1479, 1593, 797, 1024, 1366, 1251,
91 1821, 1479, 1479, 1251, 1479, 1366, 1139, 1251, 1479, 1366, 1821,
92 1366, 1251, 1251, 682, 569, 682, 1167, 1024, 682, 1024, 1024,
93 909, 1024, 909, 682, 1024, 1139, 569, 569, 1024, 569, 1593,
94 1139, 1024, 1024, 1024, 797, 797, 569, 1139, 909, 1366, 1024,
95 909, 797, 713, 451, 713, 1167, -1,
96 },
97 },
98 // Arial.ttf (+ variants) from ttf-mscorefonts-installer.
99 {
100 (const char *[]){"helvetica", "arial", "arialmt", "freesans",
101 "liberationsans", "arimo", "albany", "nimbussans",
102 "nimbussansa", "texgyreheros", "albany", "arimo",
103 NULL},
104 2048,
105 {
106 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
107 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
108 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 569,
109 569, 727, 1139, 1139, 1821, 1366, 391, 682, 682, 797, 1196,
110 569, 682, 569, 569, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
111 1139, 1139, 1139, 569, 569, 1196, 1196, 1196, 1139, 2079, 1366,
112 1366, 1479, 1479, 1366, 1251, 1593, 1479, 569, 1024, 1366, 1139,
113 1706, 1479, 1593, 1366, 1593, 1479, 1366, 1251, 1479, 1366, 1933,
114 1366, 1366, 1251, 569, 569, 569, 961, 1139, 682, 1139, 1139,
115 1024, 1139, 1139, 569, 1139, 1139, 455, 455, 1024, 455, 1706,
116 1139, 1139, 1139, 1139, 682, 1024, 569, 1139, 1024, 1479, 1024,
117 1024, 1024, 684, 532, 684, 1196, -1,
118 },
119 {
120 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
121 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
122 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 569,
123 682, 971, 1139, 1139, 1821, 1479, 487, 682, 682, 797, 1196,
124 569, 682, 569, 569, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
125 1139, 1139, 1139, 682, 682, 1196, 1196, 1196, 1251, 1997, 1479,
126 1479, 1479, 1479, 1366, 1251, 1593, 1479, 569, 1139, 1479, 1251,
127 1706, 1479, 1593, 1366, 1593, 1479, 1366, 1251, 1479, 1366, 1933,
128 1366, 1366, 1251, 682, 569, 682, 1196, 1139, 682, 1139, 1251,
129 1139, 1251, 1139, 682, 1251, 1251, 569, 569, 1139, 569, 1821,
130 1251, 1251, 1251, 1251, 797, 1139, 682, 1251, 1139, 1593, 1139,
131 1139, 1024, 797, 573, 797, 1196, -1,
132 },
133 {
134 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
135 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
136 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 569,
137 569, 727, 1139, 1139, 1821, 1366, 391, 682, 682, 797, 1196,
138 569, 682, 569, 569, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
139 1139, 1139, 1139, 569, 569, 1196, 1196, 1196, 1139, 2079, 1366,
140 1366, 1479, 1479, 1366, 1251, 1593, 1479, 569, 1024, 1366, 1139,
141 1706, 1479, 1593, 1366, 1593, 1479, 1366, 1251, 1479, 1366, 1933,
142 1366, 1366, 1251, 569, 569, 569, 961, 1139, 682, 1139, 1139,
143 1024, 1139, 1139, 569, 1139, 1139, 455, 455, 1024, 455, 1706,
144 1139, 1139, 1139, 1139, 682, 1024, 569, 1139, 1024, 1479, 1024,
145 1024, 1024, 684, 532, 684, 1196, -1,
146 },
147 {
148 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
149 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
150 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 569,
151 682, 971, 1139, 1139, 1821, 1479, 487, 682, 682, 797, 1196,
152 569, 682, 569, 569, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
153 1139, 1139, 1139, 682, 682, 1196, 1196, 1196, 1251, 1997, 1479,
154 1479, 1479, 1479, 1366, 1251, 1593, 1479, 569, 1139, 1479, 1251,
155 1706, 1479, 1593, 1366, 1593, 1479, 1366, 1251, 1479, 1366, 1933,
156 1366, 1366, 1251, 682, 569, 682, 1196, 1139, 682, 1139, 1251,
157 1139, 1251, 1139, 682, 1251, 1251, 569, 569, 1139, 569, 1821,
158 1251, 1251, 1251, 1251, 797, 1139, 682, 1251, 1139, 1593, 1139,
159 1139, 1024, 797, 573, 797, 1196, -1,
160 },
161 },
162 // Courier_New.ttf (+ variants) from ttf-mscorefonts-installer.
163 {
164 (const char *[]){"cour", "courier", "couriernew", "nimbusmono",
165 "texgyrecursor", "freemono", "liberationmono",
166 "cousine", "cumberland", NULL},
167 2048,
168 {
169 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
170 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
171 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1229,
172 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
173 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
174 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
175 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
176 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
177 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
178 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
179 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
180 1229, 1229, 1229, 1229, 1229, 1229, -1,
181 },
182 {
183 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
184 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
185 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1229,
186 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
187 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
188 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
189 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
190 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
191 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
192 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
193 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
194 1229, 1229, 1229, 1229, 1229, 1229, -1,
195 },
196 {
197 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
198 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
199 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1229,
200 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
201 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
202 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
203 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
204 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
205 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
206 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
207 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
208 1229, 1229, 1229, 1229, 1229, 1229, -1,
209 },
210 {
211 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
212 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
213 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1229,
214 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
215 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
216 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
217 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
218 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
219 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
220 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
221 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229,
222 1229, 1229, 1229, 1229, 1229, 1229, -1,
223 },
224 },
225 // https://fonts.google.com/specimen/Nunito
226 {
227 (const char *[]){"Nunito", NULL},
228 1000,
229 {
230 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
231 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
232 -1, -1, -1, -1, -1, -1, 258, 228, 392, 600, 600, 930, 693,
233 221, 317, 317, 450, 600, 228, 424, 228, 283, 600, 600, 600, 600,
234 600, 600, 600, 600, 600, 600, 228, 228, 600, 600, 600, 443, 946,
235 729, 676, 673, 742, 583, 548, 726, 761, 257, 324, 625, 543, 855,
236 740, 767, 633, 767, 669, 615, 602, 728, 689, 1101, 650, 596, 589,
237 315, 283, 315, 600, 500, 500, 530, 583, 463, 583, 532, 333, 586,
238 568, 232, 236, 500, 296, 856, 568, 556, 583, 583, 358, 481, 350,
239 561, 515, 841, 525, 514, 463, 352, 265, 352, 600, -1,
240 },
241 {
242 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
243 271, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
244 -1, -1, -1, -1, -1, -1, 271, 248, 448, 600, 600, 945, 726,
245 243, 358, 358, 453, 600, 248, 434, 248, 313, 600, 600, 600, 600,
246 600, 600, 600, 600, 600, 600, 248, 248, 600, 600, 600, 459, 950,
247 744, 688, 680, 762, 597, 562, 736, 773, 282, 354, 665, 562, 868,
248 748, 785, 652, 785, 686, 631, 621, 738, 713, 1113, 672, 618, 605,
249 354, 313, 354, 600, 500, 500, 547, 600, 472, 600, 542, 364, 604,
250 585, 255, 259, 536, 319, 877, 585, 576, 600, 600, 392, 488, 384,
251 579, 527, 853, 546, 526, 474, 391, 288, 391, 600, -1,
252 },
253 {
254 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
255 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
256 -1, -1, -1, -1, -1, -1, 258, 228, 392, 600, 600, 930, 693,
257 221, 317, 317, 450, 600, 228, 424, 228, 283, 600, 600, 600, 600,
258 600, 600, 600, 600, 600, 600, 228, 228, 600, 600, 600, 443, 946,
259 729, 676, 673, 742, 583, 548, 726, 761, 257, 324, 625, 543, 856,
260 739, 767, 633, 767, 669, 615, 602, 728, 688, 1101, 650, 596, 589,
261 315, 283, 315, 600, 500, 500, 530, 583, 463, 583, 532, 333, 586,
262 568, 232, 236, 500, 296, 856, 568, 556, 583, 583, 358, 481, 350,
263 561, 515, 841, 525, 514, 463, 352, 265, 352, 600, -1,
264 },
265 {
266 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
267 271, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
268 -1, -1, -1, -1, -1, -1, 271, 248, 448, 600, 600, 945, 726,
269 243, 358, 358, 453, 600, 248, 434, 248, 313, 600, 600, 600, 600,
270 600, 600, 600, 600, 600, 600, 248, 248, 600, 600, 600, 459, 950,
271 744, 688, 680, 762, 597, 562, 736, 773, 282, 354, 664, 562, 869,
272 747, 785, 652, 785, 686, 631, 621, 738, 713, 1113, 672, 618, 605,
273 354, 313, 354, 600, 500, 500, 547, 600, 472, 600, 542, 364, 604,
274 585, 255, 259, 536, 319, 877, 585, 576, 600, 600, 392, 488, 384,
275 579, 527, 853, 546, 526, 474, 391, 288, 391, 600, -1,
276 },
277 },
278 // Based on DejaVuSans, DejaVuSans-Bold, DejaVuSans-Oblique and
279 // DejaVuSans-BoldOblique (as opposed to italic)
280 {
281 (const char *[]){"dejavusans", NULL},
282 2048,
283 {
284 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
285 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
286 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 651,
287 821, 942, 1716, 1303, 1946, 1597, 563, 799, 799, 1024, 1716,
288 651, 739, 651, 690, 1303, 1303, 1303, 1303, 1303, 1303, 1303,
289 1303, 1303, 1303, 690, 690, 1716, 1716, 1716, 1087, 2048, 1401,
290 1405, 1430, 1577, 1294, 1178, 1587, 1540, 604, 604, 1343, 1141,
291 1767, 1532, 1612, 1235, 1612, 1423, 1300, 1251, 1499, 1401, 2025,
292 1403, 1251, 1403, 799, 690, 799, 1716, 1024, 1024, 1255, 1300,
293 1126, 1300, 1260, 721, 1300, 1298, 569, 569, 1186, 569, 1995,
294 1298, 1253, 1300, 1300, 842, 1067, 803, 1298, 1212, 1675, 1212,
295 1212, 1075, 1303, 690, 1303, 1716, -1,
296 },
297 {
298 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
299 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
300 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 713,
301 934, 1067, 1716, 1425, 2052, 1786, 627, 936, 936, 1071, 1716,
302 778, 850, 778, 748, 1425, 1425, 1425, 1425, 1425, 1425, 1425,
303 1425, 1425, 1425, 819, 819, 1716, 1716, 1716, 1188, 2048, 1585,
304 1561, 1503, 1700, 1399, 1399, 1681, 1714, 762, 762, 1587, 1305,
305 2038, 1714, 1741, 1501, 1741, 1577, 1475, 1397, 1663, 1585, 2259,
306 1579, 1483, 1485, 936, 748, 936, 1716, 1024, 1024, 1382, 1466,
307 1214, 1466, 1389, 891, 1466, 1458, 702, 702, 1362, 702, 2134,
308 1458, 1407, 1466, 1466, 1010, 1219, 979, 1458, 1335, 1892, 1321,
309 1335, 1192, 1458, 748, 1458, 1716, -1,
310 },
311 {
312 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
313 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
314 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 651,
315 821, 942, 1716, 1303, 1946, 1597, 563, 799, 799, 1024, 1716,
316 651, 739, 651, 690, 1303, 1303, 1303, 1303, 1303, 1303, 1303,
317 1303, 1303, 1303, 690, 690, 1716, 1716, 1716, 1087, 2048, 1401,
318 1405, 1430, 1577, 1294, 1178, 1587, 1540, 604, 604, 1343, 1141,
319 1767, 1532, 1612, 1235, 1612, 1423, 1300, 1251, 1499, 1401, 2025,
320 1403, 1251, 1403, 799, 690, 799, 1716, 1024, 1024, 1255, 1300,
321 1126, 1300, 1260, 721, 1300, 1298, 569, 569, 1186, 569, 1995,
322 1298, 1253, 1300, 1300, 842, 1067, 803, 1298, 1212, 1675, 1212,
323 1212, 1075, 1303, 690, 1303, 1716, -1,
324 },
325 {
326 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
327 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
328 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 713,
329 934, 1067, 1425, 1425, 2052, 1786, 627, 936, 936, 1071, 1716,
330 778, 850, 778, 748, 1425, 1425, 1425, 1425, 1425, 1425, 1425,
331 1425, 1425, 1425, 819, 819, 1716, 1716, 1716, 1188, 2048, 1585,
332 1561, 1503, 1700, 1399, 1399, 1681, 1714, 762, 762, 1587, 1305,
333 2038, 1714, 1741, 1501, 1741, 1577, 1475, 1397, 1663, 1585, 2259,
334 1579, 1483, 1485, 936, 748, 936, 1716, 1024, 1024, 1382, 1466,
335 1214, 1466, 1389, 891, 1466, 1458, 702, 702, 1362, 702, 2134,
336 1458, 1407, 1466, 1466, 1010, 1219, 979, 1458, 1335, 1892, 1321,
337 1335, 1192, 1458, 748, 1458, 1716, -1,
338 },
339 },
340 {
341 (const char *[]){"consola", "consolas", NULL},
342 2048,
343 {
344 1126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
345 -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1,
346 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1126,
347 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
348 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
349 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
350 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
351 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
352 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
353 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
354 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
355 1126, 1126, 1126, 1126, 1126, 1126, -1,
356 },
357 {
358 1126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
359 -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1,
360 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1126,
361 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
362 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
363 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
364 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
365 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
366 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
367 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
368 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
369 1126, 1126, 1126, 1126, 1126, 1126, -1,
370 },
371 {
372 1126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
373 -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1,
374 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1126,
375 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
376 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
377 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
378 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
379 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
380 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
381 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
382 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
383 1126, 1126, 1126, 1126, 1126, 1126, -1,
384 },
385 {
386 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
387 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
388 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1126,
389 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
390 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
391 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
392 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
393 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
394 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
395 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
396 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
397 1126, 1126, 1126, 1126, 1126, 1126, -1,
398 },
399 },
400 {
401 (const char *[]){"Trebuchet MS", "Trebuchet", NULL},
402 2048,
403 {
404 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
405 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
406 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 617,
407 752, 665, 1074, 1074, 1229, 1446, 327, 752, 752, 752, 1074,
408 752, 752, 752, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074,
409 1074, 1074, 1074, 752, 752, 1074, 1074, 1074, 752, 1578, 1208,
410 1159, 1225, 1256, 1097, 1075, 1385, 1340, 570, 976, 1179, 1037,
411 1453, 1307, 1380, 1142, 1384, 1192, 985, 1189, 1328, 1203, 1745,
412 1140, 1168, 1127, 752, 728, 752, 1074, 1074, 1074, 1076, 1141,
413 1014, 1141, 1117, 757, 1028, 1119, 584, 751, 1033, 604, 1700,
414 1119, 1099, 1141, 1141, 796, 829, 812, 1119, 1003, 1524, 1026,
415 1010, 972, 752, 1074, 752, 1074, -1,
416 },
417 {
418 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
419 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
420 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 617,
421 752, 751, 1200, 1200, 1401, 1446, 470, 752, 752, 885, 1200,
422 752, 752, 752, 799, 1200, 1200, 1200, 1200, 1200, 1200, 1200,
423 1200, 1200, 1200, 752, 752, 1200, 1200, 1200, 897, 1578, 1297,
424 1219, 1253, 1316, 1165, 1195, 1375, 1400, 570, 1091, 1264, 1132,
425 1526, 1367, 1440, 1202, 1452, 1251, 1047, 1253, 1388, 1273, 1810,
426 1230, 1256, 1147, 823, 728, 823, 1200, 1200, 1200, 1091, 1191,
427 1048, 1189, 1177, 757, 1028, 1214, 611, 751, 1122, 604, 1760,
428 1209, 1159, 1193, 1196, 875, 882, 812, 1210, 1080, 1605, 1131,
429 1093, 1082, 888, 1200, 888, 1200, -1,
430 },
431 {
432 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
433 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
434 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 617,
435 752, 665, 1074, 985, 1229, 1446, 327, 752, 752, 752, 1074,
436 752, 752, 752, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074,
437 1074, 1074, 1074, 752, 752, 1074, 1074, 1074, 752, 1578, 1251,
438 1159, 1225, 1256, 1097, 1075, 1385, 1340, 570, 976, 1179, 1037,
439 1559, 1307, 1380, 1113, 1380, 1192, 985, 1189, 1328, 1203, 1745,
440 1140, 1168, 1127, 752, 728, 752, 1074, 1074, 1074, 1076, 1141,
441 942, 1141, 1100, 822, 1028, 1141, 628, 751, 1033, 656, 1700,
442 1119, 1099, 1141, 1141, 853, 829, 860, 1140, 1003, 1524, 1026,
443 1010, 972, 752, 1074, 752, 1074, -1,
444 },
445 {
446 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
447 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
448 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 617,
449 752, 800, 1200, 1200, 1500, 1446, 617, 752, 752, 885, 1200,
450 752, 752, 752, 813, 1200, 1200, 1200, 1200, 1200, 1200, 1200,
451 1200, 1200, 1200, 752, 752, 1200, 1200, 1200, 813, 1578, 1257,
452 1208, 1255, 1295, 1215, 1199, 1385, 1389, 570, 1021, 1331, 1082,
453 1610, 1352, 1438, 1195, 1576, 1277, 1027, 1403, 1355, 1399, 1897,
454 1345, 1400, 1252, 994, 978, 994, 1200, 1200, 1200, 1214, 1215,
455 1009, 1215, 1130, 840, 1096, 1151, 669, 794, 1105, 655, 1700,
456 1151, 1167, 1226, 1226, 915, 940, 897, 1141, 1131, 1584, 1179,
457 1155, 1091, 994, 1200, 994, 1200, -1,
458 },
459 },
460 {
461 (const char *[]){"Verdana", NULL},
462 2048,
463 {
464 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
465 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
466 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 720,
467 806, 940, 1676, 1302, 2204, 1488, 550, 930, 930, 1302, 1676,
468 745, 930, 745, 930, 1302, 1302, 1302, 1302, 1302, 1302, 1302,
469 1302, 1302, 1302, 930, 930, 1676, 1676, 1676, 1117, 2048, 1400,
470 1404, 1430, 1578, 1295, 1177, 1588, 1539, 862, 931, 1419, 1140,
471 1726, 1532, 1612, 1235, 1612, 1424, 1400, 1262, 1499, 1400, 2025,
472 1403, 1260, 1403, 930, 930, 930, 1676, 1302, 1302, 1230, 1276,
473 1067, 1276, 1220, 720, 1276, 1296, 562, 705, 1212, 562, 1992,
474 1296, 1243, 1276, 1276, 874, 1067, 807, 1296, 1212, 1676, 1212,
475 1212, 1076, 1300, 930, 1300, 1676, -1,
476 },
477 {
478 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
479 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
480 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 700,
481 824, 1203, 1776, 1456, 2605, 1766, 680, 1113, 1113, 1456, 1776,
482 740, 983, 740, 1412, 1456, 1456, 1456, 1456, 1456, 1456, 1456,
483 1456, 1456, 1456, 824, 824, 1776, 1776, 1776, 1263, 1974, 1590,
484 1560, 1482, 1700, 1399, 1332, 1661, 1715, 1118, 1137, 1579, 1305,
485 1941, 1734, 1741, 1501, 1741, 1602, 1455, 1396, 1663, 1564, 2311,
486 1564, 1509, 1417, 1113, 1412, 1113, 1776, 1456, 1456, 1368, 1432,
487 1205, 1432, 1360, 865, 1432, 1459, 700, 825, 1374, 700, 2167,
488 1459, 1406, 1432, 1432, 1018, 1215, 933, 1459, 1331, 2006, 1370,
489 1333, 1222, 1456, 1113, 1456, 1776, -1,
490 },
491 {
492 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
493 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
494 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 720,
495 806, 940, 1676, 1302, 2204, 1488, 550, 930, 930, 1302, 1676,
496 745, 930, 745, 930, 1302, 1302, 1302, 1302, 1302, 1302, 1302,
497 1302, 1302, 1302, 930, 930, 1676, 1676, 1676, 1117, 2048, 1398,
498 1404, 1430, 1568, 1295, 1177, 1588, 1539, 862, 931, 1419, 1140,
499 1726, 1532, 1612, 1235, 1612, 1424, 1400, 1262, 1499, 1398, 2028,
500 1403, 1260, 1403, 930, 930, 930, 1676, 1302, 1302, 1230, 1276,
501 1067, 1276, 1220, 720, 1273, 1296, 562, 705, 1202, 562, 1993,
502 1296, 1243, 1276, 1276, 874, 1067, 807, 1296, 1210, 1676, 1212,
503 1210, 1076, 1300, 930, 1300, 1676, -1,
504 },
505 {
506 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
507 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
508 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 700,
509 824, 1203, 1776, 1456, 2605, 1766, 680, 1113, 1113, 1456, 1776,
510 740, 983, 740, 1412, 1456, 1456, 1456, 1456, 1456, 1456, 1456,
511 1456, 1456, 1456, 824, 824, 1776, 1776, 1776, 1263, 1974, 1590,
512 1560, 1482, 1700, 1399, 1332, 1661, 1715, 1118, 1137, 1579, 1305,
513 1941, 1734, 1741, 1501, 1741, 1602, 1455, 1396, 1663, 1564, 2311,
514 1564, 1509, 1417, 1113, 1412, 1113, 1776, 1456, 1456, 1368, 1432,
515 1205, 1432, 1360, 865, 1432, 1459, 700, 825, 1374, 700, 2167,
516 1459, 1404, 1432, 1432, 1018, 1215, 933, 1459, 1329, 2006, 1370,
517 1333, 1222, 1456, 1113, 1456, 1776, -1,
518 },
519 },
520 {
521 (const char *[]){"OpenSans", NULL},
522 2048,
523 {
524 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
525 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
526 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 532,
527 547, 821, 1323, 1171, 1686, 1495, 453, 606, 606, 1130, 1171,
528 502, 659, 545, 752, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
529 1171, 1171, 1171, 545, 545, 1171, 1171, 1171, 879, 1841, 1296,
530 1327, 1292, 1493, 1139, 1057, 1491, 1511, 571, 547, 1257, 1063,
531 1849, 1544, 1595, 1233, 1595, 1266, 1124, 1133, 1491, 1219, 1896,
532 1182, 1147, 1169, 674, 752, 674, 1110, 918, 1182, 1139, 1255,
533 975, 1255, 1149, 694, 1122, 1257, 518, 518, 1075, 518, 1905,
534 1257, 1237, 1255, 1255, 836, 977, 723, 1257, 1026, 1593, 1073,
535 1032, 958, 776, 1128, 776, 1171, -1,
536 },
537 {
538 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
539 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
540 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 532,
541 586, 967, 1323, 1169, 1845, 1536, 545, 694, 694, 1116, 1169,
542 594, 659, 584, 846, 1169, 1169, 1169, 1169, 1169, 1169, 1169,
543 1169, 1169, 1169, 584, 594, 1169, 1169, 1169, 977, 1837, 1413,
544 1376, 1305, 1516, 1147, 1124, 1483, 1567, 678, 678, 1360, 1157,
545 1931, 1665, 1630, 1286, 1630, 1352, 1128, 1186, 1548, 1331, 1980,
546 1366, 1278, 1186, 678, 846, 678, 1090, 842, 1243, 1237, 1296,
547 1053, 1296, 1210, 793, 1157, 1346, 625, 625, 1270, 625, 2011,
548 1346, 1268, 1296, 1296, 930, 1018, 889, 1346, 1165, 1753, 1184,
549 1165, 999, 807, 1128, 807, 1169, -1,
550 },
551 {
552 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
553 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
554 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 532,
555 530, 791, 1323, 1128, 1624, 1372, 444, 584, 584, 1130, 1128,
556 492, 639, 518, 717, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
557 1128, 1128, 1128, 518, 518, 1128, 1128, 1128, 874, 1735, 1137,
558 1225, 1198, 1364, 1047, 967, 1386, 1389, 559, 547, 1141, 971,
559 1714, 1438, 1475, 1159, 1475, 1165, 1028, 1020, 1384, 1122, 1745,
560 1063, 1030, 1087, 586, 717, 586, 1059, 807, 1135, 1157, 1182,
561 922, 1182, 1010, 641, 1026, 1182, 520, 520, 999, 520, 1786,
562 1182, 1149, 1182, 1182, 811, 877, 664, 1182, 946, 1468, 979,
563 946, 909, 715, 1128, 715, 1128, -1,
564 },
565 {
566 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
567 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
568 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 532,
569 586, 928, 1323, 1128, 1753, 1450, 522, 694, 694, 1116, 1128,
570 569, 659, 584, 862, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
571 1128, 1128, 1128, 584, 584, 1128, 1128, 1128, 940, 1753, 1286,
572 1270, 1253, 1386, 1110, 1087, 1413, 1434, 659, 678, 1255, 1061,
573 1802, 1546, 1495, 1188, 1495, 1247, 1085, 1087, 1415, 1208, 1831,
574 1241, 1155, 1098, 678, 862, 678, 1081, 819, 1135, 1217, 1219,
575 989, 1217, 1141, 764, 1108, 1237, 608, 608, 1163, 608, 1853,
576 1237, 1198, 1219, 1217, 862, 969, 840, 1237, 1049, 1614, 1087,
577 1063, 932, 727, 1128, 727, 1128, -1,
578 },
579 },
580 {
581 (const char *[]){"Georgia", NULL},
582 2048,
583 {
584 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
585 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
586 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 494,
587 678, 843, 1317, 1249, 1674, 1455, 441, 768, 768, 967, 1317,
588 552, 766, 552, 960, 1257, 880, 1144, 1130, 1157, 1082, 1159,
589 1029, 1221, 1159, 640, 640, 1317, 1317, 1317, 980, 1902, 1374,
590 1339, 1315, 1534, 1338, 1227, 1485, 1669, 798, 1060, 1422, 1236,
591 1899, 1571, 1524, 1249, 1524, 1437, 1149, 1267, 1549, 1365, 1998,
592 1455, 1260, 1232, 768, 960, 768, 1317, 1317, 1024, 1032, 1147,
593 930, 1176, 990, 666, 1043, 1192, 600, 598, 1097, 586, 1804,
594 1210, 1104, 1170, 1146, 839, 885, 707, 1178, 1017, 1510, 1034,
595 1008, 909, 881, 768, 881, 1317, -1,
596 },
597 {
598 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
599 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
600 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 520,
601 771, 1044, 1440, 1312, 1801, 1637, 551, 915, 915, 987, 1440,
602 672, 776, 672, 966, 1436, 1003, 1283, 1279, 1330, 1227, 1327,
603 1135, 1385, 1327, 752, 752, 1440, 1440, 1440, 1123, 1980, 1553,
604 1551, 1465, 1708, 1477, 1375, 1653, 1870, 913, 1219, 1673, 1404,
605 2096, 1719, 1679, 1436, 1679, 1633, 1329, 1401, 1707, 1561, 2307,
606 1656, 1499, 1412, 915, 966, 915, 1440, 1440, 1024, 1220, 1322,
607 1088, 1358, 1171, 805, 1181, 1392, 724, 709, 1294, 705, 2080,
608 1413, 1302, 1347, 1328, 1065, 1050, 814, 1386, 1161, 1768, 1204,
609 1151, 1076, 1024, 794, 1024, 1440, -1,
610 },
611 {
612 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
613 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
614 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 494,
615 678, 843, 1317, 1249, 1674, 1455, 441, 768, 768, 967, 1317,
616 552, 766, 552, 960, 1257, 880, 1144, 1130, 1157, 1082, 1159,
617 1017, 1221, 1159, 786, 786, 1317, 1317, 1317, 980, 1902, 1374,
618 1339, 1315, 1534, 1338, 1227, 1485, 1669, 798, 1060, 1422, 1236,
619 1899, 1571, 1496, 1249, 1496, 1437, 1149, 1267, 1549, 1365, 1998,
620 1455, 1260, 1232, 768, 960, 768, 1317, 1317, 1024, 1173, 1134,
621 929, 1178, 966, 673, 1173, 1152, 609, 596, 1081, 584, 1801,
622 1208, 1100, 1184, 1137, 945, 883, 711, 1178, 1102, 1684, 1026,
623 1146, 909, 881, 768, 881, 1317, -1,
624 },
625 {
626 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
627 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
628 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 520,
629 771, 1044, 1440, 1312, 1801, 1637, 551, 915, 915, 987, 1440,
630 672, 776, 672, 966, 1436, 1003, 1283, 1279, 1330, 1227, 1327,
631 1160, 1385, 1327, 752, 752, 1440, 1440, 1440, 1123, 1980, 1553,
632 1555, 1465, 1708, 1477, 1375, 1653, 1870, 923, 1219, 1673, 1404,
633 2116, 1699, 1679, 1446, 1679, 1633, 1337, 1401, 1707, 1561, 2307,
634 1643, 1499, 1412, 915, 966, 915, 1440, 1440, 1024, 1352, 1329,
635 1097, 1357, 1141, 780, 1330, 1383, 749, 747, 1313, 726, 2052,
636 1413, 1302, 1357, 1331, 1093, 1059, 854, 1403, 1254, 1912, 1195,
637 1371, 1059, 1024, 794, 1024, 1440, -1,
638 },
639 },
640 {
641 (const char *[]){"Calibri", NULL},
642 2048,
643 {
644 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
645 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
646 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 463,
647 667, 821, 1020, 1038, 1464, 1397, 452, 621, 621, 1020, 1020,
648 511, 627, 517, 791, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
649 1038, 1038, 1038, 548, 548, 1020, 1020, 1020, 949, 1831, 1185,
650 1114, 1092, 1260, 1000, 941, 1292, 1276, 516, 653, 1064, 861,
651 1751, 1322, 1356, 1058, 1378, 1112, 941, 998, 1314, 1162, 1822,
652 1063, 998, 959, 628, 791, 628, 1020, 1020, 596, 981, 1076,
653 866, 1076, 1019, 625, 964, 1076, 470, 490, 931, 470, 1636,
654 1076, 1080, 1076, 1076, 714, 801, 686, 1076, 925, 1464, 887,
655 927, 809, 644, 943, 644, 1020, -1,
656 },
657 {
658 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
659 -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1,
660 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 463,
661 667, 898, 1020, 1038, 1493, 1443, 478, 638, 638, 1020, 1020,
662 528, 627, 547, 880, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
663 1038, 1038, 1038, 565, 565, 1020, 1020, 1020, 949, 1840, 1241,
664 1148, 1084, 1291, 999, 940, 1305, 1292, 546, 678, 1120, 866,
665 1790, 1349, 1385, 1090, 1405, 1153, 968, 1014, 1337, 1211, 1856,
666 1128, 1064, 979, 665, 880, 665, 1020, 1020, 615, 1011, 1099,
667 857, 1099, 1031, 648, 971, 1099, 503, 523, 983, 503, 1666,
668 1099, 1101, 1099, 1099, 728, 817, 710, 1099, 969, 1526, 941,
669 970, 814, 704, 973, 704, 1020, -1,
670 },
671 {
672 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
673 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
674 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 463,
675 667, 821, 1020, 1038, 1464, 1397, 452, 621, 621, 1020, 1020,
676 511, 627, 517, 794, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
677 1038, 1038, 1038, 548, 548, 1020, 1020, 1020, 949, 1831, 1185,
678 1114, 1070, 1260, 1000, 941, 1292, 1276, 516, 653, 1064, 861,
679 1751, 1320, 1340, 1058, 1360, 1112, 926, 998, 1314, 1162, 1823,
680 1063, 998, 959, 628, 787, 628, 1020, 1020, 596, 1053, 1053,
681 852, 1053, 978, 625, 1053, 1053, 470, 490, 931, 470, 1620,
682 1053, 1051, 1053, 1053, 702, 797, 686, 1053, 913, 1464, 887,
683 916, 809, 644, 943, 644, 1020, -1,
684 },
685 {
686 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
687 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
688 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 463,
689 667, 898, 1020, 1038, 1493, 1443, 478, 638, 638, 1020, 1020,
690 528, 627, 547, 889, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
691 1038, 1038, 1038, 565, 565, 1020, 1020, 1020, 949, 1840, 1241,
692 1148, 1062, 1291, 999, 940, 1305, 1292, 546, 678, 1120, 866,
693 1790, 1344, 1369, 1090, 1387, 1153, 953, 1014, 1337, 1211, 1857,
694 1128, 1064, 979, 665, 870, 665, 1020, 1020, 615, 1081, 1081,
695 843, 1081, 1006, 648, 1081, 1080, 503, 523, 983, 503, 1646,
696 1080, 1080, 1081, 1081, 721, 807, 710, 1080, 961, 1526, 941,
697 963, 814, 704, 973, 704, 1020, -1,
698 },
699 },
700};
701
702static const size_t all_font_metrics_len =
703 sizeof(all_font_metrics) / sizeof(all_font_metrics[0]);
704
711static bool font_name_equal_permissive(const char *a, const char *b) {
712 size_t b_length = strlen(b);
713 size_t a_length = strlen(a);
714 size_t a_pos = 0;
715 size_t b_pos = 0;
716 while (a_pos != a_length && b_pos != b_length) {
717 if (!gv_isalpha(a[a_pos])) {
718 ++a_pos;
719 continue;
720 }
721 if (!gv_isalpha(b[b_pos])) {
722 ++b_pos;
723 continue;
724 }
725 if (tolower(a[a_pos]) != tolower(b[b_pos])) {
726 return false;
727 }
728 ++a_pos;
729 ++b_pos;
730 }
731 while (a_pos != a_length) {
732 if (gv_isalpha(a[a_pos])) {
733 return false;
734 }
735 ++a_pos;
736 }
737 while (b_pos != b_length) {
738 if (gv_isalpha(b[b_pos])) {
739 return false;
740 }
741 ++b_pos;
742 }
743 return true;
744}
745
751static bool font_in_list_permissive(const char *value, const char **list) {
752 assert(value && strlen(value));
753 assert(list && list[0] != NULL);
754
755 for (size_t i = 0; list[i] != NULL; ++i) {
756 if (font_name_equal_permissive(value, list[i])) {
757 return true;
758 }
759 }
760
761 return false;
762}
763
764static const struct FontFamilyMetrics *
766 for (size_t i = 0; i < all_font_metrics_len; i++) {
768 return &all_font_metrics[i];
769 }
770 }
771 agxbuf warning = {0};
772 agxbprint(&warning,
773 "Warning: no hard-coded metrics for '%s'. Falling back to 'Times' "
774 "metrics\n",
775 font_name);
776 char *warning_text = agxbuse(&warning);
777 if (emit_once(warning_text)) {
778 agwarningf("%s", warning_text);
779 }
780 agxbfree(&warning);
781 return get_metrics_for_font_family("Times");
782}
783
784static const short *
786 bool bold, bool italic) {
787 if (bold && italic) {
788 return family_metrics->widths_bold_italic;
789 }
790 if (bold) {
791 return family_metrics->widths_bold;
792 }
793 if (italic) {
794 return family_metrics->widths_italic;
795 }
796 return family_metrics->widths_regular;
797}
798
800static unsigned short
801estimate_character_width_canonical(const short variant_metrics[128],
802 unsigned character) {
803 if (character >= 128) {
804 static bool warning_already_reported = false;
805 if (!warning_already_reported) { // stderr spam prevention
806 warning_already_reported = true;
808 "Warning: no value for width of non-ASCII character %u. Falling "
809 "back to width of space character\n",
810 character);
811 }
812 character = ' ';
813 }
814 short width = variant_metrics[character];
815 if (width == -1) {
816 static bool warning_already_reported = false;
817 if (!warning_already_reported) { // stderr spam prevention
818 warning_already_reported = true;
820 "Warning: no value for width of ASCII character %u. Falling back "
821 "to 0\n",
822 character);
823 }
824 width = 0;
825 }
826 assert(width >= 0);
827 return (unsigned short)width;
828}
829
830double estimate_text_width_1pt(const char *font_name, const char *text,
831 bool bold, bool italic) {
832 assert(font_name);
833 assert(text);
834
835 const struct FontFamilyMetrics *family_metrics =
837 const short *variant_metrics =
838 get_metrics_for_font_variant(family_metrics, bold, italic);
839 unsigned text_width_canonical = 0;
840 for (const char *c = text; *c != '\0'; c++) {
841 text_width_canonical +=
842 estimate_character_width_canonical(variant_metrics, (unsigned char)*c);
843 }
844 return (double)text_width_canonical / family_metrics->units_per_em;
845}
static void agxbfree(agxbuf *xb)
free any malloced resources
Definition agxbuf.h:77
static int agxbprint(agxbuf *xb, const char *fmt,...)
Printf-style output to an agxbuf.
Definition agxbuf.h:213
static char * agxbuse(agxbuf *xb)
Definition agxbuf.h:286
bool emit_once(char *str)
Definition emit.c:3449
node NULL
Definition grammar.y:149
void agwarningf(const char *fmt,...)
Definition agerror.c:173
replacements for ctype.h functions
static bool gv_isalpha(int c)
Definition gv_ctype.h:29
short widths_italic[128]
const char ** font_name
short widths_bold[128]
short widths_bold_italic[128]
short widths_regular[128]
static const struct FontFamilyMetrics * get_metrics_for_font_family(const char *font_name)
static unsigned short estimate_character_width_canonical(const short variant_metrics[128], unsigned character)
static const struct FontFamilyMetrics all_font_metrics[]
static const short * get_metrics_for_font_variant(const struct FontFamilyMetrics *family_metrics, bool bold, bool italic)
static bool font_in_list_permissive(const char *value, const char **list)
static bool font_name_equal_permissive(const char *a, const char *b)
double estimate_text_width_1pt(const char *font_name, const char *text, bool bold, bool italic)
static const size_t all_font_metrics_len
lookup table for textspan
graphs, nodes and edges info: Agraphinfo_t, Agnodeinfo_t and Agedgeinfo_t