1/***************************************************************************/
2/*                                                                         */
3/*  afcjk.h                                                                */
4/*                                                                         */
5/*    Auto-fitter hinting routines for CJK writing system (specification). */
6/*                                                                         */
7/*  Copyright 2006-2018 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
26FT_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
136FT_END_HEADER
137
138#endif /* AFCJK_H_ */
139
140
141/* END */
142