186 lines
5.3 KiB
C
186 lines
5.3 KiB
C
|
/***************************************************************************/
|
||
|
/* */
|
||
|
/* pshalgo2.h */
|
||
|
/* */
|
||
|
/* First (basic) Postscript hinting routines */
|
||
|
/* */
|
||
|
/* Copyright 2001 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. */
|
||
|
/* */
|
||
|
/***************************************************************************/
|
||
|
|
||
|
#ifndef __PS_HINTER_ALGO2_H__
|
||
|
#define __PS_HINTER_ALGO2_H__
|
||
|
|
||
|
#include "pshrec.h"
|
||
|
#include "pshglob.h"
|
||
|
#include FT_TRIGONOMETRY_H
|
||
|
|
||
|
FT_BEGIN_HEADER
|
||
|
|
||
|
typedef struct PSH2_HintRec_* PSH2_Hint;
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
PSH2_HINT_GHOST = PS_HINT_FLAG_GHOST,
|
||
|
PSH2_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
|
||
|
PSH2_HINT_ACTIVE = 4,
|
||
|
PSH2_HINT_FITTED = 8
|
||
|
} PSH2_Hint_Flags;
|
||
|
|
||
|
#define psh2_hint_is_active(x) (((x)->flags & PSH2_HINT_ACTIVE) != 0)
|
||
|
#define psh2_hint_is_ghost(x) (((x)->flags & PSH2_HINT_GHOST) != 0)
|
||
|
#define psh2_hint_is_fitted(x) (((x)->flags & PSH2_HINT_FITTED) != 0)
|
||
|
|
||
|
#define psh2_hint_activate(x) (x)->flags |= PSH2_HINT_ACTIVE
|
||
|
#define psh2_hint_deactivate(x) (x)->flags &= ~PSH2_HINT_ACTIVE
|
||
|
#define psh2_hint_set_fitted(x) (x)->flags |= PSH2_HINT_FITTED
|
||
|
|
||
|
typedef struct PSH2_HintRec_
|
||
|
{
|
||
|
FT_Int org_pos;
|
||
|
FT_Int org_len;
|
||
|
FT_Pos cur_pos;
|
||
|
FT_Pos cur_len;
|
||
|
FT_UInt flags;
|
||
|
PSH2_Hint parent;
|
||
|
FT_Int order;
|
||
|
|
||
|
} PSH2_HintRec;
|
||
|
|
||
|
|
||
|
/* this is an interpolation zone used for strong points */
|
||
|
/* weak points are interpolated according to their strong */
|
||
|
/* neighbours.. */
|
||
|
typedef struct PSH2_ZoneRec_
|
||
|
{
|
||
|
FT_Fixed scale;
|
||
|
FT_Fixed delta;
|
||
|
FT_Pos min;
|
||
|
FT_Pos max;
|
||
|
|
||
|
} PSH2_ZoneRec, *PSH2_Zone;
|
||
|
|
||
|
|
||
|
typedef struct PSH2_Hint_TableRec_
|
||
|
{
|
||
|
FT_UInt max_hints;
|
||
|
FT_UInt num_hints;
|
||
|
PSH2_Hint hints;
|
||
|
PSH2_Hint* sort;
|
||
|
PSH2_Hint* sort_global;
|
||
|
FT_UInt num_zones;
|
||
|
PSH2_Zone zones;
|
||
|
PSH2_Zone zone;
|
||
|
PS_Mask_Table hint_masks;
|
||
|
PS_Mask_Table counter_masks;
|
||
|
|
||
|
} PSH2_Hint_TableRec, *PSH2_Hint_Table;
|
||
|
|
||
|
typedef struct PSH2_PointRec_* PSH2_Point;
|
||
|
typedef struct PSH2_ContourRec_* PSH2_Contour;
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
PSH2_DIR_NONE = 4,
|
||
|
PSH2_DIR_UP = 1,
|
||
|
PSH2_DIR_DOWN = -1,
|
||
|
PSH2_DIR_LEFT = -2,
|
||
|
PSH2_DIR_RIGHT = 2
|
||
|
};
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
PSH2_POINT_OFF = 1, /* point is off the curve */
|
||
|
PSH2_POINT_STRONG = 2, /* point is strong */
|
||
|
PSH2_POINT_SMOOTH = 4, /* point is smooth */
|
||
|
PSH2_POINT_FITTED = 8 /* point is already fitted */
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct PSH2_PointRec_
|
||
|
{
|
||
|
PSH2_Point prev;
|
||
|
PSH2_Point next;
|
||
|
PSH2_Contour contour;
|
||
|
FT_UInt flags;
|
||
|
FT_Char dir_in;
|
||
|
FT_Char dir_out;
|
||
|
FT_Angle angle_in;
|
||
|
FT_Angle angle_out;
|
||
|
PSH2_Hint hint;
|
||
|
FT_Pos org_u;
|
||
|
FT_Pos cur_u;
|
||
|
#ifdef DEBUG_HINTER
|
||
|
FT_Pos org_x;
|
||
|
FT_Pos cur_x;
|
||
|
FT_Pos org_y;
|
||
|
FT_Pos cur_y;
|
||
|
FT_UInt flags_x;
|
||
|
FT_UInt flags_y;
|
||
|
#endif
|
||
|
|
||
|
} PSH2_PointRec;
|
||
|
|
||
|
#define psh2_point_is_strong(p) ((p)->flags & PSH2_POINT_STRONG)
|
||
|
#define psh2_point_is_fitted(p) ((p)->flags & PSH2_POINT_FITTED)
|
||
|
#define psh2_point_is_smooth(p) ((p)->flags & PSH2_POINT_SMOOTH)
|
||
|
|
||
|
#define psh2_point_set_strong(p) (p)->flags |= PSH2_POINT_STRONG
|
||
|
#define psh2_point_set_fitted(p) (p)->flags |= PSH2_POINT_FITTED
|
||
|
#define psh2_point_set_smooth(p) (p)->flags |= PSH2_POINT_SMOOTH
|
||
|
|
||
|
typedef struct PSH2_ContourRec_
|
||
|
{
|
||
|
PSH2_Point start;
|
||
|
FT_UInt count;
|
||
|
|
||
|
} PSH2_ContourRec;
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct PSH2_GlyphRec_
|
||
|
{
|
||
|
FT_UInt num_points;
|
||
|
FT_UInt num_contours;
|
||
|
|
||
|
PSH2_Point points;
|
||
|
PSH2_Contour contours;
|
||
|
|
||
|
FT_Memory memory;
|
||
|
FT_Outline* outline;
|
||
|
PSH_Globals globals;
|
||
|
PSH2_Hint_TableRec hint_tables[2];
|
||
|
|
||
|
FT_Bool vertical;
|
||
|
FT_Int major_dir;
|
||
|
FT_Int minor_dir;
|
||
|
|
||
|
} PSH2_GlyphRec, *PSH2_Glyph;
|
||
|
|
||
|
|
||
|
#ifdef DEBUG_HINTER
|
||
|
extern PSH2_Hint_Table ps2_debug_hint_table;
|
||
|
|
||
|
typedef void (*PSH2_HintFunc)( PSH2_Hint hint, FT_Bool vertical );
|
||
|
extern PSH2_HintFunc ps2_debug_hint_func;
|
||
|
|
||
|
extern PSH2_Glyph ps2_debug_glyph;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
extern FT_Error
|
||
|
ps2_hints_apply( PS_Hints ps_hints,
|
||
|
FT_Outline* outline,
|
||
|
PSH_Globals globals );
|
||
|
|
||
|
FT_END_HEADER
|
||
|
|
||
|
#endif /* __PS_HINTS_ALGO_2_H__ */
|