mirror of
				https://github.com/RetroDECK/ES-DE.git
				synced 2025-04-10 19:15:13 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			437 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			437 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************/
 | |
| /*                                                                         */
 | |
| /*  fttrigon.h                                                             */
 | |
| /*                                                                         */
 | |
| /*    FreeType trigonometric functions (specification).                    */
 | |
| /*                                                                         */
 | |
| /*  Copyright 2001, 2003, 2005, 2007, 2013 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 PLUTOVG_FT_MATH_H
 | |
| #define PLUTOVG_FT_MATH_H
 | |
| 
 | |
| #include "plutovg-ft-types.h"
 | |
| 
 | |
| /*************************************************************************/
 | |
| /*                                                                       */
 | |
| /* The min and max functions missing in C.  As usual, be careful not to  */
 | |
| /* write things like PVG_FT_MIN( a++, b++ ) to avoid side effects.           */
 | |
| /*                                                                       */
 | |
| #define PVG_FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )
 | |
| #define PVG_FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
 | |
| 
 | |
| #define PVG_FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )
 | |
| 
 | |
| /*
 | |
|  * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min'
 | |
|  * algorithm.  We use alpha = 1, beta = 3/8, giving us results with a
 | |
|  * largest error less than 7% compared to the exact value.
 | |
|  */
 | |
| #define PVG_FT_HYPOT( x, y )                 \
 | |
|           ( x = PVG_FT_ABS( x ),             \
 | |
|             y = PVG_FT_ABS( y ),             \
 | |
|             x > y ? x + ( 3 * y >> 3 )   \
 | |
|                   : y + ( 3 * x >> 3 ) )
 | |
| 
 | |
| /*************************************************************************/
 | |
| /*                                                                       */
 | |
| /* <Function>                                                            */
 | |
| /*    PVG_FT_MulFix                                                      */
 | |
| /*                                                                       */
 | |
| /* <Description>                                                         */
 | |
| /*    A very simple function used to perform the computation             */
 | |
| /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */
 | |
| /*    used to multiply a given value by a 16.16 fixed-point factor.      */
 | |
| /*                                                                       */
 | |
| /* <Input>                                                               */
 | |
| /*    a :: The first multiplier.                                         */
 | |
| /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */
 | |
| /*         possible (see note below).                                    */
 | |
| /*                                                                       */
 | |
| /* <Return>                                                              */
 | |
| /*    The result of `(a*b)/0x10000'.                                     */
 | |
| /*                                                                       */
 | |
| /* <Note>                                                                */
 | |
| /*    This function has been optimized for the case where the absolute   */
 | |
| /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
 | |
| /*    As this happens mainly when scaling from notional units to         */
 | |
| /*    fractional pixels in FreeType, it resulted in noticeable speed     */
 | |
| /*    improvements between versions 2.x and 1.x.                         */
 | |
| /*                                                                       */
 | |
| /*    As a conclusion, always try to place a 16.16 factor as the         */
 | |
| /*    _second_ argument of this function; this can make a great          */
 | |
| /*    difference.                                                        */
 | |
| /*                                                                       */
 | |
| PVG_FT_Long
 | |
| PVG_FT_MulFix( PVG_FT_Long  a,
 | |
|     PVG_FT_Long  b );
 | |
| 
 | |
| /*************************************************************************/
 | |
| /*                                                                       */
 | |
| /* <Function>                                                            */
 | |
| /*    PVG_FT_MulDiv                                                      */
 | |
| /*                                                                       */
 | |
| /* <Description>                                                         */
 | |
| /*    A very simple function used to perform the computation `(a*b)/c'   */
 | |
| /*    with maximum accuracy (it uses a 64-bit intermediate integer       */
 | |
| /*    whenever necessary).                                               */
 | |
| /*                                                                       */
 | |
| /*    This function isn't necessarily as fast as some processor specific */
 | |
| /*    operations, but is at least completely portable.                   */
 | |
| /*                                                                       */
 | |
| /* <Input>                                                               */
 | |
| /*    a :: The first multiplier.                                         */
 | |
| /*    b :: The second multiplier.                                        */
 | |
| /*    c :: The divisor.                                                  */
 | |
| /*                                                                       */
 | |
| /* <Return>                                                              */
 | |
| /*    The result of `(a*b)/c'.  This function never traps when trying to */
 | |
| /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
 | |
| /*    on the signs of `a' and `b'.                                       */
 | |
| /*                                                                       */
 | |
| PVG_FT_Long
 | |
| PVG_FT_MulDiv( PVG_FT_Long  a,
 | |
|     PVG_FT_Long  b,
 | |
|     PVG_FT_Long  c );
 | |
| 
 | |
| /*************************************************************************/
 | |
| /*                                                                       */
 | |
