1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ftcalc.h                                                               */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Arithmetic computations (specification).                             */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by       */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef __FTCALC_H__
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define __FTCALC_H__
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_FREETYPE_H
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_BEGIN_HEADER
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FT_FixedSqrt                                                       */
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the square root of a 16.16 fixed point value.             */
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    x :: The value to compute the root for.                            */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The result of `sqrt(x)'.                                           */
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This function is not very fast.                                    */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE( FT_Int32 )
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_SqrtFixed( FT_Int32  x );
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FT_Sqrt32                                                          */
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the square root of an Int32 integer (which will be        */
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    handled as an unsigned long value).                                */
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    x :: The value to compute the root for.                            */
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The result of `sqrt(x)'.                                           */
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT( FT_Int32 )
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Sqrt32( FT_Int32  x );
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FT_MulDiv_No_Round                                                 */
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    A very simple function used to perform the computation `(a*b)/c'   */
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    (without rounding) with maximal accuracy (it uses a 64-bit         */
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    intermediate integer whenever necessary).                          */
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This function isn't necessarily as fast as some processor specific */
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    operations, but is at least completely portable.                   */
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    a :: The first multiplier.                                         */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    b :: The second multiplier.                                        */
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    c :: The divisor.                                                  */
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The result of `(a*b)/c'.  This function never traps when trying to */
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    on the signs of `a' and `b'.                                       */
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE( FT_Long )
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_MulDiv_No_Round( FT_Long  a,
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Long  b,
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Long  c );
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  A variant of FT_Matrix_Multiply which scales its result afterwards.
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  The idea is that both `a' and `b' are scaled by factors of 10 so that
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  the values are as precise as possible to get a correct result during
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  `a' and `b', respectively, then the scaling factor of the result is
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  `sa*sb'.
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE( void )
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_Matrix        *b,
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_Long           scaling );
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  A variant of FT_Vector_Transform.  See comments for
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  FT_Matrix_Multiply_Scaled.
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE( void )
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_Vector_Transform_Scaled( FT_Vector*        vector,
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              const FT_Matrix*  matrix,
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                              FT_Long           scaling );
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  Return -1, 0, or +1, depending on the orientation of a given corner.
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  We use the Cartesian coordinate system, with positive vertical values
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  going upwards.  The function returns +1 if the corner turns to the
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  left, -1 to the right, and 0 for undecidable cases.
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE( FT_Int )
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_corner_orientation( FT_Pos  in_x,
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_Pos  in_y,
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_Pos  out_x,
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_Pos  out_y );
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  saying that the angle difference between the `in' and `out' vectors is
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  very small.
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BASE( FT_Int )
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  ft_corner_is_flat( FT_Pos  in_x,
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Pos  in_y,
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Pos  out_x,
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Pos  out_y );
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )
168295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                        : ( -( ( 32 - (x) ) & -64 ) ) )
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __FTCALC_H__ */
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
180