aflatin.h revision 81e5ff53a89b454a3984a7181516dfb4cb22187a
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/*                                                                         */
8f57fc59e016217687362b6fbbc4842fab932175cWerner Lemberg/*  Copyright 2003-2015 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
20d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#ifndef __AFLATIN_H__
21d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#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 )
56ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \
57ccfc4b4c4e2c4fc51f20ce5c9bf107739e86e5adWerner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL )
5875efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \
5975efc2d0bdd07ea689aa7ee3d41c0c1928435e14Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT )
603f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg#define AF_LATIN_IS_LONG_BLUE( b ) \
613f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
62ff9d2415a7a192520ea198187dbdb6408625e210David Turner
63b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_MAX_WIDTHS  16
64b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
65ff9d2415a7a192520ea198187dbdb6408625e210David Turner
6681e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_ACTIVE      ( 1U << 0 ) /* zone height is <= 3/4px   */
6781e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_TOP         ( 1U << 1 ) /* we have a top blue zone   */
6881e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_NEUTRAL     ( 1U << 2 ) /* we have neutral blue zone */
6981e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_BLUE_ADJUSTMENT  ( 1U << 3 ) /* used for scale adjustment */
7081e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg                                              /* optimization              */
71ff9d2415a7a192520ea198187dbdb6408625e210David Turner
72ff9d2415a7a192520ea198187dbdb6408625e210David Turner
73b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinBlueRec_
74ff9d2415a7a192520ea198187dbdb6408625e210David Turner  {
75b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_WidthRec  ref;
76b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_WidthRec  shoot;
77b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    FT_UInt      flags;
788ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
79ff9d2415a7a192520ea198187dbdb6408625e210David Turner  } AF_LatinBlueRec, *AF_LatinBlue;
80ff9d2415a7a192520ea198187dbdb6408625e210David Turner
81d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
82b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinAxisRec_
83d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  {
84ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_Fixed         scale;
85ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_Pos           delta;
868ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
876cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_UInt          width_count;                 /* number of used widths */
886cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */
896cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Pos           edge_distance_threshold;   /* used for creating edges */
906cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Pos           standard_width;         /* the default stem thickness */
916cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Bool          extra_light;         /* is standard width very light? */
928ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
93b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    /* ignored for horizontal metrics */
94ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_UInt          blue_count;
950975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg    AF_LatinBlueRec  blues[AF_BLUE_STRINGSET_MAX];
96ff9d2415a7a192520ea198187dbdb6408625e210David Turner
97f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner    FT_Fixed         org_scale;
98f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner    FT_Pos           org_delta;
99f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner
100d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  } AF_LatinAxisRec, *AF_LatinAxis;
101ff9d2415a7a192520ea198187dbdb6408625e210David Turner
102ff9d2415a7a192520ea198187dbdb6408625e210David Turner
103b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinMetricsRec_
104d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  {
1053f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg    AF_StyleMetricsRec  root;
1063f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg    FT_UInt             units_per_em;
1073f91cb338b860307b4db874e703bbdf96a8750c6Werner Lemberg    AF_LatinAxisRec     axis[AF_DIMENSION_MAX];
1088ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
109d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  } AF_LatinMetricsRec, *AF_LatinMetrics;
110d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
111d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
112d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( FT_Error )
113d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  af_latin_metrics_init( AF_LatinMetrics  metrics,
114d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner                         FT_Face          face );
115d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
116d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( void )
117d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  af_latin_metrics_scale( AF_LatinMetrics  metrics,
118d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner                          AF_Scaler        scaler );
119d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
1204cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一)  FT_LOCAL( void )
1214cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一)  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
122553bb3c3caa38bf73d01f5c3a3ebe5a96070f527Werner Lemberg                                FT_Face          face );
123d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
1248b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg  FT_LOCAL( void )
1258b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
1268b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg                                 FT_Face          face );
1278b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg
128d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
129b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
130b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
131b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
132b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
133b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
134b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
135b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
136d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
13781e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_HORZ_SNAP    ( 1U << 0 ) /* stem width snapping  */
13881e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_VERT_SNAP    ( 1U << 1 ) /* stem height snapping */
13981e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_STEM_ADJUST  ( 1U << 2 ) /* stem width/height    */
14081e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg                                                /* adjustment           */
14181e5ff53a89b454a3984a7181516dfb4cb22187aWerner Lemberg#define AF_LATIN_HINTS_MONO         ( 1U << 3 ) /* monochrome rendering */
142cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
143cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
144b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \
145b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
146cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
147b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \
148b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
149cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
150b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \
151b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
152cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
153b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_MONO( h )             \
154b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
155d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
156b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
157b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*
1585a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg   *  The next functions shouldn't normally be exported.  However, other
159974b193bcc6f9ca10097a646fdea7d26cd95c830Werner Lemberg   *  writing systems might like to use these functions as-is.
160b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   */
161b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
162ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_compute_segments( AF_GlyphHints  hints,
163ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                   AF_Dimension   dim );
164d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
165d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( void )
166ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_link_segments( AF_GlyphHints  hints,
16771f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                FT_UInt        width_count,
16871f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                AF_WidthRec*   widths,
169ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                AF_Dimension   dim );
170d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
171b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
172ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_compute_edges( AF_GlyphHints  hints,
173ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                AF_Dimension   dim );
174d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
175b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
176ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_detect_features( AF_GlyphHints  hints,
17771f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                  FT_UInt        width_count,
17871f53e122b83cbe3033f47a2f283d207492c87b0Werner Lemberg                                  AF_WidthRec*   widths,
179ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                  AF_Dimension   dim );
180d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
181d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner/* */
182d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
183d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_END_HEADER
184d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
185d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#endif /* __AFLATIN_H__ */
186b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
187b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
188b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg/* END */
189