| 1 | /***************************************************************************/ |
| 2 | /* */ |
| 3 | /* t1hinter.h */ |
| 4 | /* */ |
| 5 | /* Type 1 hinter (body). */ |
| 6 | /* */ |
| 7 | /* Copyright 1996-2000 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 T1HINTER_H |
| 20 | #define T1HINTER_H |
| 21 | |
| 22 | |
| 23 | #ifdef FT_FLAT_COMPILE |
| 24 | |
| 25 | #include "t1objs.h" |
| 26 | #include "t1gload.h" |
| 27 | |
| 28 | #else |
| 29 | |
| 30 | #include <type1/t1objs.h> |
| 31 | #include <type1/t1gload.h> |
| 32 | |
| 33 | #endif |
| 34 | |
| 35 | |
| 36 | #ifdef __cplusplus |
| 37 | extern "C" { |
| 38 | #endif |
| 39 | |
| 40 | |
| 41 | /*************************************************************************/ |
| 42 | /* */ |
| 43 | /* <Struct> */ |
| 44 | /* T1_Snap_Zone */ |
| 45 | /* */ |
| 46 | /* <Description> */ |
| 47 | /* A `snap zone' is used to model either a blue zone or a stem width */ |
| 48 | /* at a given character size. It is made of a minimum and maximum */ |
| 49 | /* edge, defined in 26.6 pixels, as well as an `original' and */ |
| 50 | /* `scaled' position. */ |
| 51 | /* */ |
| 52 | /* The position corresponds to the stem width (for stem snap zones) */ |
| 53 | /* or to the blue position (for blue zones). */ |
| 54 | /* */ |
| 55 | /* <Fields> */ |
| 56 | /* orus :: The original position in font units. */ |
| 57 | /* */ |
| 58 | /* pix :: The current position in sub-pixel units. */ |
| 59 | /* */ |
| 60 | /* min :: The minimum boundary in sub-pixel units. */ |
| 61 | /* */ |
| 62 | /* max :: The maximum boundary in sub-pixel units. */ |
| 63 | /* */ |
| 64 | typedef struct T1_Snap_Zone_ |
| 65 | { |
| 66 | FT_Pos orus; |
| 67 | FT_Pos pix; |
| 68 | FT_Pos min; |
| 69 | FT_Pos max; |
| 70 | |
| 71 | } T1_Snap_Zone; |
| 72 | |
| 73 | |
| 74 | /*************************************************************************/ |
| 75 | /* */ |
| 76 | /* <Struct> */ |
| 77 | /* T1_Edge */ |
| 78 | /* */ |
| 79 | /* <Description> */ |
| 80 | /* A very simple structure used to model a stem edge. */ |
| 81 | /* */ |
| 82 | /* <Fields> */ |
| 83 | /* orus :: The original edge position in font units. */ |
| 84 | /* */ |
| 85 | /* pix :: The scaled edge position in sub-pixel units. */ |
| 86 | /* */ |
| 87 | typedef struct T1_Edge_ |
| 88 | { |
| 89 | FT_Pos orus; |
| 90 | FT_Pos pix; |
| 91 | |
| 92 | } T1_Edge; |
| 93 | |
| 94 | |
| 95 | /*************************************************************************/ |
| 96 | /* */ |
| 97 | /* <Struct> */ |
| 98 | /* T1_Stem_Hint */ |
| 99 | /* */ |
| 100 | /* <Description> */ |
| 101 | /* A simple structure used to model a stem hint. */ |
| 102 | /* */ |
| 103 | /* <Fields> */ |
| 104 | /* min_edge :: The hint's minimum edge. */ |
| 105 | /* */ |
| 106 | /* max_edge :: The hint's maximum edge. */ |
| 107 | /* */ |
| 108 | /* hint_flags :: Some flags describing the stem properties. */ |
| 109 | /* */ |
| 110 | /* <Note> */ |
| 111 | /* The min and max edges of a ghost stem have the same position, even */ |
| 112 | /* if they are coded in a weird way in the charstrings. */ |
| 113 | /* */ |
| 114 | typedef struct T1_Stem_Hint_ |
| 115 | { |
| 116 | T1_Edge min_edge; |
| 117 | T1_Edge max_edge; |
| 118 | FT_Int hint_flags; |
| 119 | |
| 120 | } T1_Stem_Hint; |
| 121 | |
| 122 | |
| 123 | #define T1_HINT_FLAG_ACTIVE 1 /* indicates an active stem */ |
| 124 | #define T1_HINT_FLAG_MIN_BORDER 2 /* unused for now */ |
| 125 | #define T1_HINT_FLAG_MAX_BORDER 4 /* unused for now */ |
| 126 | |
| 127 | /* hinter's configuration constants */ |
| 128 | #define T1_HINTER_MAX_BLUES 24 /* maximum number of blue zones */ |
| 129 | #define T1_HINTER_MAX_SNAPS 16 /* maximum number of stem snap zones */ |
| 130 | #define T1_HINTER_MAX_EDGES 64 /* maximum number of stem hints */ |
| 131 | |
| 132 | |
| 133 | /*************************************************************************/ |
| 134 | /* */ |
| 135 | /* <Struct> */ |
| 136 | /* T1_Size_Hints */ |
| 137 | /* */ |
| 138 | /* <Description> */ |
| 139 | /* A structure used to model the hinting information related to a size */ |
| 140 | /* object. */ |
| 141 | /* */ |
| 142 | /* <Fields> */ |
| 143 | /* supress_overshoots :: A boolean flag to tell whether overshoot */ |
| 144 | /* supression should occur. */ |
| 145 | /* */ |
| 146 | /* num_blue_zones :: The total number of blue zones (top+bottom). */ |
| 147 | /* */ |
| 148 | /* num_bottom_zones :: The number of bottom zones. */ |
| 149 | /* */ |
| 150 | /* blue_zones :: The blue zones table. Bottom zones are */ |
| 151 | /* stored first in the table, followed by all */ |
| 152 | /* top zones. */ |
| 153 | /* */ |
| 154 | /* num_snap_widths :: The number of horizontal stem snap zones. */ |
| 155 | /* */ |
| 156 | /* snap_widths :: An array of horizontal stem snap zones. */ |
| 157 | /* */ |
| 158 | /* num_snap_heights :: The number of vertical stem snap zones. */ |
| 159 | /* */ |
| 160 | /* snap_heights :: An array of vertical stem snap zones. */ |
| 161 | /* */ |
| 162 | struct T1_Size_Hints_ |
| 163 | { |
| 164 | FT_Bool supress_overshoots; |
| 165 | |
| 166 | FT_Int num_blue_zones; |
| 167 | FT_Int num_bottom_zones; |
| 168 | T1_Snap_Zone blue_zones[T1_HINTER_MAX_BLUES]; |
| 169 | |
| 170 | FT_Int num_snap_widths; |
| 171 | T1_Snap_Zone snap_widths[T1_HINTER_MAX_SNAPS]; |
| 172 | |
| 173 | FT_Int num_snap_heights; |
| 174 | T1_Snap_Zone snap_heights[T1_HINTER_MAX_SNAPS]; |
| 175 | }; |
| 176 | |
| 177 | |
| 178 | /*************************************************************************/ |
| 179 | /* */ |
| 180 | /* <Struct> */ |
| 181 | /* T1_Stem_Table */ |
| 182 | /* */ |
| 183 | /* <Description> */ |
| 184 | /* A simple structure used to model a set of stem hints in a single */ |
| 185 | /* direction during the loading of a given glyph outline. Not all */ |
| 186 | /* stem hints are active at a time. Moreover, stems must be sorted */ |
| 187 | /* regularly. */ |
| 188 | /* */ |
| 189 | /* <Fields> */ |
| 190 | /* num_stems :: The total number of stems in the table. */ |
| 191 | /* */ |
| 192 | /* num_active :: The number of active stems in the table. */ |
| 193 | /* */ |
| 194 | /* stems :: A table of all stems. */ |
| 195 | /* */ |
| 196 | /* sort :: A table of indices into the stems table, used to */ |
| 197 | /* keep a sorted list of the active stems. */ |
| 198 | /* */ |
| 199 | typedef struct T1_Stem_Table_ |
| 200 | { |
| 201 | FT_Int num_stems; |
| 202 | FT_Int num_active; |
| 203 | |
| 204 | T1_Stem_Hint stems[T1_HINTER_MAX_EDGES]; |
| 205 | FT_Int sort [T1_HINTER_MAX_EDGES]; |
| 206 | |
| 207 | } T1_Stem_Table; |
| 208 | |
| 209 | |
| 210 | /*************************************************************************/ |
| 211 | /* */ |
| 212 | /* <Struct> */ |
| 213 | /* T1_Glyph_Hints */ |
| 214 | /* */ |
| 215 | /* <Description> */ |
| 216 | /* A structure used to model the stem hints of a given glyph outline */ |
| 217 | /* during glyph loading. */ |
| 218 | /* */ |
| 219 | /* <Fields> */ |
| 220 | /* hori_stems :: The horizontal stem hints table. */ |
| 221 | /* vert_stems :: The vertical stem hints table. */ |
| 222 | /* */ |
| 223 | struct T1_Glyph_Hints_ |
| 224 | { |
| 225 | T1_Stem_Table hori_stems; |
| 226 | T1_Stem_Table vert_stems; |
| 227 | }; |
| 228 | |
| 229 | |
| 230 | /*************************************************************************/ |
| 231 | /* */ |
| 232 | /* <Data> */ |
| 233 | /* t1_hinter_funcs */ |
| 234 | /* */ |
| 235 | /* <Description> */ |
| 236 | /* A table containing the address of various functions used during */ |
| 237 | /* the loading of an hinted scaled outline. */ |
| 238 | /* */ |
| 239 | extern const T1_Hinter_Funcs t1_hinter_funcs; |
| 240 | |
| 241 | |
| 242 | LOCAL_DEF |
| 243 | FT_Error T1_New_Size_Hinter( T1_Size size ); |
| 244 | |
| 245 | LOCAL_DEF |
| 246 | void T1_Done_Size_Hinter( T1_Size size ); |
| 247 | |
| 248 | LOCAL_DEF |
| 249 | FT_Error T1_Reset_Size_Hinter( T1_Size size ); |
| 250 | |
| 251 | LOCAL_DEF |
| 252 | FT_Error T1_New_Glyph_Hinter( T1_GlyphSlot glyph ); |
| 253 | |
| 254 | LOCAL_DEF |
| 255 | void T1_Done_Glyph_Hinter( T1_GlyphSlot glyph ); |
| 256 | |
| 257 | |
| 258 | LOCAL_DEF |
| 259 | void T1_Hint_Points( T1_Builder* builder ); |
| 260 | |
| 261 | LOCAL_DEF |
| 262 | void T1_Hint_Stems( T1_Builder* builder ); |
| 263 | |
| 264 | |
| 265 | #ifdef __cplusplus |
| 266 | } |
| 267 | #endif |
| 268 | |
| 269 | |
| 270 | #endif /* T1HINTER_H */ |
| 271 | |
| 272 | |
| 273 | /* END */ |