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
26FT_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 extra_light; /* 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
136FT_END_HEADER
137
138#endif /* AFCJK_H_ */
139
140
141/* END */
142