1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  afcjk.h                                                                */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Auto-fitter hinting routines for CJK script (specification).         */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  Copyright 2006, 2007, 2011, 2012 by                                    */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef __AFCJK_H__
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define __AFCJK_H__
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "afhints.h"
23c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#include "aflatin.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_BEGIN_HEADER
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the CJK-specific script class */
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
31a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  AF_DECLARE_SCRIPT_CLASS( af_cjk_script_class )
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
33c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  /* CJK (global) metrics management */
34c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
35c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  /*
36c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner   *  CJK glyphs tend to fill the square.  So we have both vertical and
37c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner   *  horizontal blue zones.  But some glyphs have flat bounding strokes that
38c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner   *  leave some space between neighbour glyphs.
39c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner   */
40c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  enum
41c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  {
42c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_TOP,
43c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_BOTTOM,
44c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_LEFT,
45c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_RIGHT,
46c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
47c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_MAX
48c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  };
49c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
50c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
51c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#define AF_CJK_MAX_WIDTHS  16
52c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner#define AF_CJK_MAX_BLUES   AF_CJK_BLUE_MAX
53c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
54c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
55c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  enum
56c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  {
57c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_ACTIVE     = 1 << 0,
58c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_IS_TOP     = 1 << 1,
59c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_IS_RIGHT   = 1 << 2,
60c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_ADJUSTMENT = 1 << 3,  /* used for scale adjustment */
61c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                                      /* optimization              */
62c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJK_BLUE_FLAG_MAX
63c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  };
64c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
65c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
66c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  typedef struct  AF_CJKBlueRec_
67c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  {
68c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_WidthRec  ref;
69c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_WidthRec  shoot; /* undershoot */
70c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_UInt      flags;
71c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
72c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  } AF_CJKBlueRec, *AF_CJKBlue;
73c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
74c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
75c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  typedef struct  AF_CJKAxisRec_
76c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  {
77c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Fixed       scale;
78c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Pos         delta;
79c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
80c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_UInt        width_count;
81c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];
82c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Pos         edge_distance_threshold;
83c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Pos         standard_width;
84c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Bool        extra_light;
85c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
86c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    /* used for horizontal metrics too for CJK */
87c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Bool        control_overshoot;
88c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_UInt        blue_count;
89c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJKBlueRec  blues[AF_CJK_BLUE_MAX];
90c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
91c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Fixed       org_scale;
92c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_Pos         org_delta;
93c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
94c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  } AF_CJKAxisRec, *AF_CJKAxis;
95c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
96c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
97c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  typedef struct  AF_CJKMetricsRec_
98c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  {
99c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_ScriptMetricsRec  root;
100c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    FT_UInt              units_per_em;
101c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner    AF_CJKAxisRec        axis[AF_DIMENSION_MAX];
102c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
103c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  } AF_CJKMetricsRec, *AF_CJKMetrics;
104c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
106a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifdef AF_CONFIG_OPTION_CJK
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( FT_Error )
108c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  af_cjk_metrics_init( AF_CJKMetrics  metrics,
109c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                       FT_Face        face );
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( void )
112c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  af_cjk_metrics_scale( AF_CJKMetrics  metrics,
113c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                        AF_Scaler      scaler );
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( FT_Error )
116c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  af_cjk_hints_init( AF_GlyphHints  hints,
117c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                     AF_CJKMetrics  metrics );
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( FT_Error )
120c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  af_cjk_hints_apply( AF_GlyphHints  hints,
121c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                      FT_Outline*    outline,
122c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                      AF_CJKMetrics  metrics );
123c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
124a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang  /* shared; called from afindic.c */
125c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  FT_LOCAL( void )
126c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
127c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner                               FT_Face        face );
128c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
129c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  FT_LOCAL( void )
130c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
131a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang                              FT_Face        face );
132a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif /* AF_CONFIG_OPTION_CJK */
133c3ee10bfa1f76a18500b487de9c85757375b48f3David 'Digit' Turner
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __AFCJK_H__ */
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
143