Imported Upstream version 2.13.2
[platform/upstream/freetype2.git] / src / autofit / afglobal.h
1 /****************************************************************************
2  *
3  * afglobal.h
4  *
5  *   Auto-fitter routines to compute global hinting values
6  *   (specification).
7  *
8  * Copyright (C) 2003-2023 by
9  * David Turner, Robert Wilhelm, and Werner Lemberg.
10  *
11  * This file is part of the FreeType project, and may only be used,
12  * modified, and distributed under the terms of the FreeType project
13  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
14  * this file you indicate that you have read the license and
15  * understand and accept it fully.
16  *
17  */
18
19
20 #ifndef AFGLOBAL_H_
21 #define AFGLOBAL_H_
22
23
24 #include "aftypes.h"
25 #include "afmodule.h"
26 #include "afshaper.h"
27
28
29 FT_BEGIN_HEADER
30
31
32   FT_LOCAL_ARRAY( AF_WritingSystemClass )
33   af_writing_system_classes[];
34
35
36 #undef  SCRIPT
37 #define SCRIPT( s, S, d, h, H, ss )                            \
38           AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class )
39
40 #include "afscript.h"
41
42   FT_LOCAL_ARRAY( AF_ScriptClass )
43   af_script_classes[];
44
45
46 #undef  STYLE
47 #define STYLE( s, S, d, ws, sc, ss, c )                      \
48           AF_DECLARE_STYLE_CLASS( af_ ## s ## _style_class )
49
50 #include "afstyles.h"
51
52   FT_LOCAL_ARRAY( AF_StyleClass )
53   af_style_classes[];
54
55
56 #ifdef FT_DEBUG_LEVEL_TRACE
57   FT_LOCAL_ARRAY( char* )
58   af_style_names[];
59 #endif
60
61
62   /*
63    * Default values and flags for both autofitter globals (found in
64    * AF_ModuleRec) and face globals (in AF_FaceGlobalsRec).
65    */
66
67   /* index of fallback style in `af_style_classes' */
68 #ifdef AF_CONFIG_OPTION_CJK
69 #define AF_STYLE_FALLBACK    AF_STYLE_HANI_DFLT
70 #else
71 #define AF_STYLE_FALLBACK    AF_STYLE_NONE_DFLT
72 #endif
73   /* default script for OpenType; ignored if HarfBuzz isn't used */
74 #define AF_SCRIPT_DEFAULT    AF_SCRIPT_LATN
75
76   /* a bit mask for AF_DIGIT and AF_NONBASE */
77 #define AF_STYLE_MASK        0x3FFF
78   /* an uncovered glyph      */
79 #define AF_STYLE_UNASSIGNED  AF_STYLE_MASK
80
81   /* if this flag is set, we have an ASCII digit   */
82 #define AF_DIGIT             0x8000U
83   /* if this flag is set, we have a non-base character */
84 #define AF_NONBASE           0x4000U
85
86   /* `increase-x-height' property */
87 #define AF_PROP_INCREASE_X_HEIGHT_MIN  6
88 #define AF_PROP_INCREASE_X_HEIGHT_MAX  0
89
90
91   /************************************************************************/
92   /************************************************************************/
93   /*****                                                              *****/
94   /*****                  F A C E   G L O B A L S                     *****/
95   /*****                                                              *****/
96   /************************************************************************/
97   /************************************************************************/
98
99
100   /*
101    * Note that glyph_styles[] maps each glyph to an index into the
102    * `af_style_classes' array.
103    *
104    */
105   typedef struct  AF_FaceGlobalsRec_
106   {
107     FT_Face          face;
108     FT_UInt          glyph_count;    /* unsigned face->num_glyphs */
109     FT_UShort*       glyph_styles;
110
111 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
112     hb_font_t*       hb_font;
113     hb_buffer_t*     hb_buf;           /* for feature comparison */
114 #endif
115
116     /* per-face auto-hinter properties */
117     FT_UInt          increase_x_height;
118
119     AF_StyleMetrics  metrics[AF_STYLE_MAX];
120
121     /* Compute darkening amount once per size.  Use this to check whether */
122     /* darken_{x,y} needs to be recomputed.                               */
123     FT_UShort        stem_darkening_for_ppem;
124     /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_HORZ] */
125     /* to compute the darkening amount.                       */
126     FT_Pos           standard_vertical_width;
127     /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_VERT] */
128     /* to compute the darkening amount.                       */
129     FT_Pos           standard_horizontal_width;
130     /* The actual amount to darken a glyph along the X axis. */
131     FT_Pos           darken_x;
132     /* The actual amount to darken a glyph along the Y axis. */
133     FT_Pos           darken_y;
134     /* Amount to scale down by to keep emboldened points */
135     /* on the Y-axis in pre-computed blue zones.         */
136     FT_Fixed         scale_down_factor;
137     AF_Module        module;         /* to access global properties */
138
139   } AF_FaceGlobalsRec;
140
141
142   /*
143    * model the global hints data for a given face, decomposed into
144    * style-specific items
145    */
146
147   FT_LOCAL( FT_Error )
148   af_face_globals_new( FT_Face          face,
149                        AF_FaceGlobals  *aglobals,
150                        AF_Module        module );
151
152   FT_LOCAL( FT_Error )
153   af_face_globals_get_metrics( AF_FaceGlobals    globals,
154                                FT_UInt           gindex,
155                                FT_UInt           options,
156                                AF_StyleMetrics  *ametrics );
157
158   FT_LOCAL( void )
159   af_face_globals_free( void*  globals );
160
161   FT_LOCAL( FT_Bool )
162   af_face_globals_is_digit( AF_FaceGlobals  globals,
163                             FT_UInt         gindex );
164
165   /* */
166
167
168 FT_END_HEADER
169
170 #endif /* AFGLOBAL_H_ */
171
172
173 /* END */