ref: 4b29d58761b6ad46eff097db54ab94d3925963ca
parent: a6f6ff56b5723102db3825de3e6656ccf430451f
author: David Turner <[email protected]>
date: Mon Mar 25 12:02:26 EST 2002
removing compiler warnings
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -215,7 +215,7 @@
#define FT_LOCAL_DEF(x) extern "C" x
#else
#define FT_LOCAL(x) extern x
-#define FT_LOCAL_DEF(x) extern x
+#define FT_LOCAL_DEF(x) x
#endif
#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
--- a/src/pcf/pcfdriver.c
+++ b/src/pcf/pcfdriver.c
@@ -299,7 +299,6 @@
/* set-up charmap */
{
FT_String *charset_registry, *charset_encoding;
- FT_Face root = FT_FACE(face);
FT_Bool unicode_charmap = 0;
@@ -547,7 +546,7 @@
#ifndef FT_CONFIG_OPTION_USE_CMAPS
(FT_CharMap_CharIndexFunc) PCF_Char_Get_Index,
#else
- (FT_CharMap_CharNextFunc) 0,
+ (FT_CharMap_CharIndexFunc) 0,
#endif
(FT_Face_GetKerningFunc) 0,
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -1014,7 +1014,6 @@
/* set-up charset */
{
PCF_Property charset_registry = 0, charset_encoding = 0;
- FT_Bool unicode_charmap = 0;
charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" );
--- a/src/psaux/t1cmap.c
+++ b/src/psaux/t1cmap.c
@@ -19,7 +19,7 @@
PSNames_Service psnames = face->psnames;
cmap->num_glyphs = face->type1.num_glyphs;
- cmap->glyph_names = face->type1.glyph_names;
+ cmap->glyph_names = (const char* const*)face->type1.glyph_names;
cmap->sid_to_string = psnames->adobe_std_strings;
cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding
: psnames->adobe_std_encoding;
@@ -416,7 +416,7 @@
}
- FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ FT_LOCAL_DEF( const FT_CMap_ClassRec )
t1_cmap_unicode_class_rec =
{
sizeof( T1_CMapUnicodeRec ),
@@ -427,7 +427,4 @@
};
-
- FT_LOCAL_DEF( const FT_CMap_Class )
- t1_cmap_unicode_class = &t1_cmap_unicode_class_rec;
--- a/src/psaux/t1cmap.h
+++ b/src/psaux/t1cmap.h
@@ -32,9 +32,9 @@
} T1_CMapStdRec;
- FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_standard_class_rec;
+ FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_standard_class_rec;
- FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_expert_class_rec;
+ FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_expert_class_rec;
/***************************************************************************/
/***************************************************************************/
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -825,40 +825,7 @@
}
- /* return length of given vector */
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
- static FT_F26Dot6
- Norm( FT_F26Dot6 X,
- FT_F26Dot6 Y )
- {
- TT_INT64 T1, T2;
-
-
- MUL_64( X, X, T1 );
- MUL_64( Y, Y, T2 );
-
- ADD_64( T1, T2, T1 );
-
- return (FT_F26Dot6)SQRT_64( T1 );
- }
-
-#else /* !FT_CONFIG_OPTION_OLD_CALCS */
-
- static FT_F26Dot6
- Norm( FT_F26Dot6 X,
- FT_F26Dot6 Y )
- {
- FT_Vector v;
-
- v.x = X;
- v.y = Y;
- return FT_Vector_Length( &v );
- }
-
-#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
-
/*************************************************************************/
/* */
/* Before an opcode is executed, the interpreter verifies that there are */
@@ -1201,6 +1168,153 @@
#define NULL_Vector (FT_Vector*)&Null_Vector
+ /* compute (a*b)/2^14 with maximal accuracy and rounding */
+ static FT_Int32
+ TT_MulFix14( FT_Int32 a, FT_Int b )
+ {
+ FT_Int32 m, s, hi;
+ FT_UInt32 l, lo;
+
+ /* compute ax*bx as 64-bit value */
+ l = (FT_UInt32)( (a & 0xFFFF)*b );
+ m = (a >> 16)*b;
+
+ lo = l + (FT_UInt32)(m << 16);
+ hi = (m >> 16) + ((FT_Int32)l >> 31) + (lo < l);
+
+ /* divide the result by 2^14 with rounding */
+ s = (hi >> 31);
+ l = lo + (FT_UInt32)s;
+ hi += s + (l < lo);
+ lo = l;
+
+ l = lo + 0x2000U;
+ hi += (l < lo);
+
+ return ( (hi << 18) | (l >> 14) );
+ }
+
+
+ /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */
+ static FT_Int32
+ TT_DotFix14( FT_Int32 ax, FT_Int32 ay, FT_Int bx, FT_Int by )
+ {
+ FT_Int32 m, s, hi1, hi2, hi;
+ FT_UInt32 l, lo1, lo2, lo;
+
+ /* compute ax*bx as 64-bit value */
+ l = (FT_UInt32)( (ax & 0xFFFF)*bx );
+ m = (ax >> 16)*bx;
+
+ lo1 = l + (FT_UInt32)(m << 16);
+ hi1 = (m >> 16) + ((FT_Int32)l >> 31) + (lo1 < l);
+
+ /* compute ay*by as 64-bit value */
+ l = (FT_UInt32)( (ay & 0xFFFF)*by );
+ m = (ay >> 16)*by;
+
+ lo2 = l + (FT_UInt32)(m << 16);
+ hi2 = (m >> 16) + ((FT_Int32)l >> 31) + (lo2 < l);
+
+ /* add them */
+ lo = lo1 + lo2;
+ hi = hi1 + hi2 + (lo < lo1);
+
+ /* divide the result by 2^14 with rounding */
+ s = (hi >> 31);
+ l = lo + (FT_UInt32)s;
+ hi += s + (l < lo);
+ lo = l;
+
+ l = lo + 0x2000U;
+ hi += (l < lo);
+
+ return ( (hi << 18) | (l >> 14) );
+ }
+
+ /* return length of given vector */
+#if 0
+
+ static FT_Int32
+ TT_VecLen( FT_Int32 x, FT_Int32 y )
+ {
+ FT_Int32 m, hi1, hi2, hi;
+ FT_UInt32 l, lo1, lo2, lo;
+
+ /* compute x*x as 64-bit value */
+ lo = (FT_UInt32)(x & 0xFFFF);
+ hi = (x >> 16);
+
+ l = lo*lo;
+ m = hi*lo;
+ hi = hi*hi;
+
+ lo1 = l + (FT_UInt32)(m << 17);
+ hi1 = hi + (m >> 15) + (lo1 < l);
+
+ /* compute y*y as 64-bit value */
+ lo = (FT_UInt32)( y & 0xFFFF );
+ hi = (y >> 16);
+
+ l = lo*lo;
+ m = hi*lo;
+ hi = hi*hi;
+
+ lo2 = l + (FT_UInt32)(m << 17);
+ hi2 = hi + (m >> 15) + (lo2 < l);
+
+ /* add them to get 'x*x+y*y' as 64-bit value */
+ lo = lo1 + lo2;
+ hi = hi1 + hi2 + (lo < lo1);
+
+ /* compute the square root of this value */
+ {
+ FT_UInt32 root, rem, test_div;
+ FT_Int count;
+
+
+ root = 0;
+
+ {
+ rem = 0;
+ count = 32;
+ do
+ {
+ rem = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 );
+ hi = ( hi << 2 ) | ( lo >> 30 );
+ lo <<= 2;
+ root <<= 1;
+ test_div = ( root << 1 ) + 1;
+
+ if ( rem >= test_div )
+ {
+ rem -= test_div;
+ root += 1;
+ }
+ } while ( --count );
+ }
+
+ return (FT_Int32)root;
+ }
+ }
+#else
+
+ /* this version uses FT_Vector_Length which computes the same value */
+ /* much, much faster.. */
+ /* */
+ static FT_F26Dot6
+ TT_VecLen( FT_F26Dot6 X,
+ FT_F26Dot6 Y )
+ {
+ FT_Vector v;
+
+ v.x = X;
+ v.y = Y;
+ return FT_Vector_Length( &v );
+ }
+
+#endif
+
/*************************************************************************/
/* */
/* <Function> */
@@ -1231,7 +1345,7 @@
x = TT_MULDIV( CUR.GS.projVector.x, CUR.tt_metrics.x_ratio, 0x4000 );
y = TT_MULDIV( CUR.GS.projVector.y, CUR.tt_metrics.y_ratio, 0x4000 );
- CUR.tt_metrics.ratio = Norm( x, y );
+ CUR.tt_metrics.ratio = TT_VecLen( x, y );
}
return CUR.tt_metrics.ratio;
@@ -1982,8 +2096,10 @@
Project( EXEC_OP_ FT_Vector* v1,
FT_Vector* v2 )
{
- return TT_MULDIV( v1->x - v2->x, CUR.GS.projVector.x, 0x4000 ) +
- TT_MULDIV( v1->y - v2->y, CUR.GS.projVector.y, 0x4000 );
+ return TT_DotFix14( v1->x - v2->x,
+ v1->y - v2->y,
+ CUR.GS.projVector.x,
+ CUR.GS.projVector.y );
}
@@ -2007,8 +2123,10 @@
Dual_Project( EXEC_OP_ FT_Vector* v1,
FT_Vector* v2 )
{
- return TT_MULDIV( v1->x - v2->x, CUR.GS.dualVector.x, 0x4000 ) +
- TT_MULDIV( v1->y - v2->y, CUR.GS.dualVector.y, 0x4000 );
+ return TT_DotFix14( v1->x - v2->x,
+ v1->y - v2->y,
+ CUR.GS.dualVector.x,
+ CUR.GS.dualVector.y );
}
@@ -2032,8 +2150,10 @@
Free_Project( EXEC_OP_ FT_Vector* v1,
FT_Vector* v2 )
{
- return TT_MULDIV( v1->x - v2->x, CUR.GS.freeVector.x, 0x4000 ) +
- TT_MULDIV( v1->y - v2->y, CUR.GS.freeVector.y, 0x4000 );
+ return TT_DotFix14( v1->x - v2->x,
+ v1->y - v2->y,
+ CUR.GS.freeVector.x,
+ CUR.GS.freeVector.y );
}
@@ -2188,7 +2308,6 @@
/* R is undefined. */
/* */
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
static FT_Bool
Normalize( EXEC_OP_ FT_F26Dot6 Vx,
@@ -2206,7 +2325,7 @@
Vx *= 0x100;
Vy *= 0x100;
- W = Norm( Vx, Vy );
+ W = TT_VecLen( Vx, Vy );
if ( W == 0 )
{
@@ -2221,7 +2340,7 @@
return SUCCESS;
}
- W = Norm( Vx, Vy );
+ W = TT_VecLen( Vx, Vy );
Vx = FT_MulDiv( Vx, 0x4000L, W );
Vy = FT_MulDiv( Vy, 0x4000L, W );
@@ -2284,31 +2403,7 @@
return SUCCESS;
}
-#else
- static FT_Bool
- Normalize( EXEC_OP_ FT_F26Dot6 Vx,
- FT_F26Dot6 Vy,
- FT_UnitVector* R )
- {
- FT_Vector v;
- FT_Angle angle;
-
- FT_UNUSED_EXEC;
-
- angle = FT_Atan2( Vx, Vy );
-
- FT_Vector_Unit( &v, angle );
-
- R->x = (short)(v.x >> 2);
- R->y = (short)(v.y >> 2);
-
- return SUCCESS;
- }
-
-#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
-
/*************************************************************************/
/* */
/* Here we start with the implementation of the various opcodes. */
@@ -5016,8 +5111,8 @@
#ifdef NO_APPLE_PATENT
- *x = TT_MULDIV( d, CUR.GS.freeVector.x, 0x4000 );
- *y = TT_MULDIV( d, CUR.GS.freeVector.y, 0x4000 );
+ *x = TT_MulFix14( d, CUR.GS.freeVector.x );
+ *y = TT_MulFix14( d, CUR.GS.freeVector.y );
#else
@@ -5225,12 +5320,8 @@
return;
}
- dx = TT_MULDIV( args[0],
- (FT_Long)CUR.GS.freeVector.x,
- 0x4000 );
- dy = TT_MULDIV( args[0],
- (FT_Long)CUR.GS.freeVector.y,
- 0x4000 );
+ dx = TT_MulFix14( args[0], CUR.GS.freeVector.x );
+ dy = TT_MulFix14( args[0], CUR.GS.freeVector.y );
while ( CUR.GS.loop > 0 )
{
@@ -5393,11 +5484,9 @@
if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */
{
- CUR.zp0.org[point].x = TT_MULDIV( CUR.GS.freeVector.x,
- distance, 0x4000 );
- CUR.zp0.org[point].y = TT_MULDIV( CUR.GS.freeVector.y,
- distance, 0x4000 );
- CUR.zp0.cur[point] = CUR.zp0.org[point];
+ CUR.zp0.org[point].x = TT_MulFix14( distance, CUR.GS.freeVector.x );
+ CUR.zp0.org[point].y = TT_MulFix14( distance, CUR.GS.freeVector.y ),
+ CUR.zp0.cur[point] = CUR.zp0.org[point];
}
org_dist = CUR_Func_project( CUR.zp0.cur + point, NULL_Vector );
@@ -5550,14 +5639,10 @@
if ( CUR.GS.gep1 == 0 )
{
CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
- TT_MULDIV( cvt_dist,
- CUR.GS.freeVector.x,
- 0x4000 );
+ TT_MulFix14( cvt_dist, CUR.GS.freeVector.x );
CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
- TT_MULDIV( cvt_dist,
- CUR.GS.freeVector.y,
- 0x4000 );
+ TT_MulFix14( cvt_dist, CUR.GS.freeVector.y );
CUR.zp1.cur[point] = CUR.zp1.org[point];
}