1 /***************************************************************************/ 2 /* */ 3 /* afcjk.h */ 4 /* */ 5 /* Auto-fitter hinting routines for CJK writing system (specification). */ 6 /* */ 7 /* Copyright 2006, 2007, 2011-2014 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 enum 59 { 60 AF_CJK_BLUE_ACTIVE = 1 << 0, /* set if zone height is <= 3/4px */ 61 AF_CJK_BLUE_TOP = 1 << 1, /* result of AF_CJK_IS_TOP_BLUE */ 62 AF_CJK_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ 63 /* optimization */ 64 AF_CJK_BLUE_FLAG_MAX 65 }; 66 67 68 typedef struct AF_CJKBlueRec_ 69 { 70 AF_WidthRec ref; 71 AF_WidthRec shoot; /* undershoot */ 72 FT_UInt flags; 73 74 } AF_CJKBlueRec, *AF_CJKBlue; 75 76 77 typedef struct AF_CJKAxisRec_ 78 { 79 FT_Fixed scale; 80 FT_Pos delta; 81 82 FT_UInt width_count; /* number of used widths */ 83 AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ 84 FT_Pos edge_distance_threshold; /* used for creating edges */ 85 FT_Pos standard_width; /* the default stem thickness */ 86 FT_Bool extra_light; /* is standard width very light? */ 87 88 /* used for horizontal metrics too for CJK */ 89 FT_Bool control_overshoot; 90 FT_UInt blue_count; 91 AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; 92 93 FT_Fixed org_scale; 94 FT_Pos org_delta; 95 96 } AF_CJKAxisRec, *AF_CJKAxis; 97 98 99 typedef struct AF_CJKMetricsRec_ 100 { 101 AF_StyleMetricsRec root; 102 FT_UInt units_per_em; 103 AF_CJKAxisRec axis[AF_DIMENSION_MAX]; 104 105 } AF_CJKMetricsRec, *AF_CJKMetrics; 106 107 108 #ifdef AF_CONFIG_OPTION_CJK 109 FT_LOCAL( FT_Error ) 110 af_cjk_metrics_init( AF_CJKMetrics metrics, 111 FT_Face face ); 112 113 FT_LOCAL( void ) 114 af_cjk_metrics_scale( AF_CJKMetrics metrics, 115 AF_Scaler scaler ); 116 117 FT_LOCAL( FT_Error ) 118 af_cjk_hints_init( AF_GlyphHints hints, 119 AF_CJKMetrics metrics ); 120 121 FT_LOCAL( FT_Error ) 122 af_cjk_hints_apply( AF_GlyphHints hints, 123 FT_Outline* outline, 124 AF_CJKMetrics metrics ); 125 126 /* shared; called from afindic.c */ 127 FT_LOCAL( void ) 128 af_cjk_metrics_check_digits( AF_CJKMetrics metrics, 129 FT_Face face ); 130 131 FT_LOCAL( void ) 132 af_cjk_metrics_init_widths( AF_CJKMetrics metrics, 133 FT_Face face ); 134 #endif /* AF_CONFIG_OPTION_CJK */ 135 136 137 /* */ 138 139 FT_END_HEADER 140 141 #endif /* __AFCJK_H__ */ 142 143 144 /* END */ 145