1f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/
2f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
3f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  aflatin.h                                                              */
4f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
5459306220771533750ddc5b3fcbf2cc92b445c71Werner Lemberg/*    Auto-fitter hinting routines for latin writing system                */
6459306220771533750ddc5b3fcbf2cc92b445c71Werner Lemberg/*    (specification).                                                     */
7f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
80a0c22569deab933df21127e75db5c81f724f292Werner Lemberg/*  Copyright 2003-2018 by                                                 */
9f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
10f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
11f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  This file is part of the FreeType project, and may only be used,       */
12f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  modified, and distributed under the terms of the FreeType project      */
13f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
14f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  this file you indicate that you have read the license and              */
15f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  understand and accept it fully.                                        */
16f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
17f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/
18f13516c8321b386227414be01e707563e852fc0dWerner Lemberg
19f13516c8321b386227414be01e707563e852fc0dWerner Lemberg
2037412ff9f42212bcf4dd29d9762f3c35b5735768Werner Lemberg#ifndef AFLATIN_H_
2137412ff9f42212bcf4dd29d9762f3c35b5735768Werner Lemberg#define AFLATIN_H_
22d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
23d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#include "afhints.h"
24d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
25b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
26d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_BEGIN_HEADER
278ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
2872f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  /* the `latin' writing system */
29b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
3072f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class )
31b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
3272f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg
336cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg  /* constants are given with units_per_em == 2048 in mind */
346cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg#define AF_LATIN_CONSTANT( metrics, c )                                      \
35d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg  ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 )
36d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg
37f9a69132a73bea7a7c1e7726789841acd8235a4bWu, Chia-I (吳佳一)
38b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
39b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
40b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
41b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****            L A T I N   G L O B A L   M E T R I C S            *****/
42b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
43b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
44b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
45b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
46b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
47b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*
48b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   *  The following declarations could be embedded in the file `aflatin.c';
49974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg   *  they have been made semi-public to allow alternate writing system
50974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg   *  hinters to re-use some of them.
51b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   */
52b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
53b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
540975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg#define AF_LATIN_IS_TOP_BLUE( b ) \
550975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP )
560164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \
570164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP )
58ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \
59ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL )
6075efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \
6175efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT )
623f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg#define AF_LATIN_IS_LONG_BLUE( b ) \
633f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
64ff9d2415a7a192520ea198187dbdb6408625e210David Turner
65b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_MAX_WIDTHS  16
66b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
67ff9d2415a7a192520ea198187dbdb6408625e210David Turner
6881e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_ACTIVE      ( 1U << 0 ) /* zone height is <= 3/4px   */
6981e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_TOP         ( 1U << 1 ) /* we have a top blue zone   */
700164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_BLUE_SUB_TOP     ( 1U << 2 ) /* we have a subscript top   */
710164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg                                              /* blue zone                 */
720164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_BLUE_NEUTRAL     ( 1U << 3 ) /* we have neutral blue zone */
730164d934b651949346a27dd160fc3d7ed683312aWerner Lemberg#define AF_LATIN_BLUE_ADJUSTMENT  ( 1U << 4 ) /* used for scale adjustment */
7481e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg                                              /* optimization              */
75ff9d2415a7a192520ea198187dbdb6408625e210David Turner
76ff9d2415a7a192520ea198187dbdb6408625e210David Turner
77b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinBlueRec_
78ff9d2415a7a192520ea198187dbdb6408625e210David Turner  {
79b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_WidthRec  ref;
80b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_WidthRec  shoot;
81be32b168ac42e670e1a8c5c614cce4c3f8232829Philipp Knechtges    FT_Pos       ascender;
82be32b168ac42e670e1a8c5c614cce4c3f8232829Philipp Knechtges    FT_Pos       descender;
83b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    FT_UInt      flags;
848ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
85ff9d2415a7a192520ea198187dbdb6408625e210David Turner  } AF_LatinBlueRec, *AF_LatinBlue;
86ff9d2415a7a192520ea198187dbdb6408625e210David Turner
87d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
88b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinAxisRec_
89d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  {
90ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_Fixed         scale;
91ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_Pos           delta;
928ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
936cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_UInt          width_count;                 /* number of used widths */
946cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */
956cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Pos           edge_distance_threshold;   /* used for creating edges */
966cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Pos           standard_width;         /* the default stem thickness */
976cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Bool          extra_light;         /* is standard width very light? */
988ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
99b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    /* ignored for horizontal metrics */
100ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_UInt          blue_count;
1010975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg    AF_LatinBlueRec  blues[AF_BLUE_STRINGSET_MAX];
102ff9d2415a7a192520ea198187dbdb6408625e210David Turner
103f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner    FT_Fixed         org_scale;
104f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner    FT_Pos           org_delta;
105f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner
106d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  } AF_LatinAxisRec, *AF_LatinAxis;
107ff9d2415a7a192520ea198187dbdb6408625e210David Turner
108ff9d2415a7a192520ea198187dbdb6408625e210David Turner
109b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinMetricsRec_
110d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  {
1113f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg    AF_StyleMetricsRec  root;
1123f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg    FT_UInt             units_per_em;
1133f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg    AF_LatinAxisRec     axis[AF_DIMENSION_MAX];
1148ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
115d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  } AF_LatinMetricsRec, *AF_LatinMetrics;
116d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
117d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
118d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( FT_Error )
119d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  af_latin_metrics_init( AF_LatinMetrics  metrics,
120d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner                         FT_Face          face );
121d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
122d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( void )
123d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  af_latin_metrics_scale( AF_LatinMetrics  metrics,
124d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner                          AF_Scaler        scaler );
125d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
1264cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一)  FT_LOCAL( void )
1274cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一)  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
128553bb3c3caa38bf73d01f5c3a3ebe5a96070f527Werner Lemberg                                FT_Face          face );
129d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
1308b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg  FT_LOCAL( void )
1318b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
1328b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg                                 FT_Face          face );
1338b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg
134d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
135b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
136b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
137b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
138b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
139b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
140b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
141b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
142d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
14381e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_HORZ_SNAP    ( 1U << 0 ) /* stem width snapping  */
14481e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_VERT_SNAP    ( 1U << 1 ) /* stem height snapping */
14581e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_STEM_ADJUST  ( 1U << 2 ) /* stem width/height    */
14681e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg                                                /* adjustment           */
14781e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_MONO         ( 1U << 3 ) /* monochrome rendering */
148cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
149cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
150b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \
151b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
152cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
153b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \
154b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
155cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
156b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \
157b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
158cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
159b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_MONO( h )             \
160b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
161d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
162b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
163b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*
1645a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg   *  The next functions shouldn't normally be exported.  However, other
165974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg   *  writing systems might like to use these functions as-is.
166b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   */
167b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
168ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_compute_segments( AF_GlyphHints  hints,
169ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                   AF_Dimension   dim );
170d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
171d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( void )
172ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_link_segments( AF_GlyphHints  hints,
17371f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                FT_UInt        width_count,
17471f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                AF_WidthRec*   widths,
175ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                AF_Dimension   dim );
176d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
177b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
178ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_compute_edges( AF_GlyphHints  hints,
179ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                AF_Dimension   dim );
180d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
181b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
182ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_detect_features( AF_GlyphHints  hints,
18371f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                  FT_UInt        width_count,
18471f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                  AF_WidthRec*   widths,
185ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                  AF_Dimension   dim );
186d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
187d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner/* */
188d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
189d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_END_HEADER
190d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
19137412ff9f42212bcf4dd29d9762f3c35b5735768Werner Lemberg#endif /* AFLATIN_H_ */
192b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
193b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
194b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg/* END */
195