1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
/*******************************************************************
*
* t1hinter.h 1.2
*
* Type1 hinter.
*
* Copyright 1996-1999 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
* modified and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify, or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*
*
* The Hinter is in charge of fitting th scaled outline to the
* pixel grid in order to considerably improve the quality of
* the Type 1 font driver's output..
*
******************************************************************/
#ifndef T1HINTER_H
#define T1HINTER_H
#include <t1objs.h>
#include <t1gload.h>
#ifdef __cplusplus
extern "C" {
#endif
/************************************************************************
*
* <Struct>
* T1_Snap_Zone
*
* <Description>
* A "snap zone" is used to model either a blue zone or a stem width
* at a given character size. It is made of a minimum and maximum
* edge, defined in 26.6 pixels, as well as one "original" and
* "scaled" position.
*
* the position corresponds to the stem width (for stem snap zones)
* or to the blue position (for blue zones)
*
* <Fields>
* orus :: original position in font units
* pix :: current position in sub-pixel units
* min :: minimum boundary in sub-pixel units
* max :: maximim boundary in sub-pixel units
*
************************************************************************/
typedef struct T1_Snap_Zone_
{
T1_Pos orus;
T1_Pos pix;
T1_Pos min;
T1_Pos max;
} T1_Snap_Zone;
/************************************************************************
*
* <Struct>
* T1_Edge
*
* <Description>
* A very simply structure used to model an stem edge
*
* <Fields>
* orus :: original edge position in font units
* pix :: scaled edge position in sub-pixel units
*
************************************************************************/
typedef struct T1_Edge_
{
T1_Pos orus;
T1_Pos pix;
} T1_Edge;
/************************************************************************
*
* <Struct>
* T1_Stem_Hint
*
* <Description>
* A simple structure used to model a stem hint
*
* <Fields>
* min_edge :: the hint's minimum edge
* max_edge :: the hint's maximum edge
* hint_flags :: some flags describing the stem properties
*
* <Note>
* the min and max edges of a ghost stem have the same position,
* even if they're coded in a weird way in the charstrings
*
************************************************************************/
typedef struct T1_Stem_Hint_
{
T1_Edge min_edge;
T1_Edge max_edge;
T1_Int hint_flags;
} T1_Stem_Hint;
#define T1_HINT_FLAG_ACTIVE 1 /* indicates an active stem */
#define T1_HINT_FLAG_MIN_BORDER 2 /* unused for now.. */
#define T1_HINT_FLAG_MAX_BORDER 4 /* unused for now.. */
/* hinter's configuration constants */
#define T1_HINTER_MAX_BLUES 24 /* maximum number of blue zones */
#define T1_HINTER_MAX_SNAPS 16 /* maximum number of stem snap zones */
#define T1_HINTER_MAX_EDGES 64 /* maximum number of stem hints */
/************************************************************************
*
* <Struct>
* T1_Size_Hints
*
* <Description>
* A structure used to model the hinting information related to
* a size object
*
* <Fields>
* supress_overshoots :: a boolean flag to tell when overshoot
* supression should occur.
*
* num_blue_zones :: the total number of blue zones (top+bottom)
* num_bottom_zones :: the number of bottom zones
*
* blue_zones :: the blue zones table. bottom zones are
* stored first in the table, followed by
* all top zones
*
* num_stem_snapH :: number of horizontal stem snap zones
* stem_snapH :: horizontal stem snap zones
*
* num_stem_snapV :: number of vertical stem snap zones
* stem_snapV :: vertical stem snap zones
*
************************************************************************/
struct T1_Size_Hints_
{
T1_Bool supress_overshoots;
T1_Int num_blue_zones;
T1_Int num_bottom_zones;
T1_Snap_Zone blue_zones[ T1_HINTER_MAX_BLUES ];
T1_Int num_snap_widths;
T1_Snap_Zone snap_widths[ T1_HINTER_MAX_SNAPS ];
T1_Int num_snap_heights;
T1_Snap_Zone snap_heights[ T1_HINTER_MAX_SNAPS ];
};
/************************************************************************
*
* <Struct>
* T1_Stem_Table
*
* <Description>
* A simple structure used to model a set of stem hints in a
* single direction during the loading of a given glyph outline.
* Not all stem hints are active at a time. Moreover, stems must
* be sorted regularly
*
* <Fields>
* num_stems :: total number of stems in table
* num_active :: number of active stems in table
*
* stems :: the table of all stems
* sort :: a table of indices into the stems table, used
* to keep a sorted list of the active stems
*
************************************************************************/
typedef struct T1_Stem_Table_
{
T1_Int num_stems;
T1_Int num_active;
T1_Stem_Hint stems[ T1_HINTER_MAX_EDGES ];
T1_Int sort [ T1_HINTER_MAX_EDGES ];
} T1_Stem_Table;
/************************************************************************
*
* <Struct>
* T1_Glyph_Hints
*
* <Description>
* A structure used to model the stem hints of a given glyph outline
* during glyph loading.
*
* <Fields>
* hori_stems :: horizontal stem hints table
* vert_stems :: vertical stem hints table
*
************************************************************************/
struct T1_Glyph_Hints_
{
T1_Stem_Table hori_stems;
T1_Stem_Table vert_stems;
};
/************************************************************************
*
* <Data>
* t1_hinter_funcs
*
* <Description>
* A table containing the address of various functions used during
* the loading of an hinted scaled outline
*
************************************************************************/
LOCAL_DEF
const T1_Hinter_Funcs t1_hinter_funcs;
/************************************************************************
*
* <Function>
* T1_New_Size_Hinter
*
* <Description>
* Allocates a new hinter structure for a given size object
*
* <Input>
* size :: handle to target size object
*
* <Return>
* Error code. 0 means success
*
************************************************************************/
LOCAL_DEF
T1_Error T1_New_Size_Hinter( T1_Size size );
/************************************************************************
*
* <Function>
* T1_Done_Size_Hinter
*
* <Description>
* Releases a given size object's hinter structure
*
* <Input>
* size :: handle to target size object
*
************************************************************************/
LOCAL_DEF
void T1_Done_Size_Hinter( T1_Size size );
/************************************************************************
*
* <Function>
* T1_Reset_Size_Hinter
*
* <Description>
* Recomputes hinting information when a given size object has
* changed its resolutions/char sizes/pixel sizes
*
* <Input>
* size :: handle to size object
*
* <Return>
* Error code. 0 means success
*
************************************************************************/
LOCAL_DEF
T1_Error T1_Reset_Size_Hinter( T1_Size size );
/************************************************************************
*
* <Function>
* T1_New_Glyph_Hinter
*
* <Description>
* Allocates a new hinter structure for a given glyph slot
*
* <Input>
* glyph :: handle to target glyph slot
*
* <Return>
* Error code. 0 means success
*
************************************************************************/
LOCAL_DEF
T1_Error T1_New_Glyph_Hinter( T1_GlyphSlot glyph );
/************************************************************************
*
* <Function>
* T1_Done_Glyph_Hinter
*
* <Description>
* Releases a given glyph slot's hinter structure
*
* <Input>
* glyph :: handle to glyph slot
*
************************************************************************/
LOCAL_DEF
void T1_Done_Glyph_Hinter( T1_GlyphSlot glyph );
/************************************************************************
*
* <Function>
* T1_Hint_Points
*
* <Description>
* this function grid-fits several points in a given Type 1 builder
* at once.
*
* <Input>
* builder :: handle to target Type 1 builder
*
************************************************************************/
LOCAL_DEF
void T1_Hint_Points( T1_Builder* builder );
/************************************************************************
*
* <Function>
* T1_Hint_Stems
*
* <Description>
* This function is used to compute the location of each stem hint
* between the first and second passes of the glyph loader on the
* charstring.
*
* <Input>
* builder :: handle to target builder
*
************************************************************************/
LOCAL_DEF
void T1_Hint_Stems( T1_Builder* builder );
#ifdef __cplusplus
}
#endif
#endif /* T1HINTER_H */