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 | |
26 | FT_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 ; /* 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 | |
189 | FT_END_HEADER |
190 | |
191 | #endif /* AFLATIN_H_ */ |
192 | |
193 | |
194 | /* END */ |
195 | |