* src/truetype/ttinterp.c (CUR_Func_move_orig): New macro.

(Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New
functions.  Similar to Direct_Move, Direct_Move_X, and
Direct_Move_Y but without touching.
(Compute_Funcs): Use new functions.

(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super,
Round_Super_45): Fix rounding of value zero.

(DO_DIV): Don't use TT_MULDIV.

(Ins_SHC): This instruction actually touches the points.
(Ins_MSIRP): Fix undocumented behaviour.

* src/truetype/ttinterp.h (TT_ExecContextRec): Updated.

* docs/VERSION.DLL: Updated.

* src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and
metrics->y_scale really precise.

(FT_Load_Glyph): Update computation of linearHoriAdvance and
linearVertAdvance.

* src/true/type/ttinterp.c (Update_Max): Use FT_REALLOC.
This commit is contained in:
Werner Lemberg 2003-11-24 22:54:58 +00:00
parent ff9d2415a7
commit be67c4ef33
6 changed files with 188 additions and 62 deletions

View File

@ -1,6 +1,41 @@
2003-11-22 David Turner <david@freetype.org>
2003-11-22 Rogier van Dalen <R.C.van.Dalen@umail.leidenuniv.nl>
* src/autofit/*: more updates
* src/truetype/ttinterp.c (CUR_Func_move_orig): New macro.
(Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New
functions. Similar to Direct_Move, Direct_Move_X, and
Direct_Move_Y but without touching.
(Compute_Funcs): Use new functions.
(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super,
Round_Super_45): Fix rounding of value zero.
(DO_DIV): Don't use TT_MULDIV.
(Ins_SHC): This instruction actually touches the points.
(Ins_MSIRP): Fix undocumented behaviour.
* src/truetype/ttinterp.h (TT_ExecContextRec): Updated.
2003-11-22 Werner Lemberg <wl@gnu.org>
* docs/VERSION.DLL: Updated.
* src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and
metrics->y_scale really precise.
(FT_Load_Glyph): Update computation of linearHoriAdvance and
linearVertAdvance.
* src/true/type/ttinterp.c (Update_Max): Use FT_REALLOC.
2003-11-22 David Turner <david@freetype.org>
* src/autofit/*: More updates.
* include/freetype/freetype.h (FREETYPE_PATCH): Set to 8.
* builds/unix/configure.ac (version_info): Set to 9:6:3.
* README: Updated.
2003-11-13 John A. Boyd Jr. <jaboydjr@netwalk.com>

View File

@ -91,20 +91,19 @@ other release numbers.
old_CPPFLAGS="$CPPFLAGS"
CPPFLAGS=`freetype-config --cflags`
AC_TRY_CPP([
#include <ft2build.h>
#include FT_FREETYPE_H
#if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009
#error Freetype version too low.
#endif
],[
AC_MSG_RESULT(yes)
FREETYPE_LIBS=`freetype-config --libs`
AC_SUBST(FREETYPE_LIBS)
AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library])
CPPFLAGS="$old_CPPFLAGS"
],[
AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])
])
],
[AC_MSG_RESULT(yes)
FREETYPE_LIBS=`freetype-config --libs`
AC_SUBST(FREETYPE_LIBS)
AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library])
CPPFLAGS="$old_CPPFLAGS"],
[AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])])
--- end of VERSION.DLL ---

View File

@ -575,15 +575,14 @@
if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
( face->face_flags & FT_FACE_FLAG_SCALABLE ) )
{
FT_UInt EM = face->units_per_EM;
FT_Size_Metrics* metrics = &face->size->metrics;
slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
(FT_Long)metrics->x_ppem << 16, EM );
metrics->x_scale, 64 );
slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
(FT_Long)metrics->y_ppem << 16, EM );
metrics->y_scale, 64 );
}
if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
@ -2042,11 +2041,11 @@
char_height = 1 * 64;
/* Compute pixel sizes in 26.6 units with rounding */
dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & -64;
dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & -64;
dim_x = ( char_width * horz_resolution + 36 ) / 72;
dim_y = ( char_height * vert_resolution + 36 ) / 72;
metrics->x_ppem = (FT_UShort)( dim_x >> 6 );
metrics->y_ppem = (FT_UShort)( dim_y >> 6 );
metrics->x_ppem = (FT_UShort)( ( dim_x + 32 ) >> 6 );
metrics->y_ppem = (FT_UShort)( ( dim_y + 32 ) >> 6 );
metrics->x_scale = 0x10000L;
metrics->y_scale = 0x10000L;

View File

@ -26,6 +26,7 @@
#include "pfrerror.h"
static FT_Error
pfr_get_kerning( PFR_Face face,
FT_UInt left,
@ -52,15 +53,16 @@
return PFR_Err_Ok;
}
/*
* PFR METRICS SERVICE
*
*/
static FT_Error
pfr_get_advance( PFR_Face face,
FT_UInt gindex,
FT_Pos *aadvance )
pfr_get_advance( PFR_Face face,
FT_UInt gindex,
FT_Pos *aadvance )
{
FT_Error error = PFR_Err_Bad_Argument;
@ -68,12 +70,12 @@
*aadvance = 0;
if ( face )
{
PFR_PhyFont phys = &face->phy_font;
PFR_PhyFont phys = &face->phy_font;
if ( gindex < phys->num_chars )
{
*aadvance = phys->chars[ gindex ].advance;
*aadvance = phys->chars[gindex].advance;
error = 0;
}
}
@ -89,7 +91,7 @@
FT_Fixed *ametrics_x_scale,
FT_Fixed *ametrics_y_scale )
{
PFR_PhyFont phys = &face->phy_font;
PFR_PhyFont phys = &face->phy_font;
FT_Fixed x_scale, y_scale;
FT_Size size = face->root.size;
@ -118,7 +120,7 @@
if ( ametrics_y_scale )
*ametrics_y_scale = y_scale;
return 0;
return PFR_Err_Ok;
}
@ -130,6 +132,7 @@
(FT_PFR_GetAdvanceFunc)pfr_get_advance
};
/*
* SERVICE LIST
*
@ -137,7 +140,7 @@
static const FT_ServiceDescRec pfr_services[] =
{
{ FT_SERVICE_ID_PFR_METRICS, & pfr_metrics_service_rec },
{ FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
{ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PFR },
{ NULL, NULL }
};
@ -177,20 +180,20 @@
sizeof( PFR_SizeRec ),
sizeof( PFR_SlotRec ),
(FT_Face_InitFunc) pfr_face_init,
(FT_Face_DoneFunc) pfr_face_done,
(FT_Size_InitFunc) NULL,
(FT_Size_DoneFunc) NULL,
(FT_Slot_InitFunc) pfr_slot_init,
(FT_Slot_DoneFunc) pfr_slot_done,
(FT_Face_InitFunc) pfr_face_init,
(FT_Face_DoneFunc) pfr_face_done,
(FT_Size_InitFunc) NULL,
(FT_Size_DoneFunc) NULL,
(FT_Slot_InitFunc) pfr_slot_init,
(FT_Slot_DoneFunc) pfr_slot_done,
(FT_Size_ResetPointsFunc) NULL,
(FT_Size_ResetPixelsFunc) NULL,
(FT_Slot_LoadFunc) pfr_slot_load,
(FT_Size_ResetPointsFunc)NULL,
(FT_Size_ResetPixelsFunc)NULL,
(FT_Slot_LoadFunc) pfr_slot_load,
(FT_Face_GetKerningFunc) pfr_get_kerning,
(FT_Face_AttachFunc) 0,
(FT_Face_GetAdvancesFunc) 0
(FT_Face_GetKerningFunc) pfr_get_kerning,
(FT_Face_AttachFunc) 0,
(FT_Face_GetAdvancesFunc)0
};

View File

@ -162,6 +162,9 @@
#define CUR_Func_move( z, p, d ) \
CUR.func_move( EXEC_ARG_ z, p, d )
#define CUR_Func_move_orig( z, p, d ) \
CUR.func_move_orig( EXEC_ARG_ z, p, d )
#define CUR_Func_dualproj( x, y ) \
CUR.func_dualproj( EXEC_ARG_ x, y )
@ -515,8 +518,7 @@
if ( *size < new_max )
{
FT_FREE( *buff );
if ( FT_ALLOC( *buff, new_max * multiplier ) )
if ( FT_REALLOC( *buff, *size, new_max * multiplier ) )
return error;
*size = new_max;
}
@ -1566,7 +1568,6 @@
if ( v != 0 )
{
zone->cur[point].x += TT_MULDIV( distance,
v * 0x10000L,
CUR.F_dot_P );
@ -1578,7 +1579,6 @@
if ( v != 0 )
{
zone->cur[point].y += TT_MULDIV( distance,
v * 0x10000L,
CUR.F_dot_P );
@ -1588,6 +1588,51 @@
}
/*************************************************************************/
/* */
/* <Function> */
/* Direct_Move_Orig */
/* */
/* <Description> */
/* Moves a point by a given distance along the freedom vector. The */
/* point will not be `touched'. */
/* */
/* <Input> */
/* point :: The index of the point to move. */
/* */
/* distance :: The distance to apply. */
/* */
/* <InOut> */
/* zone :: The affected glyph zone. */
/* */
static void
Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone,
FT_UShort point,
FT_F26Dot6 distance )
{
FT_F26Dot6 v;
#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
FT_ASSERT( !CUR.face->unpatented_hinting );
#endif
v = CUR.GS.freeVector.x;
if ( v != 0 )
zone->org[point].x += TT_MULDIV( distance,
v * 0x10000L,
CUR.F_dot_P );
v = CUR.GS.freeVector.y;
if ( v != 0 )
zone->org[point].y += TT_MULDIV( distance,
v * 0x10000L,
CUR.F_dot_P );
}
/*************************************************************************/
/* */
/* Special versions of Direct_Move() */
@ -1622,6 +1667,38 @@
}
/*************************************************************************/
/* */
/* Special versions of Direct_Move_Orig() */
/* */
/* The following versions are used whenever both vectors are both */
/* along one of the coordinate unit vectors, i.e. in 90% of the cases. */
/* */
/*************************************************************************/
static void
Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone,
FT_UShort point,
FT_F26Dot6 distance )
{
FT_UNUSED_EXEC;
zone->org[point].x += distance;
}
static void
Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone,
FT_UShort point,
FT_F26Dot6 distance )
{
FT_UNUSED_EXEC;
zone->org[point].y += distance;
}
/*************************************************************************/
/* */
/* <Function> */
@ -1656,7 +1733,7 @@
if ( distance >= 0 )
{
val = distance + compensation;
if ( val < 0 )
if ( distance && val < 0 )
val = 0;
}
else {
@ -1696,7 +1773,7 @@
if ( distance >= 0 )
{
val = distance + compensation + 32;
if ( val > 0 )
if ( distance && val > 0 )
val &= ~63;
else
val = 0;
@ -1740,7 +1817,7 @@
if ( distance >= 0 )
{
val = ( ( distance + compensation ) & -64 ) + 32;
if ( val < 0 )
if ( distance && val < 0 )
val = 0;
}
else
@ -1782,7 +1859,7 @@
if ( distance >= 0 )
{
val = distance + compensation;
if ( val > 0 )
if ( distance && val > 0 )
val &= ~63;
else
val = 0;
@ -1826,7 +1903,7 @@
if ( distance >= 0 )
{
val = distance + compensation + 63;
if ( val > 0 )
if ( distance && val > 0 )
val &= ~63;
else
val = 0;
@ -1870,7 +1947,7 @@
if ( distance >= 0 )
{
val = distance + compensation + 16;
if ( val > 0 )
if ( distance && val > 0 )
val &= ~31;
else
val = 0;
@ -1919,7 +1996,7 @@
{
val = ( distance - CUR.phase + CUR.threshold + compensation ) &
-CUR.period;
if ( val < 0 )
if ( distance && val < 0 )
val = 0;
val += CUR.phase;
}
@ -1967,7 +2044,7 @@
{
val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
CUR.period ) * CUR.period;
if ( val < 0 )
if ( distance && val < 0 )
val = 0;
val += CUR.phase;
}
@ -2243,13 +2320,15 @@
if ( CUR.GS.both_x_axis )
{
CUR.func_project = Project_x;
CUR.func_move = Direct_Move_X;
CUR.func_project = Project_x;
CUR.func_move = Direct_Move_X;
CUR.func_move_orig = Direct_Move_Orig_X;
}
else
{
CUR.func_project = Project_y;
CUR.func_move = Direct_Move_Y;
CUR.func_project = Project_y;
CUR.func_move = Direct_Move_Y;
CUR.func_move_orig = Direct_Move_Orig_Y;
}
if ( CUR.GS.dualVector.x == 0x4000 )
@ -2300,16 +2379,23 @@
CUR.func_dualproj = (TT_Project_Func)Dual_Project;
}
CUR.func_move = (TT_Move_Func)Direct_Move;
CUR.func_move = (TT_Move_Func)Direct_Move;
CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
if ( CUR.F_dot_P == 0x40000000L )
{
if ( CUR.GS.freeVector.x == 0x4000 )
CUR.func_move = (TT_Move_Func)Direct_Move_X;
{
CUR.func_move = (TT_Move_Func)Direct_Move_X;
CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
}
else
{
if ( CUR.GS.freeVector.y == 0x4000 )
CUR.func_move = (TT_Move_Func)Direct_Move_Y;
{
CUR.func_move = (TT_Move_Func)Direct_Move_Y;
CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
}
}
}
@ -2891,7 +2977,8 @@
if ( args[1] == 0 ) \
CUR.error = TT_Err_Divide_By_Zero; \
else \
args[0] = TT_MULDIV( args[0], 64L, args[1] );
/* Should args[0] be cast to FT_Int64 first? */ \
args[0] = ( args[0] * 64L ) / args[1];
#define DO_MUL \
@ -5359,11 +5446,11 @@
last_point = 0;
}
/* XXX: UNDOCUMENTED! SHC doesn't touch the points */
/* XXX: UNDOCUMENTED! SHC does touch the points */
for ( i = first_point; i <= last_point; i++ )
{
if ( zp.cur != CUR.zp2.cur || refp != i )
MOVE_Zp2_Point( i, dx, dy, FALSE );
MOVE_Zp2_Point( i, dx, dy, TRUE );
}
}
@ -5498,9 +5585,11 @@
}
/* XXX: UNDOCUMENTED! behaviour */
if ( CUR.GS.gep0 == 0 ) /* if in twilight zone */
if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */
/* is in twilight zone */
{
CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
CUR_Func_move_orig( &CUR.zp1, point, args[1] );
CUR.zp1.cur[point] = CUR.zp1.org[point];
}

View File

@ -4,7 +4,7 @@
/* */
/* TrueType bytecode interpreter (specification). */
/* */
/* Copyright 1996-2001, 2002 by */
/* Copyright 1996-2001, 2002, 2003 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@ -210,6 +210,7 @@ FT_BEGIN_HEADER
func_freeProj; /* current freedom proj. func */
TT_Move_Func func_move; /* current point move function */
TT_Move_Func func_move_orig; /* move original position function */
TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */
TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */