Home | History | Annotate | Download | only in autofit
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  afcjk.h                                                                */
      4 /*                                                                         */
      5 /*    Auto-fitter hinting routines for CJK writing system (specification). */
      6 /*                                                                         */
      7 /*  Copyright 2006, 2007, 2011-2014 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 #ifndef __AFCJK_H__
     20 #define __AFCJK_H__
     21 
     22 #include "afhints.h"
     23 #include "aflatin.h"
     24 
     25 
     26 FT_BEGIN_HEADER
     27 
     28 
     29   /* the CJK-specific writing system */
     30 
     31   AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class )
     32 
     33 
     34   /*************************************************************************/
     35   /*************************************************************************/
     36   /*****                                                               *****/
     37   /*****              C J K   G L O B A L   M E T R I C S              *****/
     38   /*****                                                               *****/
     39   /*************************************************************************/
     40   /*************************************************************************/
     41 
     42 
     43   /*
     44    *  CJK glyphs tend to fill the square.  So we have both vertical and
     45    *  horizontal blue zones.  But some glyphs have flat bounding strokes that
     46    *  leave some space between neighbour glyphs.
     47    */
     48 
     49 #define AF_CJK_IS_TOP_BLUE( b ) \
     50           ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP )
     51 #define AF_CJK_IS_HORIZ_BLUE( b ) \
     52           ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ )
     53 #define AF_CJK_IS_RIGHT_BLUE  AF_CJK_IS_TOP_BLUE
     54 
     55 #define AF_CJK_MAX_WIDTHS  16
     56 
     57 
     58   enum
     59   {
     60     AF_CJK_BLUE_ACTIVE     = 1 << 0,  /* set if zone height is <= 3/4px */
     61     AF_CJK_BLUE_TOP        = 1 << 1,  /* result of AF_CJK_IS_TOP_BLUE   */
     62     AF_CJK_BLUE_ADJUSTMENT = 1 << 2,  /* used for scale adjustment      */
     63                                       /* optimization                   */
     64     AF_CJK_BLUE_FLAG_MAX
     65   };
     66 
     67 
     68   typedef struct  AF_CJKBlueRec_
     69   {
     70     AF_WidthRec  ref;
     71     AF_WidthRec  shoot; /* undershoot */
     72     FT_UInt      flags;
     73 
     74   } AF_CJKBlueRec, *AF_CJKBlue;
     75 
     76 
     77   typedef struct  AF_CJKAxisRec_
     78   {
     79     FT_Fixed       scale;
     80     FT_Pos         delta;
     81 
     82     FT_UInt        width_count;                   /* number of used widths */
     83     AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];     /* widths array          */
     84     FT_Pos         edge_distance_threshold;     /* used for creating edges */
     85     FT_Pos         standard_width;           /* the default stem thickness */
     86     FT_Bool        extra_light;           /* is standard width very light? */
     87 
     88     /* used for horizontal metrics too for CJK */
     89     FT_Bool        control_overshoot;
     90     FT_UInt        blue_count;
     91     AF_CJKBlueRec  blues[AF_BLUE_STRINGSET_MAX];
     92 
     93     FT_Fixed       org_scale;
     94     FT_Pos         org_delta;
     95 
     96   } AF_CJKAxisRec, *AF_CJKAxis;
     97 
     98 
     99   typedef struct  AF_CJKMetricsRec_
    100   {
    101     AF_StyleMetricsRec  root;
    102     FT_UInt             units_per_em;
    103     AF_CJKAxisRec       axis[AF_DIMENSION_MAX];
    104 
    105   } AF_CJKMetricsRec, *AF_CJKMetrics;
    106 
    107 
    108 #ifdef AF_CONFIG_OPTION_CJK
    109   FT_LOCAL( FT_Error )
    110   af_cjk_metrics_init( AF_CJKMetrics  metrics,
    111                        FT_Face        face );
    112 
    113   FT_LOCAL( void )
    114   af_cjk_metrics_scale( AF_CJKMetrics  metrics,
    115                         AF_Scaler      scaler );
    116 
    117   FT_LOCAL( FT_Error )
    118   af_cjk_hints_init( AF_GlyphHints  hints,
    119                      AF_CJKMetrics  metrics );
    120 
    121   FT_LOCAL( FT_Error )
    122   af_cjk_hints_apply( AF_GlyphHints  hints,
    123                       FT_Outline*    outline,
    124                       AF_CJKMetrics  metrics );
    125 
    126   /* shared; called from afindic.c */
    127   FT_LOCAL( void )
    128   af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
    129                                FT_Face        face );
    130 
    131   FT_LOCAL( void )
    132   af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
    133                               FT_Face        face );
    134 #endif /* AF_CONFIG_OPTION_CJK */
    135 
    136 
    137 /* */
    138 
    139 FT_END_HEADER
    140 
    141 #endif /* __AFCJK_H__ */
    142 
    143 
    144 /* END */
    145