1 /****************************************************************************
   2  *
   3  * autohint.h
   4  *
   5  *   High-level 'autohint' module-specific interface (specification).
   6  *
   7  * Copyright (C) 1996-2020 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   /**************************************************************************
  20    *
  21    * The auto-hinter is used to load and automatically hint glyphs if a
  22    * format-specific hinter isn't available.
  23    *
  24    */
  25 
  26 
  27 #ifndef AUTOHINT_H_
  28 #define AUTOHINT_H_
  29 
  30 
  31   /**************************************************************************
  32    *
  33    * A small technical note regarding automatic hinting in order to clarify
  34    * this module interface.
  35    *
  36    * An automatic hinter might compute two kinds of data for a given face:
  37    *
  38    * - global hints: Usually some metrics that describe global properties
  39    *                 of the face.  It is computed by scanning more or less
  40    *                 aggressively the glyphs in the face, and thus can be
  41    *                 very slow to compute (even if the size of global hints
  42    *                 is really small).
  43    *
  44    * - glyph hints: These describe some important features of the glyph
  45    *                 outline, as well as how to align them.  They are
  46    *                 generally much faster to compute than global hints.
  47    *
  48    * The current FreeType auto-hinter does a pretty good job while performing
  49    * fast computations for both global and glyph hints.  However, we might be
  50    * interested in introducing more complex and powerful algorithms in the
  51    * future, like the one described in the John D. Hobby paper, which
  52    * unfortunately requires a lot more horsepower.
  53    *
  54    * Because a sufficiently sophisticated font management system would
  55    * typically implement an LRU cache of opened face objects to reduce memory
  56    * usage, it is a good idea to be able to avoid recomputing global hints
  57    * every time the same face is re-opened.
  58    *
  59    * We thus provide the ability to cache global hints outside of the face
  60    * object, in order to speed up font re-opening time.  Of course, this
  61    * feature is purely optional, so most client programs won't even notice
  62    * it.
  63    *
  64    * I initially thought that it would be a good idea to cache the glyph
  65    * hints too.  However, my general idea now is that if you really need to
  66    * cache these too, you are simply in need of a new font format, where all
  67    * this information could be stored within the font file and decoded on the
  68    * fly.
  69    *
  70    */
  71 
  72 
  73 #include <ft2build.h>
  74 #include FT_FREETYPE_H
  75 
  76 
  77 FT_BEGIN_HEADER
  78 
  79 
  80   typedef struct FT_AutoHinterRec_  *FT_AutoHinter;
  81 
  82 
  83   /**************************************************************************
  84    *
  85    * @functype:
  86    *   FT_AutoHinter_GlobalGetFunc
  87    *
  88    * @description:
  89    *   Retrieve the global hints computed for a given face object.  The
  90    *   resulting data is dissociated from the face and will survive a call to
  91    *   FT_Done_Face().  It must be discarded through the API
  92    *   FT_AutoHinter_GlobalDoneFunc().
  93    *
  94    * @input:
  95    *   hinter ::
  96    *     A handle to the source auto-hinter.
  97    *
  98    *   face ::
  99    *     A handle to the source face object.
 100    *
 101    * @output:
 102    *   global_hints ::
 103    *     A typeless pointer to the global hints.
 104    *
 105    *   global_len ::
 106    *     The size in bytes of the global hints.
 107    */
 108   typedef void
 109   (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,
 110                                   FT_Face        face,
 111                                   void**         global_hints,
 112                                   long*          global_len );
 113 
 114 
 115   /**************************************************************************
 116    *
 117    * @functype:
 118    *   FT_AutoHinter_GlobalDoneFunc
 119    *
 120    * @description:
 121    *   Discard the global hints retrieved through
 122    *   FT_AutoHinter_GlobalGetFunc().  This is the only way these hints are
 123    *   freed from memory.
 124    *
 125    * @input:
 126    *   hinter ::
 127    *     A handle to the auto-hinter module.
 128    *
 129    *   global ::
 130    *     A pointer to retrieved global hints to discard.
 131    */
 132   typedef void
 133   (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,
 134                                    void*          global );
 135 
 136 
 137   /**************************************************************************
 138    *
 139    * @functype:
 140    *   FT_AutoHinter_GlobalResetFunc
 141    *
 142    * @description:
 143    *   This function is used to recompute the global metrics in a given font.
 144    *   This is useful when global font data changes (e.g. Multiple Masters
 145    *   fonts where blend coordinates change).
 146    *
 147    * @input:
 148    *   hinter ::
 149    *     A handle to the source auto-hinter.
 150    *
 151    *   face ::
 152    *     A handle to the face.
 153    */
 154   typedef void
 155   (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,
 156                                     FT_Face        face );
 157 
 158 
 159   /**************************************************************************
 160    *
 161    * @functype:
 162    *   FT_AutoHinter_GlyphLoadFunc
 163    *
 164    * @description:
 165    *   This function is used to load, scale, and automatically hint a glyph
 166    *   from a given face.
 167    *
 168    * @input:
 169    *   face ::
 170    *     A handle to the face.
 171    *
 172    *   glyph_index ::
 173    *     The glyph index.
 174    *
 175    *   load_flags ::
 176    *     The load flags.
 177    *
 178    * @note:
 179    *   This function is capable of loading composite glyphs by hinting each
 180    *   sub-glyph independently (which improves quality).
 181    *
 182    *   It will call the font driver with @FT_Load_Glyph, with
 183    *   @FT_LOAD_NO_SCALE set.
 184    */
 185   typedef FT_Error
 186   (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,
 187                                   FT_GlyphSlot   slot,
 188                                   FT_Size        size,
 189                                   FT_UInt        glyph_index,
 190                                   FT_Int32       load_flags );
 191 
 192 
 193   /**************************************************************************
 194    *
 195    * @struct:
 196    *   FT_AutoHinter_InterfaceRec
 197    *
 198    * @description:
 199    *   The auto-hinter module's interface.
 200    */
 201   typedef struct  FT_AutoHinter_InterfaceRec_
 202   {
 203     FT_AutoHinter_GlobalResetFunc  reset_face;
 204     FT_AutoHinter_GlobalGetFunc    get_global_hints;
 205     FT_AutoHinter_GlobalDoneFunc   done_global_hints;
 206     FT_AutoHinter_GlyphLoadFunc    load_glyph;
 207 
 208   } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
 209 
 210 
 211 #define FT_DEFINE_AUTOHINTER_INTERFACE(       \
 212           class_,                             \
 213           reset_face_,                        \
 214           get_global_hints_,                  \
 215           done_global_hints_,                 \
 216           load_glyph_ )                       \
 217   FT_CALLBACK_TABLE_DEF                       \
 218   const FT_AutoHinter_InterfaceRec  class_ =  \
 219   {                                           \
 220     reset_face_,                              \
 221     get_global_hints_,                        \
 222     done_global_hints_,                       \
 223     load_glyph_                               \
 224   };
 225 
 226 
 227 FT_END_HEADER
 228 
 229 #endif /* AUTOHINT_H_ */
 230 
 231 
 232 /* END */