1 /****************************************************************************
2 *
3 * gxfgen.c
4 *
5 * Generate feature registry data for gxv `feat' validator.
6 * This program is derived from gxfeatreg.c in gxlayout.
7 *
8 * Copyright (C) 2004-2023 by
9 * Masatake YAMATO and Redhat K.K.
10 *
11 * This file may only be used,
12 * modified, and distributed under the terms of the FreeType project
13 * license, LICENSE.TXT. By continuing to use, modify, or distribute
14 * this file you indicate that you have read the license and
15 * understand and accept it fully.
16 *
17 */
18
19 /****************************************************************************
20 *
21 * gxfeatreg.c
22 *
23 * Database of font features pre-defined by Apple Computer, Inc.
24 * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html
25 * (body).
26 *
27 * Copyright 2003 by
28 * Masatake YAMATO and Redhat K.K.
29 *
30 * This file may only be used,
31 * modified, and distributed under the terms of the FreeType project
32 * license, LICENSE.TXT. By continuing to use, modify, or distribute
33 * this file you indicate that you have read the license and
34 * understand and accept it fully.
35 *
36 */
37
38 /****************************************************************************
39 *
40 * Development of gxfeatreg.c is supported by
41 * Information-technology Promotion Agency, Japan.
42 *
43 */
44
45
46 /****************************************************************************
47 *
48 * This file is compiled as a stand-alone executable.
49 * This file is never compiled into `libfreetype2'.
50 * The output of this file is used in `gxvfeat.c'.
51 * -----------------------------------------------------------------------
52 * Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen
53 * Run: ./gxvfgen > tmp.c
54 *
55 */
56
57 /********************************************************************
58 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
59 */
60
61 /*
62 * If you add a new setting to a feature, check the number of settings
63 * in the feature. If the number is greater than the value defined as
64 * FEATREG_MAX_SETTING, update the value.
65 */
66 #define FEATREG_MAX_SETTING 12
67
68 /********************************************************************
69 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
70 */
71
72
73 #include <stdio.h>
74 #include <string.h>
75
76
77 /*************************************************************************/
78 /*************************************************************************/
79 /***** *****/
80 /***** Data and Types *****/
81 /***** *****/
82 /*************************************************************************/
83 /*************************************************************************/
84
85 #define APPLE_RESERVED "Apple Reserved"
86 #define APPLE_RESERVED_LENGTH 14
87
88 typedef struct GX_Feature_RegistryRec_
89 {
90 const char* feat_name;
91 char exclusive;
92 char* setting_name[FEATREG_MAX_SETTING];
93
94 } GX_Feature_RegistryRec;
95
96
97 #define EMPTYFEAT {0, 0, {NULL}}
98
99
100 static GX_Feature_RegistryRec featreg_table[] =
101 {
102 { /* 0 */
103 "All Typographic Features",
104 0,
105 {
106 "All Type Features",
107 NULL
108 }
109 }, { /* 1 */
110 "Ligatures",
111 0,
112 {
113 "Required Ligatures",
114 "Common Ligatures",
115 "Rare Ligatures",
116 "Logos",
117 "Rebus Pictures",
118 "Diphthong Ligatures",
119 "Squared Ligatures",
120 "Squared Ligatures, Abbreviated",
121 NULL
122 }
123 }, { /* 2 */
124 "Cursive Connection",
125 1,
126 {
127 "Unconnected",
128 "Partially Connected",
129 "Cursive",
130 NULL
131 }
132 }, { /* 3 */
133 "Letter Case",
134 1,
135 {
136 "Upper & Lower Case",
137 "All Caps",
138 "All Lower Case",
139 "Small Caps",
140 "Initial Caps",
141 "Initial Caps & Small Caps",
142 NULL
143 }
144 }, { /* 4 */
145 "Vertical Substitution",
146 0,
147 {
148 /* "Substitute Vertical Forms", */
149 "Turns on the feature",
150 NULL
151 }
152 }, { /* 5 */
153 "Linguistic Rearrangement",
154 0,
155 {
156 /* "Linguistic Rearrangement", */
157 "Turns on the feature",
158 NULL
159 }
160 }, { /* 6 */
161 "Number Spacing",
162 1,
163 {
164 "Monospaced Numbers",
165 "Proportional Numbers",
166 NULL
167 }
168 }, { /* 7 */
169 APPLE_RESERVED " 1",
170 0,
171 {NULL}
172 }, { /* 8 */
173 "Smart Swashes",
174 0,
175 {
176 "Word Initial Swashes",
177 "Word Final Swashes",
178 "Line Initial Swashes",
179 "Line Final Swashes",
180 "Non-Final Swashes",
181 NULL
182 }
183 }, { /* 9 */
184 "Diacritics",
185 1,
186 {
187 "Show Diacritics",
188 "Hide Diacritics",
189 "Decompose Diacritics",
190 NULL
191 }
192 }, { /* 10 */
193 "Vertical Position",
194 1,
195 {
196 /* "Normal Position", */
197 "No Vertical Position",
198 "Superiors",
199 "Inferiors",
200 "Ordinals",
201 NULL
202 }
203 }, { /* 11 */
204 "Fractions",
205 1,
206 {
207 "No Fractions",
208 "Vertical Fractions",
209 "Diagonal Fractions",
210 NULL
211 }
212 }, { /* 12 */
213 APPLE_RESERVED " 2",
214 0,
215 {NULL}
216 }, { /* 13 */
217 "Overlapping Characters",
218 0,
219 {
220 /* "Prevent Overlap", */
221 "Turns on the feature",
222 NULL
223 }
224 }, { /* 14 */
225 "Typographic Extras",
226 0,
227 {
228 "Hyphens to Em Dash",
229 "Hyphens to En Dash",
230 "Unslashed Zero",
231 "Form Interrobang",
232 "Smart Quotes",
233 "Periods to Ellipsis",
234 NULL
235 }
236 }, { /* 15 */
237 "Mathematical Extras",
238 0,
239 {
240 "Hyphens to Minus",
241 "Asterisk to Multiply",
242 "Slash to Divide",
243 "Inequality Ligatures",
244 "Exponents",
245 NULL
246 }
247 }, { /* 16 */
248 "Ornament Sets",
249 1,
250 {
251 "No Ornaments",
252 "Dingbats",
253 "Pi Characters",
254 "Fleurons",
255 "Decorative Borders",
256 "International Symbols",
257 "Math Symbols",
258 NULL
259 }
260 }, { /* 17 */
261 "Character Alternatives",
262 1,
263 {
264 "No Alternates",
265 /* TODO */
266 NULL
267 }
268 }, { /* 18 */
269 "Design Complexity",
270 1,
271 {
272 "Design Level 1",
273 "Design Level 2",
274 "Design Level 3",
275 "Design Level 4",
276 "Design Level 5",
277 /* TODO */
278 NULL
279 }
280 }, { /* 19 */
281 "Style Options",
282 1,
283 {
284 "No Style Options",
285 "Display Text",
286 "Engraved Text",
287 "Illuminated Caps",
288 "Tilling Caps",
289 "Tall Caps",
290 NULL
291 }
292 }, { /* 20 */
293 "Character Shape",
294 1,
295 {
296 "Traditional Characters",
297 "Simplified Characters",
298 "JIS 1978 Characters",
299 "JIS 1983 Characters",
300 "JIS 1990 Characters",
301 "Traditional Characters, Alternative Set 1",
302 "Traditional Characters, Alternative Set 2",
303 "Traditional Characters, Alternative Set 3",
304 "Traditional Characters, Alternative Set 4",
305 "Traditional Characters, Alternative Set 5",
306 "Expert Characters",
307 NULL /* count => 12 */
308 }
309 }, { /* 21 */
310 "Number Case",
311 1,
312 {
313 "Lower Case Numbers",
314 "Upper Case Numbers",
315 NULL
316 }
317 }, { /* 22 */
318 "Text Spacing",
319 1,
320 {
321 "Proportional",
322 "Monospaced",
323 "Half-width",
324 "Normal",
325 NULL
326 }
327 }, /* Here after Newer */ { /* 23 */
328 "Transliteration",
329 1,
330 {
331 "No Transliteration",
332 "Hanja To Hangul",
333 "Hiragana to Katakana",
334 "Katakana to Hiragana",
335 "Kana to Romanization",
336 "Romanization to Hiragana",
337 "Romanization to Katakana",
338 "Hanja to Hangul, Alternative Set 1",
339 "Hanja to Hangul, Alternative Set 2",
340 "Hanja to Hangul, Alternative Set 3",
341 NULL
342 }
343 }, { /* 24 */
344 "Annotation",
345 1,
346 {
347 "No Annotation",
348 "Box Annotation",
349 "Rounded Box Annotation",
350 "Circle Annotation",
351 "Inverted Circle Annotation",
352 "Parenthesis Annotation",
353 "Period Annotation",
354 "Roman Numeral Annotation",
355 "Diamond Annotation",
356 NULL
357 }
358 }, { /* 25 */
359 "Kana Spacing",
360 1,
361 {
362 "Full Width",
363 "Proportional",
364 NULL
365 }
366 }, { /* 26 */
367 "Ideographic Spacing",
368 1,
369 {
370 "Full Width",
371 "Proportional",
372 NULL
373 }
374 }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 27-30 */
375 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */
376 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */
377 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */
378 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */
379 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */
380 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */
381 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */
382 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */
383 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */
384 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */
385 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */
386 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */
387 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */
388 EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 96-98 */
389 EMPTYFEAT, /* 99 */ { /* 100 => 22 */
390 "Text Spacing",
391 1,
392 {
393 "Proportional",
394 "Monospaced",
395 "Half-width",
396 "Normal",
397 NULL
398 }
399 }, { /* 101 => 25 */
400 "Kana Spacing",
401 1,
402 {
403 "Full Width",
404 "Proportional",
405 NULL
406 }
407 }, { /* 102 => 26 */
408 "Ideographic Spacing",
409 1,
410 {
411 "Full Width",
412 "Proportional",
413 NULL
414 }
415 }, { /* 103 */
416 "CJK Roman Spacing",
417 1,
418 {
419 "Half-width",
420 "Proportional",
421 "Default Roman",
422 "Full-width Roman",
423 NULL
424 }
425 }, { /* 104 => 1 */
426 "All Typographic Features",
427 0,
428 {
429 "All Type Features",
430 NULL
431 }
432 }
433 };
434
435
436 /*************************************************************************/
437 /*************************************************************************/
438 /***** *****/
439 /***** Generator *****/
440 /***** *****/
441 /*************************************************************************/
442 /*************************************************************************/
443
444 int
445 main( void )
446 {
447 int i;
448
449
450 printf( " {\n" );
451 printf( " /* Generated from %s */\n", __FILE__ );
452
453 for ( i = 0;
454 i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec );
455 i++ )
456 {
457 const char* feat_name;
458 int nSettings;
459
460
461 feat_name = featreg_table[i].feat_name;
462 for ( nSettings = 0;
463 featreg_table[i].setting_name[nSettings];
464 nSettings++)
465 ; /* Do nothing */
466
467 printf( " {%1d, %1d, %1d, %2d}, /* %s */\n",
468 feat_name ? 1 : 0,
469 ( feat_name &&
470 ( ft_strncmp( feat_name,
471 APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 )
472 ) ? 1 : 0,
473 featreg_table[i].exclusive ? 1 : 0,
474 nSettings,
475 feat_name ? feat_name : "__EMPTY__" );
476 }
477
478 printf( " };\n" );
479
480 return 0;
481 }
482
483
484 /* END */