1 | /**************************************************************************** |
2 | * |
3 | * afcjk.h |
4 | * |
5 | * Auto-fitter hinting routines for CJK writing system (specification). |
6 | * |
7 | * Copyright (C) 2006-2023 by |
8 | * David Turner, Robert Wilhelm, and Werner Lemberg. |
9 | * |
10 | * This file is part of the FreeType project, and may only be used, |
11 | * modified, and distributed under the terms of the FreeType project |
12 | * license, LICENSE.TXT. By continuing to use, modify, or distribute |
13 | * this file you indicate that you have read the license and |
14 | * understand and accept it fully. |
15 | * |
16 | */ |
17 | |
18 | |
19 | #ifndef AFCJK_H_ |
20 | #define AFCJK_H_ |
21 | |
22 | #include "afhints.h" |
23 | #include "aflatin.h" |
24 | |
25 | |
26 | FT_BEGIN_HEADER |
27 | |
28 | |
29 | /* the CJK-specific writing system */ |
30 | |
31 | AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class ) |
32 | |
33 | |
34 | /*************************************************************************/ |
35 | /*************************************************************************/ |
36 | /***** *****/ |
37 | /***** C J K G L O B A L M E T R I C S *****/ |
38 | /***** *****/ |
39 | /*************************************************************************/ |
40 | /*************************************************************************/ |
41 | |
42 | |
43 | /* |
44 | * CJK glyphs tend to fill the square. So we have both vertical and |
45 | * horizontal blue zones. But some glyphs have flat bounding strokes that |
46 | * leave some space between neighbour glyphs. |
47 | */ |
48 | |
49 | #define AF_CJK_IS_TOP_BLUE( b ) \ |
50 | ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP ) |
51 | #define AF_CJK_IS_HORIZ_BLUE( b ) \ |
52 | ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ ) |
53 | #define AF_CJK_IS_RIGHT_BLUE AF_CJK_IS_TOP_BLUE |
54 | |
55 | #define AF_CJK_MAX_WIDTHS 16 |
56 | |
57 | |
58 | #define AF_CJK_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ |
59 | #define AF_CJK_BLUE_TOP ( 1U << 1 ) /* result of AF_CJK_IS_TOP_BLUE */ |
60 | #define AF_CJK_BLUE_ADJUSTMENT ( 1U << 2 ) /* used for scale adjustment */ |
61 | /* optimization */ |
62 | |
63 | |
64 | typedef struct AF_CJKBlueRec_ |
65 | { |
66 | AF_WidthRec ref; |
67 | AF_WidthRec shoot; /* undershoot */ |
68 | FT_UInt flags; |
69 | |
70 | } AF_CJKBlueRec, *AF_CJKBlue; |
71 | |
72 | |
73 | typedef struct AF_CJKAxisRec_ |
74 | { |
75 | FT_Fixed scale; |
76 | FT_Pos delta; |
77 | |
78 | FT_UInt width_count; /* number of used widths */ |
79 | AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ |
80 | FT_Pos edge_distance_threshold; /* used for creating edges */ |
81 | FT_Pos standard_width; /* the default stem thickness */ |
82 | FT_Bool ; /* is standard width very light? */ |
83 | |
84 | /* used for horizontal metrics too for CJK */ |
85 | FT_Bool control_overshoot; |
86 | FT_UInt blue_count; |
87 | AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; |
88 | |
89 | FT_Fixed org_scale; |
90 | FT_Pos org_delta; |
91 | |
92 | } AF_CJKAxisRec, *AF_CJKAxis; |
93 | |
94 | |
95 | typedef struct AF_CJKMetricsRec_ |
96 | { |
97 | AF_StyleMetricsRec root; |
98 | FT_UInt units_per_em; |
99 | AF_CJKAxisRec axis[AF_DIMENSION_MAX]; |
100 | |
101 | } AF_CJKMetricsRec, *AF_CJKMetrics; |
102 | |
103 | |
104 | #ifdef AF_CONFIG_OPTION_CJK |
105 | FT_LOCAL( FT_Error ) |
106 | af_cjk_metrics_init( AF_StyleMetrics metrics, |
107 | FT_Face face ); |
108 | |
109 | FT_LOCAL( void ) |
110 | af_cjk_metrics_scale( AF_StyleMetrics metrics, |
111 | AF_Scaler scaler ); |
112 | |
113 | FT_LOCAL( FT_Error ) |
114 | af_cjk_hints_init( AF_GlyphHints hints, |
115 | AF_StyleMetrics metrics ); |
116 | |
117 | FT_LOCAL( FT_Error ) |
118 | af_cjk_hints_apply( FT_UInt glyph_index, |
119 | AF_GlyphHints hints, |
120 | FT_Outline* outline, |
121 | AF_StyleMetrics metrics ); |
122 | |
123 | /* shared; called from afindic.c */ |
124 | FT_LOCAL( void ) |
125 | af_cjk_metrics_check_digits( AF_CJKMetrics metrics, |
126 | FT_Face face ); |
127 | |
128 | FT_LOCAL( void ) |
129 | af_cjk_metrics_init_widths( AF_CJKMetrics metrics, |
130 | FT_Face face ); |
131 | #endif /* AF_CONFIG_OPTION_CJK */ |
132 | |
133 | |
134 | /* */ |
135 | |
136 | FT_END_HEADER |
137 | |
138 | #endif /* AFCJK_H_ */ |
139 | |
140 | |
141 | /* END */ |
142 | |