Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  aftypes.h                                                              */
  4. /*                                                                         */
  5. /*    Auto-fitter types (specification only).                              */
  6. /*                                                                         */
  7. /*  Copyright 2003-2009, 2011-2012 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_and_quantize_widths( FT_UInt*  count,
  91.                                AF_Width  widths,
  92.                                FT_Pos    threshold );
  93.  
  94.  
  95.   /*************************************************************************/
  96.   /*************************************************************************/
  97.   /*****                                                               *****/
  98.   /*****                   A N G L E   T Y P E S                       *****/
  99.   /*****                                                               *****/
  100.   /*************************************************************************/
  101.   /*************************************************************************/
  102.  
  103.   /*
  104.    *  The auto-fitter doesn't need a very high angular accuracy;
  105.    *  this allows us to speed up some computations considerably with a
  106.    *  light Cordic algorithm (see afangles.c).
  107.    */
  108.  
  109.   typedef FT_Int  AF_Angle;
  110.  
  111.  
  112. #define AF_ANGLE_PI   256
  113. #define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )
  114. #define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )
  115. #define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )
  116.  
  117.  
  118. #if 0
  119.   /*
  120.    *  compute the angle of a given 2-D vector
  121.    */
  122.   FT_LOCAL( AF_Angle )
  123.   af_angle_atan( FT_Pos  dx,
  124.                  FT_Pos  dy );
  125.  
  126.  
  127.   /*
  128.    *  compute `angle2 - angle1'; the result is always within
  129.    *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
  130.    */
  131.   FT_LOCAL( AF_Angle )
  132.   af_angle_diff( AF_Angle  angle1,
  133.                  AF_Angle  angle2 );
  134. #endif /* 0 */
  135.  
  136.  
  137. #define AF_ANGLE_DIFF( result, angle1, angle2 ) \
  138.   FT_BEGIN_STMNT                                \
  139.     AF_Angle  _delta = (angle2) - (angle1);     \
  140.                                                 \
  141.                                                 \
  142.     _delta %= AF_ANGLE_2PI;                     \
  143.     if ( _delta < 0 )                           \
  144.       _delta += AF_ANGLE_2PI;                   \
  145.                                                 \
  146.     if ( _delta > AF_ANGLE_PI )                 \
  147.       _delta -= AF_ANGLE_2PI;                   \
  148.                                                 \
  149.     result = _delta;                            \
  150.   FT_END_STMNT
  151.  
  152.  
  153.   /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
  154.    *  details
  155.    */
  156.   typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
  157.  
  158.  
  159.   /*************************************************************************/
  160.   /*************************************************************************/
  161.   /*****                                                               *****/
  162.   /*****                       S C A L E R S                           *****/
  163.   /*****                                                               *****/
  164.   /*************************************************************************/
  165.   /*************************************************************************/
  166.  
  167.   /*
  168.    *  A scaler models the target pixel device that will receive the
  169.    *  auto-hinted glyph image.
  170.    */
  171.  
  172.   typedef enum  AF_ScalerFlags_
  173.   {
  174.     AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */
  175.     AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */
  176.     AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */
  177.  
  178.   } AF_ScalerFlags;
  179.  
  180.  
  181.   typedef struct  AF_ScalerRec_
  182.   {
  183.     FT_Face         face;        /* source font face                        */
  184.     FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
  185.     FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
  186.     FT_Pos          x_delta;     /* in 1/64th device pixels                 */
  187.     FT_Pos          y_delta;     /* in 1/64th device pixels                 */
  188.     FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
  189.     FT_UInt32       flags;       /* additional control flags, see above     */
  190.  
  191.   } AF_ScalerRec, *AF_Scaler;
  192.  
  193.  
  194. #define AF_SCALER_EQUAL_SCALES( a, b )      \
  195.           ( (a)->x_scale == (b)->x_scale && \
  196.             (a)->y_scale == (b)->y_scale && \
  197.             (a)->x_delta == (b)->x_delta && \
  198.             (a)->y_delta == (b)->y_delta )
  199.  
  200.  
  201.   /*************************************************************************/
  202.   /*************************************************************************/
  203.   /*****                                                               *****/
  204.   /*****                       S C R I P T S                           *****/
  205.   /*****                                                               *****/
  206.   /*************************************************************************/
  207.   /*************************************************************************/
  208.  
  209.   /*
  210.    *  The list of known scripts.  Each different script corresponds to the
  211.    *  following information:
  212.    *
  213.    *   - A set of Unicode ranges to test whether the face supports the
  214.    *     script.
  215.    *
  216.    *   - A specific global analyzer that will compute global metrics
  217.    *     specific to the script.
  218.    *
  219.    *   - A specific glyph analyzer that will compute segments and
  220.    *     edges for each glyph covered by the script.
  221.    *
  222.    *   - A specific grid-fitting algorithm that will distort the
  223.    *     scaled glyph outline according to the results of the glyph
  224.    *     analyzer.
  225.    *
  226.    *  Note that a given analyzer and/or grid-fitting algorithm can be
  227.    *  used by more than one script.
  228.    */
  229.  
  230.   typedef enum  AF_Script_
  231.   {
  232.     AF_SCRIPT_DUMMY = 0,
  233.     AF_SCRIPT_LATIN = 1,
  234.     AF_SCRIPT_CJK   = 2,
  235.     AF_SCRIPT_INDIC = 3,
  236. #ifdef FT_OPTION_AUTOFIT2
  237.     AF_SCRIPT_LATIN2 = 4,
  238. #endif
  239.  
  240.     /* add new scripts here.  Don't forget to update the list in */
  241.     /* `afglobal.c'.                                             */
  242.  
  243.     AF_SCRIPT_MAX   /* do not remove */
  244.  
  245.   } AF_Script;
  246.  
  247.  
  248.   typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;
  249.   typedef struct AF_FaceGlobalsRec_*        AF_FaceGlobals;
  250.  
  251.   typedef struct  AF_ScriptMetricsRec_
  252.   {
  253.     AF_ScriptClass  clazz;
  254.     AF_ScalerRec    scaler;
  255.     FT_Bool         digits_have_same_width;
  256.  
  257.     AF_FaceGlobals  globals;    /* to access properties */
  258.  
  259.   } AF_ScriptMetricsRec, *AF_ScriptMetrics;
  260.  
  261.  
  262.   /*  This function parses an FT_Face to compute global metrics for
  263.    *  a specific script.
  264.    */
  265.   typedef FT_Error
  266.   (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,
  267.                                 FT_Face           face );
  268.  
  269.   typedef void
  270.   (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,
  271.                                  AF_Scaler         scaler );
  272.  
  273.   typedef void
  274.   (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );
  275.  
  276.  
  277.   typedef FT_Error
  278.   (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,
  279.                               AF_ScriptMetrics  metrics );
  280.  
  281.   typedef void
  282.   (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,
  283.                                FT_Outline*       outline,
  284.                                AF_ScriptMetrics  metrics );
  285.  
  286.  
  287.   typedef struct  AF_Script_UniRangeRec_
  288.   {
  289.     FT_UInt32  first;
  290.     FT_UInt32  last;
  291.  
  292.   } AF_Script_UniRangeRec;
  293.  
  294. #define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
  295.  
  296.   typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;
  297.  
  298.  
  299.   typedef struct  AF_ScriptClassRec_
  300.   {
  301.     AF_Script           script;
  302.     AF_Script_UniRange  script_uni_ranges; /* last must be { 0, 0 }        */
  303.     FT_UInt32           standard_char;     /* for default width and height */
  304.  
  305.     FT_Offset                   script_metrics_size;
  306.     AF_Script_InitMetricsFunc   script_metrics_init;
  307.     AF_Script_ScaleMetricsFunc  script_metrics_scale;
  308.     AF_Script_DoneMetricsFunc   script_metrics_done;
  309.  
  310.     AF_Script_InitHintsFunc     script_hints_init;
  311.     AF_Script_ApplyHintsFunc    script_hints_apply;
  312.  
  313.   } AF_ScriptClassRec;
  314.  
  315.  
  316.   /* Declare and define vtables for classes */
  317. #ifndef FT_CONFIG_OPTION_PIC
  318.  
  319. #define AF_DECLARE_SCRIPT_CLASS( script_class ) \
  320.   FT_CALLBACK_TABLE const AF_ScriptClassRec     \
  321.   script_class;
  322.  
  323. #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \
  324.                                 m_size,                                    \
  325.                                 m_init, m_scale, m_done, h_init, h_apply ) \
  326.   FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec  script_class =            \
  327.   {                                                                        \
  328.     script_,                                                               \
  329.     ranges,                                                                \
  330.     def_char,                                                              \
  331.                                                                            \
  332.     m_size,                                                                \
  333.                                                                            \
  334.     m_init,                                                                \
  335.     m_scale,                                                               \
  336.     m_done,                                                                \
  337.                                                                            \
  338.     h_init,                                                                \
  339.     h_apply                                                                \
  340.   };
  341.  
  342. #else /* FT_CONFIG_OPTION_PIC */
  343.  
  344. #define AF_DECLARE_SCRIPT_CLASS( script_class )             \
  345.   FT_LOCAL( void )                                          \
  346.   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac );
  347.  
  348. #define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char,   \
  349.                                 m_size,                                    \
  350.                                 m_init, m_scale, m_done, h_init, h_apply ) \
  351.   FT_LOCAL_DEF( void )                                                     \
  352.   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac )                 \
  353.   {                                                                        \
  354.     ac->script               = script_;                                    \
  355.     ac->script_uni_ranges    = ranges;                                     \
  356.     ac->default_char         = def_char;                                   \
  357.                                                                            \
  358.     ac->script_metrics_size  = m_size;                                     \
  359.                                                                            \
  360.     ac->script_metrics_init  = m_init;                                     \
  361.     ac->script_metrics_scale = m_scale;                                    \
  362.     ac->script_metrics_done  = m_done;                                     \
  363.                                                                            \
  364.     ac->script_hints_init    = h_init;                                     \
  365.     ac->script_hints_apply   = h_apply;                                    \
  366.   }
  367.  
  368. #endif /* FT_CONFIG_OPTION_PIC */
  369.  
  370.  
  371. /* */
  372.  
  373. FT_END_HEADER
  374.  
  375. #endif /* __AFTYPES_H__ */
  376.  
  377.  
  378. /* END */
  379.