Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  ftcalc.h                                                               */
  4. /*                                                                         */
  5. /*    Arithmetic computations (specification).                             */
  6. /*                                                                         */
  7. /*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by       */
  8. /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
  9. /*                                                                         */
  10. /*  This file is part of the FreeType project, and may only be used,       */
  11. /*  modified, and distributed under the terms of the FreeType project      */
  12. /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
  13. /*  this file you indicate that you have read the license and              */
  14. /*  understand and accept it fully.                                        */
  15. /*                                                                         */
  16. /***************************************************************************/
  17.  
  18.  
  19. #ifndef __FTCALC_H__
  20. #define __FTCALC_H__
  21.  
  22.  
  23. #include <ft2build.h>
  24. #include FT_FREETYPE_H
  25.  
  26.  
  27. FT_BEGIN_HEADER
  28.  
  29.  
  30.   /*************************************************************************/
  31.   /*                                                                       */
  32.   /* <Function>                                                            */
  33.   /*    FT_FixedSqrt                                                       */
  34.   /*                                                                       */
  35.   /* <Description>                                                         */
  36.   /*    Computes the square root of a 16.16 fixed point value.             */
  37.   /*                                                                       */
  38.   /* <Input>                                                               */
  39.   /*    x :: The value to compute the root for.                            */
  40.   /*                                                                       */
  41.   /* <Return>                                                              */
  42.   /*    The result of `sqrt(x)'.                                           */
  43.   /*                                                                       */
  44.   /* <Note>                                                                */
  45.   /*    This function is not very fast.                                    */
  46.   /*                                                                       */
  47.   FT_BASE( FT_Int32 )
  48.   FT_SqrtFixed( FT_Int32  x );
  49.  
  50.  
  51. #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
  52.  
  53.   /*************************************************************************/
  54.   /*                                                                       */
  55.   /* <Function>                                                            */
  56.   /*    FT_Sqrt32                                                          */
  57.   /*                                                                       */
  58.   /* <Description>                                                         */
  59.   /*    Computes the square root of an Int32 integer (which will be        */
  60.   /*    handled as an unsigned long value).                                */
  61.   /*                                                                       */
  62.   /* <Input>                                                               */
  63.   /*    x :: The value to compute the root for.                            */
  64.   /*                                                                       */
  65.   /* <Return>                                                              */
  66.   /*    The result of `sqrt(x)'.                                           */
  67.   /*                                                                       */
  68.   FT_EXPORT( FT_Int32 )
  69.   FT_Sqrt32( FT_Int32  x );
  70.  
  71. #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
  72.  
  73.  
  74.   /*************************************************************************/
  75.   /*                                                                       */
  76.   /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */
  77.   /*                                                                       */
  78.   /*************************************************************************/
  79.  
  80.  
  81. #ifdef TT_USE_BYTECODE_INTERPRETER
  82.  
  83.   /*************************************************************************/
  84.   /*                                                                       */
  85.   /* <Function>                                                            */
  86.   /*    FT_MulDiv_No_Round                                                 */
  87.   /*                                                                       */
  88.   /* <Description>                                                         */
  89.   /*    A very simple function used to perform the computation `(a*b)/c'   */
  90.   /*    (without rounding) with maximal accuracy (it uses a 64-bit         */
  91.   /*    intermediate integer whenever necessary).                          */
  92.   /*                                                                       */
  93.   /*    This function isn't necessarily as fast as some processor specific */
  94.   /*    operations, but is at least completely portable.                   */
  95.   /*                                                                       */
  96.   /* <Input>                                                               */
  97.   /*    a :: The first multiplier.                                         */
  98.   /*    b :: The second multiplier.                                        */
  99.   /*    c :: The divisor.                                                  */
  100.   /*                                                                       */
  101.   /* <Return>                                                              */
  102.   /*    The result of `(a*b)/c'.  This function never traps when trying to */
  103.   /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
  104.   /*    on the signs of `a' and `b'.                                       */
  105.   /*                                                                       */
  106.   FT_BASE( FT_Long )
  107.   FT_MulDiv_No_Round( FT_Long  a,
  108.                       FT_Long  b,
  109.                       FT_Long  c );
  110.  
  111. #endif /* TT_USE_BYTECODE_INTERPRETER */
  112.  
  113.  
  114.   /*
  115.    *  A variant of FT_Matrix_Multiply which scales its result afterwards.
  116.    *  The idea is that both `a' and `b' are scaled by factors of 10 so that
  117.    *  the values are as precise as possible to get a correct result during
  118.    *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of
  119.    *  `a' and `b', respectively, then the scaling factor of the result is
  120.    *  `sa*sb'.
  121.    */
  122.   FT_BASE( void )
  123.   FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
  124.                              FT_Matrix        *b,
  125.                              FT_Long           scaling );
  126.  
  127.  
  128.   /*
  129.    *  A variant of FT_Vector_Transform.  See comments for
  130.    *  FT_Matrix_Multiply_Scaled.
  131.    */
  132.  
  133.   FT_BASE( void )
  134.   FT_Vector_Transform_Scaled( FT_Vector*        vector,
  135.                               const FT_Matrix*  matrix,
  136.                               FT_Long           scaling );
  137.  
  138.  
  139.   /*
  140.    *  Return -1, 0, or +1, depending on the orientation of a given corner.
  141.    *  We use the Cartesian coordinate system, with positive vertical values
  142.    *  going upwards.  The function returns +1 if the corner turns to the
  143.    *  left, -1 to the right, and 0 for undecidable cases.
  144.    */
  145.   FT_BASE( FT_Int )
  146.   ft_corner_orientation( FT_Pos  in_x,
  147.                          FT_Pos  in_y,
  148.                          FT_Pos  out_x,
  149.                          FT_Pos  out_y );
  150.  
  151.   /*
  152.    *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to
  153.    *  saying that the angle difference between the `in' and `out' vectors is
  154.    *  very small.
  155.    */
  156.   FT_BASE( FT_Int )
  157.   ft_corner_is_flat( FT_Pos  in_x,
  158.                      FT_Pos  in_y,
  159.                      FT_Pos  out_x,
  160.                      FT_Pos  out_y );
  161.  
  162.  
  163. #define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )
  164. #define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )
  165. #define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )
  166. #define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )
  167. #define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )
  168. #define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
  169.  
  170. #define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
  171.                                         : ( -( ( 32 - (x) ) & -64 ) ) )
  172.  
  173.  
  174. FT_END_HEADER
  175.  
  176. #endif /* __FTCALC_H__ */
  177.  
  178.  
  179. /* END */
  180.