misc/libfreetype/src/autofit/aftypes.h
changeset 9372 915436ff64ab
parent 9371 f3840de881bd
child 9373 b769a8e38cbd
equal deleted inserted replaced
9371:f3840de881bd 9372:915436ff64ab
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  aftypes.h                                                              */
       
     4 /*                                                                         */
       
     5 /*    Auto-fitter types (specification only).                              */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2003-2009, 2011 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-fitter is a complete rewrite of the old auto-hinter.
       
    22    *  Its main feature is the ability to differentiate between different
       
    23    *  scripts in order to apply language-specific rules.
       
    24    *
       
    25    *  The code has also been compartmentized into several entities that
       
    26    *  should make algorithmic experimentation easier than with the old
       
    27    *  code.
       
    28    *
       
    29    *  Finally, we get rid of the Catharon license, since this code is
       
    30    *  released under the FreeType one.
       
    31    *
       
    32    *************************************************************************/
       
    33 
       
    34 
       
    35 #ifndef __AFTYPES_H__
       
    36 #define __AFTYPES_H__
       
    37 
       
    38 #include <ft2build.h>
       
    39 
       
    40 #include FT_FREETYPE_H
       
    41 #include FT_OUTLINE_H
       
    42 #include FT_INTERNAL_OBJECTS_H
       
    43 #include FT_INTERNAL_DEBUG_H
       
    44 
       
    45 
       
    46 FT_BEGIN_HEADER
       
    47 
       
    48   /*************************************************************************/
       
    49   /*************************************************************************/
       
    50   /*****                                                               *****/
       
    51   /*****                    D E B U G G I N G                          *****/
       
    52   /*****                                                               *****/
       
    53   /*************************************************************************/
       
    54   /*************************************************************************/
       
    55 
       
    56 #ifdef FT_DEBUG_AUTOFIT
       
    57 
       
    58 #include FT_CONFIG_STANDARD_LIBRARY_H
       
    59 
       
    60 extern int    _af_debug_disable_horz_hints;
       
    61 extern int    _af_debug_disable_vert_hints;
       
    62 extern int    _af_debug_disable_blue_hints;
       
    63 extern void*  _af_debug_hints;
       
    64 
       
    65 #endif /* FT_DEBUG_AUTOFIT */
       
    66 
       
    67 
       
    68   /*************************************************************************/
       
    69   /*************************************************************************/
       
    70   /*****                                                               *****/
       
    71   /*****                 U T I L I T Y   S T U F F                     *****/
       
    72   /*****                                                               *****/
       
    73   /*************************************************************************/
       
    74   /*************************************************************************/
       
    75 
       
    76   typedef struct  AF_WidthRec_
       
    77   {
       
    78     FT_Pos  org;  /* original position/width in font units              */
       
    79     FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */
       
    80     FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */
       
    81 
       
    82   } AF_WidthRec, *AF_Width;
       
    83 
       
    84 
       
    85   FT_LOCAL( void )
       
    86   af_sort_pos( FT_UInt  count,
       
    87                FT_Pos*  table );
       
    88 
       
    89   FT_LOCAL( void )
       
    90   af_sort_widths( FT_UInt   count,
       
    91                   AF_Width  widths );
       
    92 
       
    93 
       
    94   /*************************************************************************/
       
    95   /*************************************************************************/
       
    96   /*****                                                               *****/
       
    97   /*****                   A N G L E   T Y P E S                       *****/
       
    98   /*****                                                               *****/
       
    99   /*************************************************************************/
       
   100   /*************************************************************************/
       
   101 
       
   102   /*
       
   103    *  The auto-fitter doesn't need a very high angular accuracy;
       
   104    *  this allows us to speed up some computations considerably with a
       
   105    *  light Cordic algorithm (see afangles.c).
       
   106    */
       
   107 
       
   108   typedef FT_Int  AF_Angle;
       
   109 
       
   110 
       
   111 #define AF_ANGLE_PI   256
       
   112 #define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )
       
   113 #define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )
       
   114 #define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )
       
   115 
       
   116 
       
   117 #if 0
       
   118   /*
       
   119    *  compute the angle of a given 2-D vector
       
   120    */
       
   121   FT_LOCAL( AF_Angle )
       
   122   af_angle_atan( FT_Pos  dx,
       
   123                  FT_Pos  dy );
       
   124 
       
   125 
       
   126   /*
       
   127    *  compute `angle2 - angle1'; the result is always within
       
   128    *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
       
   129    */
       
   130   FT_LOCAL( AF_Angle )
       
   131   af_angle_diff( AF_Angle  angle1,
       
   132                  AF_Angle  angle2 );
       
   133 #endif /* 0 */
       
   134 
       
   135 
       
   136 #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
       
   137   FT_BEGIN_STMNT                                \
       
   138     AF_Angle  _delta = (angle2) - (angle1);     \
       
   139                                                 \
       
   140                                                 \
       
   141     _delta %= AF_ANGLE_2PI;                     \
       
   142     if ( _delta < 0 )                           \
       
   143       _delta += AF_ANGLE_2PI;                   \
       
   144                                                 \
       
   145     if ( _delta > AF_ANGLE_PI )                 \
       
   146       _delta -= AF_ANGLE_2PI;                   \
       
   147                                                 \
       
   148     result = _delta;                            \
       
   149   FT_END_STMNT
       
   150 
       
   151 
       
   152   /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
       
   153    *  details
       
   154    */
       
   155   typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
       
   156 
       
   157 
       
   158   /*************************************************************************/
       
   159   /*************************************************************************/
       
   160   /*****                                                               *****/
       
   161   /*****                       S C A L E R S                           *****/
       
   162   /*****                                                               *****/
       
   163   /*************************************************************************/
       
   164   /*************************************************************************/
       
   165 
       
   166   /*
       
   167    *  A scaler models the target pixel device that will receive the
       
   168    *  auto-hinted glyph image.
       
   169    */
       
   170 
       
   171   typedef enum  AF_ScalerFlags_
       
   172   {
       
   173     AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */
       
   174     AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */
       
   175     AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */
       
   176 
       
   177   } AF_ScalerFlags;
       
   178 
       
   179 
       
   180   typedef struct  AF_ScalerRec_
       
   181   {
       
   182     FT_Face         face;        /* source font face                        */
       
   183     FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
       
   184     FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
       
   185     FT_Pos          x_delta;     /* in 1/64th device pixels                 */
       
   186     FT_Pos          y_delta;     /* in 1/64th device pixels                 */
       
   187     FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
       
   188     FT_UInt32       flags;       /* additional control flags, see above     */
       
   189 
       
   190   } AF_ScalerRec, *AF_Scaler;
       
   191 
       
   192 
       
   193 #define AF_SCALER_EQUAL_SCALES( a, b )      \
       
   194           ( (a)->x_scale == (b)->x_scale && \
       
   195             (a)->y_scale == (b)->y_scale && \
       
   196             (a)->x_delta == (b)->x_delta && \
       
   197             (a)->y_delta == (b)->y_delta )
       
   198 
       
   199 
       
   200   /*************************************************************************/
       
   201   /*************************************************************************/
       
   202   /*****                                                               *****/
       
   203   /*****                       S C R I P T S                           *****/
       
   204   /*****                                                               *****/
       
   205   /*************************************************************************/
       
   206   /*************************************************************************/
       
   207 
       
   208   /*
       
   209    *  The list of known scripts.  Each different script corresponds to the
       
   210    *  following information:
       
   211    *
       
   212    *   - A set of Unicode ranges to test whether the face supports the
       
   213    *     script.
       
   214    *
       
   215    *   - A specific global analyzer that will compute global metrics
       
   216    *     specific to the script.
       
   217    *
       
   218    *   - A specific glyph analyzer that will compute segments and
       
   219    *     edges for each glyph covered by the script.
       
   220    *
       
   221    *   - A specific grid-fitting algorithm that will distort the
       
   222    *     scaled glyph outline according to the results of the glyph
       
   223    *     analyzer.
       
   224    *
       
   225    *  Note that a given analyzer and/or grid-fitting algorithm can be
       
   226    *  used by more than one script.
       
   227    */
       
   228 
       
   229   typedef enum  AF_Script_
       
   230   {
       
   231     AF_SCRIPT_NONE  = 0,
       
   232     AF_SCRIPT_LATIN = 1,
       
   233     AF_SCRIPT_CJK   = 2,
       
   234     AF_SCRIPT_INDIC = 3, 
       
   235 #ifdef FT_OPTION_AUTOFIT2
       
   236     AF_SCRIPT_LATIN2,
       
   237 #endif
       
   238 
       
   239     /* add new scripts here.  Don't forget to update the list in */
       
   240     /* `afglobal.c'.                                             */
       
   241 
       
   242     AF_SCRIPT_MAX   /* do not remove */
       
   243 
       
   244   } AF_Script;
       
   245 
       
   246 
       
   247   typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;
       
   248 
       
   249   typedef struct  AF_ScriptMetricsRec_
       
   250   {
       
   251     AF_ScriptClass  clazz;
       
   252     AF_ScalerRec    scaler;
       
   253     FT_Bool         digits_have_same_width;
       
   254 
       
   255   } AF_ScriptMetricsRec, *AF_ScriptMetrics;
       
   256 
       
   257 
       
   258   /*  This function parses an FT_Face to compute global metrics for
       
   259    *  a specific script.
       
   260    */
       
   261   typedef FT_Error
       
   262   (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,
       
   263                                 FT_Face           face );
       
   264 
       
   265   typedef void
       
   266   (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,
       
   267                                  AF_Scaler         scaler );
       
   268 
       
   269   typedef void
       
   270   (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );
       
   271 
       
   272 
       
   273   typedef FT_Error
       
   274   (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,
       
   275                               AF_ScriptMetrics  metrics );
       
   276 
       
   277   typedef void
       
   278   (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,
       
   279                                FT_Outline*       outline,
       
   280                                AF_ScriptMetrics  metrics );
       
   281 
       
   282 
       
   283   typedef struct  AF_Script_UniRangeRec_
       
   284   {
       
   285     FT_UInt32  first;
       
   286     FT_UInt32  last;
       
   287 
       
   288   } AF_Script_UniRangeRec;
       
   289 
       
   290 #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
       
   291 
       
   292   typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;
       
   293 
       
   294 
       
   295   typedef struct  AF_ScriptClassRec_
       
   296   {
       
   297     AF_Script                   script;
       
   298     AF_Script_UniRange          script_uni_ranges; /* last must be { 0, 0 } */
       
   299 
       
   300     FT_Offset                   script_metrics_size;
       
   301     AF_Script_InitMetricsFunc   script_metrics_init;
       
   302     AF_Script_ScaleMetricsFunc  script_metrics_scale;
       
   303     AF_Script_DoneMetricsFunc   script_metrics_done;
       
   304 
       
   305     AF_Script_InitHintsFunc     script_hints_init;
       
   306     AF_Script_ApplyHintsFunc    script_hints_apply;
       
   307 
       
   308   } AF_ScriptClassRec;
       
   309 
       
   310 
       
   311   /* Declare and define vtables for classes */
       
   312 #ifndef FT_CONFIG_OPTION_PIC
       
   313 
       
   314 #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
       
   315   FT_CALLBACK_TABLE const AF_ScriptClassRec     \
       
   316   script_class;
       
   317 
       
   318 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size,     \
       
   319                                 m_init, m_scale, m_done, h_init, h_apply ) \
       
   320   FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec                            \
       
   321   script_class =                                                           \
       
   322   {                                                                        \
       
   323     script_,                                                               \
       
   324     ranges,                                                                \
       
   325                                                                            \
       
   326     m_size,                                                                \
       
   327                                                                            \
       
   328     m_init,                                                                \
       
   329     m_scale,                                                               \
       
   330     m_done,                                                                \
       
   331                                                                            \
       
   332     h_init,                                                                \
       
   333     h_apply                                                                \
       
   334   };
       
   335 
       
   336 #else /* FT_CONFIG_OPTION_PIC */
       
   337 
       
   338 #define AF_DECLARE_SCRIPT_CLASS( script_class )          \
       
   339   FT_LOCAL( void )                                       \
       
   340   FT_Init_Class_##script_class( AF_ScriptClassRec* ac );
       
   341 
       
   342 #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size,     \
       
   343                                 m_init, m_scale, m_done, h_init, h_apply ) \
       
   344   FT_LOCAL_DEF( void )                                                     \
       
   345   FT_Init_Class_##script_class( AF_ScriptClassRec* ac )                    \
       
   346   {                                                                        \
       
   347     ac->script               = script_;                                    \
       
   348     ac->script_uni_ranges    = ranges;                                     \
       
   349                                                                            \
       
   350     ac->script_metrics_size  = m_size;                                     \
       
   351                                                                            \
       
   352     ac->script_metrics_init  = m_init;                                     \
       
   353     ac->script_metrics_scale = m_scale;                                    \
       
   354     ac->script_metrics_done  = m_done;                                     \
       
   355                                                                            \
       
   356     ac->script_hints_init    = h_init;                                     \
       
   357     ac->script_hints_apply   = h_apply;                                    \
       
   358   }
       
   359 
       
   360 #endif /* FT_CONFIG_OPTION_PIC */
       
   361 
       
   362 
       
   363 /* */
       
   364 
       
   365 FT_END_HEADER
       
   366 
       
   367 #endif /* __AFTYPES_H__ */
       
   368 
       
   369 
       
   370 /* END */