| /* <Function>                                                            */
 | |
| /*    PVG_FT_DivFix                                                      */
 | |
| /*                                                                       */
 | |
| /* <Description>                                                         */
 | |
| /*    A very simple function used to perform the computation             */
 | |
| /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */
 | |
| /*    used to divide a given value by a 16.16 fixed-point factor.        */
 | |
| /*                                                                       */
 | |
| /* <Input>                                                               */
 | |
| /*    a :: The numerator.                                                */
 | |
| /*    b :: The denominator.  Use a 16.16 factor here.                    */
 | |
| /*                                                                       */
 | |
| /* <Return>                                                              */
 | |
| /*    The result of `(a*0x10000)/b'.                                     */
 | |
| /*                                                                       */
 | |
| PVG_FT_Long
 | |
| PVG_FT_DivFix( PVG_FT_Long  a,
 | |
|     PVG_FT_Long  b );
 | |
| 
 | |
| 
 | |
| 
 | |
| /*************************************************************************/
 | |
| /*                                                                       */
 | |
| /* <Section>                                                             */
 | |
| /*   computations                                                        */
 | |
| /*                                                                       */
 | |
| /*************************************************************************/
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @type:
 | |
|  *   PVG_FT_Angle
 | |
|  *
 | |
|  * @description:
 | |
|  *   This type is used to model angle values in FreeType.  Note that the
 | |
|  *   angle is a 16.16 fixed-point value expressed in degrees.
 | |
|  *
 | |
|  */
 | |
| typedef PVG_FT_Fixed  PVG_FT_Angle;
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @macro:
 | |
|  *   PVG_FT_ANGLE_PI
 | |
|  *
 | |
|  * @description:
 | |
|  *   The angle pi expressed in @PVG_FT_Angle units.
 | |
|  *
 | |
|  */
 | |
| #define PVG_FT_ANGLE_PI  ( 180L << 16 )
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @macro:
 | |
|  *   PVG_FT_ANGLE_2PI
 | |
|  *
 | |
|  * @description:
 | |
|  *   The angle 2*pi expressed in @PVG_FT_Angle units.
 | |
|  *
 | |
|  */
 | |
| #define PVG_FT_ANGLE_2PI  ( PVG_FT_ANGLE_PI * 2 )
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @macro:
 | |
|  *   PVG_FT_ANGLE_PI2
 | |
|  *
 | |
|  * @description:
 | |
|  *   The angle pi/2 expressed in @PVG_FT_Angle units.
 | |
|  *
 | |
|  */
 | |
| #define PVG_FT_ANGLE_PI2  ( PVG_FT_ANGLE_PI / 2 )
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @macro:
 | |
|  *   PVG_FT_ANGLE_PI4
 | |
|  *
 | |
|  * @description:
 | |
|  *   The angle pi/4 expressed in @PVG_FT_Angle units.
 | |
|  *
 | |
|  */
 | |
| #define PVG_FT_ANGLE_PI4  ( PVG_FT_ANGLE_PI / 4 )
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Sin
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the sinus of a given angle in fixed-point format.
 | |
|  *
 | |
|  * @input:
 | |
|  *   angle ::
 | |
|  *     The input angle.
 | |
|  *
 | |
|  * @return:
 | |
|  *   The sinus value.
 | |
|  *
 | |
|  * @note:
 | |
|  *   If you need both the sinus and cosinus for a given angle, use the
 | |
|  *   function @PVG_FT_Vector_Unit.
 | |
|  *
 | |
|  */
 | |
| PVG_FT_Fixed
 | |
| PVG_FT_Sin( PVG_FT_Angle  angle );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Cos
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the cosinus of a given angle in fixed-point format.
 | |
|  *
 | |
|  * @input:
 | |
|  *   angle ::
 | |
|  *     The input angle.
 | |
|  *
 | |
|  * @return:
 | |
|  *   The cosinus value.
 | |
|  *
 | |
|  * @note:
 | |
|  *   If you need both the sinus and cosinus for a given angle, use the
 | |
|  *   function @PVG_FT_Vector_Unit.
 | |
|  *
 | |
|  */
 | |
| PVG_FT_Fixed
 | |
| PVG_FT_Cos( PVG_FT_Angle  angle );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Tan
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the tangent of a given angle in fixed-point format.
 | |
|  *
 | |
|  * @input:
 | |
|  *   angle ::
 | |
|  *     The input angle.
 | |
|  *
 | |
|  * @return:
 | |
|  *   The tangent value.
 | |
|  *
 | |
|  */
 | |
| PVG_FT_Fixed
 | |
| PVG_FT_Tan( PVG_FT_Angle  angle );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Atan2
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the arc-tangent corresponding to a given vector (x,y) in
 | |
|  *   the 2d plane.
 | |
