adding Owen Taylor's patches to the Postscript hinter for testing
This commit is contained in:
parent
26438805c7
commit
9f7d079c89
@ -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
|
||||
{
|
||||
|
@ -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
1722
src/pshinter/pshalgo3.c
Normal file
File diff suppressed because it is too large
Load Diff
202
src/pshinter/pshalgo3.h
Normal file
202
src/pshinter/pshalgo3.h
Normal 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 */
|
@ -23,6 +23,7 @@
|
||||
#include "pshglob.c"
|
||||
#include "pshalgo1.c"
|
||||
#include "pshalgo2.c"
|
||||
#include "pshalgo3.c"
|
||||
#include "pshmod.c"
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user