adding Owen Taylor's patches to the Postscript hinter for testing

This commit is contained in:
David Turner 2002-07-03 21:00:26 +00:00
parent 9a08f7054d
commit f9334dae32
7 changed files with 1946 additions and 9 deletions

View File

@ -10,7 +10,7 @@ SubDirHdrs [ FT2_SubDir src pshinter ] ;
if $(FT2_MULTI)
{
_sources = pshrec pshglob pshalgo1 pshalgo2 pshmod ;
_sources = pshrec pshglob pshalgo1 pshalgo2 pshalgo3 pshmod ;
}
else
{

View File

@ -22,17 +22,26 @@
FT_BEGIN_HEADER
/* define to choose hinting algorithm */
#define PSH_ALGORITHM_2
#define PSH_ALGORITHM_3
#ifdef PSH_ALGORITHM_1
#if defined(PSH_ALGORITHM_1)
#include "pshalgo1.h"
#define PS_HINTS_APPLY_FUNC ps1_hints_apply
# include "pshalgo1.h"
# define PS_HINTS_APPLY_FUNC ps1_hints_apply
#elif defined(PSH_ALGORITHM_2)
# include "pshalgo2.h"
# define PS_HINTS_APPLY_FUNC ps2_hints_apply
#elif defined(PSH_ALGORITHM_3)
# include "pshalgo3.h"
# define PS_HINTS_APPLY_FUNC ps3_hints_apply
#else
#include "pshalgo2.h"
#define PS_HINTS_APPLY_FUNC ps2_hints_apply
# error "invalid Postscript Hinter algorithm selection"
#endif

1722
src/pshinter/pshalgo3.c Normal file

File diff suppressed because it is too large Load Diff

202
src/pshinter/pshalgo3.h Normal file
View File

@ -0,0 +1,202 @@
/***************************************************************************/
/* */
/* pshalgo3.h */
/* */
/* PostScript hinting algorithm 3 (specification). */
/* */
/* 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 __PSHALGO3_H__
#define __PSHALGO3_H__
#include "pshrec.h"
#include "pshglob.h"
#include FT_TRIGONOMETRY_H
FT_BEGIN_HEADER
typedef struct PSH3_HintRec_* PSH3_Hint;
typedef enum
{
PSH3_HINT_GHOST = PS_HINT_FLAG_GHOST,
PSH3_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
PSH3_HINT_ACTIVE = 4,
PSH3_HINT_FITTED = 8
} PSH3_Hint_Flags;
#define psh3_hint_is_active( x ) ( ( (x)->flags & PSH3_HINT_ACTIVE ) != 0 )
#define psh3_hint_is_ghost( x ) ( ( (x)->flags & PSH3_HINT_GHOST ) != 0 )
#define psh3_hint_is_fitted( x ) ( ( (x)->flags & PSH3_HINT_FITTED ) != 0 )
#define psh3_hint_activate( x ) (x)->flags |= PSH3_HINT_ACTIVE
#define psh3_hint_deactivate( x ) (x)->flags &= ~PSH3_HINT_ACTIVE
#define psh3_hint_set_fitted( x ) (x)->flags |= PSH3_HINT_FITTED
typedef struct PSH3_HintRec_
{
FT_Int org_pos;
FT_Int org_len;
FT_Pos cur_pos;
FT_Pos cur_len;
FT_UInt flags;
PSH3_Hint parent;
FT_Int order;
} PSH3_HintRec;
/* this is an interpolation zone used for strong points; */
/* weak points are interpolated according to their strong */
/* neighbours */
typedef struct PSH3_ZoneRec_
{
FT_Fixed scale;
FT_Fixed delta;
FT_Pos min;
FT_Pos max;
} PSH3_ZoneRec, *PSH3_Zone;
typedef struct PSH3_Hint_TableRec_
{
FT_UInt max_hints;
FT_UInt num_hints;
PSH3_Hint hints;
PSH3_Hint* sort;
PSH3_Hint* sort_global;
FT_UInt num_zones;
PSH3_Zone zones;
PSH3_Zone zone;
PS_Mask_Table hint_masks;
PS_Mask_Table counter_masks;
} PSH3_Hint_TableRec, *PSH3_Hint_Table;
typedef struct PSH3_PointRec_* PSH3_Point;
typedef struct PSH3_ContourRec_* PSH3_Contour;
enum
{
PSH3_DIR_NONE = 4,
PSH3_DIR_UP = 1,
PSH3_DIR_DOWN = -1,
PSH3_DIR_LEFT = -2,
PSH3_DIR_RIGHT = 2
};
enum
{
PSH3_POINT_OFF = 1, /* point is off the curve */
PSH3_POINT_STRONG = 2, /* point is strong */
PSH3_POINT_SMOOTH = 4, /* point is smooth */
PSH3_POINT_FITTED = 8 /* point is already fitted */
};
typedef struct PSH3_PointRec_
{
PSH3_Point prev;
PSH3_Point next;
PSH3_Contour contour;
FT_UInt flags;
FT_Char dir_in;
FT_Char dir_out;
FT_Angle angle_in;
FT_Angle angle_out;
PSH3_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
} PSH3_PointRec;
#define psh3_point_is_strong( p ) ( (p)->flags & PSH3_POINT_STRONG )
#define psh3_point_is_fitted( p ) ( (p)->flags & PSH3_POINT_FITTED )
#define psh3_point_is_smooth( p ) ( (p)->flags & PSH3_POINT_SMOOTH )
#define psh3_point_set_strong( p ) (p)->flags |= PSH3_POINT_STRONG
#define psh3_point_set_fitted( p ) (p)->flags |= PSH3_POINT_FITTED
#define psh3_point_set_smooth( p ) (p)->flags |= PSH3_POINT_SMOOTH
typedef struct PSH3_ContourRec_
{
PSH3_Point start;
FT_UInt count;
} PSH3_ContourRec;
typedef struct PSH3_GlyphRec_
{
FT_UInt num_points;
FT_UInt num_contours;
PSH3_Point points;
PSH3_Contour contours;
FT_Memory memory;
FT_Outline* outline;
PSH_Globals globals;
PSH3_Hint_TableRec hint_tables[2];
FT_Bool vertical;
FT_Int major_dir;
FT_Int minor_dir;
} PSH3_GlyphRec, *PSH3_Glyph;
#ifdef DEBUG_HINTER
extern PSH3_Hint_Table ps3_debug_hint_table;
typedef void
(*PSH3_HintFunc)( PSH3_Hint hint,
FT_Bool vertical );
extern PSH3_HintFunc ps3_debug_hint_func;
extern PSH3_Glyph ps3_debug_glyph;
#endif
extern FT_Error
ps3_hints_apply( PS_Hints ps_hints,
FT_Outline* outline,
PSH_Globals globals );
FT_END_HEADER
#endif /* __PSHALGO3_H__ */
/* END */

View File

@ -23,6 +23,7 @@
#include "pshglob.c"
#include "pshalgo1.c"
#include "pshalgo2.c"
#include "pshalgo3.c"
#include "pshmod.c"

View File

@ -30,7 +30,8 @@ PSHINTER_DRV_SRC := $(PSHINTER_DIR_)pshrec.c \
$(PSHINTER_DIR_)pshglob.c \
$(PSHINTER_DIR_)pshmod.c \
$(PSHINTER_DIR_)pshalgo1.c \
$(PSHINTER_DIR_)pshalgo2.c
$(PSHINTER_DIR_)pshalgo2.c \
$(PSHINTER_DIR_)pshalgo3.c
# PSHINTER driver headers

View File

@ -130,15 +130,17 @@ init_symbols( void )
nv_path_new_rectangle( renderer, -1, -1, 3, 3, 0, 0, &symbol_square );
nv_path_new_rectangle( renderer, -1, -6, 2, 12, 0, 0, &symbol_rect_v );
nv_path_new_rectangle( renderer, -6, -1, 12, 2, 0, 0, &symbol_rect_h );
nv_path_new_circle( renderer, 0, 0, 3., &symbol_dot );
nv_path_stroke( symbol_dot, 0.6,
nv_path_linecap_butt,
nv_path_linejoin_miter, 1.,
&symbol_circle );
nv_path_destroy( symbol_dot );
nv_path_new_circle( renderer, 0, 0, 2., &symbol_dot );
nv_path_new_circle( renderer, 0, 0, 2., &symbol_dot );
}
static void