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