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 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_CJKMetrics metrics, 107 FT_Face face ); 108 109 FT_LOCAL( void ) 110 af_cjk_metrics_scale( AF_CJKMetrics metrics, 111 AF_Scaler scaler ); 112 113 FT_LOCAL( FT_Error ) 114 af_cjk_hints_init( AF_GlyphHints hints, 115 AF_CJKMetrics 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_CJKMetrics 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