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