1 /***************************************************************************/
   2 /*                                                                         */
   3 /*  autohint.h                                                             */
   4 /*                                                                         */
   5 /*    High-level `autohint' module-specific interface (specification).     */
   6 /*                                                                         */
   7 /*  Copyright 1996-2018 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        */
  34   /* clarify 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      */
  42   /*                 hints 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         */
  49   /* performing fast computations for both global and glyph hints.         */
  50   /* However, we might be interested in introducing more complex and       */
  51   /* powerful algorithms in the future, like the one described in the John */
  52   /* D. Hobby paper, which 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     */
  56   /* memory usage, it is a good idea to be able to avoid recomputing       */
  57   /* global hints 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   */
  66   /* to cache these too, you are simply in need of a new font format,      */
  67   /* where all this information could be stored within the font file and   */
  68   /* decoded on the 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     */
  91   /*    call to FT_Done_Face().  It must be discarded through the API      */
  92   /*    FT_AutoHinter_GlobalDoneFunc().                                    */
  93   /*                                                                       */
  94   /* <Input>                                                               */
  95   /*    hinter       :: A handle to the source auto-hinter.                */
  96   /*                                                                       */
  97   /*    face         :: A handle to the source face object.                */
  98   /*                                                                       */
  99   /* <Output>                                                              */
 100   /*    global_hints :: A typeless pointer to the global hints.            */
 101   /*                                                                       */
 102   /*    global_len   :: The size in bytes of the global hints.             */
 103   /*                                                                       */
 104   typedef void
 105   (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,
 106                                   FT_Face        face,
 107                                   void**         global_hints,
 108                                   long*          global_len );
 109 
 110 
 111   /*************************************************************************/
 112   /*                                                                       */
 113   /* <FuncType>                                                            */
 114   /*    FT_AutoHinter_GlobalDoneFunc                                       */
 115   /*                                                                       */
 116   /* <Description>                                                         */
 117   /*    Discard the global hints retrieved through                         */
 118   /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */
 119   /*    are freed from memory.                                             */
 120   /*                                                                       */
 121   /* <Input>                                                               */
 122   /*    hinter :: A handle to the auto-hinter module.                      */
 123   /*                                                                       */
 124   /*    global :: A pointer to retrieved global hints to discard.          */
 125   /*                                                                       */
 126   typedef void
 127   (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,
 128                                    void*          global );
 129 
 130 
 131   /*************************************************************************/
 132   /*                                                                       */
 133   /* <FuncType>                                                            */
 134   /*    FT_AutoHinter_GlobalResetFunc                                      */
 135   /*                                                                       */
 136   /* <Description>                                                         */
 137   /*    This function is used to recompute the global metrics in a given   */
 138   /*    font.  This is useful when global font data changes (e.g. Multiple */
 139   /*    Masters fonts where blend coordinates change).                     */
 140   /*                                                                       */
 141   /* <Input>                                                               */
 142   /*    hinter :: A handle to the source auto-hinter.                      */
 143   /*                                                                       */
 144   /*    face   :: A handle to the face.                                    */
 145   /*                                                                       */
 146   typedef void
 147   (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,
 148                                     FT_Face        face );
 149 
 150 
 151   /*************************************************************************/
 152   /*                                                                       */
 153   /* <FuncType>                                                            */
 154   /*    FT_AutoHinter_GlyphLoadFunc                                        */
 155   /*                                                                       */
 156   /* <Description>                                                         */
 157   /*    This function is used to load, scale, and automatically hint a     */
 158   /*    glyph from a given face.                                           */
 159   /*                                                                       */
 160   /* <Input>                                                               */
 161   /*    face        :: A handle to the face.                               */
 162   /*                                                                       */
 163   /*    glyph_index :: The glyph index.                                    */
 164   /*                                                                       */
 165   /*    load_flags  :: The load flags.                                     */
 166   /*                                                                       */
 167   /* <Note>                                                                */
 168   /*    This function is capable of loading composite glyphs by hinting    */
 169   /*    each sub-glyph independently (which improves quality).             */
 170   /*                                                                       */
 171   /*    It will call the font driver with @FT_Load_Glyph, with             */
 172   /*    @FT_LOAD_NO_SCALE set.                                             */
 173   /*                                                                       */
 174   typedef FT_Error
 175   (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,
 176                                   FT_GlyphSlot   slot,
 177                                   FT_Size        size,
 178                                   FT_UInt        glyph_index,
 179                                   FT_Int32       load_flags );
 180 
 181 
 182   /*************************************************************************/
 183   /*                                                                       */
 184   /* <Struct>                                                              */
 185   /*    FT_AutoHinter_InterfaceRec                                         */
 186   /*                                                                       */
 187   /* <Description>                                                         */
 188   /*    The auto-hinter module's interface.                                */
 189   /*                                                                       */
 190   typedef struct  FT_AutoHinter_InterfaceRec_
 191   {
 192     FT_AutoHinter_GlobalResetFunc  reset_face;
 193     FT_AutoHinter_GlobalGetFunc    get_global_hints;
 194     FT_AutoHinter_GlobalDoneFunc   done_global_hints;
 195     FT_AutoHinter_GlyphLoadFunc    load_glyph;
 196 
 197   } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
 198 
 199 
 200 #ifndef FT_CONFIG_OPTION_PIC
 201 
 202 #define FT_DEFINE_AUTOHINTER_INTERFACE(       \
 203           class_,                             \
 204           reset_face_,                        \
 205           get_global_hints_,                  \
 206           done_global_hints_,                 \
 207           load_glyph_ )                       \
 208   FT_CALLBACK_TABLE_DEF                       \
 209   const FT_AutoHinter_InterfaceRec  class_ =  \
 210   {                                           \
 211     reset_face_,                              \
 212     get_global_hints_,                        \
 213     done_global_hints_,                       \
 214     load_glyph_                               \
 215   };
 216 
 217 #else /* FT_CONFIG_OPTION_PIC */
 218 
 219 #define FT_DEFINE_AUTOHINTER_INTERFACE(                            \
 220           class_,                                                  \
 221           reset_face_,                                             \
 222           get_global_hints_,                                       \
 223           done_global_hints_,                                      \
 224           load_glyph_ )                                            \
 225   void                                                             \
 226   FT_Init_Class_ ## class_( FT_Library                   library,  \
 227                             FT_AutoHinter_InterfaceRec*  clazz )   \
 228   {                                                                \
 229     FT_UNUSED( library );                                          \
 230                                                                    \
 231     clazz->reset_face        = reset_face_;                        \
 232     clazz->get_global_hints  = get_global_hints_;                  \
 233     clazz->done_global_hints = done_global_hints_;                 \
 234     clazz->load_glyph        = load_glyph_;                        \
 235   }
 236 
 237 #endif /* FT_CONFIG_OPTION_PIC */
 238 
 239 FT_END_HEADER
 240 
 241 #endif /* AUTOHINT_H_ */
 242 
 243 
 244 /* END */