1 /****************************************************************************
   2  *
   3  * afcjk.h
   4  *
   5  *   Auto-fitter hinting routines for CJK writing system (specification).
   6  *
   7  * Copyright (C) 2006-2019 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 #define AF_CJK_BLUE_ACTIVE      ( 1U << 0 ) /* zone height is <= 3/4px      */
  59 #define AF_CJK_BLUE_TOP         ( 1U << 1 ) /* result of AF_CJK_IS_TOP_BLUE */
  60 #define AF_CJK_BLUE_ADJUSTMENT  ( 1U << 2 ) /* used for scale adjustment    */
  61                                             /* optimization                 */
  62 
  63 
  64   typedef struct  AF_CJKBlueRec_
  65   {
  66     AF_WidthRec  ref;
  67     AF_WidthRec  shoot; /* undershoot */
  68     FT_UInt      flags;
  69 
  70   } AF_CJKBlueRec, *AF_CJKBlue;
  71 
  72 
  73   typedef struct  AF_CJKAxisRec_
  74   {
  75     FT_Fixed       scale;
  76     FT_Pos         delta;
  77 
  78     FT_UInt        width_count;                   /* number of used widths */
  79     AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];     /* widths array          */
  80     FT_Pos         edge_distance_threshold;     /* used for creating edges */
  81     FT_Pos         standard_width;           /* the default stem thickness */
  82     FT_Bool        extra_light;           /* is standard width very light? */
  83 
  84     /* used for horizontal metrics too for CJK */
  85     FT_Bool        control_overshoot;
  86     FT_UInt        blue_count;
  87     AF_CJKBlueRec  blues[AF_BLUE_STRINGSET_MAX];
  88 
  89     FT_Fixed       org_scale;
  90     FT_Pos         org_delta;
  91 
  92   } AF_CJKAxisRec, *AF_CJKAxis;
  93 
  94 
  95   typedef struct  AF_CJKMetricsRec_
  96   {
  97     AF_StyleMetricsRec  root;
  98     FT_UInt             units_per_em;
  99     AF_CJKAxisRec       axis[AF_DIMENSION_MAX];
 100 
 101   } AF_CJKMetricsRec, *AF_CJKMetrics;
 102 
 103 
 104 #ifdef AF_CONFIG_OPTION_CJK
 105   FT_LOCAL( FT_Error )
 106   af_cjk_metrics_init( AF_CJKMetrics  metrics,
 107                        FT_Face        face );
 108 
 109   FT_LOCAL( void )
 110   af_cjk_metrics_scale( AF_CJKMetrics  metrics,
 111                         AF_Scaler      scaler );
 112 
 113   FT_LOCAL( FT_Error )
 114   af_cjk_hints_init( AF_GlyphHints  hints,
 115                      AF_CJKMetrics  metrics );
 116 
 117   FT_LOCAL( FT_Error )
 118   af_cjk_hints_apply( FT_UInt        glyph_index,
 119                       AF_GlyphHints  hints,
 120                       FT_Outline*    outline,
 121                       AF_CJKMetrics  metrics );
 122 
 123   /* shared; called from afindic.c */
 124   FT_LOCAL( void )
 125   af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
 126                                FT_Face        face );
 127 
 128   FT_LOCAL( void )
 129   af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
 130                               FT_Face        face );
 131 #endif /* AF_CONFIG_OPTION_CJK */
 132 
 133 
 134 /* */
 135 
 136 FT_END_HEADER
 137 
 138 #endif /* AFCJK_H_ */
 139 
 140 
 141 /* END */