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 main(void)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 */ 485