|  *
 | |
|  * @input:
 | |
|  *   x ::
 | |
|  *     The horizontal vector coordinate.
 | |
|  *
 | |
|  *   y ::
 | |
|  *     The vertical vector coordinate.
 | |
|  *
 | |
|  * @return:
 | |
|  *   The arc-tangent value (i.e. angle).
 | |
|  *
 | |
|  */
 | |
| PVG_FT_Angle
 | |
| PVG_FT_Atan2( PVG_FT_Fixed  x,
 | |
|     PVG_FT_Fixed  y );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Angle_Diff
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the difference between two angles.  The result is always
 | |
|  *   constrained to the ]-PI..PI] interval.
 | |
|  *
 | |
|  * @input:
 | |
|  *   angle1 ::
 | |
|  *     First angle.
 | |
|  *
 | |
|  *   angle2 ::
 | |
|  *     Second angle.
 | |
|  *
 | |
|  * @return:
 | |
|  *   Constrained value of `value2-value1'.
 | |
|  *
 | |
|  */
 | |
| PVG_FT_Angle
 | |
| PVG_FT_Angle_Diff( PVG_FT_Angle  angle1,
 | |
|     PVG_FT_Angle  angle2 );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Vector_Unit
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the unit vector corresponding to a given angle.  After the
 | |
|  *   call, the value of `vec.x' will be `sin(angle)', and the value of
 | |
|  *   `vec.y' will be `cos(angle)'.
 | |
|  *
 | |
|  *   This function is useful to retrieve both the sinus and cosinus of a
 | |
|  *   given angle quickly.
 | |
|  *
 | |
|  * @output:
 | |
|  *   vec ::
 | |
|  *     The address of target vector.
 | |
|  *
 | |
|  * @input:
 | |
|  *   angle ::
 | |
|  *     The input angle.
 | |
|  *
 | |
|  */
 | |
| void
 | |
| PVG_FT_Vector_Unit( PVG_FT_Vector*  vec,
 | |
|     PVG_FT_Angle    angle );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Vector_Rotate
 | |
|  *
 | |
|  * @description:
 | |
|  *   Rotate a vector by a given angle.
 | |
|  *
 | |
|  * @inout:
 | |
|  *   vec ::
 | |
|  *     The address of target vector.
 | |
|  *
 | |
|  * @input:
 | |
|  *   angle ::
 | |
|  *     The input angle.
 | |
|  *
 | |
|  */
 | |
| void
 | |
| PVG_FT_Vector_Rotate( PVG_FT_Vector*  vec,
 | |
|     PVG_FT_Angle    angle );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Vector_Length
 | |
|  *
 | |
|  * @description:
 | |
|  *   Return the length of a given vector.
 | |
|  *
 | |
|  * @input:
 | |
|  *   vec ::
 | |
|  *     The address of target vector.
 | |
|  *
 | |
|  * @return:
 | |
|  *   The vector length, expressed in the same units that the original
 | |
|  *   vector coordinates.
 | |
|  *
 | |
|  */
 | |
| PVG_FT_Fixed
 | |
| PVG_FT_Vector_Length( PVG_FT_Vector*  vec );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Vector_Polarize
 | |
|  *
 | |
|  * @description:
 | |
|  *   Compute both the length and angle of a given vector.
 | |
|  *
 | |
|  * @input:
 | |
|  *   vec ::
 | |
|  *     The address of source vector.
 | |
|  *
 | |
|  * @output:
 | |
|  *   length ::
 | |
|  *     The vector length.
 | |
|  *
 | |
|  *   angle ::
 | |
|  *     The vector angle.
 | |
|  *
 | |
|  */
 | |
| void
 | |
| PVG_FT_Vector_Polarize( PVG_FT_Vector*  vec,
 | |
|     PVG_FT_Fixed   *length,
 | |
|     PVG_FT_Angle   *angle );
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
|  *
 | |
|  * @function:
 | |
|  *   PVG_FT_Vector_From_Polar
 | |
|  *
 | |
|  * @description:
 | |
|  *   Compute vector coordinates from a length and angle.
 | |
|  *
 | |
|  * @output:
 | |
|  *   vec ::
 | |
|  *     The address of source vector.
 | |
|  *
 | |
|  * @input:
 | |
|  *   length ::
 | |
|  *     The vector length.
 | |
|  *
 | |
|  *   angle ::
 | |
|  *     The vector angle.
 | |
|  *
 | |
|  */
 | |
| void
 | |
| PVG_FT_Vector_From_Polar( PVG_FT_Vector*  vec,
 | |
|     PVG_FT_Fixed    length,
 | |
|     PVG_FT_Angle    angle );
 | |
| 
 | |
| #endif /* PLUTOVG_FT_MATH_H */
 | 
