forked from minhngoc25a/freetype2
adding Owen Taylor's patches to the Postscript hinter for testing
This commit is contained in:
parent
9a08f7054d
commit
f9334dae32
|
@ -10,7 +10,7 @@ SubDirHdrs [ FT2_SubDir src pshinter ] ;
|
||||||
|
|
||||||
if $(FT2_MULTI)
|
if $(FT2_MULTI)
|
||||||
{
|
{
|
||||||
_sources = pshrec pshglob pshalgo1 pshalgo2 pshmod ;
|
_sources = pshrec pshglob pshalgo1 pshalgo2 pshalgo3 pshmod ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,17 +22,26 @@
|
||||||
FT_BEGIN_HEADER
|
FT_BEGIN_HEADER
|
||||||
|
|
||||||
/* define to choose hinting algorithm */
|
/* 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"
|
# include "pshalgo1.h"
|
||||||
#define PS_HINTS_APPLY_FUNC ps1_hints_apply
|
# 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
|
#else
|
||||||
|
|
||||||
#include "pshalgo2.h"
|
# error "invalid Postscript Hinter algorithm selection"
|
||||||
#define PS_HINTS_APPLY_FUNC ps2_hints_apply
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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 "pshglob.c"
|
||||||
#include "pshalgo1.c"
|
#include "pshalgo1.c"
|
||||||
#include "pshalgo2.c"
|
#include "pshalgo2.c"
|
||||||
|
#include "pshalgo3.c"
|
||||||
#include "pshmod.c"
|
#include "pshmod.c"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,8 @@ PSHINTER_DRV_SRC := $(PSHINTER_DIR_)pshrec.c \
|
||||||
$(PSHINTER_DIR_)pshglob.c \
|
$(PSHINTER_DIR_)pshglob.c \
|
||||||
$(PSHINTER_DIR_)pshmod.c \
|
$(PSHINTER_DIR_)pshmod.c \
|
||||||
$(PSHINTER_DIR_)pshalgo1.c \
|
$(PSHINTER_DIR_)pshalgo1.c \
|
||||||
$(PSHINTER_DIR_)pshalgo2.c
|
$(PSHINTER_DIR_)pshalgo2.c \
|
||||||
|
$(PSHINTER_DIR_)pshalgo3.c
|
||||||
|
|
||||||
|
|
||||||
# PSHINTER driver headers
|
# 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, -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, -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_rectangle( renderer, -6, -1, 12, 2, 0, 0, &symbol_rect_h );
|
||||||
|
|
||||||
nv_path_new_circle( renderer, 0, 0, 3., &symbol_dot );
|
nv_path_new_circle( renderer, 0, 0, 3., &symbol_dot );
|
||||||
|
|
||||||
nv_path_stroke( symbol_dot, 0.6,
|
nv_path_stroke( symbol_dot, 0.6,
|
||||||
nv_path_linecap_butt,
|
nv_path_linecap_butt,
|
||||||
nv_path_linejoin_miter, 1.,
|
nv_path_linejoin_miter, 1.,
|
||||||
&symbol_circle );
|
&symbol_circle );
|
||||||
|
|
||||||
nv_path_destroy( symbol_dot );
|
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
|
static void
|
||||||
|
|
Loading…
Reference in New Issue