freetype2/src/autohint/ahtypes.h

443 lines
14 KiB
C
Raw Normal View History

/***************************************************************************/
/* */
/* ahtypes.h */
/* */
/* General types and definitions for the auto-hint module */
/* */
/* Copyright 2000: Catharon Productions Inc. */
/* Author: David Turner */
/* */
/* This file is part of the Catharon Typography Project and shall only */
/* be used, modified, and distributed under the terms of the Catharon */
/* Open Source License that should come with this file under the name */
/* "CatharonLicense.txt". By continuing to use, modify, or distribute */
/* this file you indicate that you have read the license and */
/* understand and accept it fully. */
/* */
/* Note that this license is compatible with the FreeType license */
/* */
/***************************************************************************/
#ifndef AGTYPES_H
#define AGTYPES_H
#include <freetype/internal/ftobjs.h> /* for freetype.h + LOCAL_DEF etc.. */
#ifdef FT_FLAT_COMPILE
#include "ahloader.h" /* glyph loader types & declarations */
#else
#include <autohint/ahloader.h> /* glyph loader types & declarations */
#endif
#define xxDEBUG_AG
#ifdef DEBUG_AG
#include <stdio.h>
#define AH_LOG(x) printf##x
#else
#define AH_LOG(x) /* nothing */
#endif
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/**** ****/
/**** COMPILE-TIME BUILD OPTIONS ****/
/**** ****/
/**** Toggle these configuration macros to experiment with ****/
/**** "features" of the auto-hinter.. ****/
/**** ****/
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/* if this option is defined, only strong interpolation will be used to */
/* place the points between edges. Otherwise, "smooth" points are detected */
/* and later hinted through weak interpolation to correct some unpleasant */
/* artefacts.. */
/* */
#undef AH_OPTION_NO_WEAK_INTERPOLATION
#undef AH_OPTION_NO_STRONG_INTERPOLATION
/* undefine this macro if you don't want to hint the metrics */
/* there is no reason to do this, except for experimentation */
#define AH_HINT_METRICS
/* define this macro if you do not want to insert extra edges at a glyph's */
/* x and y extrema (when there isn't one already available). This help */
/* reduce a number of artefacts and allow hinting of metrics.. */
/* */
#undef AH_OPTION_NO_EXTREMUM_EDGES
/* don't touch for now.. */
#define AH_MAX_WIDTHS 12
#define AH_MAX_HEIGHTS 12
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/**** ****/
/**** TYPES DEFINITIONS ****/
/**** ****/
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/* see agangles.h */
typedef FT_Int AH_Angle;
/* hint flags */
typedef enum AH_Flags_
{
ah_flah_none = 0,
/* bezier control points flags */
ah_flah_conic = 1,
ah_flah_cubic = 2,
ah_flah_control = ah_flah_conic | ah_flah_cubic,
/* extrema flags */
ah_flah_extrema_x = 4,
ah_flah_extrema_y = 8,
/* roundness */
ah_flah_round_x = 16,
ah_flah_round_y = 32,
/* touched */
ah_flah_touch_x = 64,
ah_flah_touch_y = 128,
/* weak interpolation */
ah_flah_weak_interpolation = 256,
/* never remove this one !! */
ah_flah_max
} AH_Flags;
/* edge hint flags */
typedef enum AH_Edge_Flags_
{
ah_edge_normal = 0,
ah_edge_round = 1,
ah_edge_serif = 2,
ah_edge_done = 4
} AH_Edge_Flags;
/* hint directions - the values are computed so that two vectors are */
/* in opposite directions iff "dir1+dir2 == 0" */
typedef enum AH_Direction_
{
ah_dir_none = 4,
ah_dir_right = 1,
ah_dir_left = -1,
ah_dir_up_and_down = 0,
ah_dir_left_and_right = 0,
ah_dir_up = 2,
ah_dir_down = -2
} AH_Direction;
typedef struct AH_Point AH_Point;
typedef struct AH_Segment AH_Segment;
typedef struct AH_Edge AH_Edge;
/***************************************************************************
*
* <Struct>
* AH_Point
*
* <Description>
* A structure used to model an outline point to the AH_Outline type
*
* <Fields>
* flags :: current point hint flags
* ox, oy :: current original scaled coordinates
* fx, fy :: current coordinates in font units
* x, y :: current hinter coordinates
* u, v :: point coordinates - meaning varies with context
*
* in_dir :: direction of inwards vector (prev->point)
* out_dir :: direction of outwards vector (point->next)
*
* in_angle :: angle of inwards vector
* out_angle :: angle of outwards vector
*
* next :: next point in same contour
* prev :: previous point in same contour
*
*/
struct AH_Point
{
AH_Flags flags; /* point flags used by hinter */
FT_Pos ox, oy;
FT_Pos fx, fy;
FT_Pos x, y;
FT_Pos u, v;
AH_Direction in_dir; /* direction of inwards vector */
AH_Direction out_dir; /* direction of outwards vector */
AH_Angle in_angle;
AH_Angle out_angle;
AH_Point* next; /* next point in contour */
AH_Point* prev; /* previous point in contour */
};
/***************************************************************************
*
* <Struct>
* AH_Segment
*
* <Description>
* a structure used to describe an edge segment to the auto-hinter. A
* segment is simply a sequence of successive points located on the same
* horizontal or vertical "position", in a given direction.
*
* <Fields>
* flags :: segment edge flags ( straight, rounded.. )
* dir :: segment direction
*
* first :: first point in segment
* last :: last point in segment
* contour :: ptr to first point of segment's contour
*
* pos :: segment position in font units
* size :: segment size
*
* edge :: edge of current segment
* edge_next :: next segment on same edge
*
* link :: the pairing segment for this edge
* serif :: the primary segment for serifs
* num_linked :: the number of other segments that link to this one
*
* score :: used to score the segment when selecting them..
*
*/
struct AH_Segment
{
AH_Edge_Flags flags;
AH_Direction dir;
AH_Point* first; /* first point in edge segment */
AH_Point* last; /* last point in edge segment */
AH_Point** contour; /* ptr to first point of segment's contour */
FT_Pos pos; /* position of segment */
FT_Pos min_coord; /* minimum coordinate of segment */
FT_Pos max_coord; /* maximum coordinate of segment */
AH_Edge* edge;
AH_Segment* edge_next;
AH_Segment* link; /* link segment */
AH_Segment* serif; /* primary segment for serifs */
FT_Pos num_linked; /* number of linked segments */
FT_Int score;
};
/***************************************************************************
*
* <Struct>
* AH_Edge
*
* <Description>
* a structure used to describe an edge, which really is a horizontal
* or vertical coordinate which will be hinted depending on the segments
* located on it..
*
* <Fields>
* flags :: segment edge flags ( straight, rounded.. )
* dir :: main segment direction on this edge
*
* first :: first edge segment
* last :: last edge segment
*
* fpos :: original edge position in font units
* opos :: original scaled edge position
* pos :: hinted edge position
*
* link :: the linked edge
* serif :: the serif edge
* num_paired :: the number of other edges that pair to this one
*
* score :: used to score the edge when selecting them..
*
* blue_edge :: indicate the blue zone edge this edge is related to
* only set for some of the horizontal edges in a Latin
* font..
*
***************************************************************************/
struct AH_Edge
{
AH_Edge_Flags flags;
AH_Direction dir;
AH_Segment* first;
AH_Segment* last;
FT_Pos fpos;
FT_Pos opos;
FT_Pos pos;
AH_Edge* link;
AH_Edge* serif;
FT_Int num_linked;
FT_Int score;
FT_Pos* blue_edge;
};
/* an outline as seen by the hinter */
typedef struct AH_Outline_
{
FT_Memory memory;
AH_Direction vert_major_dir; /* vertical major direction */
AH_Direction horz_major_dir; /* horizontal major direction */
FT_Fixed x_scale;
FT_Fixed y_scale;
FT_Pos edge_distance_threshold;
FT_Int max_points;
FT_Int num_points;
AH_Point* points;
FT_Int max_contours;
FT_Int num_contours;
AH_Point** contours;
FT_Int num_hedges;
AH_Edge* horz_edges;
FT_Int num_vedges;
AH_Edge* vert_edges;
FT_Int num_hsegments;
AH_Segment* horz_segments;
FT_Int num_vsegments;
AH_Segment* vert_segments;
} AH_Outline;
typedef enum AH_Blue_
{
ah_blue_capital_top, /* THEZOCQS */
ah_blue_capital_bottom, /* HEZLOCUS */
ah_blue_small_top, /* xzroesc */
ah_blue_small_bottom, /* xzroesc */
ah_blue_small_minor, /* pqgjy */
ah_blue_max
} AH_Blue;
typedef enum
{
ah_hinter_monochrome = 1,
ah_hinter_optimize = 2
} AH_Hinter_Flags;
/************************************************************************
*
* <Struct>
* AH_Globals
*
* <Description>
* Holds the global metrics for a given font face (be it in design
* units, or scaled pixel values)..
*
* <Fields>
* num_widths :: number of widths
* num_heights :: number of heights
* widths :: snap widths, including standard one
* heights :: snap height, including standard one
* blue_refs :: reference position of blue zones
* blue_shoots :: overshoot position of blue zones
*
************************************************************************/
typedef struct AH_Globals_
{
FT_Int num_widths;
FT_Int num_heights;
FT_Pos widths [ AH_MAX_WIDTHS ];
FT_Pos heights[ AH_MAX_HEIGHTS ];
FT_Pos blue_refs [ ah_blue_max ];
FT_Pos blue_shoots[ ah_blue_max ];
} AH_Globals;
/************************************************************************
*
* <Struct>
* AH_Face_Globals
*
* <Description>
* Holds the complete global metrics for a given font face (i.e. the
* design units version + a scaled version + the current scales used)
*
* <Fields>
* face :: handle to source face object
* design :: globals in font design units
* scaled :: scaled globals in sub-pixel values
* x_scale :: current horizontal scale
* y_scale :: current vertical scale
*
************************************************************************/
typedef struct AH_Face_Globals_
{
FT_Face face;
AH_Globals design;
AH_Globals scaled;
FT_Fixed x_scale;
FT_Fixed y_scale;
FT_Bool control_overshoot;
} AH_Face_Globals;
typedef struct AH_Hinter
{
FT_Memory memory;
FT_Long flags;
FT_Int algorithm;
FT_Face face;
AH_Face_Globals* globals;
AH_Outline* glyph;
AH_Loader* loader;
FT_Vector pp1;
FT_Vector pp2;
} AH_Hinter;
#endif /* AGTYPES_H */