2005-03-03 18:09:08 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* afangles.c */
|
|
|
|
/* */
|
|
|
|
/* Routines used to compute vector angles with limited accuracy */
|
|
|
|
/* and very high speed. It also contains sorting routines (body). */
|
|
|
|
/* */
|
2006-05-18 00:55:04 +02:00
|
|
|
/* Copyright 2003, 2004, 2005, 2006 by */
|
2005-03-03 18:09:08 +01:00
|
|
|
/* 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. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
|
2003-10-02 23:07:10 +02:00
|
|
|
#include "aftypes.h"
|
|
|
|
|
2006-11-03 10:40:12 +01:00
|
|
|
|
2006-11-02 18:21:02 +01:00
|
|
|
#if 0
|
2006-11-03 10:40:12 +01:00
|
|
|
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
FT_LOCAL_DEF( FT_Int )
|
2006-05-18 00:55:04 +02:00
|
|
|
af_corner_is_flat( FT_Pos x_in,
|
|
|
|
FT_Pos y_in,
|
|
|
|
FT_Pos x_out,
|
|
|
|
FT_Pos y_out )
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
{
|
|
|
|
FT_Pos ax = x_in;
|
|
|
|
FT_Pos ay = y_in;
|
|
|
|
|
|
|
|
FT_Pos d_in, d_out, d_corner;
|
|
|
|
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
if ( ax < 0 )
|
|
|
|
ax = -ax;
|
|
|
|
if ( ay < 0 )
|
|
|
|
ay = -ay;
|
|
|
|
d_in = ax + ay;
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
ax = x_out;
|
|
|
|
if ( ax < 0 )
|
|
|
|
ax = -ax;
|
|
|
|
ay = y_out;
|
|
|
|
if ( ay < 0 )
|
|
|
|
ay = -ay;
|
|
|
|
d_out = ax + ay;
|
|
|
|
|
|
|
|
ax = x_out + x_in;
|
|
|
|
if ( ax < 0 )
|
|
|
|
ax = -ax;
|
|
|
|
ay = y_out + y_in;
|
|
|
|
if ( ay < 0 )
|
|
|
|
ay = -ay;
|
|
|
|
d_corner = ax + ay;
|
|
|
|
|
|
|
|
return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( FT_Int )
|
|
|
|
af_corner_orientation( FT_Pos x_in,
|
|
|
|
FT_Pos y_in,
|
|
|
|
FT_Pos x_out,
|
|
|
|
FT_Pos y_out )
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
FT_Pos delta;
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
|
|
|
|
delta = x_in * y_out - y_in * x_out;
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
|
|
|
|
if ( delta == 0 )
|
|
|
|
return 0;
|
|
|
|
else
|
2006-05-18 00:55:04 +02:00
|
|
|
return 1 - 2 * ( delta < 0 );
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
}
|
2006-11-03 10:40:12 +01:00
|
|
|
|
2006-11-02 18:21:02 +01:00
|
|
|
#endif
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
|
2006-11-03 10:40:12 +01:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
/*
|
|
|
|
* We are not using `af_angle_atan' anymore, but we keep the source
|
|
|
|
* code below just in case...
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
*/
|
2006-05-18 00:55:04 +02:00
|
|
|
|
|
|
|
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
#if 0
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The trick here is to realize that we don't need a very accurate angle
|
|
|
|
* approximation. We are going to use the result of `af_angle_atan' to
|
|
|
|
* only compare the sign of angle differences, or check whether its
|
|
|
|
* magnitude is very small.
|
|
|
|
*
|
|
|
|
* The approximation
|
|
|
|
*
|
|
|
|
* dy * PI / (|dx|+|dy|)
|
|
|
|
*
|
|
|
|
* should be enough, and much faster to compute.
|
|
|
|
*/
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
FT_LOCAL_DEF( AF_Angle )
|
|
|
|
af_angle_atan( FT_Fixed dx,
|
|
|
|
FT_Fixed dy )
|
|
|
|
{
|
|
|
|
AF_Angle angle;
|
|
|
|
FT_Fixed ax = dx;
|
|
|
|
FT_Fixed ay = dy;
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
|
|
|
|
if ( ax < 0 )
|
|
|
|
ax = -ax;
|
|
|
|
if ( ay < 0 )
|
|
|
|
ay = -ay;
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
|
|
|
|
ax += ay;
|
|
|
|
|
|
|
|
if ( ax == 0 )
|
|
|
|
angle = 0;
|
|
|
|
else
|
|
|
|
{
|
2006-05-18 00:55:04 +02:00
|
|
|
angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay );
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
if ( dx < 0 )
|
|
|
|
{
|
|
|
|
if ( angle >= 0 )
|
|
|
|
angle = AF_ANGLE_PI - angle;
|
|
|
|
else
|
|
|
|
angle = -AF_ANGLE_PI - angle;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return angle;
|
|
|
|
}
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
|
* include/freetype/internal/tttypes.h, src/autofit/afangles.c,
src/autofit/afcjk.c, src/autofit/afhints.c, src/autofit/aflatin.c,
src/autofit/aftypes.h, src/base/ftcalc.c, src/base/ftoutln.c,
src/gzip/ftgzip.c, src/psaux/psconv.c, src/truetype/ttgload.c,
src/type1/t1gload.c:
this is a major patch used to drastically improve the performance
of loading glyphs. This both speeds up loading the glypn vector
themselves and the auto-fitter.
note that we've started using inline assembler with GCC to
implement FT_MulFix, given that this function is so damn
important for the engine's performance.
the resulting speed-up is about 25%.
2006-05-17 15:34:21 +02:00
|
|
|
#elif 0
|
2005-09-23 16:14:15 +02:00
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
|
2005-09-23 16:14:15 +02:00
|
|
|
/* the following table has been automatically generated with */
|
|
|
|
/* the `mather.py' Python script */
|
|
|
|
|
2005-09-28 09:34:45 +02:00
|
|
|
#define AF_ATAN_BITS 8
|
2005-09-23 16:14:15 +02:00
|
|
|
|
|
|
|
static const FT_Byte af_arctan[1L << AF_ATAN_BITS] =
|
|
|
|
{
|
|
|
|
0, 0, 1, 1, 1, 2, 2, 2,
|
|
|
|
3, 3, 3, 3, 4, 4, 4, 5,
|
|
|
|
5, 5, 6, 6, 6, 7, 7, 7,
|
|
|
|
8, 8, 8, 9, 9, 9, 10, 10,
|
|
|
|
10, 10, 11, 11, 11, 12, 12, 12,
|
|
|
|
13, 13, 13, 14, 14, 14, 14, 15,
|
|
|
|
15, 15, 16, 16, 16, 17, 17, 17,
|
|
|
|
18, 18, 18, 18, 19, 19, 19, 20,
|
|
|
|
20, 20, 21, 21, 21, 21, 22, 22,
|
|
|
|
22, 23, 23, 23, 24, 24, 24, 24,
|
|
|
|
25, 25, 25, 26, 26, 26, 26, 27,
|
|
|
|
27, 27, 28, 28, 28, 28, 29, 29,
|
|
|
|
29, 30, 30, 30, 30, 31, 31, 31,
|
|
|
|
31, 32, 32, 32, 33, 33, 33, 33,
|
|
|
|
34, 34, 34, 34, 35, 35, 35, 35,
|
|
|
|
36, 36, 36, 36, 37, 37, 37, 38,
|
|
|
|
38, 38, 38, 39, 39, 39, 39, 40,
|
|
|
|
40, 40, 40, 41, 41, 41, 41, 42,
|
|
|
|
42, 42, 42, 42, 43, 43, 43, 43,
|
|
|
|
44, 44, 44, 44, 45, 45, 45, 45,
|
|
|
|
46, 46, 46, 46, 46, 47, 47, 47,
|
|
|
|
47, 48, 48, 48, 48, 48, 49, 49,
|
|
|
|
49, 49, 50, 50, 50, 50, 50, 51,
|
|
|
|
51, 51, 51, 51, 52, 52, 52, 52,
|
|
|
|
52, 53, 53, 53, 53, 53, 54, 54,
|
|
|
|
54, 54, 54, 55, 55, 55, 55, 55,
|
|
|
|
56, 56, 56, 56, 56, 57, 57, 57,
|
|
|
|
57, 57, 57, 58, 58, 58, 58, 58,
|
|
|
|
59, 59, 59, 59, 59, 59, 60, 60,
|
|
|
|
60, 60, 60, 61, 61, 61, 61, 61,
|
|
|
|
61, 62, 62, 62, 62, 62, 62, 63,
|
|
|
|
63, 63, 63, 63, 63, 64, 64, 64
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( AF_Angle )
|
|
|
|
af_angle_atan( FT_Fixed dx,
|
|
|
|
FT_Fixed dy )
|
|
|
|
{
|
|
|
|
AF_Angle angle;
|
|
|
|
|
|
|
|
|
|
|
|
/* check trivial cases */
|
|
|
|
if ( dy == 0 )
|
|
|
|
{
|
|
|
|
angle = 0;
|
|
|
|
if ( dx < 0 )
|
|
|
|
angle = AF_ANGLE_PI;
|
|
|
|
return angle;
|
|
|
|
}
|
|
|
|
else if ( dx == 0 )
|
|
|
|
{
|
|
|
|
angle = AF_ANGLE_PI2;
|
|
|
|
if ( dy < 0 )
|
|
|
|
angle = -AF_ANGLE_PI2;
|
|
|
|
return angle;
|
|
|
|
}
|
|
|
|
|
|
|
|
angle = 0;
|
|
|
|
if ( dx < 0 )
|
|
|
|
{
|
|
|
|
dx = -dx;
|
|
|
|
dy = -dy;
|
|
|
|
angle = AF_ANGLE_PI;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( dy < 0 )
|
|
|
|
{
|
|
|
|
FT_Pos tmp;
|
|
|
|
|
|
|
|
|
|
|
|
tmp = dx;
|
|
|
|
dx = -dy;
|
|
|
|
dy = tmp;
|
|
|
|
angle -= AF_ANGLE_PI2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( dx == 0 && dy == 0 )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if ( dx == dy )
|
|
|
|
angle += AF_ANGLE_PI4;
|
|
|
|
else if ( dx > dy )
|
|
|
|
angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )];
|
|
|
|
else
|
|
|
|
angle += AF_ANGLE_PI2 -
|
|
|
|
af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )];
|
|
|
|
|
|
|
|
if ( angle > AF_ANGLE_PI )
|
|
|
|
angle -= AF_ANGLE_2PI;
|
|
|
|
|
|
|
|
return angle;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-05-18 00:55:04 +02:00
|
|
|
#endif /* 0 */
|
2003-10-02 23:07:10 +02:00
|
|
|
|
|
|
|
|
2003-11-23 22:39:51 +01:00
|
|
|
FT_LOCAL_DEF( void )
|
2005-03-03 18:09:08 +01:00
|
|
|
af_sort_pos( FT_UInt count,
|
|
|
|
FT_Pos* table )
|
2003-11-23 22:39:51 +01:00
|
|
|
{
|
2003-12-24 19:42:04 +01:00
|
|
|
FT_UInt i, j;
|
|
|
|
FT_Pos swap;
|
2003-11-23 22:39:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
for ( i = 1; i < count; i++ )
|
|
|
|
{
|
|
|
|
for ( j = i; j > 0; j-- )
|
|
|
|
{
|
|
|
|
if ( table[j] > table[j - 1] )
|
|
|
|
break;
|
|
|
|
|
|
|
|
swap = table[j];
|
|
|
|
table[j] = table[j - 1];
|
|
|
|
table[j - 1] = swap;
|
|
|
|
}
|
|
|
|
}
|
2003-12-24 02:10:46 +01:00
|
|
|
}
|
2003-12-24 19:42:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( void )
|
|
|
|
af_sort_widths( FT_UInt count,
|
|
|
|
AF_Width table )
|
|
|
|
{
|
|
|
|
FT_UInt i, j;
|
|
|
|
AF_WidthRec swap;
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = 1; i < count; i++ )
|
|
|
|
{
|
|
|
|
for ( j = i; j > 0; j-- )
|
|
|
|
{
|
|
|
|
if ( table[j].org > table[j - 1].org )
|
|
|
|
break;
|
|
|
|
|
|
|
|
swap = table[j];
|
|
|
|
table[j] = table[j - 1];
|
|
|
|
table[j - 1] = swap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-06-04 19:41:59 +02:00
|
|
|
|
|
|
|
|
2005-03-03 18:09:08 +01:00
|
|
|
/* END */
|