freetype2/src/type1z/t1hinter.h
David Turner 2dfb5aca28 added a new experimental Type 1 driver. This version sports several
improvements compared to "src/type1". Briefly :

  - the postscript-like interpreter is now gone. We now perform
    pattern-matching to load our font content. The resultant code
    is much faster, smaller, and easier to maintain.

    For a more detailed description, see the comments at the start
    of "src/type1z/t1objs.c"

  - the glyph loader will be greatly simplified really soon, and the
    clumsy hinter will be ditched in favor of a more general auto-hinting
    module (when we get one).

    The goal is to strip down the Type1 driver to about 15-20 Kb.

This is still an experimental version. It is added to the repository
for archiving. You should not try to use it for now (it won't work
because some crucial parts are _knowingly_ ignored for now !).

Note that the "old" type1 driver will probably move to the "demos/src"
directory, in order to show how one can replace one given font driver
at runtime (and to provide the functionality of the "t1dump" program).
2000-01-27 14:02:04 +00:00

381 lines
9.6 KiB
C

/*******************************************************************
*
* 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 */