misc/libfreetype/include/freetype/internal/ftcalc.h
changeset 5172 88f2e05288ba
equal deleted inserted replaced
5171:f9283dc4860d 5172:88f2e05288ba
       
     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 */