1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  afcjk.h                                                                */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
59c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/*    Auto-fitter hinting routines for CJK writing system (specification). */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/*  Copyright 2006, 2007, 2011-2014 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"
23aeb407daf3711a10a27f3bc2223c5eb05158076eDavid '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
29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* the CJK-specific writing system */
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class )
32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                                                               *****/
37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****              C J K   G L O B A L   M E T R I C S              *****/
38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                                                               *****/
39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
43aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  /*
44aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner   *  CJK glyphs tend to fill the square.  So we have both vertical and
45aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner   *  horizontal blue zones.  But some glyphs have flat bounding strokes that
46aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner   *  leave some space between neighbour glyphs.
47aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner   */
48aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_CJK_IS_TOP_BLUE( b ) \
50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP )
51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_CJK_IS_HORIZ_BLUE( b ) \
52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ )
53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_CJK_IS_RIGHT_BLUE  AF_CJK_IS_TOP_BLUE
54aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#define AF_CJK_MAX_WIDTHS  16
56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  enum
59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {
60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_CJK_BLUE_ACTIVE     = 1 << 0,  /* set if zone height is <= 3/4px */
61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_CJK_BLUE_TOP        = 1 << 1,  /* result of AF_CJK_IS_TOP_BLUE   */
62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_CJK_BLUE_ADJUSTMENT = 1 << 2,  /* used for scale adjustment      */
63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                      /* optimization                   */
64aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    AF_CJK_BLUE_FLAG_MAX
65aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  };
66aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
67aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
68aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  typedef struct  AF_CJKBlueRec_
69aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {
70aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    AF_WidthRec  ref;
71aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    AF_WidthRec  shoot; /* undershoot */
72aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_UInt      flags;
73aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
74aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  } AF_CJKBlueRec, *AF_CJKBlue;
75aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
76aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
77aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  typedef struct  AF_CJKAxisRec_
78aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {
79aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Fixed       scale;
80aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Pos         delta;
81aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_UInt        width_count;                   /* number of used widths */
83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];     /* widths array          */
84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_Pos         edge_distance_threshold;     /* used for creating edges */
85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_Pos         standard_width;           /* the default stem thickness */
86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_Bool        extra_light;           /* is standard width very light? */
87aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
88aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* used for horizontal metrics too for CJK */
89aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Bool        control_overshoot;
90aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_UInt        blue_count;
91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_CJKBlueRec  blues[AF_BLUE_STRINGSET_MAX];
92aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
93aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Fixed       org_scale;
94aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Pos         org_delta;
95aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
96aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  } AF_CJKAxisRec, *AF_CJKAxis;
97aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
98aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
99aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  typedef struct  AF_CJKMetricsRec_
100aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {
1019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_StyleMetricsRec  root;
1029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt             units_per_em;
1039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_CJKAxisRec       axis[AF_DIMENSION_MAX];
104aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
105aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  } AF_CJKMetricsRec, *AF_CJKMetrics;
106aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
108727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef AF_CONFIG_OPTION_CJK
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( FT_Error )
110aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  af_cjk_metrics_init( AF_CJKMetrics  metrics,
111aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                       FT_Face        face );
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( void )
114aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  af_cjk_metrics_scale( AF_CJKMetrics  metrics,
115aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                        AF_Scaler      scaler );
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( FT_Error )
118aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  af_cjk_hints_init( AF_GlyphHints  hints,
119aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     AF_CJKMetrics  metrics );
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( FT_Error )
122aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  af_cjk_hints_apply( AF_GlyphHints  hints,
123aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                      FT_Outline*    outline,
124aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                      AF_CJKMetrics  metrics );
125aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* shared; called from afindic.c */
127aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  FT_LOCAL( void )
128aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
129aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                               FT_Face        face );
130aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
131aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  FT_LOCAL( void )
132aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                              FT_Face        face );
134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* AF_CONFIG_OPTION_CJK */
135aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __AFCJK_H__ */
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
145