1/***************************************************************************/
2/*                                                                         */
3/*  afcjk.h                                                                */
4/*                                                                         */
5/*    Auto-fitter hinting routines for CJK script (specification).         */
6/*                                                                         */
7/*  Copyright 2006, 2007, 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#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 script class */
30
31  AF_DECLARE_SCRIPT_CLASS( af_cjk_script_class )
32
33  /* CJK (global) metrics management */
34
35  /*
36   *  CJK glyphs tend to fill the square.  So we have both vertical and
37   *  horizontal blue zones.  But some glyphs have flat bounding strokes that
38   *  leave some space between neighbour glyphs.
39   */
40  enum
41  {
42    AF_CJK_BLUE_TOP,
43    AF_CJK_BLUE_BOTTOM,
44    AF_CJK_BLUE_LEFT,
45    AF_CJK_BLUE_RIGHT,
46
47    AF_CJK_BLUE_MAX
48  };
49
50
51#define AF_CJK_MAX_WIDTHS  16
52#define AF_CJK_MAX_BLUES   AF_CJK_BLUE_MAX
53
54
55  enum
56  {
57    AF_CJK_BLUE_ACTIVE     = 1 << 0,
58    AF_CJK_BLUE_IS_TOP     = 1 << 1,
59    AF_CJK_BLUE_IS_RIGHT   = 1 << 2,
60    AF_CJK_BLUE_ADJUSTMENT = 1 << 3,  /* used for scale adjustment */
61                                      /* optimization              */
62    AF_CJK_BLUE_FLAG_MAX
63  };
64
65
66  typedef struct  AF_CJKBlueRec_
67  {
68    AF_WidthRec  ref;
69    AF_WidthRec  shoot; /* undershoot */
70    FT_UInt      flags;
71
72  } AF_CJKBlueRec, *AF_CJKBlue;
73
74
75  typedef struct  AF_CJKAxisRec_
76  {
77    FT_Fixed       scale;
78    FT_Pos         delta;
79
80    FT_UInt        width_count;
81    AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];
82    FT_Pos         edge_distance_threshold;
83    FT_Pos         standard_width;
84    FT_Bool        extra_light;
85
86    /* used for horizontal metrics too for CJK */
87    FT_Bool        control_overshoot;
88    FT_UInt        blue_count;
89    AF_CJKBlueRec  blues[AF_CJK_BLUE_MAX];
90
91    FT_Fixed       org_scale;
92    FT_Pos         org_delta;
93
94  } AF_CJKAxisRec, *AF_CJKAxis;
95
96
97  typedef struct  AF_CJKMetricsRec_
98  {
99    AF_ScriptMetricsRec  root;
100    FT_UInt              units_per_em;
101    AF_CJKAxisRec        axis[AF_DIMENSION_MAX];
102
103  } AF_CJKMetricsRec, *AF_CJKMetrics;
104
105
106#ifdef AF_CONFIG_OPTION_CJK
107  FT_LOCAL( FT_Error )
108  af_cjk_metrics_init( AF_CJKMetrics  metrics,
109                       FT_Face        face );
110
111  FT_LOCAL( void )
112  af_cjk_metrics_scale( AF_CJKMetrics  metrics,
113                        AF_Scaler      scaler );
114
115  FT_LOCAL( FT_Error )
116  af_cjk_hints_init( AF_GlyphHints  hints,
117                     AF_CJKMetrics  metrics );
118
119  FT_LOCAL( FT_Error )
120  af_cjk_hints_apply( AF_GlyphHints  hints,
121                      FT_Outline*    outline,
122                      AF_CJKMetrics  metrics );
123
124  /* shared; called from afindic.c */
125  FT_LOCAL( void )
126  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
127                               FT_Face        face );
128
129  FT_LOCAL( void )
130  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
131                              FT_Face        face );
132#endif /* AF_CONFIG_OPTION_CJK */
133
134
135/* */
136
137FT_END_HEADER
138
139#endif /* __AFCJK_H__ */
140
141
142/* END */
143