Home | History | Annotate | Download | only in freetype2
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  ftautoh.h                                                              */
      4 /*                                                                         */
      5 /*    FreeType API for controlling the auto-hinter (specification only).   */
      6 /*                                                                         */
      7 /*  Copyright 2012-2015 by                                                 */
      8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
      9 /*                                                                         */
     10 /*  This file is part of the FreeType project, and may only be used,       */
     11 /*  modified, and distributed under the terms of the FreeType project      */
     12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     13 /*  this file you indicate that you have read the license and              */
     14 /*  understand and accept it fully.                                        */
     15 /*                                                                         */
     16 /***************************************************************************/
     17 
     18 
     19 #ifndef __FTAUTOH_H__
     20 #define __FTAUTOH_H__
     21 
     22 #include <ft2build.h>
     23 #include FT_FREETYPE_H
     24 
     25 #ifdef FREETYPE_H
     26 #error "freetype.h of FreeType 1 has been loaded!"
     27 #error "Please fix the directory search order for header files"
     28 #error "so that freetype.h of FreeType 2 is found first."
     29 #endif
     30 
     31 
     32 FT_BEGIN_HEADER
     33 
     34 
     35   /**************************************************************************
     36    *
     37    * @section:
     38    *   auto_hinter
     39    *
     40    * @title:
     41    *   The auto-hinter
     42    *
     43    * @abstract:
     44    *   Controlling the auto-hinting module.
     45    *
     46    * @description:
     47    *   While FreeType's auto-hinter doesn't expose API functions by itself,
     48    *   it is possible to control its behaviour with @FT_Property_Set and
     49    *   @FT_Property_Get.  The following lists the available properties
     50    *   together with the necessary macros and structures.
     51    *
     52    *   Note that the auto-hinter's module name is `autofitter' for
     53    *   historical reasons.
     54    *
     55    */
     56 
     57 
     58   /**************************************************************************
     59    *
     60    * @property:
     61    *   glyph-to-script-map
     62    *
     63    * @description:
     64    *   *Experimental* *only*
     65    *
     66    *   The auto-hinter provides various script modules to hint glyphs.
     67    *   Examples of supported scripts are Latin or CJK.  Before a glyph is
     68    *   auto-hinted, the Unicode character map of the font gets examined, and
     69    *   the script is then determined based on Unicode character ranges, see
     70    *   below.
     71    *
     72    *   OpenType fonts, however, often provide much more glyphs than
     73    *   character codes (small caps, superscripts, ligatures, swashes, etc.),
     74    *   to be controlled by so-called `features'.  Handling OpenType features
     75    *   can be quite complicated and thus needs a separate library on top of
     76    *   FreeType.
     77    *
     78    *   The mapping between glyph indices and scripts (in the auto-hinter
     79    *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
     80    *   array with `num_glyphs' elements, as found in the font's @FT_Face
     81    *   structure.  The `glyph-to-script-map' property returns a pointer to
     82    *   this array, which can be modified as needed.  Note that the
     83    *   modification should happen before the first glyph gets processed by
     84    *   the auto-hinter so that the global analysis of the font shapes
     85    *   actually uses the modified mapping.
     86    *
     87    *   The following example code demonstrates how to access it (omitting
     88    *   the error handling).
     89    *
     90    *   {
     91    *     FT_Library                library;
     92    *     FT_Face                   face;
     93    *     FT_Prop_GlyphToScriptMap  prop;
     94    *
     95    *
     96    *     FT_Init_FreeType( &library );
     97    *     FT_New_Face( library, "foo.ttf", 0, &face );
     98    *
     99    *     prop.face = face;
    100    *
    101    *     FT_Property_Get( library, "autofitter",
    102    *                               "glyph-to-script-map", &prop );
    103    *
    104    *     // adjust `prop.map' as needed right here
    105    *
    106    *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
    107    *   }
    108    *
    109    */
    110 
    111 
    112   /**************************************************************************
    113    *
    114    * @enum:
    115    *   FT_AUTOHINTER_SCRIPT_XXX
    116    *
    117    * @description:
    118    *   *Experimental* *only*
    119    *
    120    *   A list of constants used for the @glyph-to-script-map property to
    121    *   specify the script submodule the auto-hinter should use for hinting a
    122    *   particular glyph.
    123    *
    124    * @values:
    125    *   FT_AUTOHINTER_SCRIPT_NONE ::
    126    *     Don't auto-hint this glyph.
    127    *
    128    *   FT_AUTOHINTER_SCRIPT_LATIN ::
    129    *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
    130    *     very broad term, including Cyrillic and Greek also since characters
    131    *     from those scripts share the same design constraints.
    132    *
    133    *     By default, characters from the following Unicode ranges are
    134    *     assigned to this submodule.
    135    *
    136    *     {
    137    *       U+0020 - U+007F  // Basic Latin (no control characters)
    138    *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
    139    *       U+0100 - U+017F  // Latin Extended-A
    140    *       U+0180 - U+024F  // Latin Extended-B
    141    *       U+0250 - U+02AF  // IPA Extensions
    142    *       U+02B0 - U+02FF  // Spacing Modifier Letters
    143    *       U+0300 - U+036F  // Combining Diacritical Marks
    144    *       U+0370 - U+03FF  // Greek and Coptic
    145    *       U+0400 - U+04FF  // Cyrillic
    146    *       U+0500 - U+052F  // Cyrillic Supplement
    147    *       U+1D00 - U+1D7F  // Phonetic Extensions
    148    *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
    149    *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
    150    *       U+1E00 - U+1EFF  // Latin Extended Additional
    151    *       U+1F00 - U+1FFF  // Greek Extended
    152    *       U+2000 - U+206F  // General Punctuation
    153    *       U+2070 - U+209F  // Superscripts and Subscripts
    154    *       U+20A0 - U+20CF  // Currency Symbols
    155    *       U+2150 - U+218F  // Number Forms
    156    *       U+2460 - U+24FF  // Enclosed Alphanumerics
    157    *       U+2C60 - U+2C7F  // Latin Extended-C
    158    *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
    159    *       U+2E00 - U+2E7F  // Supplemental Punctuation
    160    *       U+A640 - U+A69F  // Cyrillic Extended-B
    161    *       U+A720 - U+A7FF  // Latin Extended-D
    162    *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
    163    *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
    164    *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
    165    *     }
    166    *
    167    *   FT_AUTOHINTER_SCRIPT_CJK ::
    168    *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
    169    *     Vietnamese, and some other scripts.
    170    *
    171    *     By default, characters from the following Unicode ranges are
    172    *     assigned to this submodule.
    173    *
    174    *     {
    175    *       U+1100 - U+11FF  // Hangul Jamo
    176    *       U+2E80 - U+2EFF  // CJK Radicals Supplement
    177    *       U+2F00 - U+2FDF  // Kangxi Radicals
    178    *       U+2FF0 - U+2FFF  // Ideographic Description Characters
    179    *       U+3000 - U+303F  // CJK Symbols and Punctuation
    180    *       U+3040 - U+309F  // Hiragana
    181    *       U+30A0 - U+30FF  // Katakana
    182    *       U+3100 - U+312F  // Bopomofo
    183    *       U+3130 - U+318F  // Hangul Compatibility Jamo
    184    *       U+3190 - U+319F  // Kanbun
    185    *       U+31A0 - U+31BF  // Bopomofo Extended
    186    *       U+31C0 - U+31EF  // CJK Strokes
    187    *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
    188    *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
    189    *       U+3300 - U+33FF  // CJK Compatibility
    190    *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
    191    *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
    192    *       U+4E00 - U+9FFF  // CJK Unified Ideographs
    193    *       U+A960 - U+A97F  // Hangul Jamo Extended-A
    194    *       U+AC00 - U+D7AF  // Hangul Syllables
    195    *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
    196    *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
    197    *       U+FE10 - U+FE1F  // Vertical forms
    198    *       U+FE30 - U+FE4F  // CJK Compatibility Forms
    199    *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
    200    *      U+1B000 - U+1B0FF // Kana Supplement
    201    *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
    202    *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
    203    *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
    204    *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
    205    *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
    206    *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
    207    *     }
    208    *
    209    *   FT_AUTOHINTER_SCRIPT_INDIC ::
    210    *     Apply the indic auto-hinter, covering all major scripts from the
    211    *     Indian sub-continent and some other related scripts like Thai, Lao,
    212    *     or Tibetan.
    213    *
    214    *     By default, characters from the following Unicode ranges are
    215    *     assigned to this submodule.
    216    *
    217    *     {
    218    *       U+0900 - U+0DFF  // Indic Range
    219    *       U+0F00 - U+0FFF  // Tibetan
    220    *       U+1900 - U+194F  // Limbu
    221    *       U+1B80 - U+1BBF  // Sundanese
    222    *       U+1C80 - U+1CDF  // Meetei Mayak
    223    *       U+A800 - U+A82F  // Syloti Nagri
    224    *      U+11800 - U+118DF // Sharada
    225    *     }
    226    *
    227    *     Note that currently Indic support is rudimentary only, missing blue
    228    *     zone support.
    229    *
    230    */
    231 #define FT_AUTOHINTER_SCRIPT_NONE   0
    232 #define FT_AUTOHINTER_SCRIPT_LATIN  1
    233 #define FT_AUTOHINTER_SCRIPT_CJK    2
    234 #define FT_AUTOHINTER_SCRIPT_INDIC  3
    235 
    236 
    237   /**************************************************************************
    238    *
    239    * @struct:
    240    *   FT_Prop_GlyphToScriptMap
    241    *
    242    * @description:
    243    *   *Experimental* *only*
    244    *
    245    *   The data exchange structure for the @glyph-to-script-map property.
    246    *
    247    */
    248   typedef struct  FT_Prop_GlyphToScriptMap_
    249   {
    250     FT_Face   face;
    251     FT_Byte*  map;
    252 
    253   } FT_Prop_GlyphToScriptMap;
    254 
    255 
    256   /**************************************************************************
    257    *
    258    * @property:
    259    *   fallback-script
    260    *
    261    * @description:
    262    *   *Experimental* *only*
    263    *
    264    *   If no auto-hinter script module can be assigned to a glyph, a
    265    *   fallback script gets assigned to it (see also the
    266    *   @glyph-to-script-map property).  By default, this is
    267    *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
    268    *   this fallback value can be changed.
    269    *
    270    *   {
    271    *     FT_Library  library;
    272    *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
    273    *
    274    *
    275    *     FT_Init_FreeType( &library );
    276    *
    277    *     FT_Property_Set( library, "autofitter",
    278    *                               "fallback-script", &fallback_script );
    279    *   }
    280    *
    281    * @note:
    282    *   This property can be used with @FT_Property_Get also.
    283    *
    284    *   It's important to use the right timing for changing this value: The
    285    *   creation of the glyph-to-script map that eventually uses the
    286    *   fallback script value gets triggered either by setting or reading a
    287    *   face-specific property like @glyph-to-script-map, or by auto-hinting
    288    *   any glyph from that face.  In particular, if you have already created
    289    *   an @FT_Face structure but not loaded any glyph (using the
    290    *   auto-hinter), a change of the fallback script will affect this face.
    291    *
    292    */
    293 
    294 
    295   /**************************************************************************
    296    *
    297    * @property:
    298    *   default-script
    299    *
    300    * @description:
    301    *   *Experimental* *only*
    302    *
    303    *   If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make
    304    *   the HarfBuzz library access OpenType features for getting better
    305    *   glyph coverages, this property sets the (auto-fitter) script to be
    306    *   used for the default (OpenType) script data of a font's GSUB table.
    307    *   Features for the default script are intended for all scripts not
    308    *   explicitly handled in GSUB; an example is a `dlig' feature,
    309    *   containing the combination of the characters `T', `E', and `L' to
    310    *   form a `TEL' ligature.
    311    *
    312    *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
    313    *   `default-script' property, this default value can be changed.
    314    *
    315    *   {
    316    *     FT_Library  library;
    317    *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
    318    *
    319    *
    320    *     FT_Init_FreeType( &library );
    321    *
    322    *     FT_Property_Set( library, "autofitter",
    323    *                               "default-script", &default_script );
    324    *   }
    325    *
    326    * @note:
    327    *   This property can be used with @FT_Property_Get also.
    328    *
    329    *   It's important to use the right timing for changing this value: The
    330    *   creation of the glyph-to-script map that eventually uses the
    331    *   default script value gets triggered either by setting or reading a
    332    *   face-specific property like @glyph-to-script-map, or by auto-hinting
    333    *   any glyph from that face.  In particular, if you have already created
    334    *   an @FT_Face structure but not loaded any glyph (using the
    335    *   auto-hinter), a change of the default script will affect this face.
    336    *
    337    */
    338 
    339 
    340   /**************************************************************************
    341    *
    342    * @property:
    343    *   increase-x-height
    344    *
    345    * @description:
    346    *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
    347    *   up the font's x~height much more often than normally.  If the value
    348    *   is set to~0, which is the default, this feature is switched off.  Use
    349    *   this property to improve the legibility of small font sizes if
    350    *   necessary.
    351    *
    352    *   {
    353    *     FT_Library               library;
    354    *     FT_Face                  face;
    355    *     FT_Prop_IncreaseXHeight  prop;
    356    *
    357    *
    358    *     FT_Init_FreeType( &library );
    359    *     FT_New_Face( library, "foo.ttf", 0, &face );
    360    *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
    361    *
    362    *     prop.face  = face;
    363    *     prop.limit = 14;
    364    *
    365    *     FT_Property_Set( library, "autofitter",
    366    *                               "increase-x-height", &prop );
    367    *   }
    368    *
    369    * @note:
    370    *   This property can be used with @FT_Property_Get also.
    371    *
    372    *   Set this value right after calling @FT_Set_Char_Size, but before
    373    *   loading any glyph (using the auto-hinter).
    374    *
    375    */
    376 
    377 
    378   /**************************************************************************
    379    *
    380    * @struct:
    381    *   FT_Prop_IncreaseXHeight
    382    *
    383    * @description:
    384    *   The data exchange structure for the @increase-x-height property.
    385    *
    386    */
    387   typedef struct  FT_Prop_IncreaseXHeight_
    388   {
    389     FT_Face  face;
    390     FT_UInt  limit;
    391 
    392   } FT_Prop_IncreaseXHeight;
    393 
    394 
    395   /**************************************************************************
    396    *
    397    * @property:
    398    *   warping
    399    *
    400    * @description:
    401    *   *Experimental* *only*
    402    *
    403    *   If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to
    404    *   activate the warp hinting code in the auto-hinter, this property
    405    *   switches warping on and off.
    406    *
    407    *   Warping only works in `light' auto-hinting mode.  The idea of the
    408    *   code is to slightly scale and shift a glyph along the non-hinted
    409    *   dimension (which is usually the horizontal axis) so that as much of
    410    *   its segments are aligned (more or less) to the grid.  To find out a
    411    *   glyph's optimal scaling and shifting value, various parameter
    412    *   combinations are tried and scored.
    413    *
    414    *   By default, warping is off.  The example below shows how to switch on
    415    *   warping (omitting the error handling).
    416    *
    417    *   {
    418    *     FT_Library  library;
    419    *     FT_Bool     warping = 1;
    420    *
    421    *
    422    *     FT_Init_FreeType( &library );
    423    *
    424    *     FT_Property_Set( library, "autofitter",
    425    *                               "warping", &warping );
    426    *   }
    427    *
    428    * @note:
    429    *   This property can be used with @FT_Property_Get also.
    430    *
    431    *   The warping code can also change advance widths.  Have a look at the
    432    *   `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure
    433    *   for details on improving inter-glyph distances while rendering.
    434    *
    435    *   Since warping is a global property of the auto-hinter it is best to
    436    *   change its value before rendering any face.  Otherwise, you should
    437    *   reload all faces that get auto-hinted in `light' hinting mode.
    438    *
    439    */
    440 
    441 
    442   /* */
    443 
    444 
    445 FT_END_HEADER
    446 
    447 #endif /* __FTAUTOH_H__ */
    448 
    449 
    450 /* END */
    451