aflatin.h revision 3f542498b2c3d480238bd14fad76e1c3ef83f1b4
1f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/
2f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
3f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  aflatin.h                                                              */
4f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
5f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*    Auto-fitter hinting routines for latin script (specification).       */
6f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
772f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg/*  Copyright 2003-2007, 2009, 2011-2013 by                                */
8f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
10f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  This file is part of the FreeType project, and may only be used,       */
11f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  modified, and distributed under the terms of the FreeType project      */
12f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  this file you indicate that you have read the license and              */
14f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*  understand and accept it fully.                                        */
15f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/*                                                                         */
16f13516c8321b386227414be01e707563e852fc0dWerner Lemberg/***************************************************************************/
17f13516c8321b386227414be01e707563e852fc0dWerner Lemberg
18f13516c8321b386227414be01e707563e852fc0dWerner Lemberg
19d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#ifndef __AFLATIN_H__
20d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#define __AFLATIN_H__
21d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
22d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#include "afhints.h"
23d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
24b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
25d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_BEGIN_HEADER
268ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
2772f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  /* the `latin' writing system */
28b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
2972f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class )
30b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
3172f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg
3272f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  /* the latin-specific script classes */
3372f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg
3472f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  AF_DECLARE_SCRIPT_CLASS( af_latn_script_class )  /* XXX */
35371f5c3b9d49fe82b05d763198a7606f9c9c689dWerner Lemberg  AF_DECLARE_SCRIPT_CLASS( af_hebr_script_class )
3672f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg#if 0
3772f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  AF_DECLARE_SCRIPT_CLASS( af_armn_script_class )
3872f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  AF_DECLARE_SCRIPT_CLASS( af_cyrl_script_class )
3972f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg  AF_DECLARE_SCRIPT_CLASS( af_grek_script_class )
4072f5ff5bbb6f3467baf13e4c014f3f50479e3b96Werner Lemberg#endif
41b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
42b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
436cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg  /* constants are given with units_per_em == 2048 in mind */
446cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg#define AF_LATIN_CONSTANT( metrics, c )                                      \
45d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg  ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 )
46d39fda2b5598fcedf4edab8343b32a30c13b9efaWerner Lemberg
47f9a69132a73bea7a7c1e7726789841acd8235a4bWu, Chia-I (吳佳一)
48b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
49b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
50b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
51b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****            L A T I N   G L O B A L   M E T R I C S            *****/
52b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
53b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
54b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
55b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
56b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
57b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*
58b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   *  The following declarations could be embedded in the file `aflatin.c';
59b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   *  they have been made semi-public to allow alternate script hinters to
60b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   *  re-use some of them.
61b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   */
62b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
63b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
640975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg#define AF_LATIN_IS_TOP_BLUE( b ) \
650975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP )
660975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg#define AF_LATIN_IS_SMALL_TOP_BLUE( b ) \
670975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SMALL_TOP )
683f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg#define AF_LATIN_IS_LONG_BLUE( b ) \
693f542498b2c3d480238bd14fad76e1c3ef83f1b4Werner Lemberg          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
70ff9d2415a7a192520ea198187dbdb6408625e210David Turner
71b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_MAX_WIDTHS  16
72b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
73ff9d2415a7a192520ea198187dbdb6408625e210David Turner
74ff9d2415a7a192520ea198187dbdb6408625e210David Turner  enum
75ff9d2415a7a192520ea198187dbdb6408625e210David Turner  {
766cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    AF_LATIN_BLUE_ACTIVE     = 1 << 0,  /* set if zone height is <= 3/4px */
776cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    AF_LATIN_BLUE_TOP        = 1 << 1,  /* result of AF_LATIN_IS_TOP_BLUE */
786cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    AF_LATIN_BLUE_ADJUSTMENT = 1 << 2,  /* used for scale adjustment      */
796cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg                                        /* optimization                   */
80cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner    AF_LATIN_BLUE_FLAG_MAX
81ff9d2415a7a192520ea198187dbdb6408625e210David Turner  };
82ff9d2415a7a192520ea198187dbdb6408625e210David Turner
83ff9d2415a7a192520ea198187dbdb6408625e210David Turner
84b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinBlueRec_
85ff9d2415a7a192520ea198187dbdb6408625e210David Turner  {
86b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_WidthRec  ref;
87b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_WidthRec  shoot;
88b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    FT_UInt      flags;
898ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
90ff9d2415a7a192520ea198187dbdb6408625e210David Turner  } AF_LatinBlueRec, *AF_LatinBlue;
91ff9d2415a7a192520ea198187dbdb6408625e210David Turner
92d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
93b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinAxisRec_
94d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  {
95ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_Fixed         scale;
96ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_Pos           delta;
978ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
986cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_UInt          width_count;                 /* number of used widths */
996cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */
1006cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Pos           edge_distance_threshold;   /* used for creating edges */
1016cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Pos           standard_width;         /* the default stem thickness */
1026cfbb23ca3665b52357119444a4ba2abd6e489fcWerner Lemberg    FT_Bool          extra_light;         /* is standard width very light? */
1038ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
104b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    /* ignored for horizontal metrics */
105ff9d2415a7a192520ea198187dbdb6408625e210David Turner    FT_UInt          blue_count;
1060975d685ed32225e37068d38f3c8bf66e26d0843Werner Lemberg    AF_LatinBlueRec  blues[AF_BLUE_STRINGSET_MAX];
107ff9d2415a7a192520ea198187dbdb6408625e210David Turner
108f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner    FT_Fixed         org_scale;
109f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner    FT_Pos           org_delta;
110f546bacdcfcadd13c3b93332635530e58fc62ce3David Turner
111d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  } AF_LatinAxisRec, *AF_LatinAxis;
112ff9d2415a7a192520ea198187dbdb6408625e210David Turner
113ff9d2415a7a192520ea198187dbdb6408625e210David Turner
114b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  typedef struct  AF_LatinMetricsRec_
115d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  {
116b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_ScriptMetricsRec  root;
117b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    FT_UInt              units_per_em;
118b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg    AF_LatinAxisRec      axis[AF_DIMENSION_MAX];
1198ccb4552a965821f2e5e9913b9c600322667483cDavid Turner
120d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  } AF_LatinMetricsRec, *AF_LatinMetrics;
121d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
122d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
123d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( FT_Error )
124d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  af_latin_metrics_init( AF_LatinMetrics  metrics,
125d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner                         FT_Face          face );
126d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
127d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( void )
128d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  af_latin_metrics_scale( AF_LatinMetrics  metrics,
129d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner                          AF_Scaler        scaler );
130d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
1314cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一)  FT_LOCAL( void )
1324cdb45c01e35de35c353e05a57c8b9f0eb4e7228Wu, Chia-I (吳佳一)  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
133553bb3c3caa38bf73d01f5c3a3ebe5a96070f527Werner Lemberg                                FT_Face          face );
134d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
1358b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg  FT_LOCAL( void )
1368b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
1378b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg                                 FT_Face          face );
1388b84c9d19fe646b2aafb5d8a57d4d453cfb8966dWerner Lemberg
139d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
140b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
141b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
142b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
143b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
144b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*****                                                               *****/
145b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
146b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*************************************************************************/
147d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
148cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner  enum
149cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner  {
150f13516c8321b386227414be01e707563e852fc0dWerner Lemberg    AF_LATIN_HINTS_HORZ_SNAP   = 1 << 0, /* enable stem width snapping  */
151f13516c8321b386227414be01e707563e852fc0dWerner Lemberg    AF_LATIN_HINTS_VERT_SNAP   = 1 << 1, /* enable stem height snapping */
152f13516c8321b386227414be01e707563e852fc0dWerner Lemberg    AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height    */
153f13516c8321b386227414be01e707563e852fc0dWerner Lemberg                                         /* adjustment                  */
154f13516c8321b386227414be01e707563e852fc0dWerner Lemberg    AF_LATIN_HINTS_MONO        = 1 << 3  /* indicate monochrome         */
155f13516c8321b386227414be01e707563e852fc0dWerner Lemberg                                         /* rendering                   */
156cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner  };
157cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
158cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
159b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \
160b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
161cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
162b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \
163b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
164cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
165b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \
166b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
167cf2c49c80c8337b4326a9a911b2452a88eb23660David Turner
168b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg#define AF_LATIN_HINTS_DO_MONO( h )             \
169b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
170d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
171b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
172b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg  /*
1735a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg   *  The next functions shouldn't normally be exported.  However, other
1745a0af493e49907c8e7434b769a2c92d3f9d2338bWerner Lemberg   *  scripts might like to use these functions as-is.
175b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg   */
176b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
177ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_compute_segments( AF_GlyphHints  hints,
178ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                   AF_Dimension   dim );
179d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
180d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner  FT_LOCAL( void )
181ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_link_segments( AF_GlyphHints  hints,
182ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                AF_Dimension   dim );
183d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
184b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
185ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_compute_edges( AF_GlyphHints  hints,
186ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                AF_Dimension   dim );
187d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
188b9c22aff61a90a17d8ace2dfda5094df31ac860cDavid Turner  FT_LOCAL( FT_Error )
189ff9d2415a7a192520ea198187dbdb6408625e210David Turner  af_latin_hints_detect_features( AF_GlyphHints  hints,
190ff9d2415a7a192520ea198187dbdb6408625e210David Turner                                  AF_Dimension   dim );
191d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
192d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner/* */
193d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
194d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid TurnerFT_END_HEADER
195d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner
196d25ad56d787cd4ecb37a69c64bfb2714458df7fcDavid Turner#endif /* __AFLATIN_H__ */
197b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
198b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg
199b19b0810cd887a4c1036121b0d3e9bb93278a0a9Werner Lemberg/* END */
200