ftcalc.c revision 049d6fea481044fcc000e7782e5bc7046fc70844
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftcalc.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Arithmetic computations (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 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 /* */ 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Support for 1-complement arithmetic has been totally dropped in this */ 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* release. You can still write your own code if you need it. */ 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Implementing basic computation routines. */ 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* and FT_FloorFix() are declared in freetype.h. */ 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_MULFIX_INLINED 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_MulFix 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* we need to define a 64-bits data type here */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_LONG64 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project typedef FT_INT64 FT_Int64; 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project typedef struct FT_Int64_ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 lo; 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 hi; 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } FT_Int64; 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_LONG64 */ 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_calc 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following three functions are available regardless of whether */ 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FT_LONG64 is defined. */ 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Fixed ) 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_RoundFix( FT_Fixed a ) 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -((-a + 0x8000L ) & ~0xFFFFL ); 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Fixed ) 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CeilFix( FT_Fixed a ) 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -((-a + 0xFFFFL ) & ~0xFFFFL ); 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Fixed ) 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FloorFix( FT_Fixed a ) 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( a >= 0 ) ? a & ~0xFFFFL 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : -((-a) & ~0xFFFFL ); 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_CONFIG_OPTION_OLD_INTERNALS 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Int32 ) 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Sqrt32( FT_Int32 x ) 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong val, root, newroot, mask; 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project root = 0; 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask = 0x40000000L; 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = (FT_ULong)x; 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project newroot = root + mask; 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( newroot <= val ) 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val -= newroot; 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project root = newroot + mask; 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project root >>= 1; 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask >>= 2; 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( mask != 0 ); 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return root; 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_LONG64 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Long ) 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulDiv( FT_Long a, 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b, 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long c ) 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int s; 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long d; 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = 1; 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a < 0 ) { a = -a; s = -1; } 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b < 0 ) { b = -b; s = -s; } 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( c < 0 ) { c = -c; s = -s; } 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : 0x7FFFFFFFL ); 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s > 0 ) ? d : -d; 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Long ) 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulDiv_No_Round( FT_Long a, 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b, 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long c ) 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int s; 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long d; 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = 1; 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a < 0 ) { a = -a; s = -1; } 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b < 0 ) { b = -b; s = -s; } 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( c < 0 ) { c = -c; s = -s; } 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project : 0x7FFFFFFFL ); 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s > 0 ) ? d : -d; 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Long ) 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulFix( FT_Long a, 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b ) 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_MULFIX_ASSEMBLER 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_MULFIX_ASSEMBLER(a,b); 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int s = 1; 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long c; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a < 0 ) { a = -a; s = -1; } 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b < 0 ) { b = -b; s = -s; } 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 ); 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s > 0 ) ? c : -c ; 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Long ) 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_DivFix( FT_Long a, 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b ) 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 s; 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 q; 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = 1; 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a < 0 ) { a = -a; s = -1; } 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b < 0 ) { b = -b; s = -s; } 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b == 0 ) 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check for division by 0 */ 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = 0x7FFFFFFFL; 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute result directly */ 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b ); 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -(FT_Long)q : (FT_Long)q ); 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* !FT_LONG64 */ 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_multo64( FT_UInt32 x, 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 y, 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 *z ) 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo1 = x & 0x0000FFFFU; hi1 = x >> 16; 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo2 = y & 0x0000FFFFU; hi2 = y >> 16; 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = lo1 * lo2; 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project i1 = lo1 * hi2; 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project i2 = lo2 * hi1; 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi = hi1 * hi2; 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Check carry overflow of i1 + i2 */ 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project i1 += i2; 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += (FT_UInt32)( i1 < i2 ) << 16; 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += i1 >> 16; 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project i1 = i1 << 16; 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Check carry overflow of i1 + lo */ 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo += i1; 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += ( lo < i1 ); 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project z->lo = lo; 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project z->hi = hi; 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_UInt32 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_div64by32( FT_UInt32 hi, 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 lo, 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 y ) 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 r, q; 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int i; 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = 0; 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r = hi; 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( r >= y ) 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return (FT_UInt32)0x7FFFFFFFL; 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project i = 32; 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r <<= 1; 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q <<= 1; 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r |= lo >> 31; 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( r >= (FT_UInt32)y ) 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r -= y; 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q |= 1; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo <<= 1; 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( --i ); 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return q; 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Add64( FT_Int64* x, 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64* y, 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 *z ) 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project register FT_UInt32 lo, hi; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = x->lo + y->lo; 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi = x->hi + y->hi + ( lo < x->lo ); 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project z->lo = lo; 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project z->hi = hi; 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The FT_MulDiv function has been optimized thanks to ideas from */ 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Graham Asher. The trick is to optimize computation when everything */ 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* fits within 32-bits (a rather common case). */ 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */ 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 46340 is FLOOR(SQRT(2^31-1)). */ 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */ 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */ 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */ 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* and 2*0x157F0 = 176096 */ 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Long ) 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulDiv( FT_Long a, 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b, 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long c ) 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project long s; 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a == 0 || b == c ) 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return a; 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = a; a = FT_ABS( a ); 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= b; b = FT_ABS( b ); 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= c; c = FT_ABS( c ); 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = ( a * b + ( c >> 1 ) ) / c; 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( c > 0 ) 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 temp, temp2; 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_multo64( a, b, &temp ); 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp2.hi = 0; 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp2.lo = (FT_UInt32)(c >> 1); 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Add64( &temp, &temp2, &temp ); 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = ft_div64by32( temp.hi, temp.lo, c ); 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = 0x7FFFFFFFL; 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -a : a ); 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Long ) 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulDiv_No_Round( FT_Long a, 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b, 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long c ) 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project long s; 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a == 0 || b == c ) 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return a; 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = a; a = FT_ABS( a ); 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= b; b = FT_ABS( b ); 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= c; c = FT_ABS( c ); 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a <= 46340L && b <= 46340L && c > 0 ) 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = a * b / c; 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( c > 0 ) 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 temp; 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_multo64( a, b, &temp ); 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = ft_div64by32( temp.hi, temp.lo, c ); 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = 0x7FFFFFFFL; 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -a : a ); 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Long ) 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulFix( FT_Long a, 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b ) 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_MULFIX_ASSEMBLER 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_MULFIX_ASSEMBLER(a,b); 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long sa, sb; 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong ua, ub; 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a == 0 || b == 0x10000L ) 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return a; 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = ( a ^ sa ) - sa; 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sb = ( b >> ( sizeof ( b ) * 8 - 1 ) ); 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b = ( b ^ sb ) - sb; 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ua = (FT_ULong)a; 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ub = (FT_ULong)b; 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ua <= 2048 && ub <= 1048576L ) 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ua = ( ua * ub + 0x8000U ) >> 16; 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong al = ua & 0xFFFFU; 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 ); 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sa ^= sb, 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ua = (FT_ULong)(( ua ^ sa ) - sa); 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return (FT_Long)ua; 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in freetype.h */ 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Long ) 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_DivFix( FT_Long a, 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long b ) 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 s; 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 q; 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = a; a = FT_ABS(a); 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= b; b = FT_ABS(b); 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b == 0 ) 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check for division by 0 */ 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = 0x7FFFFFFFL; 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( ( a >> 16 ) == 0 ) 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute result directly */ 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b; 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we need more bits; we have to do it by hand */ 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 temp, temp2; 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp.hi = (FT_Int32) (a >> 16); 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp.lo = (FT_UInt32)(a << 16); 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp2.hi = 0; 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp2.lo = (FT_UInt32)( b >> 1 ); 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Add64( &temp, &temp2, &temp ); 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = ft_div64by32( temp.hi, temp.lo, b ); 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulTo64( FT_Int32 x, 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 y, 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 *z ) 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 s; 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = x; x = FT_ABS( x ); 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= y; y = FT_ABS( y ); 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_multo64( x, y, z ); 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( s < 0 ) 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project z->lo = (FT_UInt32)-(FT_Int32)z->lo; 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project z->hi = ~z->hi + !( z->lo ); 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* apparently, the second version of this code is not compiled correctly */ 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */ 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Int32 ) 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Div64by32( FT_Int64* x, 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 y ) 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 s; 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 q, r, i, lo; 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = x->hi; 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( s < 0 ) 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x->lo = (FT_UInt32)-(FT_Int32)x->lo; 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x->hi = ~x->hi + !x->lo; 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= y; y = FT_ABS( y ); 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Shortcut */ 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x->hi == 0 ) 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( y > 0 ) 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = x->lo / y; 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = 0x7FFFFFFFL; 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r = x->hi; 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = x->lo; 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */ 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL ); 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Return Max/Min Int32 if division overflow. */ 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This includes division by zero! */ 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = 0; 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < 32; i++ ) 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r <<= 1; 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q <<= 1; 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r |= lo >> 31; 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( r >= (FT_UInt32)y ) 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project r -= y; 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q |= 1; 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo <<= 1; 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* 0 */ 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Int32 ) 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Div64by32( FT_Int64* x, 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 y ) 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 s; 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 q; 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = x->hi; 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( s < 0 ) 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x->lo = (FT_UInt32)-(FT_Int32)x->lo; 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x->hi = ~x->hi + !x->lo; 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s ^= y; y = FT_ABS( y ); 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Shortcut */ 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x->hi == 0 ) 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( y > 0 ) 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = ( x->lo + ( y >> 1 ) ) / y; 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = 0x7FFFFFFFL; 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project q = ft_div64by32( x->hi, x->lo, y ); 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */ 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */ 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* FT_LONG64 */ 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Matrix_Multiply_Scaled( const FT_Matrix* a, 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Matrix *b, 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long scaling ) 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed xx, xy, yx, yy; 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long val = 0x10000L * scaling; 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !a || !b ) 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val ); 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val ); 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val ); 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val ); 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b->xx = xx; b->xy = xy; 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b->yx = yx; b->yy = yy; 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( void ) 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector_Transform_Scaled( FT_Vector* vector, 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Matrix* matrix, 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long scaling ) 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos xz, yz; 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long val = 0x10000L * scaling; 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !vector || !matrix ) 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project xz = FT_MulDiv( vector->x, matrix->xx, val ) + 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulDiv( vector->y, matrix->xy, val ); 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project yz = FT_MulDiv( vector->x, matrix->yx, val ) + 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MulDiv( vector->y, matrix->yy, val ); 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vector->x = xz; 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project vector->y = yz; 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Int32 ) 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_SqrtFixed( FT_Int32 x ) 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 root, rem_hi, rem_lo, test_div; 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int count; 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project root = 0; 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x > 0 ) 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rem_hi = 0; 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rem_lo = x; 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = 24; 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rem_lo <<= 2; 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project root <<= 1; 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project test_div = ( root << 1 ) + 1; 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( rem_hi >= test_div ) 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rem_hi -= test_div; 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project root += 1; 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( --count ); 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return (FT_Int32)root; 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Int ) 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_corner_orientation( FT_Pos in_x, 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos in_y, 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos out_x, 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos out_y ) 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int result; 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* deal with the trivial cases quickly */ 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( in_y == 0 ) 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( in_x >= 0 ) 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = out_y; 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = -out_y; 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( in_x == 0 ) 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( in_y >= 0 ) 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = -out_x; 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = out_x; 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( out_y == 0 ) 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( out_x >= 0 ) 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = in_y; 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = -in_y; 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( out_x == 0 ) 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( out_y >= 0 ) 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = -in_x; 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = in_x; 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else /* general case */ 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef FT_LONG64 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( delta == 0 ) 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = 0; 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = 1 - 2 * ( delta < 0 ); 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int64 z1, z2; 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_multo64( in_x, out_y, &z1 ); 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_multo64( in_y, out_x, &z2 ); 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( z1.hi > z2.hi ) 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = +1; 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( z1.hi < z2.hi ) 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = -1; 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( z1.lo > z2.lo ) 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = +1; 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( z1.lo < z2.lo ) 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = -1; 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = 0; 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return result; 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftcalc.h */ 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BASE_DEF( FT_Int ) 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_corner_is_flat( FT_Pos in_x, 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos in_y, 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos out_x, 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos out_y ) 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos ax = in_x; 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos ay = in_y; 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos d_in, d_out, d_corner; 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ax < 0 ) 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ax = -ax; 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ay < 0 ) 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ay = -ay; 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d_in = ax + ay; 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ax = out_x; 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ax < 0 ) 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ax = -ax; 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ay = out_y; 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ay < 0 ) 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ay = -ay; 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d_out = ax + ay; 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ax = out_x + in_x; 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ax < 0 ) 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ax = -ax; 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ay = out_y + in_y; 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ay < 0 ) 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ay = -ay; 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d_corner = ax + ay; 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 826