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