1/****************************************************************************
2 *
3 * aflatin.h
4 *
5 * Auto-fitter hinting routines for latin writing system
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 AFLATIN_H_
21#define AFLATIN_H_
22
23#include "afhints.h"
24
25
26FT_BEGIN_HEADER
27
28 /* the `latin' writing system */
29
30 AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class )
31
32
33 /* constants are given with units_per_em == 2048 in mind */
34#define AF_LATIN_CONSTANT( metrics, c ) \
35 ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 )
36
37
38 /*************************************************************************/
39 /*************************************************************************/
40 /***** *****/
41 /***** L A T I N G L O B A L M E T R I C S *****/
42 /***** *****/
43 /*************************************************************************/
44 /*************************************************************************/
45
46
47 /*
48 * The following declarations could be embedded in the file `aflatin.c';
49 * they have been made semi-public to allow alternate writing system
50 * hinters to re-use some of them.
51 */
52
53
54#define AF_LATIN_IS_TOP_BLUE( b ) \
55 ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP )
56#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \
57 ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP )
58#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \
59 ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL )
60#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \
61 ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT )
62#define AF_LATIN_IS_LONG_BLUE( b ) \
63 ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG )
64
65#define AF_LATIN_MAX_WIDTHS 16
66
67
68#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */
69#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */
70#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript top */
71 /* blue zone */
72#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have neutral blue zone */
73#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustment */
74 /* optimization */
75
76
77 typedef struct AF_LatinBlueRec_
78 {
79 AF_WidthRec ref;
80 AF_WidthRec shoot;
81 FT_Pos ascender;
82 FT_Pos descender;
83 FT_UInt flags;
84
85 } AF_LatinBlueRec, *AF_LatinBlue;
86
87
88 typedef struct AF_LatinAxisRec_
89 {
90 FT_Fixed scale;
91 FT_Pos delta;
92
93 FT_UInt width_count; /* number of used widths */
94 AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */
95 FT_Pos edge_distance_threshold; /* used for creating edges */
96 FT_Pos standard_width; /* the default stem thickness */
97 FT_Bool extra_light; /* is standard width very light? */
98
99 /* ignored for horizontal metrics */
100 FT_UInt blue_count;
101 AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX];
102
103 FT_Fixed org_scale;
104 FT_Pos org_delta;
105
106 } AF_LatinAxisRec, *AF_LatinAxis;
107
108
109 typedef struct AF_LatinMetricsRec_
110 {
111 AF_StyleMetricsRec root;
112 FT_UInt units_per_em;
113 AF_LatinAxisRec axis[AF_DIMENSION_MAX];
114
115 } AF_LatinMetricsRec, *AF_LatinMetrics;
116
117
118 FT_LOCAL( FT_Error )
119 af_latin_metrics_init( AF_StyleMetrics metrics,
120 FT_Face face );
121
122 FT_LOCAL( void )
123 af_latin_metrics_scale( AF_StyleMetrics metrics,
124 AF_Scaler scaler );
125
126 FT_LOCAL( void )
127 af_latin_metrics_init_widths( AF_LatinMetrics metrics,
128 FT_Face face );
129
130 FT_LOCAL( void )
131 af_latin_metrics_check_digits( AF_LatinMetrics metrics,
132 FT_Face face );
133
134
135 /*************************************************************************/
136 /*************************************************************************/
137 /***** *****/
138 /***** L A T I N G L Y P H A N A L Y S I S *****/
139 /***** *****/
140 /*************************************************************************/
141 /*************************************************************************/
142
143#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */
144#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */
145#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */
146 /* adjustment */
147#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */
148
149
150#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \
151 AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
152
153#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \
154 AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
155
156#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \
157 AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
158
159#define AF_LATIN_HINTS_DO_MONO( h ) \
160 AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
161
162
163 /*
164 * The next functions shouldn't normally be exported. However, other
165 * writing systems might like to use these functions as-is.
166 */
167 FT_LOCAL( FT_Error )
168 af_latin_hints_compute_segments( AF_GlyphHints hints,
169 AF_Dimension dim );
170
171 FT_LOCAL( void )
172 af_latin_hints_link_segments( AF_GlyphHints hints,
173 FT_UInt width_count,
174 AF_WidthRec* widths,
175 AF_Dimension dim );
176
177 FT_LOCAL( FT_Error )
178 af_latin_hints_compute_edges( AF_GlyphHints hints,
179 AF_Dimension dim );
180
181 FT_LOCAL( FT_Error )
182 af_latin_hints_detect_features( AF_GlyphHints hints,
183 FT_UInt width_count,
184 AF_WidthRec* widths,
185 AF_Dimension dim );
186
187/* */
188
189FT_END_HEADER
190
191#endif /* AFLATIN_H_ */
192
193
194/* END */
195