Home | History | Annotate | Download | only in internal
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  autohint.h                                                             */
      4 /*                                                                         */
      5 /*    High-level `autohint' module-specific interface (specification).     */
      6 /*                                                                         */
      7 /*  Copyright 1996-2001, 2002, 2007 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   /*    Retrieves 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   /*    Discards 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_ServiceRec                                           */
    186   /*                                                                       */
    187   /* <Description>                                                         */
    188   /*    The auto-hinter module's interface.                                */
    189   /*                                                                       */
    190   typedef struct  FT_AutoHinter_ServiceRec_
    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_ServiceRec, *FT_AutoHinter_Service;
    198 
    199 #ifndef FT_CONFIG_OPTION_PIC
    200 
    201 #define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \
    202                                      done_global_hints_, load_glyph_)        \
    203   FT_CALLBACK_TABLE_DEF                                                      \
    204   const FT_AutoHinter_ServiceRec class_ =                                    \
    205   {                                                                          \
    206     reset_face_, get_global_hints_, done_global_hints_, load_glyph_          \
    207   };
    208 
    209 #else /* FT_CONFIG_OPTION_PIC */
    210 
    211 #define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \
    212                                      done_global_hints_, load_glyph_)        \
    213   void                                                                       \
    214   FT_Init_Class_##class_( FT_Library library,                                \
    215                           FT_AutoHinter_ServiceRec* clazz)                   \
    216   {                                                                          \
    217     FT_UNUSED(library);                                                      \
    218     clazz->reset_face = reset_face_;                                         \
    219     clazz->get_global_hints = get_global_hints_;                             \
    220     clazz->done_global_hints = done_global_hints_;                           \
    221     clazz->load_glyph = load_glyph_;                                         \
    222   }
    223 
    224 #endif /* FT_CONFIG_OPTION_PIC */
    225 
    226 FT_END_HEADER
    227 
    228 #endif /* __AUTOHINT_H__ */
    229 
    230 
    231 /* END */
    232