1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ttinterp.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    TrueType bytecode interpreter (body).                                */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier/*  Copyright 1996-2012                                                    */
8aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich/*  by 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
19aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */
20aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner/* issues; many thanks!                                                */
21aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
22aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRIGONOMETRY_H
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SYSTEM_H
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttinterp.h"
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "tterrors.h"
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define TT_MULFIX           FT_MulFix
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define TT_MULDIV           FT_MulDiv
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define TT_MULDIV_NO_ROUND  FT_MulDiv_No_Round
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_ttinterp
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* In order to detect infinite loops in the code, we set up a counter    */
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* within the run loop.  A single stroke of interpretation is now        */
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* limited to a maximal number of opcodes defined below.                 */
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MAX_RUNNABLE_OPCODES  1000000L
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* There are two kinds of implementations:                               */
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* a. static implementation                                              */
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The current execution context is a static variable, which fields   */
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    are accessed directly by the interpreter during execution.  The    */
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    context is named `cur'.                                            */
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This version is non-reentrant, of course.                          */
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* b. indirect implementation                                            */
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The current execution context is passed to _each_ function as its  */
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    first argument, and each field is thus accessed indirectly.        */
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This version is fully re-entrant.                                  */
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The idea is that an indirect implementation may be slower to execute  */
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* on low-end processors that are used in some systems (like 386s or     */
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* even 486s).                                                           */
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* As a consequence, the indirect implementation is now the default, as  */
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* its performance costs can be considered negligible in our context.    */
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note, however, that we kept the same source with macros because:      */
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - The code is kept very close in design to the Pascal code used for   */
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   development.                                                        */
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - It's much more readable that way!                                   */
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - It's still open to experimentation and tuning.                      */
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER     /* indirect implementation */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR  (*exc)                             /* see ttobjs.h */
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This macro is used whenever `exec' is unused in a function, to avoid  */
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* stupid warnings from pedantic compilers.                              */
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_EXEC  FT_UNUSED( exc )
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else                                           /* static implementation */
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR  cur
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_EXEC  int  __dummy = __dummy
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_ExecContextRec  cur;   /* static exec. context variable */
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* apparently, we have a _lot_ of direct indexing when accessing  */
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the static `cur', which makes the code bigger (due to all the  */
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* four bytes addresses).                                         */
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The instruction argument stack.                                       */
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_ARG  EXEC_OP_ FT_Long*  args    /* see ttobjs.h for EXEC_OP_ */
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This macro is used whenever `args' is unused in a function, to avoid  */
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* stupid warnings from pedantic compilers.                              */
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_ARG  FT_UNUSED_EXEC; FT_UNUSED( args )
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* increase readability of the code.                                     */
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SKIP_Code() \
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          SkipCode( EXEC_ARG )
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GET_ShortIns() \
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          GetShortIns( EXEC_ARG )
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define NORMalize( x, y, v ) \
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Normalize( EXEC_ARG_ x, y, v )
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SET_SuperRound( scale, flags ) \
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          SetSuperRound( EXEC_ARG_ scale, flags )
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ROUND_None( d, c ) \
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Round_None( EXEC_ARG_ d, c )
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_Goto_CodeRange( range, ip ) \
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move( z, p, d ) \
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move( EXEC_ARG_ z, p, d )
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move_orig( z, p, d ) \
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move_orig( EXEC_ARG_ z, p, d )
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_round( d, c ) \
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_round( EXEC_ARG_ d, c )
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_read_cvt( index ) \
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_read_cvt( EXEC_ARG_ index )
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_write_cvt( index, val ) \
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_write_cvt( EXEC_ARG_ index, val )
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move_cvt( index, val ) \
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move_cvt( EXEC_ARG_ index, val )
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CURRENT_Ratio() \
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Current_Ratio( EXEC_ARG )
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CURRENT_Ppem() \
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Current_Ppem( EXEC_ARG )
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Ppem() \
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Cur_PPEM( EXEC_ARG )
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_SxVTL( a, b, c, d ) \
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SxVTL( EXEC_ARG_ a, b, c, d )
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Funcs() \
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Compute_Funcs( EXEC_ARG )
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Round( a ) \
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Compute_Round( EXEC_ARG_ a )
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Point_Displacement( a, b, c, d ) \
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MOVE_Zp2_Point( a, b, c, t ) \
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_project( v1, v2 )  \
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_dualproj( v1, v2 )  \
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_fast_project( v ) \
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_fast_dualproj( v ) \
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Instruction dispatch function, as used by the interpreter.            */
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void  (*TInstruction_Function)( INS_ARG );
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* Two simple bounds-checking macros.                                    */
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )
233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  SUCCESS
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SUCCESS  0
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FAILURE
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FAILURE  1
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GUESS_VECTOR( V )                                         \
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  if ( CUR.face->unpatented_hinting )                             \
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                                               \
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GUESS_VECTOR( V )
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                        CODERANGE FUNCTIONS                            */
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Goto_CodeRange                                                  */
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Switches to a new code range (updates the code related elements in */
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    `exec', and `IP').                                                 */
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    range :: The new execution code range.                             */
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    IP    :: The new IP in the new code range.                         */
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec  :: The target execution context.                             */
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Goto_CodeRange( TT_ExecContext  exec,
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Int          range,
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Long         IP )
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CodeRange*  coderange;
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( range >= 1 && range <= 3 );
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    coderange = &exec->codeRangeTable[range - 1];
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( coderange->base != NULL );
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: Because the last instruction of a program may be a CALL */
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       which will return to the first byte *after* the code    */
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       range, we test for IP <= Size instead of IP < Size.     */
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                               */
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( (FT_ULong)IP <= coderange->size );
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->code     = coderange->base;
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeSize = coderange->size;
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->IP       = IP;
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->curRange = range;
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Set_CodeRange                                                   */
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets a code range.                                                 */
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    range  :: The code range index.                                    */
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    base   :: The new code base.                                       */
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    length :: The range size in bytes.                                 */
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec   :: The target execution context.                            */
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Set_CodeRange( TT_ExecContext  exec,
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Int          range,
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    void*           base,
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Long         length )
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( range >= 1 && range <= 3 );
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].size = length;
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Clear_CodeRange                                                 */
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Clears a code range.                                               */
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    range :: The code range index.                                     */
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec  :: The target execution context.                             */
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Does not set the Error variable.                                   */
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Clear_CodeRange( TT_ExecContext  exec,
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Int          range )
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( range >= 1 && range <= 3 );
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].base = NULL;
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].size = 0;
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                   EXECUTION CONTEXT ROUTINES                          */
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Done_Context                                                    */
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Destroys a given context.                                          */
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec   :: A handle to the target execution context.                */
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory :: A handle to the parent memory object.                    */
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Done_Context( TT_ExecContext  exec )
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = exec->memory;
407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* points zone */
410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxPoints   = 0;
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxContours = 0;
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* free stack */
414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec->stack );
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stackSize = 0;
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* free call stack */
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec->callStack );
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callSize = 0;
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callTop  = 0;
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* free glyph code range */
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec->glyphIns );
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphSize = 0;
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->size = NULL;
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->face = NULL;
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec );
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Init_Context                                                       */
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Initializes a context object.                                      */
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory :: A handle to the parent memory object.                    */
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec   :: A handle to the target execution context.                */
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Init_Context( TT_ExecContext  exec,
454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                FT_Memory       memory )
455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->memory   = memory;
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callSize = 32;
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail_Memory;
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* all values in the context are set to 0 already, but this is */
468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* here as a remainder                                         */
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxPoints   = 0;
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxContours = 0;
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stackSize = 0;
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphSize = 0;
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stack     = NULL;
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphIns  = NULL;
477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->face = NULL;
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->size = NULL;
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail_Memory:
4847f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_Done_Context( exec );
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Update_Max                                                         */
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Checks the size of a buffer and reallocates it if necessary.       */
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory     :: A handle to the parent memory object.                */
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    multiplier :: The size in bytes of each element in the buffer.     */
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    new_max    :: The new capacity (size) of the buffer.               */
505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size       :: The address of the buffer's current size expressed   */
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                  in elements.                                         */
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    buff       :: The address of the buffer base pointer.              */
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
515aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  FT_LOCAL_DEF( FT_Error )
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Update_Max( FT_Memory  memory,
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              FT_ULong*  size,
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              FT_Long    multiplier,
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              void*      _pbuff,
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              FT_ULong   new_max )
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void**    pbuff = (void**)_pbuff;
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( *size < new_max )
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *size = new_max;
531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Load_Context                                                    */
541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Prepare an execution context for glyph hinting.                    */
544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    face :: A handle to the source face object.                        */
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size :: A handle to the source size object.                        */
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec :: A handle to the target execution context.                  */
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Load_Context( TT_ExecContext  exec,
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_Face         face,
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_Size         size )
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int          i;
565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong        tmp;
566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_MaxProfile*  maxp;
567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error        error;
568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->face = face;
571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    maxp       = &face->max_profile;
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->size = size;
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( size )
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->numFDefs   = size->num_function_defs;
577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxFDefs   = size->max_function_defs;
578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->numIDefs   = size->num_instruction_defs;
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxIDefs   = size->max_instruction_defs;
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->FDefs      = size->function_defs;
581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->IDefs      = size->instruction_defs;
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->tt_metrics = size->ttmetrics;
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->metrics    = size->metrics;
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxFunc    = size->max_func;
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxIns     = size->max_ins;
587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        exec->codeRangeTable[i] = size->codeRangeTable[i];
590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* set graphics state */
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->GS = size->GS;
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->cvtSize = size->cvt_size;
595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->cvt     = size->cvt;
596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->storeSize = size->storage_size;
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->storage   = size->storage;
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->twilight  = size->twilight;
6017f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
6027f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      /* In case of multi-threading it can happen that the old size object */
6037f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      /* no longer exists, thus we must clear all glyph zone references.   */
6047f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
6057f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      exec->zp1 = exec->zp0;
6067f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      exec->zp2 = exec->zp0;
607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: We reserve a little more elements on the stack to deal safely */
610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */
611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tmp = exec->stackSize;
612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = Update_Max( exec->memory,
613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        &tmp,
614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        sizeof ( FT_F26Dot6 ),
615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        (void*)&exec->stack,
616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        maxp->maxStackElements + 32 );
617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stackSize = (FT_UInt)tmp;
618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tmp = exec->glyphSize;
622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = Update_Max( exec->memory,
623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        &tmp,
624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        sizeof ( FT_Byte ),
625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        (void*)&exec->glyphIns,
626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        maxp->maxSizeOfInstructions );
627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphSize = (FT_UShort)tmp;
628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->pts.n_points   = 0;
632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->pts.n_contours = 0;
633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp1 = exec->pts;
635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp2 = exec->pts;
636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp0 = exec->pts;
637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->instruction_trap = FALSE;
639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Save_Context                                                    */
648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Saves the code ranges in a `size' object.                          */
651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec :: A handle to the source execution context.                  */
654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size :: A handle to the target size object.                        */
657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Save_Context( TT_ExecContext  exec,
666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_Size         size )
667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  i;
669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
671aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* XXX: Will probably disappear soon with all the code range */
672aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*      management, which is now rather obsolete.            */
673aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                           */
674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->num_function_defs    = exec->numFDefs;
675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->num_instruction_defs = exec->numIDefs;
676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->max_func = exec->maxFunc;
678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->max_ins  = exec->maxIns;
679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      size->codeRangeTable[i] = exec->codeRangeTable[i];
682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Run_Context                                                     */
691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Executes one or more instructions in the execution context.        */
694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    debug :: A Boolean flag.  If set, the function sets some internal  */
697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*             variables and returns immediately, otherwise TT_RunIns()  */
698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*             is called.                                                */
699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*             This is commented out currently.                          */
701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec  :: A handle to the target execution context.                 */
704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
7060a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /*    TrueType error code.  0 means success.                             */
707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Run_Context( TT_ExecContext  exec,
713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Bool         debug )
714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )
719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project           != TT_Err_Ok )
720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp0 = exec->pts;
723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp1 = exec->pts;
724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp2 = exec->pts;
725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.gep0 = 1;
727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.gep1 = 1;
728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.gep2 = 1;
729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.projVector.x = 0x4000;
731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.projVector.y = 0x0000;
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.freeVector = exec->GS.projVector;
734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.dualVector = exec->GS.projVector;
735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.both_x_axis = TRUE;
738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.round_state = 1;
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.loop        = 1;
742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some glyphs leave something on the stack. so we clean it */
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* before a new execution.                                  */
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->top     = 0;
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callTop = 0;
747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1
749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( debug );
750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return exec->face->interpreter( exec );
752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !debug )
754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return TT_RunIns( exec );
755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return TT_Err_Ok;
757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7610a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* The default value for `scan_control' is documented as FALSE in the */
7620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* TrueType specification.  This is confusing since it implies a      */
7630a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* Boolean value.  However, this is not the case, thus both the       */
7640a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* default values of our `scan_type' and `scan_control' fields (which */
7650a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* the documentation's `scan_control' variable is split into) are     */
7660a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* zero.                                                              */
7670a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const TT_GraphicsState  tt_default_graphics_state =
769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0, 0, 0,
771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    { 0x4000, 0 },
772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    { 0x4000, 0 },
773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    { 0x4000, 0 },
774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TRUE,
777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 64, 1,
780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TRUE, 68, 0, 0, 9, 3,
7810a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    0, FALSE, 0, 1, 1, 1
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ttinterp.h */
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( TT_ExecContext )
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_New_Context( TT_Driver  driver )
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_ExecContext  exec;
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory       memory;
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = driver->root.root.memory;
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec   = driver->context;
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !driver->context )
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Error  error;
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* allocate object */
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( exec ) )
804295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        goto Fail;
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
806295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      /* initialize it; in case of error this deallocates `exec' too */
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = Init_Context( exec, memory );
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* store it into the driver */
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      driver->context = exec;
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return driver->context;
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
818295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return NULL;
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Before an opcode is executed, the interpreter verifies that there are */
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* table.                                                                */
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* For each opcode, the first column gives the number of arguments that  */
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* are popped from the stack; the second one gives the number of those   */
830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* that are pushed in result.                                            */
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcodes which have a varying number of parameters in the data stream  */
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* to zero.                                                              */
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  PACK
841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define PACK( x, y )  ( ( x << 4 ) | y )
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Byte  Pop_Push_Count[256] =
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* opcodes are gathered in groups of 16 */
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* please keep the spaces as they are   */
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  y  */  PACK( 0, 0 ),
851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  x  */  PACK( 0, 0 ),
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA y  */  PACK( 0, 0 ),
853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA x  */  PACK( 0, 0 ),
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA y  */  PACK( 0, 0 ),
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA x  */  PACK( 0, 0 ),
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL //  */  PACK( 2, 0 ),
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL +   */  PACK( 2, 0 ),
858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL //  */  PACK( 2, 0 ),
859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL +   */  PACK( 2, 0 ),
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvFS     */  PACK( 2, 0 ),
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvFS     */  PACK( 2, 0 ),
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GPV       */  PACK( 0, 2 ),
863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GFV       */  PACK( 0, 2 ),
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTPv    */  PACK( 0, 0 ),
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ISECT     */  PACK( 5, 0 ),
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP0      */  PACK( 1, 0 ),
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP1      */  PACK( 1, 0 ),
869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP2      */  PACK( 1, 0 ),
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP0      */  PACK( 1, 0 ),
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP1      */  PACK( 1, 0 ),
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP2      */  PACK( 1, 0 ),
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZPS      */  PACK( 1, 0 ),
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SLOOP     */  PACK( 1, 0 ),
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTG       */  PACK( 0, 0 ),
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTHG      */  PACK( 0, 0 ),
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SMD       */  PACK( 1, 0 ),
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ELSE      */  PACK( 0, 0 ),
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JMPR      */  PACK( 1, 0 ),
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCvTCi    */  PACK( 1, 0 ),
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSwCi     */  PACK( 1, 0 ),
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSW       */  PACK( 1, 0 ),
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DUP       */  PACK( 1, 2 ),
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  POP       */  PACK( 1, 0 ),
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CLEAR     */  PACK( 0, 0 ),
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SWAP      */  PACK( 2, 2 ),
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEPTH     */  PACK( 0, 1 ),
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CINDEX    */  PACK( 1, 1 ),
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MINDEX    */  PACK( 1, 0 ),
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignPTS  */  PACK( 2, 0 ),
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$28   */  PACK( 0, 0 ),
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  UTP       */  PACK( 1, 0 ),
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LOOPCALL  */  PACK( 2, 0 ),
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CALL      */  PACK( 1, 0 ),
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FDEF      */  PACK( 1, 0 ),
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ENDF      */  PACK( 0, 0 ),
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[0]   */  PACK( 1, 0 ),
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[1]   */  PACK( 1, 0 ),
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[0]    */  PACK( 0, 0 ),
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[1]    */  PACK( 0, 0 ),
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[0]    */  PACK( 0, 0 ),
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[1]    */  PACK( 0, 0 ),
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[0]    */  PACK( 1, 0 ),
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[1]    */  PACK( 1, 0 ),
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[0]    */  PACK( 1, 0 ),
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[1]    */  PACK( 1, 0 ),
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHPIX     */  PACK( 1, 0 ),
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IP        */  PACK( 0, 0 ),
911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[0]  */  PACK( 2, 0 ),
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[1]  */  PACK( 2, 0 ),
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignRP   */  PACK( 0, 0 ),
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTDG      */  PACK( 0, 0 ),
915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[0]   */  PACK( 2, 0 ),
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[1]   */  PACK( 2, 0 ),
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushB    */  PACK( 0, 0 ),
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushW    */  PACK( 0, 0 ),
920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WS        */  PACK( 2, 0 ),
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RS        */  PACK( 1, 1 ),
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtP     */  PACK( 2, 0 ),
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RCvt      */  PACK( 1, 1 ),
924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[0]     */  PACK( 1, 1 ),
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[1]     */  PACK( 1, 1 ),
926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCFS      */  PACK( 2, 0 ),
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[0]     */  PACK( 2, 1 ),
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[1]     */  PACK( 2, 1 ),
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPPEM     */  PACK( 0, 1 ),
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPS       */  PACK( 0, 1 ),
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipON    */  PACK( 0, 0 ),
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipOFF   */  PACK( 0, 0 ),
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEBUG     */  PACK( 1, 0 ),
934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LT        */  PACK( 2, 1 ),
936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LTEQ      */  PACK( 2, 1 ),
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GT        */  PACK( 2, 1 ),
938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GTEQ      */  PACK( 2, 1 ),
939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EQ        */  PACK( 2, 1 ),
940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEQ       */  PACK( 2, 1 ),
941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ODD       */  PACK( 1, 1 ),
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EVEN      */  PACK( 1, 1 ),
943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IF        */  PACK( 1, 0 ),
944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EIF       */  PACK( 0, 0 ),
945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AND       */  PACK( 2, 1 ),
946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  OR        */  PACK( 2, 1 ),
947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NOT       */  PACK( 1, 1 ),
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP1   */  PACK( 1, 0 ),
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDB       */  PACK( 1, 0 ),
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDS       */  PACK( 1, 0 ),
951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ADD       */  PACK( 2, 1 ),
953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SUB       */  PACK( 2, 1 ),
954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DIV       */  PACK( 2, 1 ),
955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MUL       */  PACK( 2, 1 ),
956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ABS       */  PACK( 1, 1 ),
957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEG       */  PACK( 1, 1 ),
958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FLOOR     */  PACK( 1, 1 ),
959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CEILING   */  PACK( 1, 1 ),
960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[0]  */  PACK( 1, 1 ),
961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[1]  */  PACK( 1, 1 ),
962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[2]  */  PACK( 1, 1 ),
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[3]  */  PACK( 1, 1 ),
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[0] */  PACK( 1, 1 ),
965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[1] */  PACK( 1, 1 ),
966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[2] */  PACK( 1, 1 ),
967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[3] */  PACK( 1, 1 ),
968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtF     */  PACK( 2, 0 ),
970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP2   */  PACK( 1, 0 ),
971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP3   */  PACK( 1, 0 ),
972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[0] */ PACK( 1, 0 ),
973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[1] */ PACK( 1, 0 ),
974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[2] */ PACK( 1, 0 ),
975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SROUND    */  PACK( 1, 0 ),
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  S45Round  */  PACK( 1, 0 ),
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROT      */  PACK( 2, 0 ),
978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROF      */  PACK( 2, 0 ),
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROFF      */  PACK( 0, 0 ),
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$7B   */  PACK( 0, 0 ),
981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RUTG      */  PACK( 0, 0 ),
982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RDTG      */  PACK( 0, 0 ),
983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SANGW     */  PACK( 1, 0 ),
984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AA        */  PACK( 1, 0 ),
985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipPT    */  PACK( 0, 0 ),
987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgON  */  PACK( 2, 0 ),
988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgOFF */  PACK( 2, 0 ),
989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$83   */  PACK( 0, 0 ),
990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$84   */  PACK( 0, 0 ),
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanCTRL  */  PACK( 1, 0 ),
992aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*  SDPVTL[0] */  PACK( 2, 0 ),
993aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*  SDPVTL[1] */  PACK( 2, 0 ),
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GetINFO   */  PACK( 1, 1 ),
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IDEF      */  PACK( 1, 0 ),
996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROLL      */  PACK( 3, 3 ),
997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MAX       */  PACK( 2, 1 ),
998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIN       */  PACK( 2, 1 ),
999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanTYPE  */  PACK( 1, 0 ),
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  InstCTRL  */  PACK( 2, 0 ),
1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$8F   */  PACK( 0, 0 ),
1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$90  */   PACK( 0, 0 ),
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$91  */   PACK( 0, 0 ),
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$92  */   PACK( 0, 0 ),
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$93  */   PACK( 0, 0 ),
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$94  */   PACK( 0, 0 ),
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$95  */   PACK( 0, 0 ),
1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$96  */   PACK( 0, 0 ),
1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$97  */   PACK( 0, 0 ),
1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$98  */   PACK( 0, 0 ),
1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$99  */   PACK( 0, 0 ),
1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9A  */   PACK( 0, 0 ),
1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9B  */   PACK( 0, 0 ),
1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9C  */   PACK( 0, 0 ),
1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9D  */   PACK( 0, 0 ),
1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9E  */   PACK( 0, 0 ),
1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9F  */   PACK( 0, 0 ),
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A0  */   PACK( 0, 0 ),
1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A1  */   PACK( 0, 0 ),
1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A2  */   PACK( 0, 0 ),
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A3  */   PACK( 0, 0 ),
1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A4  */   PACK( 0, 0 ),
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A5  */   PACK( 0, 0 ),
1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A6  */   PACK( 0, 0 ),
1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A7  */   PACK( 0, 0 ),
1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A8  */   PACK( 0, 0 ),
1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A9  */   PACK( 0, 0 ),
1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AA  */   PACK( 0, 0 ),
1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AB  */   PACK( 0, 0 ),
1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AC  */   PACK( 0, 0 ),
1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AD  */   PACK( 0, 0 ),
1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AE  */   PACK( 0, 0 ),
1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AF  */   PACK( 0, 0 ),
1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[0]  */  PACK( 0, 1 ),
1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[1]  */  PACK( 0, 2 ),
1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[2]  */  PACK( 0, 3 ),
1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[3]  */  PACK( 0, 4 ),
1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[4]  */  PACK( 0, 5 ),
1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[5]  */  PACK( 0, 6 ),
1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[6]  */  PACK( 0, 7 ),
1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[7]  */  PACK( 0, 8 ),
1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[0]  */  PACK( 0, 1 ),
1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[1]  */  PACK( 0, 2 ),
1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[2]  */  PACK( 0, 3 ),
1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[3]  */  PACK( 0, 4 ),
1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[4]  */  PACK( 0, 5 ),
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[5]  */  PACK( 0, 6 ),
1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[6]  */  PACK( 0, 7 ),
1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[7]  */  PACK( 0, 8 ),
1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[00]  */  PACK( 1, 0 ),
1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[01]  */  PACK( 1, 0 ),
1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[02]  */  PACK( 1, 0 ),
1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[03]  */  PACK( 1, 0 ),
1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[04]  */  PACK( 1, 0 ),
1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[05]  */  PACK( 1, 0 ),
1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[06]  */  PACK( 1, 0 ),
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[07]  */  PACK( 1, 0 ),
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[08]  */  PACK( 1, 0 ),
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[09]  */  PACK( 1, 0 ),
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[10]  */  PACK( 1, 0 ),
1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[11]  */  PACK( 1, 0 ),
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[12]  */  PACK( 1, 0 ),
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[13]  */  PACK( 1, 0 ),
1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[14]  */  PACK( 1, 0 ),
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[15]  */  PACK( 1, 0 ),
1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[16]  */  PACK( 1, 0 ),
1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[17]  */  PACK( 1, 0 ),
1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[18]  */  PACK( 1, 0 ),
1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[19]  */  PACK( 1, 0 ),
1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[20]  */  PACK( 1, 0 ),
1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[21]  */  PACK( 1, 0 ),
1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[22]  */  PACK( 1, 0 ),
1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[23]  */  PACK( 1, 0 ),
1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[24]  */  PACK( 1, 0 ),
1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[25]  */  PACK( 1, 0 ),
1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[26]  */  PACK( 1, 0 ),
1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[27]  */  PACK( 1, 0 ),
1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[28]  */  PACK( 1, 0 ),
1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[29]  */  PACK( 1, 0 ),
1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[30]  */  PACK( 1, 0 ),
1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[31]  */  PACK( 1, 0 ),
1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[00]  */  PACK( 2, 0 ),
1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[01]  */  PACK( 2, 0 ),
1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[02]  */  PACK( 2, 0 ),
1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[03]  */  PACK( 2, 0 ),
1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[04]  */  PACK( 2, 0 ),
1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[05]  */  PACK( 2, 0 ),
1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[06]  */  PACK( 2, 0 ),
1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[07]  */  PACK( 2, 0 ),
1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[08]  */  PACK( 2, 0 ),
1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[09]  */  PACK( 2, 0 ),
1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[10]  */  PACK( 2, 0 ),
1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[11]  */  PACK( 2, 0 ),
1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[12]  */  PACK( 2, 0 ),
1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[13]  */  PACK( 2, 0 ),
1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[14]  */  PACK( 2, 0 ),
1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[15]  */  PACK( 2, 0 ),
1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[16]  */  PACK( 2, 0 ),
1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[17]  */  PACK( 2, 0 ),
1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[18]  */  PACK( 2, 0 ),
1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[19]  */  PACK( 2, 0 ),
1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[20]  */  PACK( 2, 0 ),
1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[21]  */  PACK( 2, 0 ),
1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[22]  */  PACK( 2, 0 ),
1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[23]  */  PACK( 2, 0 ),
1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[24]  */  PACK( 2, 0 ),
1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[25]  */  PACK( 2, 0 ),
1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[26]  */  PACK( 2, 0 ),
1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[27]  */  PACK( 2, 0 ),
1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[28]  */  PACK( 2, 0 ),
1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[29]  */  PACK( 2, 0 ),
1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[30]  */  PACK( 2, 0 ),
1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[31]  */  PACK( 2, 0 )
1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1124aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_DEBUG_LEVEL_TRACE
1125aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1126aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  static
1127aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  const char*  const opcode_name[256] =
1128aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  {
1129aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SVTCA y",
1130aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SVTCA x",
1131aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTCA y",
1132aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTCA x",
1133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTCA y",
1134aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTCA x",
1135aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTL ||",
1136aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTL +",
1137aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTL ||",
1138aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTL +",
1139aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvFS",
1140aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvFS",
1141aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GPV",
1142aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GFV",
1143aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTPv",
1144aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ISECT",
1145aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1146aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP0",
1147aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP1",
1148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP2",
1149aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP0",
1150aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP1",
1151aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP2",
1152aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZPS",
1153aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SLOOP",
1154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTG",
1155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTHG",
1156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SMD",
1157aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ELSE",
1158aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JMPR",
1159aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SCvTCi",
1160aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SSwCi",
1161aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SSW",
1162aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1163aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DUP",
1164aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "POP",
1165aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CLEAR",
1166aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SWAP",
1167aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DEPTH",
1168aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CINDEX",
1169aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MINDEX",
1170aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AlignPTS",
1171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$28",
1172aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "UTP",
1173aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LOOPCALL",
1174aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CALL",
1175aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FDEF",
1176aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ENDF",
1177aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDAP[0]",
1178aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDAP[1]",
1179aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1180aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IUP[0]",
1181aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IUP[1]",
1182aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHP[0]",
1183aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHP[1]",
1184aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHC[0]",
1185aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHC[1]",
1186aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHZ[0]",
1187aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHZ[1]",
1188aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHPIX",
1189aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IP",
1190aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MSIRP[0]",
1191aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MSIRP[1]",
1192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AlignRP",
1193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTDG",
1194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIAP[0]",
1195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIAP[1]",
1196aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NPushB",
1198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NPushW",
1199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WS",
1200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RS",
1201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WCvtP",
1202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RCvt",
1203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GC[0]",
1204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GC[1]",
1205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SCFS",
1206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MD[0]",
1207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MD[1]",
1208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MPPEM",
1209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MPS",
1210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipON",
1211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipOFF",
1212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DEBUG",
1213aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1214aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LT",
1215aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LTEQ",
1216aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GT",
1217aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GTEQ",
1218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EQ",
1219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NEQ",
1220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ODD",
1221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EVEN",
1222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IF",
1223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EIF",
1224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AND",
1225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "OR",
1226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NOT",
1227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP1",
1228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDB",
1229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDS",
1230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ADD",
1232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SUB",
1233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DIV",
1234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MUL",
1235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ABS",
1236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NEG",
1237aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FLOOR",
1238aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CEILING",
1239aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[0]",
1240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[1]",
1241aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[2]",
1242aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[3]",
1243aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[0]",
1244aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[1]",
1245aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[2]",
1246aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[3]",
1247aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1248aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WCvtF",
1249aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP2",
1250aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP3",
1251aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[0]",
1252aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[1]",
1253aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[2]",
1254aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SROUND",
1255aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "S45Round",
1256aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JROT",
1257aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JROF",
1258aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROFF",
1259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$7B",
1260aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RUTG",
1261aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RDTG",
1262aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SANGW",
1263aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AA",
1264aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1265aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipPT",
1266aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipRgON",
1267aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipRgOFF",
1268aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$83",
1269aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$84",
1270aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ScanCTRL",
1271aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDVPTL[0]",
1272aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDVPTL[1]",
1273aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GetINFO",
1274aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IDEF",
1275aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROLL",
1276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MAX",
1277aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIN",
1278aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ScanTYPE",
1279aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "InstCTRL",
1280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$8F",
1281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1282aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$90",
1283aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$91",
1284aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$92",
1285aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$93",
1286aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$94",
1287aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$95",
1288aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$96",
1289aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$97",
1290aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$98",
1291aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$99",
1292aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9A",
1293aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9B",
1294aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9C",
1295aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9D",
1296aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9E",
1297aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9F",
1298aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1299aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A0",
1300aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A1",
1301aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A2",
1302aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A3",
1303aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A4",
1304aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A5",
1305aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A6",
1306aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A7",
1307aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A8",
1308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A9",
1309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AA",
1310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AB",
1311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AC",
1312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AD",
1313aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AE",
1314aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AF",
1315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[0]",
1317aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[1]",
1318aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[2]",
1319aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[3]",
1320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[4]",
1321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[5]",
1322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[6]",
1323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[7]",
1324aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[0]",
1325aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[1]",
1326aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[2]",
1327aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[3]",
1328aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[4]",
1329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[5]",
1330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[6]",
1331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[7]",
1332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[00]",
1334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[01]",
1335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[02]",
1336aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[03]",
1337aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[04]",
1338aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[05]",
1339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[06]",
1340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[07]",
1341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[08]",
1342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[09]",
1343aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[10]",
1344aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[11]",
1345aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[12]",
1346aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[13]",
1347aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[14]",
1348aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[15]",
1349aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[16]",
1351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[17]",
1352aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[18]",
1353aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[19]",
1354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[20]",
1355aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[21]",
1356aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[22]",
1357aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[23]",
1358aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[24]",
1359aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[25]",
1360aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[26]",
1361aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[27]",
1362aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[28]",
1363aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[29]",
1364aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[30]",
1365aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[31]",
1366aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1367aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[00]",
1368aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[01]",
1369aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[02]",
1370aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[03]",
1371aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[04]",
1372aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[05]",
1373aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[06]",
1374aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[07]",
1375aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[08]",
1376aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[09]",
1377aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[10]",
1378aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[11]",
1379aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[12]",
1380aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[13]",
1381aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[14]",
1382aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[15]",
1383aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1384aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[16]",
1385aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[17]",
1386aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[18]",
1387aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[19]",
1388aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[20]",
1389aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[21]",
1390aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[22]",
1391aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[23]",
1392aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[24]",
1393aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[25]",
1394aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[26]",
1395aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[27]",
1396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[28]",
1397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[29]",
1398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[30]",
1399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[31]"
1400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  };
1401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif /* FT_DEBUG_LEVEL_TRACE */
1403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
1406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Char  opcode_length[256] =
1407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,
1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1
1427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
1428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef PACK
1430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1
1432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_MulFix14( FT_Int32  a,
1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    b )
1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   sign;
1438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  ah, al, mid, lo, hi;
1439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sign = a ^ b;
1442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( a < 0 )
1444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      a = -a;
1445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( b < 0 )
1446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      b = -b;
1447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
1449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    al = (FT_UInt32)( a & 0xFFFFU );
1450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo    = al * b;
1452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid   = ah * b;
1453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi    = mid >> 16;
1454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
1455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo   += mid;
1456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( lo < mid )
1457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      hi += 1;
1458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid = ( lo >> 14 ) | ( hi << 18 );
1460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
1462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
1465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* compute (a*b)/2^14 with maximal accuracy and rounding */
1467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_MulFix14( FT_Int32  a,
1469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    b )
1470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   m, s, hi;
1472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  l, lo;
1473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ax*bx as 64-bit value */
1476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l  = (FT_UInt32)( ( a & 0xFFFFU ) * b );
1477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m  = ( a >> 16 ) * b;
1478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = l + (FT_UInt32)( m << 16 );
1480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
1481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* divide the result by 2^14 with rounding */
1483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    s   = hi >> 31;
1484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + (FT_UInt32)s;
1485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += s + ( l < lo );
1486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo  = l;
1487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + 0x2000U;
1489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += l < lo;
1490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ( hi << 18 ) | ( l >> 14 );
1492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */
1497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_DotFix14( FT_Int32  ax,
1499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int32  ay,
1500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    bx,
1501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    by )
1502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   m, s, hi1, hi2, hi;
1504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  l, lo1, lo2, lo;
1505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ax*bx as 64-bit value */
1508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
1509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m = ( ax >> 16 ) * bx;
1510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo1 = l + (FT_UInt32)( m << 16 );
1512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
1513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ay*by as 64-bit value */
1515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
1516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m = ( ay >> 16 ) * by;
1517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo2 = l + (FT_UInt32)( m << 16 );
1519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
1520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* add them */
1522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = lo1 + lo2;
1523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = hi1 + hi2 + ( lo < lo1 );
1524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* divide the result by 2^14 with rounding */
1526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    s   = hi >> 31;
1527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + (FT_UInt32)s;
1528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += s + ( l < lo );
1529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo  = l;
1530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + 0x2000U;
1532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += ( l < lo );
1533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ( hi << 18 ) | ( l >> 14 );
1535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* return length of given vector */
1539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
1541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_VecLen( FT_Int32  x,
1544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_Int32  y )
1545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   m, hi1, hi2, hi;
1547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  l, lo1, lo2, lo;
1548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute x*x as 64-bit value */
1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = (FT_UInt32)( x & 0xFFFFU );
1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = x >> 16;
1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l  = lo * lo;
1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m  = hi * lo;
1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = hi * hi;
1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo1 = l + (FT_UInt32)( m << 17 );
1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi1 = hi + ( m >> 15 ) + ( lo1 < l );
1560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute y*y as 64-bit value */
1562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = (FT_UInt32)( y & 0xFFFFU );
1563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = y >> 16;
1564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l  = lo * lo;
1566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m  = hi * lo;
1567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = hi * hi;
1568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo2 = l + (FT_UInt32)( m << 17 );
1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi2 = hi + ( m >> 15 ) + ( lo2 < l );
1571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* add them to get 'x*x+y*y' as 64-bit value */
1573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = lo1 + lo2;
1574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = hi1 + hi2 + ( lo < lo1 );
1575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute the square root of this value */
1577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt32  root, rem, test_div;
1579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Int     count;
1580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      root = 0;
1583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        rem   = 0;
1586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        count = 32;
1587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        do
1588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          rem      = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 );
1590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          hi       = (  hi << 2 ) | (            lo >> 30 );
1591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          lo     <<= 2;
1592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          root   <<= 1;
1593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          test_div = ( root << 1 ) + 1;
1594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( rem >= test_div )
1596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
1597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            rem  -= test_div;
1598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            root += 1;
1599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
1600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        } while ( --count );
1601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return (FT_Int32)root;
1604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
1608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* this version uses FT_Vector_Length which computes the same value */
1610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* much, much faster..                                              */
1611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                  */
1612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
1613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_VecLen( FT_F26Dot6  X,
1614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_F26Dot6  Y )
1615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector  v;
1617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v.x = X;
1620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v.y = Y;
1621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FT_Vector_Length( &v );
1623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Current_Ratio                                                      */
1632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns the current aspect ratio scaling factor depending on the   */
1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    projection vector's state and device resolutions.                  */
1636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */
1639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Long
1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Current_Ratio( EXEC_OP )
1642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !CUR.tt_metrics.ratio )
1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.face->unpatented_hinting )
1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.both_x_axis )
1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
1650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
1652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.projVector.y == 0 )
1657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
1658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( CUR.GS.projVector.x == 0 )
1660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
1661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_Long  x, y;
1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x = TT_MULDIV( CUR.GS.projVector.x,
1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         CUR.tt_metrics.x_ratio, 0x4000 );
1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          y = TT_MULDIV( CUR.GS.projVector.y,
1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         CUR.tt_metrics.y_ratio, 0x4000 );
1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = TT_VecLen( x, y );
1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.tt_metrics.ratio;
1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Long
1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Current_Ppem( EXEC_OP )
1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() );
1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Functions related to the control value table (CVT).                   */
1689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_F26Dot6 )
1694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Read_CVT( EXEC_OP_ FT_ULong  idx )
1695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.cvt[idx];
1697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_F26Dot6 )
1701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )
1702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() );
1704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Write_CVT( EXEC_OP_ FT_ULong    idx,
1709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_F26Dot6  value )
1710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] = value;
1712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
1717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  value )
1718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
1720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_CVT( EXEC_OP_ FT_ULong    idx,
1725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_F26Dot6  value )
1726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] += value;
1728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
1733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  value )
1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
1736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    GetShortIns                                                        */
1743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns a short integer taken from the instruction stream at       */
1746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    address IP.                                                        */
1747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Short read at code[IP].                                            */
1750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
1752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This one could become a macro.                                     */
1753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Short
1755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  GetShortIns( EXEC_OP )
1756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Reading a byte stream so there is no endianess (DaveP) */
1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += 2;
1759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
1760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         CUR.code[CUR.IP - 1]      );
1761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Ins_Goto_CodeRange                                                 */
1768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Goes to a certain code range in the instruction stream.            */
1771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    aRange :: The index of the code range.                             */
1774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    aIP    :: The new IP address in the code range.                    */
1776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS or FAILURE.                                                */
1779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
1781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,
1782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_ULong  aIP )
1783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CodeRange*  range;
1785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( aRange < 1 || aRange > 3 )
1788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Bad_Argument;
1790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    range = &CUR.codeRangeTable[aRange - 1];
1794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( range->base == NULL )     /* invalid coderange */
1796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Invalid_CodeRange;
1798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: Because the last instruction of a program may be a CALL */
1802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       which will return to the first byte *after* the code    */
180341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*       range, we test for aIP <= Size, instead of aIP < Size.  */
1804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( aIP > range->size )
1806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Code_Overflow;
1808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.code     = range->base;
1812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.codeSize = range->size;
1813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP       = aIP;
1814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.curRange = aRange;
1815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Direct_Move                                                        */
1824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Moves a point by a given distance along the freedom vector.  The   */
1827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point will be `touched'.                                           */
1828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point    :: The index of the point to move.                        */
1831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance :: The distance to apply.                                 */
1833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
1835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    zone     :: The affected glyph zone.                               */
1836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,
1839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_UShort     point,
1840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_F26Dot6    distance )
1841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  v;
1843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
1847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.x;
1850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->cur[point].x += TT_MULDIV( distance,
1854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       v * 0x10000L,
1855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       CUR.F_dot_P );
1856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
1858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.y;
1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->cur[point].y += TT_MULDIV( distance,
1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       v * 0x10000L,
1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       CUR.F_dot_P );
1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
1869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Direct_Move_Orig                                                   */
1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Moves the *original* position of a point by a given distance along */
1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the freedom vector.  Obviously, the point will not be `touched'.   */
1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point    :: The index of the point to move.                        */
1884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance :: The distance to apply.                                 */
1886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
1888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    zone     :: The affected glyph zone.                               */
1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,
1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_UShort     point,
1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_F26Dot6    distance )
1894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  v;
1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.x;
1903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->org[point].x += TT_MULDIV( distance,
1906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       v * 0x10000L,
1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       CUR.F_dot_P );
1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.y;
1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->org[point].y += TT_MULDIV( distance,
1913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       v * 0x10000L,
1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       CUR.F_dot_P );
1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Special versions of Direct_Move()                                     */
1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The following versions are used whenever both vectors are both      */
1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,
1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UShort     point,
1931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6    distance )
1932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->cur[point].x += distance;
1936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,
1942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UShort     point,
1943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6    distance )
1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->cur[point].y += distance;
1948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;
1949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Special versions of Direct_Move_Orig()                                */
1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The following versions are used whenever both vectors are both      */
1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,
1964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UShort     point,
1965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6    distance )
1966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->org[point].x += distance;
1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,
1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UShort     point,
1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6    distance )
1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->org[point].y += distance;
1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_None                                                         */
1988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Does not round, but adds engine compensation.                      */
1991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance (not) to round.                       */
1994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The compensated distance.                                          */
1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The TrueType specification says very few about the relationship    */
2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    between rounding and engine compensation.  However, it seems from  */
2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the description of super round that we should add the compensation */
2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    before rounding.                                                   */
2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_None( EXEC_OP_ FT_F26Dot6  distance,
2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_F26Dot6  compensation )
2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation;
2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2021aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    else
2022aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    {
2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance - compensation;
2024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Grid                                                      */
2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to grid after adding engine compensation.             */
2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6  compensation )
2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 32;
2059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -FT_PIX_ROUND( compensation - distance );
2067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return  val;
2072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Half_Grid                                                 */
2079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to half grid after adding engine compensation.        */
2082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,
2093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  compensation )
2094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = FT_PIX_FLOOR( distance + compensation ) + 32;
2103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Down_To_Grid                                                 */
2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value down to grid after adding engine compensation.        */
2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  compensation )
2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation;
2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( compensation - distance ) & -64 );
2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Up_To_Grid                                                   */
2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value up to grid after adding engine compensation.          */
2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_F26Dot6  compensation )
2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 63;
2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = - FT_PIX_CEIL( compensation - distance );
2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Double_Grid                                               */
2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to double grid after adding engine compensation.      */
2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,
2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 FT_F26Dot6  compensation )
2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6 val;
2226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 16;
2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~31;
2235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -FT_PAD_ROUND( compensation - distance, 32 );
2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Super                                                        */
2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Super-rounds value to grid after adding engine compensation.       */
2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The TrueType specification says very few about the relationship    */
2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    between rounding and engine compensation.  However, it seems from  */
2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the description of super round that we should add the compensation */
2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    before rounding.                                                   */
2270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Super( EXEC_OP_ FT_F26Dot6  distance,
2273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_F26Dot6  compensation )
2274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = ( distance - CUR.phase + CUR.threshold + compensation ) &
2281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              -CUR.period;
2282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val += CUR.phase;
2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
2289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               -CUR.period );
2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val -= CUR.phase;
2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Super_45                                                     */
2303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Super-rounds value to grid after adding engine compensation.       */
2306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    There is a separate function for Round_Super_45() as we may need   */
2317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    greater precision.                                                 */
2318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,
2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  compensation )
2322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
2329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                CUR.period ) * CUR.period;
2330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val += CUR.phase;
2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
2337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.period ) * CUR.period );
2338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val -= CUR.phase;
2341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Compute_Round                                                      */
2351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets the rounding mode.                                            */
2354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    round_mode :: The rounding mode to be used.                        */
2357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Round( EXEC_OP_ FT_Byte  round_mode )
2360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( round_mode )
2362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Off:
2364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_None;
2365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Grid:
2368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Grid;
2369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Up_To_Grid:
2372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
2373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Down_To_Grid:
2376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
2377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Half_Grid:
2380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
2381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Double_Grid:
2384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
2385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Super:
2388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Super;
2389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Super_45:
2392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Super_45;
2393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SetSuperRound                                                      */
2402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets Super Round parameters.                                       */
2405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    GridPeriod :: Grid period                                          */
2408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    selector   :: SROUND opcode                                        */
2409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,
2412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_Long     selector )
2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)( selector & 0xC0 ) )
2415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0:
2417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod / 2;
2418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x40:
2421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod;
2422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x80:
2425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod * 2;
2426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* This opcode is reserved, but... */
2429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0xC0:
2431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod;
2432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)( selector & 0x30 ) )
2436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
2438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = 0;
2439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x10:
2442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period / 4;
2443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x20:
2446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period / 2;
2447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x30:
2450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period * 3 / 4;
2451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( selector & 0x0F ) == 0 )
2455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.threshold = CUR.period - 1;
2456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
2458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.period    /= 256;
2460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.phase     /= 256;
2461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.threshold /= 256;
2462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project                                                            */
2469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of vector given by (v2-v1) along the       */
2472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    current projection vector.                                         */
2473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project( EXEC_OP_ FT_Pos  dx,
2483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Pos  dy )
2484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
2487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2489295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
2490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.projVector.x,
2491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.projVector.y );
2492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Dual_Project                                                       */
2499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    current dual vector.                                               */
2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Dual_Project( EXEC_OP_ FT_Pos  dx,
2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_Pos  dy )
2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2515295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.dualVector.x,
2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.dualVector.y );
2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project_x                                                          */
2525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    horizontal axis.                                                   */
2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project_x( EXEC_OP_ FT_Pos  dx,
2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pos  dy )
2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( dy );
2543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return dx;
2545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project_y                                                          */
2552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    vertical axis.                                                     */
2556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project_y( EXEC_OP_ FT_Pos  dx,
2566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pos  dy )
2567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( dx );
2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return dy;
2572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Compute_Funcs                                                      */
2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection and movement function pointers according   */
2582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    to the current graphics state.                                     */
2583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Funcs( EXEC_OP )
2586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
2589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* If both vectors point rightwards along the x axis, set             */
2591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `both-x-axis' true, otherwise set it false.  The x values only     */
2592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* need be tested because the vector has been normalised to a unit    */
2593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* vector of length 0x4000 = unity.                                   */
2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      CUR.GS.freeVector.x == 0x4000 );
2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Throw away projection and freedom vector information */
2598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* because the patents don't allow them to be stored.   */
2599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* The relevant US Patents are 5155805 and 5325479.     */
2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.projVector.x = 0;
2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.projVector.y = 0;
2602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.freeVector.x = 0;
2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.freeVector.y = 0;
2604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
2606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project   = Project_x;
2608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = Direct_Move_X;
2609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = Direct_Move_Orig_X;
2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project   = Project_y;
2614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = Direct_Move_Y;
2615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = Direct_Move_Orig_Y;
2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.dualVector.x == 0x4000 )
2619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_dualproj = Project_x;
2620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.dualVector.y == 0x4000 )
2623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_dualproj = Project_y;
2624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
2625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_dualproj = Dual_Project;
2626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Force recalculation of cached aspect ratio */
2629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.tt_metrics.ratio = 0;
2630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
2632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
2634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x == 0x4000 )
2636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.F_dot_P       = CUR.GS.projVector.x * 0x10000L;
2637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.freeVector.y == 0x4000 )
2640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.F_dot_P       = CUR.GS.projVector.y * 0x10000L;
2641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.F_dot_P = (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 +
2643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4;
2644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.projVector.x == 0x4000 )
2647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_project = (TT_Project_Func)Project_x;
2648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.projVector.y == 0x4000 )
2651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project = (TT_Project_Func)Project_y;
2652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project = (TT_Project_Func)Project;
2654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.dualVector.x == 0x4000 )
2657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_dualproj = (TT_Project_Func)Project_x;
2658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.dualVector.y == 0x4000 )
2661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_dualproj = (TT_Project_Func)Project_y;
2662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_dualproj = (TT_Project_Func)Dual_Project;
2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_move      = (TT_Move_Func)Direct_Move;
2667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
2668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.F_dot_P == 0x40000000L )
2670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.freeVector.x == 0x4000 )
2672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = (TT_Move_Func)Direct_Move_X;
2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.freeVector.y == 0x4000 )
2679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move      = (TT_Move_Func)Direct_Move_Y;
2681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
2683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* at small sizes, F_dot_P can become too small, resulting   */
2687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* in overflows and `spikes' in a number of glyphs like `w'. */
2688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L )
2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.F_dot_P = 0x40000000L;
2691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Disable cached aspect ratio */
2693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.tt_metrics.ratio = 0;
2694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Normalize                                                          */
2701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Norms a vector.                                                    */
2704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Vx :: The horizontal input vector coordinate.                      */
2707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Vy :: The vertical input vector coordinate.                        */
2708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Output>                                                              */
2710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    R  :: The normed unit vector.                                      */
2711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns FAILURE if a vector parameter is zero.                     */
2714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */
2717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    R is undefined.                                                    */
2718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
2722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Normalize( EXEC_OP_ FT_F26Dot6      Vx,
2723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_F26Dot6      Vy,
2724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UnitVector*  R )
2725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  W;
2727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool     S1, S2;
2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L )
2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Vx *= 0x100;
2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Vy *= 0x100;
2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      W = TT_VecLen( Vx, Vy );
2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( W == 0 )
2740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
2742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      to normalize the vector (0,0).  Return immediately. */
2743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
2744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W );
2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W );
2748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return SUCCESS;
2750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    W = TT_VecLen( Vx, Vy );
2753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Vx = FT_MulDiv( Vx, 0x4000L, W );
2755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Vy = FT_MulDiv( Vy, 0x4000L, W );
2756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    W = Vx * Vx + Vy * Vy;
2758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now, we want that Sqrt( W ) = 0x4000 */
276041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* Or 0x10000000 <= W < 0x10004000      */
2761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( Vx < 0 )
2763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Vx = -Vx;
2765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      S1 = TRUE;
2766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      S1 = FALSE;
2769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( Vy < 0 )
2771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Vy = -Vy;
2773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      S2 = TRUE;
2774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      S2 = FALSE;
2777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( W < 0x10000000L )
2779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* We need to increase W by a minimal amount */
2781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Vx < Vy )
2782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Vx++;
2783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Vy++;
2785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      W = Vx * Vx + Vy * Vy;
2787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( W >= 0x10004000L )
2790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* We need to decrease W by a minimal amount */
2792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( Vx < Vy )
2793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Vx--;
2794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Vy--;
2796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      W = Vx * Vx + Vy * Vy;
2798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Note that in various cases, we can only  */
2801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */
2802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( S1 )
2804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Vx = -Vx;
2805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( S2 )
2807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Vy = -Vy;
2808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    R->x = (FT_F2Dot14)Vx;   /* Type conversion */
2810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    R->y = (FT_F2Dot14)Vy;   /* Type conversion */
2811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Here we start with the implementation of the various opcodes.         */
2819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
2824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,
2825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UShort       aIdx2,
2826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Int          aOpc,
2827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UnitVector*  Vec )
2828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long     A, B, C;
2830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  p1;
2831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  p2;
2832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
2835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( aIdx2, CUR.zp1.n_points ) )
2836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
2838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
2839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
2840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = CUR.zp1.cur + aIdx2;
2843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = CUR.zp2.cur + aIdx1;
2844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = p1->x - p2->x;
2846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = p1->y - p2->y;
2847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2848aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* If p1 == p2, SPVTL and SFVTL behave the same as */
2849aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* SPVTCA[X] and SFVTCA[X], respectively.          */
2850aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                 */
2851aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Confirmed by Greg Hitchcock.                    */
2852aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
2853aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( A == 0 && B == 0 )
2854aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
2855aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      A    = 0x4000;
2856aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      aOpc = 0;
2857aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
2858aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
2859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( aOpc & 1 ) != 0 )
2860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
2862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
2863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
2864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, Vec );
2867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* When not using the big switch statements, the interpreter uses a */
2873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* call table defined later below in this source.  Each opcode must */
2874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* thus have a corresponding function, even trivial ones.           */
2875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                  */
2876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* They are all defined there.                                      */
2877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SVTCA                            \
2879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.x = A;                \
2887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.x = A;                \
2888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.x = A;                \
2889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.y = B;                \
2891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.y = B;                \
2892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.y = B;                \
2893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTCA                           \
2899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.x = A;                \
2907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.x = A;                \
2908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.y = B;                \
2910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.y = B;                \
2911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );             \
2913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTCA                           \
2919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.x = A;                \
2927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.y = B;                \
2928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );             \
2930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTL                                      \
2936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( INS_SxVTL( (FT_UShort)args[1],               \
2937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    (FT_UShort)args[0],               \
2938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    CUR.opcode,                       \
2939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    &CUR.GS.projVector ) == SUCCESS ) \
2940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                                 \
2941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.dualVector = CUR.GS.projVector;          \
2942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      GUESS_VECTOR( freeVector );                     \
2943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      COMPUTE_Funcs();                                \
2944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTL                                      \
2948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( INS_SxVTL( (FT_UShort)args[1],               \
2949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    (FT_UShort)args[0],               \
2950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    CUR.opcode,                       \
2951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    &CUR.GS.freeVector ) == SUCCESS ) \
2952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                                 \
2953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      GUESS_VECTOR( projVector );                     \
2954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      COMPUTE_Funcs();                                \
2955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTPV                          \
2959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );            \
2960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector = CUR.GS.projVector; \
2961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
2962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVFS                                \
2965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                             \
2966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  S;                                \
2967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   X, Y;                             \
2968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Only use low 16bits, then sign extend */ \
2971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[1];                      \
2972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Y = (FT_Long)S;                             \
2973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[0];                      \
2974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    X = (FT_Long)S;                             \
2975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( X, Y, &CUR.GS.projVector );      \
2977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector = CUR.GS.projVector;      \
2979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );                 \
2980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                            \
2981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVFS                                \
2985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                             \
2986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  S;                                \
2987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   X, Y;                             \
2988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Only use low 16bits, then sign extend */ \
2991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[1];                      \
2992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Y = (FT_Long)S;                             \
2993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[0];                      \
2994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    X = S;                                      \
2995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( X, Y, &CUR.GS.freeVector );      \
2997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );                 \
2998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                            \
2999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
3003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV                                   \
3004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )          \
3005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
3006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
3007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
3008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }                                            \
3009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                         \
3010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
3011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.projVector.x;             \
3012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.projVector.y;             \
3013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
3015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV                                   \
3016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.GS.projVector.x;               \
3017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = CUR.GS.projVector.y;
3018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
3022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV                                   \
3023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )          \
3024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
3025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
3026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
3027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }                                            \
3028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                         \
3029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
3030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.freeVector.x;             \
3031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.freeVector.y;             \
3032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
3034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV                                   \
3035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.GS.freeVector.x;               \
3036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = CUR.GS.freeVector.y;
3037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
3038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP0                      \
3041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = (FT_UShort)args[0];
3042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP1                      \
3045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = (FT_UShort)args[0];
3046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP2                      \
3049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = (FT_UShort)args[0];
3050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTHG                                         \
3053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Half_Grid;         \
3054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
3055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTG                                     \
3058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Grid;         \
3059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Grid;
3060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTDG                                           \
3063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Double_Grid;         \
3064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
3065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RUTG                                       \
3068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Up_To_Grid;         \
3069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
3070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RDTG                                         \
3073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Down_To_Grid;         \
3074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
3075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROFF                                 \
3078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Off;          \
3079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_None;
3080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SROUND                                \
3083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SET_SuperRound( 0x4000, args[0] );           \
3084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Super;         \
3085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Super;
3086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_S45ROUND                                 \
3089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SET_SuperRound( 0x2D41, args[0] );              \
3090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Super_45;         \
3091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Super_45;
3092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SLOOP                       \
3095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] < 0 )                 \
3096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Bad_Argument; \
3097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                               \
3098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop = args[0];
3099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SMD                         \
3102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.minimum_distance = args[0];
3103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SCVTCI                                     \
3106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
3107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SSWCI                                     \
3110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
3111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! or bug in the Windows engine?   */
3114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                    */
3115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      It seems that the value that is read here is  */
3116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      expressed in 16.16 format rather than in font */
3117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      units.                                        */
3118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                    */
3119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SSW                                                 \
3120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.single_width_value = (FT_F26Dot6)( args[0] >> 10 );
3121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPON            \
3124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.auto_flip = TRUE;
3125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPOFF            \
3128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.auto_flip = FALSE;
3129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDB                             \
3132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.delta_base = (FT_Short)args[0];
3133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDS                              \
3136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.delta_shift = (FT_Short)args[0];
3137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MD  /* nothing */
3140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPPEM              \
3143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CURRENT_Ppem();
3144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note: The pointSize should be irrelevant in a given font program; */
3147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       we thus decide to return only the ppem.                     */
3148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
3149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS                       \
3151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.metrics.pointSize;
3152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
3154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS                \
3156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CURRENT_Ppem();
3157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */
3159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DUP         \
3162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = args[0];
3163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CLEAR     \
3166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = 0;
3167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SWAP        \
3170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                    \
3171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  L;        \
3172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       \
3173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       \
3174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L       = args[0]; \
3175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = args[1]; \
3176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = L;       \
3177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DEPTH       \
3181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.top;
3182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3184aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#define DO_CINDEX                             \
3185aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  {                                           \
3186aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Long  L;                               \
3187aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                              \
3188aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                              \
3189aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    L = args[0];                              \
3190aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                              \
3191aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( L <= 0 || L > CUR.args )             \
3192aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {                                         \
3193aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )             \
3194aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.error = TT_Err_Invalid_Reference; \
3195aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      args[0] = 0;                            \
3196aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }                                         \
3197aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    else                                      \
3198aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      args[0] = CUR.stack[CUR.args - L];      \
3199aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  }
3200aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3201aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
320241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JROT                                                   \
320341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( args[1] != 0 )                                           \
320441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    {                                                             \
320541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( args[0] == 0 && CUR.args == 0 )                        \
320641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        CUR.error = TT_Err_Bad_Argument;                          \
320741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.IP += args[0];                                          \
320841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( CUR.IP < 0                                          || \
320941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier           ( CUR.callTop > 0                                 &&   \
321041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
321141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        CUR.error = TT_Err_Bad_Argument;                          \
321241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.step_ins = FALSE;                                       \
3213aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
3214aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3215aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
321641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JMPR                                                 \
321741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( args[0] == 0 && CUR.args == 0 )                        \
321841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.error = TT_Err_Bad_Argument;                          \
321941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    CUR.IP += args[0];                                          \
322041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.IP < 0                                          || \
322141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier         ( CUR.callTop > 0                                 &&   \
322241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier           CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
322341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.error = TT_Err_Bad_Argument;                          \
3224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
3225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
322741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JROF                                                   \
322841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( args[1] == 0 )                                           \
322941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    {                                                             \
323041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( args[0] == 0 && CUR.args == 0 )                        \
323141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        CUR.error = TT_Err_Bad_Argument;                          \
323241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.IP += args[0];                                          \
323341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( CUR.IP < 0                                          || \
323441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier           ( CUR.callTop > 0                                 &&   \
323541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
323641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        CUR.error = TT_Err_Bad_Argument;                          \
323741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.step_ins = FALSE;                                       \
3238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LT                        \
3242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] < args[1] );
3243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LTEQ                       \
3246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] <= args[1] );
3247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GT                        \
3250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] > args[1] );
3251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GTEQ                       \
3254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] >= args[1] );
3255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EQ                         \
3258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] == args[1] );
3259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEQ                        \
3262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] != args[1] );
3263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ODD                                                  \
3266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
3267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EVEN                                                \
3270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
3271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_AND                        \
3274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] && args[1] );
3275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_OR                         \
3278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] || args[1] );
3279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NOT          \
3282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = !args[0];
3283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ADD          \
3286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] += args[1];
3287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SUB          \
3290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] -= args[1];
3291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DIV                                               \
3294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] == 0 )                                      \
3295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Divide_By_Zero;                     \
3296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                                     \
3297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] );
3298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MUL                                    \
3301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = TT_MULDIV( args[0], args[1], 64L );
3302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ABS                   \
3305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_ABS( args[0] );
3306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEG          \
3309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = -args[0];
3310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLOOR    \
3313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_PIX_FLOOR( args[0] );
3314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CEILING                    \
3317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_PIX_CEIL( args[0] );
3318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_RS                           \
3321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich   {                                    \
3322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     FT_ULong  I = (FT_ULong)args[0];   \
3323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3324aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3325aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.storeSize ) ) \
3326aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     {                                  \
3327aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       if ( CUR.pedantic_hinting )      \
3328aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       {                                \
3329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         ARRAY_BOUND_ERROR;             \
3330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       }                                \
3331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       else                             \
3332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         args[0] = 0;                   \
3333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     }                                  \
3334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     else                               \
3335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       args[0] = CUR.storage[I];        \
3336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_WS                           \
3340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich   {                                    \
3341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     FT_ULong  I = (FT_ULong)args[0];   \
3342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3343aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3344aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.storeSize ) ) \
3345aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     {                                  \
3346aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       if ( CUR.pedantic_hinting )      \
3347aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       {                                \
3348aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         ARRAY_BOUND_ERROR;             \
3349aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       }                                \
3350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     }                                  \
3351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     else                               \
3352aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       CUR.storage[I] = args[1];        \
3353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RCVT                          \
3357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                     \
3358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];    \
3359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3361aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )    \
3362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                   \
3363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )       \
3364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                 \
3365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;              \
3366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                 \
3367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       else                              \
3368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         args[0] = 0;                    \
3369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                   \
3370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                \
3371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       args[0] = CUR_Func_read_cvt( I ); \
3372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTP                         \
3376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                     \
3377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];    \
3378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3380aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )    \
3381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                   \
3382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )       \
3383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                 \
3384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;              \
3385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                 \
3386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                   \
3387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                \
3388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       CUR_Func_write_cvt( I, args[1] ); \
3389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTF                                                \
3393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                                            \
3394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];                           \
3395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                                \
3396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                                \
3397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )                           \
3398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                                          \
3399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )                              \
3400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                                        \
3401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;                                     \
3402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                                        \
3403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                                          \
3404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                                       \
3405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       CUR.cvt[I] = TT_MULFIX( args[1], CUR.tt_metrics.scale ); \
3406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DEBUG                     \
3410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.error = TT_Err_Debug_OpCode;
3411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROUND                                                   \
3414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR_Func_round(                                      \
3415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                args[0],                                           \
3416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
3417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NROUND                                                            \
3420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ROUND_None( args[0],                                           \
3421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
3422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MAX               \
3425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] > args[0] ) \
3426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = args[1];
3427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MIN               \
3430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] < args[0] ) \
3431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = args[1];
3432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
3435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  ARRAY_BOUND_ERROR
3438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARRAY_BOUND_ERROR                   \
3439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                       \
3440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Invalid_Reference; \
3441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;                               \
3442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */
3448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x00-0x01                                               */
3449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SVTCA( INS_ARG )
3453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SVTCA
3455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */
3461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x02-0x03                                               */
3462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVTCA( INS_ARG )
3466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVTCA
3468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */
3474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x04-0x05                                               */
3475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTCA( INS_ARG )
3479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTCA
3481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVTL[a]:     Set PVector To Line                                     */
3487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x06-0x07                                               */
3488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
3489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVTL( INS_ARG )
3492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVTL
3494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTL[a]:     Set FVector To Line                                     */
3500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x08-0x09                                               */
3501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
3502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTL( INS_ARG )
3505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTL
3507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTPV[]:     Set FVector To PVector                                  */
3513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0E                                                    */
3514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTPV( INS_ARG )
3518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTPV
3520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVFS[]:      Set PVector From Stack                                  */
3526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0A                                                    */
3527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f2.14 f2.14 -->                                         */
3528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVFS( INS_ARG )
3531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVFS
3533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVFS[]:      Set FVector From Stack                                  */
3539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0B                                                    */
3540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f2.14 f2.14 -->                                         */
3541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVFS( INS_ARG )
3544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVFS
3546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GPV[]:        Get Projection Vector                                   */
3552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0C                                                    */
3553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        ef2.14 --> ef2.14                                       */
3554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GPV( INS_ARG )
3557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GPV
3559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GFV[]:        Get Freedom Vector                                      */
3564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0D                                                    */
3565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        ef2.14 --> ef2.14                                       */
3566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GFV( INS_ARG )
3569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GFV
3571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP0[]:       Set Reference Point 0                                   */
3577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x10                                                    */
3578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP0( INS_ARG )
3582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP0
3584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP1[]:       Set Reference Point 1                                   */
3590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x11                                                    */
3591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP1( INS_ARG )
3595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP1
3597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP2[]:       Set Reference Point 2                                   */
3603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x12                                                    */
3604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP2( INS_ARG )
3608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP2
3610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTHG[]:       Round To Half Grid                                      */
3616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x19                                                    */
3617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTHG( INS_ARG )
3621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTHG
3623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTG[]:        Round To Grid                                           */
3629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x18                                                    */
3630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTG( INS_ARG )
3634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTG
3636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTDG[]:       Round To Double Grid                                    */
3641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3D                                                    */
3642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTDG( INS_ARG )
3646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTDG
3648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RUTG[]:       Round Up To Grid                                        */
3653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7C                                                    */
3654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RUTG( INS_ARG )
3658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RUTG
3660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RDTG[]:       Round Down To Grid                                      */
3666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7D                                                    */
3667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RDTG( INS_ARG )
3671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RDTG
3673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROFF[]:       Round OFF                                               */
3679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7A                                                    */
3680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROFF( INS_ARG )
3684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ROFF
3686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SROUND[]:     Super ROUND                                             */
3692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x76                                                    */
3693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        Eint8 -->                                               */
3694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SROUND( INS_ARG )
3697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SROUND
3699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* S45ROUND[]:   Super ROUND 45 degrees                                  */
3705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x77                                                    */
3706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_S45ROUND( INS_ARG )
3710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_S45ROUND
3712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SLOOP[]:      Set LOOP variable                                       */
3718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x17                                                    */
3719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? -->                                              */
3720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SLOOP( INS_ARG )
3723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SLOOP
3725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SMD[]:        Set Minimum Distance                                    */
3731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1A                                                    */
3732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SMD( INS_ARG )
3736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SMD
3738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCVTCI[]:     Set Control Value Table Cut In                          */
3744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1D                                                    */
3745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCVTCI( INS_ARG )
3749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SCVTCI
3751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SSWCI[]:      Set Single Width Cut In                                 */
3757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1E                                                    */
3758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SSWCI( INS_ARG )
3762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SSWCI
3764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SSW[]:        Set Single Width                                        */
3770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1F                                                    */
3771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? -->                                              */
3772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SSW( INS_ARG )
3775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SSW
3777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPON[]:     Set auto-FLIP to ON                                     */
3783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4D                                                    */
3784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPON( INS_ARG )
3788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLIPON
3790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
3796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4E                                                    */
3797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack: -->                                                            */
3798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPOFF( INS_ARG )
3801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLIPOFF
3803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SANGW[]:      Set ANGle Weight                                        */
3809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7E                                                    */
3810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SANGW( INS_ARG )
3814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* instruction not supported anymore */
3816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDB[]:        Set Delta Base                                          */
3822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5E                                                    */
3823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDB( INS_ARG )
3827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SDB
3829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDS[]:        Set Delta Shift                                         */
3835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5F                                                    */
3836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDS( INS_ARG )
3840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SDS
3842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MPPEM[]:      Measure Pixel Per EM                                    */
3848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4B                                                    */
3849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> Euint16                                             */
3850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MPPEM( INS_ARG )
3853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MPPEM
3855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MPS[]:        Measure Point Size                                      */
3861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4C                                                    */
3862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> Euint16                                             */
3863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MPS( INS_ARG )
3866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MPS
3868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DUP[]:        DUPlicate the top stack's element                       */
3874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x20                                                    */
3875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt --> StkElt StkElt                                */
3876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DUP( INS_ARG )
3879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DUP
3881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* POP[]:        POP the stack's top element                             */
3887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x21                                                    */
3888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt -->                                              */
3889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_POP( INS_ARG )
3892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CLEAR[]:      CLEAR the entire stack                                  */
3900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x22                                                    */
3901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt... -->                                           */
3902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CLEAR( INS_ARG )
3905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CLEAR
3907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SWAP[]:       SWAP the stack's top two elements                       */
3913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x23                                                    */
3914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        2 * StkElt --> 2 * StkElt                               */
3915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SWAP( INS_ARG )
3918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SWAP
3920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEPTH[]:      return the stack DEPTH                                  */
3926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x24                                                    */
3927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32                                              */
3928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DEPTH( INS_ARG )
3931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DEPTH
3933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CINDEX[]:     Copy INDEXed element                                    */
3939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x25                                                    */
3940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 --> StkElt                                        */
3941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CINDEX( INS_ARG )
3944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CINDEX
3946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EIF[]:        End IF                                                  */
3952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x59                                                    */
3953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EIF( INS_ARG )
3957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JROT[]:       Jump Relative On True                                   */
3965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x78                                                    */
3966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt int32 -->                                        */
3967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JROT( INS_ARG )
3970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JROT
3972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JMPR[]:       JuMP Relative                                           */
3978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1C                                                    */
3979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 -->                                               */
3980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JMPR( INS_ARG )
3983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JMPR
3985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JROF[]:       Jump Relative On False                                  */
3991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x79                                                    */
3992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt int32 -->                                        */
3993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JROF( INS_ARG )
3996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JROF
3998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LT[]:         Less Than                                               */
4004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x50                                                    */
4005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LT( INS_ARG )
4009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_LT
4011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LTEQ[]:       Less Than or EQual                                      */
4017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x51                                                    */
4018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LTEQ( INS_ARG )
4022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_LTEQ
4024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GT[]:         Greater Than                                            */
4030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x52                                                    */
4031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GT( INS_ARG )
4035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GT
4037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GTEQ[]:       Greater Than or EQual                                   */
4043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x53                                                    */
4044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GTEQ( INS_ARG )
4048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GTEQ
4050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EQ[]:         EQual                                                   */
4056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x54                                                    */
4057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt StkElt --> bool                                  */
4058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EQ( INS_ARG )
4061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_EQ
4063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NEQ[]:        Not EQual                                               */
4069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x55                                                    */
4070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt StkElt --> bool                                  */
4071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NEQ( INS_ARG )
4074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NEQ
4076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ODD[]:        Is ODD                                                  */
4082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x56                                                    */
4083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> bool                                          */
4084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ODD( INS_ARG )
4087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ODD
4089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EVEN[]:       Is EVEN                                                 */
4095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x57                                                    */
4096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> bool                                          */
4097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EVEN( INS_ARG )
4100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_EVEN
4102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* AND[]:        logical AND                                             */
4108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5A                                                    */
4109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> uint32                                */
4110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_AND( INS_ARG )
4113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_AND
4115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* OR[]:         logical OR                                              */
4121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5B                                                    */
4122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> uint32                                */
4123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_OR( INS_ARG )
4126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_OR
4128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NOT[]:        logical NOT                                             */
4134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5C                                                    */
4135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt --> uint32                                       */
4136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NOT( INS_ARG )
4139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NOT
4141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ADD[]:        ADD                                                     */
4147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x60                                                    */
4148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ADD( INS_ARG )
4152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ADD
4154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SUB[]:        SUBtract                                                */
4160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x61                                                    */
4161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SUB( INS_ARG )
4165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SUB
4167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DIV[]:        DIVide                                                  */
4173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x62                                                    */
4174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DIV( INS_ARG )
4178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DIV
4180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MUL[]:        MULtiply                                                */
4186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x63                                                    */
4187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MUL( INS_ARG )
4191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MUL
4193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ABS[]:        ABSolute value                                          */
4199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x64                                                    */
4200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ABS( INS_ARG )
4204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ABS
4206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NEG[]:        NEGate                                                  */
4212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x65                                                    */
4213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack: f26.6 --> f26.6                                                */
4214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NEG( INS_ARG )
4217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NEG
4219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLOOR[]:      FLOOR                                                   */
4225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x66                                                    */
4226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLOOR( INS_ARG )
4230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLOOR
4232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CEILING[]:    CEILING                                                 */
4238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x67                                                    */
4239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CEILING( INS_ARG )
4243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CEILING
4245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RS[]:         Read Store                                              */
4251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x43                                                    */
4252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> uint32                                       */
4253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RS( INS_ARG )
4256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RS
4258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WS[]:         Write Store                                             */
4264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x42                                                    */
4265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
4266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WS( INS_ARG )
4269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WS
4271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WCVTP[]:      Write CVT in Pixel units                                */
4277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x44                                                    */
4278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
4279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WCVTP( INS_ARG )
4282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WCVTP
4284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WCVTF[]:      Write CVT in Funits                                     */
4290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x70                                                    */
4291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
4292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WCVTF( INS_ARG )
4295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WCVTF
4297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RCVT[]:       Read CVT                                                */
4303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x45                                                    */
4304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> f26.6                                        */
4305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RCVT( INS_ARG )
4308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RCVT
4310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* AA[]:         Adjust Angle                                            */
4316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7F                                                    */
4317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_AA( INS_ARG )
4321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* intentionally no longer supported */
4323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEBUG[]:      DEBUG.  Unsupported.                                    */
4329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4F                                                    */
4330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note: The original instruction pops a value from the stack.           */
4333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DEBUG( INS_ARG )
4336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DEBUG
4338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROUND[ab]:    ROUND value                                             */
4344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x68-0x6B                                               */
4345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROUND( INS_ARG )
4349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ROUND
4351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NROUND[ab]:   No ROUNDing of value                                    */
4357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x6C-0x6F                                               */
4358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NROUND( INS_ARG )
4362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NROUND
4364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MAX[]:        MAXimum                                                 */
4370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x68                                                    */
4371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> int32                                 */
4372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MAX( INS_ARG )
4375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MAX
4377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIN[]:        MINimum                                                 */
4383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x69                                                    */
4384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> int32                                 */
4385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIN( INS_ARG )
4388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MIN
4390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
4394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The following functions are called as is within the switch statement. */
4399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MINDEX[]:     Move INDEXed element                                    */
4406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x26                                                    */
4407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? --> StkElt                                       */
4408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MINDEX( INS_ARG )
4411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  L, K;
4413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = args[0];
4416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( L <= 0 || L > CUR.args )
4418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4419aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
4420aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.error = TT_Err_Invalid_Reference;
4421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4422aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    else
4423aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
4424aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      K = CUR.stack[CUR.args - L];
4425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4426aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],
4427aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     &CUR.stack[CUR.args - L + 1],
4428aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     ( L - 1 ) );
4429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4430aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.stack[CUR.args - 1] = K;
4431aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
4432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROLL[]:       ROLL top three elements                                 */
4438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8A                                                    */
4439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        3 * StkElt --> 3 * StkElt                               */
4440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROLL( INS_ARG )
4443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  A, B, C;
4445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
4447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = args[2];
4450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = args[1];
4451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    C = args[0];
4452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[2] = C;
4454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = A;
4455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = B;
4456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING THE FLOW OF CONTROL                                          */
4462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
4464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
4469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  SkipCode( EXEC_OP )
4470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += CUR.length;
4472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.IP < CUR.codeSize )
4474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.opcode = CUR.code[CUR.IP];
4476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.length = opcode_length[CUR.opcode];
4478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.length < 0 )
4479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
448041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        if ( CUR.IP + 1 >= CUR.codeSize )
4481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail_Overflow;
4482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
4483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP + CUR.length <= CUR.codeSize )
4486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
4487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail_Overflow:
4490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.error = TT_Err_Code_Overflow;
4491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FAILURE;
4492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IF[]:         IF test                                                 */
4498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x58                                                    */
4499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt -->                                              */
4500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IF( INS_ARG )
4503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int   nIfs;
4505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool  Out;
4506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] != 0 )
4509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nIfs = 1;
4512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Out = 0;
4513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
4515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( SKIP_Code() == FAILURE )
4517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x58:      /* IF */
4522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs++;
4523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x1B:      /* ELSE */
4526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Out = FT_BOOL( nIfs == 1 );
4527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x59:      /* EIF */
4530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs--;
4531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Out = FT_BOOL( nIfs == 0 );
4532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( Out == 0 );
4535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ELSE[]:       ELSE                                                    */
4541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1B                                                    */
4542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
4543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ELSE( INS_ARG )
4546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  nIfs;
4548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
4550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nIfs = 1;
4553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
4555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( SKIP_Code() == FAILURE )
4557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x58:    /* IF */
4562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs++;
4563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x59:    /* EIF */
4566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs--;
4567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( nIfs != 0 );
4570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */
4576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
4578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FDEF[]:       Function DEFinition                                     */
4585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2C                                                    */
4586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FDEF( INS_ARG )
4590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       n;
4592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  rec;
4593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit;
4594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some font programs are broken enough to redefine functions! */
4597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We will then parse the current table.                       */
4598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec   = CUR.FDefs;
4600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = rec + CUR.numFDefs;
4601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    n     = args[0];
4602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; rec < limit; rec++ )
4604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( rec->opc == n )
4606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( rec == limit )
4610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check that there is enough room for new functions */
4612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.numFDefs >= CUR.maxFDefs )
4613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Too_Many_Function_Defs;
4615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.numFDefs++;
4618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4620295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* Although FDEF takes unsigned 32-bit integer,  */
4621295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* func # must be within unsigned 16-bit integer */
4622295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( n > 0xFFFFU )
4623295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
4624295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.error = TT_Err_Too_Many_Function_Defs;
4625295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
4626295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
4627295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
4628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec->range  = CUR.curRange;
4629295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    rec->opc    = (FT_UInt16)n;
4630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec->start  = CUR.IP + 1;
4631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec->active = TRUE;
4632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n > CUR.maxFunc )
4634295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.maxFunc = (FT_UInt16)n;
4635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now skip the whole function definition. */
4637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We don't allow nested IDEFS & FDEFs.    */
4638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( SKIP_Code() == SUCCESS )
4640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x89:    /* IDEF */
4644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2C:    /* FDEF */
4645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Nested_DEFS;
4646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2D:   /* ENDF */
464941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        rec->end = CUR.IP;
4650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ENDF[]:       END Function definition                                 */
4659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2D                                                    */
4660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
4661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ENDF( INS_ARG )
4664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*  pRec;
4666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
4668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */
4671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_ENDF_In_Exec_Stream;
4673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.callTop--;
4677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pRec = &CUR.callStack[CUR.callTop];
4679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pRec->Cur_Count--;
4681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
4683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pRec->Cur_Count > 0 )
4685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.callTop++;
4687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.IP = pRec->Cur_Restart;
4688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
4690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Loop through the current function */
4691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      INS_Goto_CodeRange( pRec->Caller_Range,
4692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          pRec->Caller_IP );
4693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Exit the current call frame.                      */
4695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: If the last instruction of a program is a   */
4697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       CALL or LOOPCALL, the return address is     */
4698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       always out of the code range.  This is a    */
4699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       valid address, and it is why we do not test */
4700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       the result of Ins_Goto_CodeRange() here!    */
4701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CALL[]:       CALL function                                           */
4707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2B                                                    */
4708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
4709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CALL( INS_ARG )
4712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       F;
4714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*    pCrec;
4715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first of all, check the index */
4719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    F = args[0];
4721aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
4722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Except for some old Apple fonts, all functions in a TrueType */
4725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* font are defined in increasing order, starting from 0.  This */
4726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* means that we normally have                                  */
4727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
4729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
4730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If this isn't true, we need to look up the function table.   */
4732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def = CUR.FDefs + F;
4734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
4735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look up the FDefs table */
4737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_DefRecord*  limit;
4738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      def   = CUR.FDefs;
4741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      limit = def + CUR.numFDefs;
4742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( def < limit && def->opc != F )
4744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        def++;
4745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def == limit )
4747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
4748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that the function is active */
4751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !def->active )
4752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check the call stack */
4755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop >= CUR.callSize )
4756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Stack_Overflow;
4758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec = CUR.callStack + CUR.callTop;
4762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Caller_Range = CUR.curRange;
4764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Caller_IP    = CUR.IP + 1;
4765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Cur_Count    = 1;
4766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Cur_Restart  = def->start;
476741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    pCrec->Cur_End      = def->end;
4768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.callTop++;
4770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    INS_Goto_CodeRange( def->range,
4772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        def->start );
4773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
4775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
4776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
4778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.error = TT_Err_Invalid_Reference;
4779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LOOPCALL[]:   LOOP and CALL function                                  */
4785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2A                                                    */
4786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? Eint16? -->                                     */
4787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LOOPCALL( INS_ARG )
4790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       F;
4792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*    pCrec;
4793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first of all, check the index */
4797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    F = args[1];
4798aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
4799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Except for some old Apple fonts, all functions in a TrueType */
4802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* font are defined in increasing order, starting from 0.  This */
4803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* means that we normally have                                  */
4804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
4806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
4807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If this isn't true, we need to look up the function table.   */
4809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def = CUR.FDefs + F;
4811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
4812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look up the FDefs table */
4814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_DefRecord*  limit;
4815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      def   = CUR.FDefs;
4818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      limit = def + CUR.numFDefs;
4819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( def < limit && def->opc != F )
4821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        def++;
4822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def == limit )
4824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
4825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that the function is active */
4828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !def->active )
4829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check stack */
4832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop >= CUR.callSize )
4833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Stack_Overflow;
4835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] > 0 )
4839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec = CUR.callStack + CUR.callTop;
4841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Caller_Range = CUR.curRange;
4843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Caller_IP    = CUR.IP + 1;
4844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Cur_Count    = (FT_Int)args[0];
4845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Cur_Restart  = def->start;
484641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      pCrec->Cur_End      = def->end;
4847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.callTop++;
4849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      INS_Goto_CodeRange( def->range, def->start );
4851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.step_ins = FALSE;
4853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
4855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
4857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.error = TT_Err_Invalid_Reference;
4858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IDEF[]:       Instruction DEFinition                                  */
4864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x89                                                    */
4865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        Eint8 -->                                               */
4866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IDEF( INS_ARG )
4869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit;
4872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  First of all, look for the same function in our table */
4875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def   = CUR.IDefs;
4877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = def + CUR.numIDefs;
4878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; def < limit; def++ )
4880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def->opc == (FT_ULong)args[0] )
4881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( def == limit )
4884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check that there is enough room for a new instruction */
4886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.numIDefs >= CUR.maxIDefs )
4887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Too_Many_Instruction_Defs;
4889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.numIDefs++;
4892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4894295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* opcode must be unsigned 8-bit integer */
4895295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( 0 > args[0] || args[0] > 0x00FF )
4896295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
4897295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.error = TT_Err_Too_Many_Instruction_Defs;
4898295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
4899295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
4900295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
4901295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    def->opc    = (FT_Byte)args[0];
4902aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    def->start  = CUR.IP + 1;
4903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def->range  = CUR.curRange;
4904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def->active = TRUE;
4905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( (FT_ULong)args[0] > CUR.maxIns )
4907295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.maxIns = (FT_Byte)args[0];
4908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now skip the whole function definition. */
4910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We don't allow nested IDEFs & FDEFs.    */
4911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( SKIP_Code() == SUCCESS )
4913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x89:   /* IDEF */
4917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2C:   /* FDEF */
4918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Nested_DEFS;
4919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2D:   /* ENDF */
4921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */
4930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
4932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NPUSHB[]:     PUSH N Bytes                                            */
4939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x40                                                    */
4940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32...                                           */
4941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NPUSHB( INS_ARG )
4944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
4946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)CUR.code[CUR.IP + 1];
4949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
4951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Stack_Overflow;
4953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 1; K <= L; K++ )
4957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K - 1] = CUR.code[CUR.IP + K + 1];
4958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top += L;
4960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NPUSHW[]:     PUSH N Words                                            */
4966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x41                                                    */
4967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> int32...                                            */
4968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NPUSHW( INS_ARG )
4971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
4973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)CUR.code[CUR.IP + 1];
4976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
4978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Stack_Overflow;
4980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += 2;
4984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 0; K < L; K++ )
4986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K] = GET_ShortIns();
4987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
4989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top += L;
4990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHB[abc]:   PUSH Bytes                                              */
4996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xB0-0xB7                                               */
4997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32...                                           */
4998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_PUSHB( INS_ARG )
5001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
5006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Stack_Overflow;
5010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 1; K <= L; K++ )
5014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K - 1] = CUR.code[CUR.IP + K];
5015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHW[abc]:   PUSH Words                                              */
5021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xB8-0xBF                                               */
5022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> int32...                                            */
5023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_PUSHW( INS_ARG )
5026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
5031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error = TT_Err_Stack_Overflow;
5035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP++;
5039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 0; K < L; K++ )
5041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K] = GET_ShortIns();
5042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
5044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING THE GRAPHICS STATE                                           */
5050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Instructions appear in the specs' order.                             */
5052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GC[a]:        Get Coordinate projected onto                           */
5059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x46-0x47                                               */
5060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> f26.6                                        */
5061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
506241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */
506341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*      along the dual projection vector!                                */
5064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GC( INS_ARG )
5067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    L;
5069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  R;
5070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_ULong)args[0];
5073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5074aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( L, CUR.zp2.n_points ) )
5075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5078aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      R = 0;
5079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.opcode & 1 )
5083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        R = CUR_fast_dualproj( &CUR.zp2.org[L] );
5084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        R = CUR_fast_project( &CUR.zp2.cur[L] );
5086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = R;
5089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCFS[]:       Set Coordinate From Stack                               */
5095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x48                                                    */
5096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
5097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Formula:                                                              */
5099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */
5101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCFS( INS_ARG )
5104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    K;
5106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L;
5107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.zp2.n_points ) )
5112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = CUR_fast_project( &CUR.zp2.cur[L] );
5119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp2, L, args[1] - K );
5121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5122aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
5123aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
5124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep2 == 0 )
5125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.org[L] = CUR.zp2.cur[L];
5126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MD[a]:        Measure Distance                                        */
5132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x49-0x4A                                               */
5133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> f26.6                                 */
5134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
513541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */
513641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                    the dual projection vector.                        */
5137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
513841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */
513941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                      0 => measure distance in original outline        */
514041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                      1 => measure distance in grid-fitted outline     */
5141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
514241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */
5143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MD( INS_ARG )
5146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   K, L;
5148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  D;
5149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( L, CUR.zp0.n_points ) ||
5155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDS( K, CUR.zp1.n_points ) )
5156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      D = 0;
5160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.opcode & 1 )
5164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
5165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
516727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra        /* XXX: UNDOCUMENTED: twilight zone special case */
5168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
516927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
5170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
517127811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec1 = CUR.zp0.org + L;
517227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec2 = CUR.zp1.org + K;
517327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
517427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
5175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          D = CUR_Func_dualproj( vec1, vec2 );
5176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
5178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
517927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec1 = CUR.zp0.orus + L;
518027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec2 = CUR.zp1.orus + K;
5181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
518327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
518427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          {
518527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            /* this should be faster */
518627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = CUR_Func_dualproj( vec1, vec2 );
518727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = TT_MULFIX( D, CUR.metrics.x_scale );
518827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          }
518927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          else
519027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          {
519127811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            FT_Vector  vec;
519227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
5193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
519427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale );
519527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale );
519627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
519727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = CUR_fast_dualproj( &vec );
519827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          }
5199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = D;
5204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDPVTL[a]:    Set Dual PVector to Line                                */
5210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x86-0x87                                               */
5211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDPVTL( INS_ARG )
5215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    A, B, C;
5217aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */
5218aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Int     aOpc = CUR.opcode;
5219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = (FT_UShort)args[1];
5222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = (FT_UShort)args[0];
5223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( p2, CUR.zp1.n_points ) ||
5225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( p1, CUR.zp2.n_points ) )
5226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector* v1 = CUR.zp1.org + p2;
5234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector* v2 = CUR.zp2.org + p1;
5235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = v1->x - v2->x;
5238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = v1->y - v2->y;
5239aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
5240aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* If v1 == v2, SDPVTL behaves the same as */
5241aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* SVTCA[X], respectively.                 */
5242aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /*                                         */
5243aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* Confirmed by Greg Hitchcock.            */
5244aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
5245aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( A == 0 && B == 0 )
5246aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
5247aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        A    = 0x4000;
5248aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        aOpc = 0;
5249aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
5250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5252aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( ( aOpc & 1 ) != 0 )
5253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
5255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
5256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
5257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, &CUR.GS.dualVector );
5260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  v1 = CUR.zp1.cur + p2;
5263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  v2 = CUR.zp2.cur + p1;
5264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = v1->x - v2->x;
5267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = v1->y - v2->y;
5268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5270aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( ( aOpc & 1 ) != 0 )
5271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
5273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
5274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
5275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, &CUR.GS.projVector );
5278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );
5280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
5282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP0[]:       Set Zone Pointer 0                                      */
5288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x13                                                    */
5289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP0( INS_ARG )
5293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.twilight;
5298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.pts;
5302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep0 = (FT_UShort)args[0];
5311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP1[]:       Set Zone Pointer 1                                      */
5317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x14                                                    */
5318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP1( INS_ARG )
5322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1 = CUR.twilight;
5327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1 = CUR.pts;
5331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep1 = (FT_UShort)args[0];
5340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP2[]:       Set Zone Pointer 2                                      */
5346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x15                                                    */
5347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP2( INS_ARG )
5351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2 = CUR.twilight;
5356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2 = CUR.pts;
5360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep2 = (FT_UShort)args[0];
5369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZPS[]:       Set Zone PointerS                                       */
5375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x16                                                    */
5376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZPS( INS_ARG )
5380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.twilight;
5385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.pts;
5389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp1 = CUR.zp0;
5398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp2 = CUR.zp0;
5399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep0 = (FT_UShort)args[0];
5401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep1 = (FT_UShort)args[0];
5402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep2 = (FT_UShort)args[0];
5403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* INSTCTRL[]:   INSTruction ConTRoL                                     */
5409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8e                                                    */
5410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 int32 -->                                         */
5411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_INSTCTRL( INS_ARG )
5414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  K, L;
5416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = args[1];
5419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = args[0];
5420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( K < 1 || K > 2 )
5422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( L != 0 )
5429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        L = K;
5430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.instruct_control = FT_BOOL(
5432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
5433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCANCTRL[]:   SCAN ConTRoL                                            */
5439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x85                                                    */
5440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
5441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCANCTRL( INS_ARG )
5444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  A;
5446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Get Threshold */
5449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Int)( args[0] & 0xFF );
5450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( A == 0xFF )
5452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( A == 0 )
5457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
54620a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
5463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
5466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
5469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
54710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
5472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
5475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
5478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCANTYPE[]:   SCAN TYPE                                               */
5485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8D                                                    */
5486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
5487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCANTYPE( INS_ARG )
5490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
54910a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( args[0] >= 0 )
5492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_type = (FT_Int)args[0];
5493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING OUTLINES                                                     */
5499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
5501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPPT[]:     FLIP PoinT                                              */
5508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x80                                                    */
5509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
5510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPPT( INS_ARG )
5513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  point;
5515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
5517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
5520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5521aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5522aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.error = TT_Err_Too_Few_Arguments;
5523aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.pts.n_points ) )
5533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
5537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
5542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
5544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5546aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
5547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
5548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
5549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPRGON[]:   FLIP RanGe ON                                           */
5555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x81                                                    */
5556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPRGON( INS_ARG )
5560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  I, K, L;
5562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( K, CUR.pts.n_points ) ||
5568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( L, CUR.pts.n_points ) )
5569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( I = L; I <= K; I++ )
5576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
5577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPRGOFF:    FLIP RanGe OFF                                          */
5583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x82                                                    */
5584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPRGOFF( INS_ARG )
5588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  I, K, L;
5590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( K, CUR.pts.n_points ) ||
5596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( L, CUR.pts.n_points ) )
5597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( I = L; I <= K; I++ )
5604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
5605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
5609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,
5610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6*   y,
5611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       TT_GlyphZone  zone,
5612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_UShort*    refp )
5613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_GlyphZoneRec  zp;
5615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        p;
5616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6       d;
5617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.opcode & 1 )
5620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zp = CUR.zp0;
5622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      p  = CUR.GS.rp1;
5623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zp = CUR.zp1;
5627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      p  = CUR.GS.rp2;
5628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( p, zp.n_points ) )
5631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *refp = 0;
5635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
5636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *zone = zp;
5639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *refp = p;
5640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    d = CUR_Func_project( zp.cur + p, zp.org + p );
5642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *x = d;
5649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *y = 0;
5650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *x = 0;
5654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *y = d;
5655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *x = TT_MULDIV( d,
5661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      (FT_Long)CUR.GS.freeVector.x * 0x10000L,
5662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      CUR.F_dot_P );
5663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *y = TT_MULDIV( d,
5664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      (FT_Long)CUR.GS.freeVector.y * 0x10000L,
5665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      CUR.F_dot_P );
5666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
5669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,
5674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  dx,
5675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  dy,
5676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Bool     touch )
5677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.cur[point].x += dx;
5684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( touch )
5685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
5686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.cur[point].y += dy;
5690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( touch )
5691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
5692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x != 0 )
5698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x += dx;
5700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( touch )
5701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
5702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.y != 0 )
5705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y += dy;
5707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( touch )
5708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
5709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHP[a]:       SHift Point by the last point                           */
5716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x32-0x33                                               */
5717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
5718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHP( INS_ARG )
5721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_GlyphZoneRec  zp;
5723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        refp;
5724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6       dx,
5726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     dy;
5727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        point;
5728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
5730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
5733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5734aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5735aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.error = TT_Err_Invalid_Reference;
5736aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
5748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
5752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( point, dx, dy, TRUE );
5757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
5759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5761aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
5762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
5763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
5764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHC[a]:       SHift Contour                                           */
5770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x34-35                                                 */
5771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
577341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */
577441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*               contour in the twilight zone, namely contour number     */
577541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*               zero.                                                   */
577641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                                                                       */
5777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHC( INS_ARG )
5779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
578041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    TT_GlyphZoneRec  zp;
578141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        refp;
578241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_F26Dot6       dx, dy;
5783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
578441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Short         contour, bounds;
578541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        start, limit, i;
5786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    contour = (FT_UShort)args[0];
578941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
5790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
579141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( BOUNDS( contour, bounds ) )
5792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( contour == 0 )
580241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      start = 0;
5803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
580441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
580541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.zp2.first_point );
5806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
580741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* we use the number of points if in the twilight zone */
580841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.GS.gep2 == 0 )
580941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = CUR.zp2.n_points;
581041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    else
581141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)( CUR.zp2.contours[contour] -
581241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.zp2.first_point + 1 );
5813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
581441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    for ( i = start; i < limit; i++ )
5815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( zp.cur != CUR.zp2.cur || refp != i )
5817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( i, dx, dy, TRUE );
5818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHZ[a]:       SHift Zone                                              */
5825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x36-37                                                 */
5826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHZ( INS_ARG )
5830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5831aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    TT_GlyphZoneRec  zp;
5832aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UShort        refp;
5833aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_F26Dot6       dx,
5834aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     dy;
5835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
583641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        limit, i;
5837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( args[0], 2 ) )
5840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
584941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
585041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      Twilight zone has no real contours, so use `n_points'. */
585141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      Normal zone's `n_points' includes phantoms, so must    */
585241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      use end of last contour.                               */
585341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.GS.gep2 == 0 )
585441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)CUR.zp2.n_points;
5855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 )
585641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
5857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
585841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = 0;
5859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
586141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    for ( i = 0; i < limit; i++ )
5862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( zp.cur != CUR.zp2.cur || refp != i )
5864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( i, dx, dy, FALSE );
5865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHPIX[]:      SHift points by a PIXel amount                          */
5872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x38                                                    */
5873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32... -->                                     */
5874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHPIX( INS_ARG )
5877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx, dy;
5879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
5880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop + 1 )
5883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5884aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5885aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.error = TT_Err_Invalid_Reference;
5886aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5894295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        dx = TT_MulFix14( (FT_UInt32)args[0], 0x4000 );
5895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dy = 0;
5896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dx = 0;
5900295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        dy = TT_MulFix14( (FT_UInt32)args[0], 0x4000 );
5901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5906295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
5907295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
5908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
5917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
5921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( point, dx, dy, TRUE );
5926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
5928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5930aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
5931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
5932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
5933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */
5939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3A-0x3B                                               */
5940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
5941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MSIRP( INS_ARG )
5944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
5946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
5947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
5950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
5952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
5953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
5956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5959aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
5960aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
5961aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( CUR.GS.gep1 == 0 )
5962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
5964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR_Func_move_orig( &CUR.zp1, point, args[1] );
5965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.cur[point] = CUR.zp1.org[point];
5966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_project( CUR.zp1.cur + point,
5969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp0.cur + CUR.GS.rp0 );
5970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, args[1] - distance );
5972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
5974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
5975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )
5977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
5978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MDAP[a]:      Move Direct Absolute Point                              */
5984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2E-0x2F                                               */
5985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MDAP( INS_ARG )
5989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
5991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  cur_dist,
5992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                distance;
5993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
5996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point, CUR.zp0.n_points ) )
5998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )
6005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
6007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round( cur_dist,
6008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.tt_metrics.compensations[0] ) - cur_dist;
6009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = 0;
6012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, point, distance );
6014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = point;
6016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = point;
6017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIAP[a]:      Move Indirect Absolute Point                            */
6023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3E-0x3F                                               */
6024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
6025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIAP( INS_ARG )
6028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    cvtEntry;
6030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance,
6032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                org_dist;
6033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cvtEntry = (FT_ULong)args[1];
6036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point    = (FT_UShort)args[0];
6037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6038aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( point,     CUR.zp0.n_points ) ||
6039aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDSL( cvtEntry, CUR.cvtSize )      )
6040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6043aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6046aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!                                                      */
6047aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6048aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* The behaviour of an MIAP instruction is quite different when used  */
6049aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* in the twilight zone.                                              */
6050aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6051aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* First, no control value cut-in test is performed as it would fail  */
6052aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */
6053aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* zp0.point, is set to the absolute, unrounded distance found in the */
6054aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* CVT.                                                               */
6055aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6056aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* This is used in the CVT programs of the Microsoft fonts Arial,     */
6057aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Times, etc., in order to re-adjust some key font heights.  It      */
6058aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* allows the use of the IP instruction in the twilight zone, which   */
6059aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* otherwise would be invalid according to the specification.         */
6060aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6061aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* We implement it with a special sequence for the twilight zone.     */
6062aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* This is a bad hack, but it seems to work.                          */
6063aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6064aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Confirmed by Greg Hitchcock.                                       */
6065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_read_cvt( cvtEntry );
6067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */
6069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6070aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
6071aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                          CUR.GS.freeVector.x );
6072aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
6073aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                          CUR.GS.freeVector.y ),
6074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0.cur[point]   = CUR.zp0.org[point];
6075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
6078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cutin flag */
6080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin )
6082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        distance = org_dist;
6083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] );
6085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, point, distance - org_dist );
6088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6089aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = point;
6091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = point;
6092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MDRP[abcde]:  Move Direct Relative Point                              */
6098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xC0-0xDF                                               */
6099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MDRP( INS_ARG )
6103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  org_dist, distance;
6106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6115aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: Is there some undocumented feature while in the */
6119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      twilight zone?                                  */
6120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED: twilight zone special case */
6122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
6124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec1 = &CUR.zp1.org[point];
6126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];
6127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      org_dist = CUR_Func_dualproj( vec1, vec2 );
6130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec1 = &CUR.zp1.orus[point];
6134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];
6135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
6138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this should be faster */
6140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( vec1, vec2 );
6141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale );
6142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Vector  vec;
6146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale );
6149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale );
6150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_fast_dualproj( &vec );
6152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* single width cut-in test */
6156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
6158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         CUR.GS.single_width_cutin )
6159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR.GS.single_width_value;
6162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = -CUR.GS.single_width_value;
6164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* round flag */
6167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 4 ) != 0 )
6169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round(
6170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   org_dist,
6171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = ROUND_None(
6174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   org_dist,
6175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* minimum distance flag */
6178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 8 ) != 0 )
6180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( distance < CUR.GS.minimum_distance )
6184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          distance = CUR.GS.minimum_distance;
6185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( distance > -CUR.GS.minimum_distance )
6189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          distance = -CUR.GS.minimum_distance;
6190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* now move the point */
6194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_Func_project( CUR.zp1.cur + point,
6196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp0.cur + CUR.GS.rp0 );
6197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, distance - org_dist );
6199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6200aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 16 ) != 0 )
6205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIRP[abcde]:  Move Indirect Relative Point                            */
6212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xE0-0xFF                                               */
6213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? uint32 -->                                       */
6214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIRP( INS_ARG )
6217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    cvtEntry;
6220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  cvt_dist,
6222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                distance,
6223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                cur_dist,
6224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                org_dist;
6225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point    = (FT_UShort)args[0];
6228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cvtEntry = (FT_ULong)( args[1] + 1 );
6229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
6231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDSL( cvtEntry,  CUR.cvtSize + 1 )  ||
6234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6238aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !cvtEntry )
6242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cvt_dist = 0;
6243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
6245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* single width test */
6247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
6249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         CUR.GS.single_width_cutin )
6250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( cvt_dist >= 0 )
6252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist =  CUR.GS.single_width_value;
6253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist = -CUR.GS.single_width_value;
6255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6257aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
6258aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
6259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep1 == 0 )
6260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
6262295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             TT_MulFix14( (FT_UInt32)cvt_dist,
6263295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                          CUR.GS.freeVector.x );
6264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
6265295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             TT_MulFix14( (FT_UInt32)cvt_dist,
6266295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                          CUR.GS.freeVector.y );
626741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.zp1.cur[point]   = CUR.zp1.org[point];
6268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
6271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  &CUR.zp0.org[CUR.GS.rp0] );
6272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
6273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  &CUR.zp0.cur[CUR.GS.rp0] );
6274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* auto-flip test */
6276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.auto_flip )
6278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( org_dist ^ cvt_dist ) < 0 )
6280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist = -cvt_dist;
6281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* control value cutin and round */
6284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 4 ) != 0 )
6286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
6288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      refer to the same zone.                                  */
6289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.gep0 == CUR.GS.gep1 )
6291aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
6292aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* XXX: According to Greg Hitchcock, the following wording is */
6293aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      the right one:                                        */
6294aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*                                                            */
6295aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        When the absolute difference between the value in   */
6296aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        the table [CVT] and the measurement directly from   */
6297aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        the outline is _greater_ than the cut_in value, the */
6298aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        outline measurement is used.                        */
6299aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*                                                            */
6300aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      This is from `instgly.doc'.  The description in       */
6301aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
6302aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      it implies `>=' instead of `>'.                       */
6303aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
6304aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( FT_ABS( cvt_dist - org_dist ) > CUR.GS.control_value_cutin )
6305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cvt_dist = org_dist;
6306aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
6307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round(
6309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   cvt_dist,
6310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = ROUND_None(
6314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   cvt_dist,
6315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* minimum distance test */
6318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 8 ) != 0 )
6320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( distance < CUR.GS.minimum_distance )
6324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          distance = CUR.GS.minimum_distance;
6325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( distance > -CUR.GS.minimum_distance )
6329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          distance = -CUR.GS.minimum_distance;
6330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
6334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6335aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 16 ) != 0 )
6339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ALIGNRP[]:    ALIGN Relative Point                                    */
6348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3C                                                    */
6349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32... -->                                    */
6350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ALIGNRP( INS_ARG )
6353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
6358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop ||
6361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6365aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
6369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
6371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
6373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp1.n_points ) )
6375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
6377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
6379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
6380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        distance = CUR_Func_project( CUR.zp1.cur + point,
6385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     CUR.zp0.cur + CUR.GS.rp0 );
6386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR_Func_move( &CUR.zp1, point, -distance );
6388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
6391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6393aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ISECT[]:      moves point to InterSECTion                             */
6402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0F                                                    */
6403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        5 * uint32 -->                                          */
6404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ISECT( INS_ARG )
6407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point,
6409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                a0, a1,
6410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                b0, b1;
6411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  discriminant;
6413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx,  dy,
6415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                dax, day,
6416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                dbx, dby;
6417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
6419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector   R;
6421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a0 = (FT_UShort)args[1];
6426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a1 = (FT_UShort)args[2];
6427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b0 = (FT_UShort)args[3];
6428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b1 = (FT_UShort)args[4];
6429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( b0, CUR.zp0.n_points )  ||
6431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( b1, CUR.zp0.n_points )  ||
6432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( a0, CUR.zp1.n_points )  ||
6433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( a1, CUR.zp1.n_points )  ||
6434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( point, CUR.zp2.n_points ) )
6435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
6442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
6443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
6445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
6446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
6448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
6449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
6451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    discriminant = TT_MULDIV( dax, -dby, 0x40 ) +
6453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_MULDIV( day, dbx, 0x40 );
6454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( discriminant ) >= 0x40 )
6456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 );
6458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      R.x = TT_MULDIV( val, dax, discriminant );
6460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      R.y = TT_MULDIV( val, day, discriminant );
6461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
6463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
6464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* else, take the middle of the middles of A and B */
6468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
6470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp1.cur[a1].x +
6471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b0].x +
6472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b1].x ) / 4;
6473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
6474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp1.cur[a1].y +
6475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b0].y +
6476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b1].y ) / 4;
6477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ALIGNPTS[]:   ALIGN PoinTS                                            */
6484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x27                                                    */
6485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
6486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ALIGNPTS( INS_ARG )
6489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   p1, p2;
6491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = (FT_UShort)args[0];
6495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = (FT_UShort)args[1];
6496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6497aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( p1, CUR.zp1.n_points ) ||
6498aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDS( p2, CUR.zp0.n_points ) )
6499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_project( CUR.zp0.cur + p2,
6506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp1.cur + p1 ) / 2;
6507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, p1, distance );
6509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, p2, -distance );
6510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IP[]:         Interpolate Point                                       */
6516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x39                                                    */
6517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
6518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SOMETIMES, DUMBER CODE IS BETTER CODE */
6521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IP( INS_ARG )
6524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  old_range, cur_range;
6526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orus_base;
6527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  cur_base;
6528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int      twilight;
6529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
6531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
6534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6535aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
6536aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.error = TT_Err_Invalid_Reference;
6537aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*
6541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * We need to deal in a special way with the twilight zone.
6542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
6543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * for every n.
6544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
6545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
6546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
6548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6551aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( twilight )
6555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus_base = &CUR.zp0.org[CUR.GS.rp1];
6556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus_base = &CUR.zp0.orus[CUR.GS.rp1];
6558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur_base = &CUR.zp0.cur[CUR.GS.rp1];
6560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: There are some glyphs in some braindead but popular */
6562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
6563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      calling IP[] with bad values of rp[12].             */
6564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      Do something sane when this odd thing happens.      */
6565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
6566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
6567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      old_range = 0;
6569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_range = 0;
6570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( twilight )
6574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
6575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       orus_base );
657641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
6577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
6578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       orus_base );
657941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else
658041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      {
658141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_Vector  vec;
658241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
658341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
658441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        vec.x = TT_MULFIX( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
658541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.x_scale );
658641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        vec.y = TT_MULFIX( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
658741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.y_scale );
658841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
658941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        old_range = CUR_fast_dualproj( &vec );
659041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      }
6591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
6593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
6596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];
6598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_F26Dot6  org_dist, cur_dist, new_dist;
6599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check point bounds */
6602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
6603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
6605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
6607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
6608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        continue;
6610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( twilight )
6613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
661441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
6615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
661641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else
661741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      {
661841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_Vector  vec;
661941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
662041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
662141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        vec.x = TT_MULFIX( CUR.zp2.orus[point].x - orus_base->x,
662241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.x_scale );
662341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        vec.y = TT_MULFIX( CUR.zp2.orus[point].y - orus_base->y,
662441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.y_scale );
662541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
662641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        org_dist = CUR_fast_dualproj( &vec );
662741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      }
6628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );
6630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist )
6632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        new_dist = ( old_range != 0 )
6633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     ? TT_MULDIV( org_dist, cur_range, old_range )
6634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     : cur_dist;
6635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        new_dist = 0;
6637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
6639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6640aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
6641aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* UTP[a]:       UnTouch Point                                           */
6650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x29                                                    */
6651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_UTP( INS_ARG )
6655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  point;
6657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte    mask;
6658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point, CUR.zp0.n_points ) )
6663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Invalid_Reference;
6666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mask = 0xFF;
6670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x != 0 )
6672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask &= ~FT_CURVE_TAG_TOUCH_X;
6673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.y != 0 )
6675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask &= ~FT_CURVE_TAG_TOUCH_Y;
6676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp0.tags[point] &= mask;
6678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Local variables for Ins_IUP: */
6682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  IUP_WorkerRec_
6683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orgs;   /* original and current coordinate */
6685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  curs;   /* arrays                          */
6686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orus;
6687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     max_points;
6688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } IUP_WorkerRec, *IUP_Worker;
6690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  _iup_worker_shift( IUP_Worker  worker,
6694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p1,
6695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p2,
6696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p )
6697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     i;
6699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx;
6700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dx = worker->curs[p].x - worker->orgs[p].x;
6703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( dx != 0 )
6704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i < p; i++ )
6706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x += dx;
6707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p + 1; i <= p2; i++ )
6709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x += dx;
6710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  _iup_worker_interpolate( IUP_Worker  worker,
6716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     p1,
6717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     p2,
6718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     ref1,
6719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     ref2 )
6720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     i;
6722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;
6723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( p1 > p2 )
6726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( ref1, worker->max_points ) ||
6729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( ref2, worker->max_points ) )
6730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    orus1 = worker->orus[ref1].x;
6733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    orus2 = worker->orus[ref2].x;
6734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( orus1 > orus2 )
6736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_F26Dot6  tmp_o;
6738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt     tmp_r;
6739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tmp_o = orus1;
6742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus1 = orus2;
6743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus2 = tmp_o;
6744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tmp_r = ref1;
6746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ref1  = ref2;
6747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ref2  = tmp_r;
6748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org1   = worker->orgs[ref1].x;
6751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org2   = worker->orgs[ref2].x;
6752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    delta1 = worker->curs[ref1].x - org1;
6753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    delta2 = worker->curs[ref2].x - org2;
6754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( orus1 == orus2 )
6756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* simple shift of untouched points */
6758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i <= p2; i++ )
6759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_F26Dot6  x = worker->orgs[i].x;
6761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( x <= org1 )
6764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta1;
6765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
6766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta2;
6767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x = x;
6769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Fixed  scale       = 0;
6774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Bool   scale_valid = 0;
6775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* interpolation */
6778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i <= p2; i++ )
6779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_F26Dot6  x = worker->orgs[i].x;
6781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( x <= org1 )
6784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta1;
6785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( x >= org2 )
6787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta2;
6788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
6790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !scale_valid )
6792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
6793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            scale_valid = 1;
6794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            scale       = TT_MULDIV( org2 + delta2 - ( org1 + delta1 ),
67950a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project                                     0x10000L, orus2 - orus1 );
6796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
6797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x = ( org1 + delta1 ) +
6799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              TT_MULFIX( worker->orus[i].x - orus1, scale );
6800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x = x;
6802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IUP[a]:       Interpolate Untouched Points                            */
6810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x30-0x31                                               */
6811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
6812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IUP( INS_ARG )
6815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    IUP_WorkerRec  V;
6817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte        mask;
6818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   first_point;   /* first point of contour        */
6820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   end_point;     /* end point (last+1) of contour */
6821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   first_touched; /* first touched point in contour   */
6823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   cur_touched;   /* current touched point in contour */
6824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   point;         /* current point   */
6826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  contour;       /* current contour */
6827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
6829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* ignore empty outlines */
6832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.pts.n_contours == 0 )
6833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.opcode & 1 )
6836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask   = FT_CURVE_TAG_TOUCH_X;
6838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orgs = CUR.pts.org;
6839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.curs = CUR.pts.cur;
6840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orus = CUR.pts.orus;
6841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask   = FT_CURVE_TAG_TOUCH_Y;
6845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
6846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
6847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
6848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    V.max_points = CUR.pts.n_points;
6850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    contour = 0;
6852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point   = 0;
6853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
6855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;
6857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      first_point = point;
6858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6859aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( BOUNDS ( end_point, CUR.pts.n_points ) )
6860aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        end_point = CUR.pts.n_points - 1;
6861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
6863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        point++;
6864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( point <= end_point )
6866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        first_touched = point;
6868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cur_touched   = point;
6869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        point++;
6871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( point <= end_point )
6873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( ( CUR.pts.tags[point] & mask ) != 0 )
6875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
68767f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner            _iup_worker_interpolate( &V,
68777f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     cur_touched + 1,
68787f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     point - 1,
68797f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     cur_touched,
68807f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     point );
6881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cur_touched = point;
6882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
6883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          point++;
6885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cur_touched == first_touched )
6888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          _iup_worker_shift( &V, first_point, end_point, cur_touched );
6889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
6890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          _iup_worker_interpolate( &V,
6892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (FT_UShort)( cur_touched + 1 ),
6893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   end_point,
6894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   cur_touched,
6895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   first_touched );
6896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( first_touched > 0 )
6898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            _iup_worker_interpolate( &V,
6899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_point,
6900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_touched - 1,
6901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     cur_touched,
6902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_touched );
6903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      contour++;
6906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( contour < CUR.pts.n_contours );
6907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */
6913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5D,0x71,0x72                                          */
6914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 (2 * uint32)... -->                              */
6915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DELTAP( INS_ARG )
6918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   k, nump;
6920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  A;
6921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   C;
6922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    B;
6923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
6926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Delta hinting is covered by US Patent 5159668. */
6927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
6928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Long  n = args[0] * 2;
6930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < n )
6933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6934aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
6935aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.error = TT_Err_Too_Few_Arguments;
6936aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        n = CUR.args;
6937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= n;
6940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args;
6941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
6944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
6946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   than once, thus UShort isn't enough */
6947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( k = 1; k <= nump; k++ )
6949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 2 )
6951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6952aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
6953aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.error = TT_Err_Too_Few_Arguments;
6954aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
6955aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        goto Fail;
6956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= 2;
6959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = (FT_UShort)CUR.stack[CUR.args + 1];
6961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = CUR.stack[CUR.args];
6962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* XXX: Because some popular fonts contain some invalid DeltaP */
6964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      instructions, we simply ignore them when the stacked   */
6965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      point reference is off limit, rather than returning an */
6966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      error.  As a delta instruction doesn't change a glyph  */
6967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      in great ways, this shouldn't be a problem.            */
6968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !BOUNDS( A, CUR.zp0.n_points ) )
6970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C = ( (FT_ULong)B & 0xF0 ) >> 4;
6972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.opcode )
6974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5D:
6976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
6977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x71:
6979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 16;
6980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
6981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x72:
6983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 32;
6984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
6985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C += CUR.GS.delta_base;
6988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CURRENT_Ppem() == (FT_Long)C )
6990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = ( (FT_ULong)B & 0xF ) - 8;
6992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( B >= 0 )
6993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            B++;
6994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = B * 64 / ( 1L << CUR.GS.delta_shift );
6995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR_Func_move( &CUR.zp0, A, B );
6997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
7002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7004aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */
7012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x73,0x74,0x75                                          */
7013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 (2 * uint32)... -->                              */
7014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DELTAC( INS_ARG )
7017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  nump, k;
7019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  A, C;
7020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   B;
7021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
7024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Delta hinting is covered by US Patent 5159668. */
7025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
7026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Long  n = args[0] * 2;
7028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < n )
7031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7032aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7033aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.error = TT_Err_Too_Few_Arguments;
7034aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        n = CUR.args;
7035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= n;
7038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args;
7039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
7042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nump = (FT_ULong)args[0];
7044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( k = 1; k <= nump; k++ )
7046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 2 )
7048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7049aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7050aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.error = TT_Err_Too_Few_Arguments;
7051aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
7052aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        goto Fail;
7053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= 2;
7056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = (FT_ULong)CUR.stack[CUR.args + 1];
7058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = CUR.stack[CUR.args];
7059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7060aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( BOUNDSL( A, CUR.cvtSize ) )
7061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Reference;
7065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C = ( (FT_ULong)B & 0xF0 ) >> 4;
7071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.opcode )
7073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x73:
7075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x74:
7078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 16;
7079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x75:
7082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 32;
7083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C += CUR.GS.delta_base;
7087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CURRENT_Ppem() == (FT_Long)C )
7089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = ( (FT_ULong)B & 0xF ) - 8;
7091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( B >= 0 )
7092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            B++;
7093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = B * 64 / ( 1L << CUR.GS.delta_shift );
7094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR_Func_move_cvt( A, B );
7096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7100aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MISC. INSTRUCTIONS                                                    */
7108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GETINFO[]:    GET INFOrmation                                         */
7115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x88                                                    */
7116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> uint32                                       */
7117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GETINFO( INS_ARG )
7120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  K;
7122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = 0;
7125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We return MS rasterizer version 1.7 for the font scaler. */
7127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 1 ) != 0 )
7128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K = 35;
7129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Has the glyph been rotated? */
7131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
7132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 0x80;
7133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Has the glyph been stretched? */
7135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
7136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 1 << 8;
7137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Are we hinting for grayscale? */
7139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
7140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 1 << 12;
7141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = K;
7143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_UNKNOWN( INS_ARG )
7148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def   = CUR.IDefs;
7150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit = def + CUR.numIDefs;
7151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
7153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; def < limit; def++ )
7156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( (FT_Byte)def->opc == CUR.opcode && def->active )
7158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        TT_CallRec*  call;
7160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.callTop >= CUR.callSize )
7163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Stack_Overflow;
7165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call = CUR.callStack + CUR.callTop++;
7169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Caller_Range = CUR.curRange;
7171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        call->Caller_IP    = CUR.IP + 1;
7172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Cur_Count    = 1;
7173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Cur_Restart  = def->start;
717441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        call->Cur_End      = def->end;
7175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        INS_Goto_CodeRange( def->range, def->start );
7177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.step_ins = FALSE;
7179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
7180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.error = TT_Err_Invalid_Opcode;
7184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
7188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
7191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TInstruction_Function  Instruct_Dispatch[256] =
7192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Opcodes are gathered in groups of 16. */
7194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Please keep the spaces as they are.   */
7195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  y  */  Ins_SVTCA,
7197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  x  */  Ins_SVTCA,
7198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA y  */  Ins_SPVTCA,
7199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA x  */  Ins_SPVTCA,
7200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA y  */  Ins_SFVTCA,
7201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA x  */  Ins_SFVTCA,
7202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL //  */  Ins_SPVTL,
7203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL +   */  Ins_SPVTL,
7204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL //  */  Ins_SFVTL,
7205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL +   */  Ins_SFVTL,
7206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvFS     */  Ins_SPVFS,
7207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvFS     */  Ins_SFVFS,
7208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GPV       */  Ins_GPV,
7209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GFV       */  Ins_GFV,
7210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTPv    */  Ins_SFVTPV,
7211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ISECT     */  Ins_ISECT,
7212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP0      */  Ins_SRP0,
7214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP1      */  Ins_SRP1,
7215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP2      */  Ins_SRP2,
7216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP0      */  Ins_SZP0,
7217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP1      */  Ins_SZP1,
7218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP2      */  Ins_SZP2,
7219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZPS      */  Ins_SZPS,
7220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SLOOP     */  Ins_SLOOP,
7221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTG       */  Ins_RTG,
7222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTHG      */  Ins_RTHG,
7223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SMD       */  Ins_SMD,
7224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ELSE      */  Ins_ELSE,
7225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JMPR      */  Ins_JMPR,
7226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCvTCi    */  Ins_SCVTCI,
7227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSwCi     */  Ins_SSWCI,
7228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSW       */  Ins_SSW,
7229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DUP       */  Ins_DUP,
7231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  POP       */  Ins_POP,
7232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CLEAR     */  Ins_CLEAR,
7233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SWAP      */  Ins_SWAP,
7234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEPTH     */  Ins_DEPTH,
7235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CINDEX    */  Ins_CINDEX,
7236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MINDEX    */  Ins_MINDEX,
7237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignPTS  */  Ins_ALIGNPTS,
7238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x28  */  Ins_UNKNOWN,
7239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  UTP       */  Ins_UTP,
7240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LOOPCALL  */  Ins_LOOPCALL,
7241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CALL      */  Ins_CALL,
7242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FDEF      */  Ins_FDEF,
7243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ENDF      */  Ins_ENDF,
7244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[0]   */  Ins_MDAP,
7245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[1]   */  Ins_MDAP,
7246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[0]    */  Ins_IUP,
7248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[1]    */  Ins_IUP,
7249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[0]    */  Ins_SHP,
7250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[1]    */  Ins_SHP,
7251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[0]    */  Ins_SHC,
7252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[1]    */  Ins_SHC,
7253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[0]    */  Ins_SHZ,
7254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[1]    */  Ins_SHZ,
7255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHPIX     */  Ins_SHPIX,
7256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IP        */  Ins_IP,
7257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[0]  */  Ins_MSIRP,
7258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[1]  */  Ins_MSIRP,
7259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignRP   */  Ins_ALIGNRP,
7260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTDG      */  Ins_RTDG,
7261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[0]   */  Ins_MIAP,
7262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[1]   */  Ins_MIAP,
7263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushB    */  Ins_NPUSHB,
7265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushW    */  Ins_NPUSHW,
7266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WS        */  Ins_WS,
7267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RS        */  Ins_RS,
7268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtP     */  Ins_WCVTP,
7269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RCvt      */  Ins_RCVT,
7270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[0]     */  Ins_GC,
7271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[1]     */  Ins_GC,
7272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCFS      */  Ins_SCFS,
7273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[0]     */  Ins_MD,
7274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[1]     */  Ins_MD,
7275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPPEM     */  Ins_MPPEM,
7276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPS       */  Ins_MPS,
7277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipON    */  Ins_FLIPON,
7278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipOFF   */  Ins_FLIPOFF,
7279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEBUG     */  Ins_DEBUG,
7280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LT        */  Ins_LT,
7282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LTEQ      */  Ins_LTEQ,
7283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GT        */  Ins_GT,
7284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GTEQ      */  Ins_GTEQ,
7285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EQ        */  Ins_EQ,
7286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEQ       */  Ins_NEQ,
7287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ODD       */  Ins_ODD,
7288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EVEN      */  Ins_EVEN,
7289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IF        */  Ins_IF,
7290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EIF       */  Ins_EIF,
7291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AND       */  Ins_AND,
7292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  OR        */  Ins_OR,
7293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NOT       */  Ins_NOT,
7294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP1   */  Ins_DELTAP,
7295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDB       */  Ins_SDB,
7296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDS       */  Ins_SDS,
7297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ADD       */  Ins_ADD,
7299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SUB       */  Ins_SUB,
7300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DIV       */  Ins_DIV,
7301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MUL       */  Ins_MUL,
7302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ABS       */  Ins_ABS,
7303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEG       */  Ins_NEG,
7304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FLOOR     */  Ins_FLOOR,
7305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CEILING   */  Ins_CEILING,
7306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[0]  */  Ins_ROUND,
7307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[1]  */  Ins_ROUND,
7308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[2]  */  Ins_ROUND,
7309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[3]  */  Ins_ROUND,
7310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[0] */  Ins_NROUND,
7311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[1] */  Ins_NROUND,
7312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[2] */  Ins_NROUND,
7313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[3] */  Ins_NROUND,
7314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtF     */  Ins_WCVTF,
7316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP2   */  Ins_DELTAP,
7317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP3   */  Ins_DELTAP,
7318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[0] */ Ins_DELTAC,
7319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[1] */ Ins_DELTAC,
7320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[2] */ Ins_DELTAC,
7321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SROUND    */  Ins_SROUND,
7322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  S45Round  */  Ins_S45ROUND,
7323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROT      */  Ins_JROT,
7324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROF      */  Ins_JROF,
7325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROFF      */  Ins_ROFF,
7326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x7B  */  Ins_UNKNOWN,
7327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RUTG      */  Ins_RUTG,
7328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RDTG      */  Ins_RDTG,
7329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SANGW     */  Ins_SANGW,
7330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AA        */  Ins_AA,
7331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipPT    */  Ins_FLIPPT,
7333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgON  */  Ins_FLIPRGON,
7334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgOFF */  Ins_FLIPRGOFF,
7335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x83  */  Ins_UNKNOWN,
7336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x84  */  Ins_UNKNOWN,
7337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanCTRL  */  Ins_SCANCTRL,
7338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDPVTL[0] */  Ins_SDPVTL,
7339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDPVTL[1] */  Ins_SDPVTL,
7340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GetINFO   */  Ins_GETINFO,
7341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IDEF      */  Ins_IDEF,
7342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROLL      */  Ins_ROLL,
7343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MAX       */  Ins_MAX,
7344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIN       */  Ins_MIN,
7345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanTYPE  */  Ins_SCANTYPE,
7346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  InstCTRL  */  Ins_INSTCTRL,
7347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x8F  */  Ins_UNKNOWN,
7348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x90  */   Ins_UNKNOWN,
7350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x91  */   Ins_UNKNOWN,
7351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x92  */   Ins_UNKNOWN,
7352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x93  */   Ins_UNKNOWN,
7353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x94  */   Ins_UNKNOWN,
7354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x95  */   Ins_UNKNOWN,
7355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x96  */   Ins_UNKNOWN,
7356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x97  */   Ins_UNKNOWN,
7357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x98  */   Ins_UNKNOWN,
7358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x99  */   Ins_UNKNOWN,
7359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9A  */   Ins_UNKNOWN,
7360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9B  */   Ins_UNKNOWN,
7361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9C  */   Ins_UNKNOWN,
7362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9D  */   Ins_UNKNOWN,
7363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9E  */   Ins_UNKNOWN,
7364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9F  */   Ins_UNKNOWN,
7365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA0  */   Ins_UNKNOWN,
7367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA1  */   Ins_UNKNOWN,
7368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA2  */   Ins_UNKNOWN,
7369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA3  */   Ins_UNKNOWN,
7370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA4  */   Ins_UNKNOWN,
7371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA5  */   Ins_UNKNOWN,
7372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA6  */   Ins_UNKNOWN,
7373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA7  */   Ins_UNKNOWN,
7374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA8  */   Ins_UNKNOWN,
7375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA9  */   Ins_UNKNOWN,
7376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAA  */   Ins_UNKNOWN,
7377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAB  */   Ins_UNKNOWN,
7378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAC  */   Ins_UNKNOWN,
7379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAD  */   Ins_UNKNOWN,
7380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAE  */   Ins_UNKNOWN,
7381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAF  */   Ins_UNKNOWN,
7382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[0]  */  Ins_PUSHB,
7384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[1]  */  Ins_PUSHB,
7385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[2]  */  Ins_PUSHB,
7386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[3]  */  Ins_PUSHB,
7387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[4]  */  Ins_PUSHB,
7388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[5]  */  Ins_PUSHB,
7389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[6]  */  Ins_PUSHB,
7390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[7]  */  Ins_PUSHB,
7391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[0]  */  Ins_PUSHW,
7392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[1]  */  Ins_PUSHW,
7393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[2]  */  Ins_PUSHW,
7394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[3]  */  Ins_PUSHW,
7395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[4]  */  Ins_PUSHW,
7396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[5]  */  Ins_PUSHW,
7397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[6]  */  Ins_PUSHW,
7398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[7]  */  Ins_PUSHW,
7399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[00]  */  Ins_MDRP,
7401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[01]  */  Ins_MDRP,
7402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[02]  */  Ins_MDRP,
7403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[03]  */  Ins_MDRP,
7404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[04]  */  Ins_MDRP,
7405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[05]  */  Ins_MDRP,
7406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[06]  */  Ins_MDRP,
7407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[07]  */  Ins_MDRP,
7408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[08]  */  Ins_MDRP,
7409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[09]  */  Ins_MDRP,
7410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[10]  */  Ins_MDRP,
7411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[11]  */  Ins_MDRP,
7412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[12]  */  Ins_MDRP,
7413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[13]  */  Ins_MDRP,
7414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[14]  */  Ins_MDRP,
7415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[15]  */  Ins_MDRP,
7416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[16]  */  Ins_MDRP,
7418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[17]  */  Ins_MDRP,
7419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[18]  */  Ins_MDRP,
7420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[19]  */  Ins_MDRP,
7421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[20]  */  Ins_MDRP,
7422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[21]  */  Ins_MDRP,
7423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[22]  */  Ins_MDRP,
7424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[23]  */  Ins_MDRP,
7425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[24]  */  Ins_MDRP,
7426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[25]  */  Ins_MDRP,
7427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[26]  */  Ins_MDRP,
7428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[27]  */  Ins_MDRP,
7429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[28]  */  Ins_MDRP,
7430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[29]  */  Ins_MDRP,
7431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[30]  */  Ins_MDRP,
7432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[31]  */  Ins_MDRP,
7433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[00]  */  Ins_MIRP,
7435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[01]  */  Ins_MIRP,
7436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[02]  */  Ins_MIRP,
7437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[03]  */  Ins_MIRP,
7438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[04]  */  Ins_MIRP,
7439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[05]  */  Ins_MIRP,
7440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[06]  */  Ins_MIRP,
7441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[07]  */  Ins_MIRP,
7442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[08]  */  Ins_MIRP,
7443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[09]  */  Ins_MIRP,
7444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[10]  */  Ins_MIRP,
7445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[11]  */  Ins_MIRP,
7446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[12]  */  Ins_MIRP,
7447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[13]  */  Ins_MIRP,
7448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[14]  */  Ins_MIRP,
7449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[15]  */  Ins_MIRP,
7450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[16]  */  Ins_MIRP,
7452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[17]  */  Ins_MIRP,
7453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[18]  */  Ins_MIRP,
7454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[19]  */  Ins_MIRP,
7455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[20]  */  Ins_MIRP,
7456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[21]  */  Ins_MIRP,
7457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[22]  */  Ins_MIRP,
7458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[23]  */  Ins_MIRP,
7459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[24]  */  Ins_MIRP,
7460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[25]  */  Ins_MIRP,
7461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[26]  */  Ins_MIRP,
7462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[27]  */  Ins_MIRP,
7463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[28]  */  Ins_MIRP,
7464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[29]  */  Ins_MIRP,
7465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[30]  */  Ins_MIRP,
7466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[31]  */  Ins_MIRP
7467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
7468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
7471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RUN                                                                   */
7476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  This function executes a run of opcodes.  It will exit in the        */
7478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  following cases:                                                     */
7479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - Errors (in which case it returns FALSE).                           */
7481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - Reaching the end of the main code range (returns TRUE).            */
7483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Reaching the end of a code range within a function call is an      */
7484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    error.                                                             */
7485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */
7487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    is set to TRUE (returns TRUE).                                     */
7488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */
7490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  an instruction trap or a normal termination.                         */
7491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */
7494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        behaviour is unsupported; here a DEBUG opcode is always an     */
7495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        error.                                                         */
7496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */
7499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Instructions appear in the specification's order.                    */
7501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ttinterp.h */
7506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( FT_Error )
7508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_RunIns( TT_ExecContext  exc )
7509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  ins_counter = 0;  /* executed instructions counter */
7511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
7514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur = *exc;
7515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
7516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set CVT functions */
7518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.tt_metrics.ratio = 0;
7519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
7520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* non-square pixels, use the stretched routines */
7522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_read_cvt  = Read_CVT_Stretched;
7523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_write_cvt = Write_CVT_Stretched;
7524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_move_cvt  = Move_CVT_Stretched;
7525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* square pixels, use normal routines */
7529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_read_cvt  = Read_CVT;
7530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_write_cvt = Write_CVT;
7531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_move_cvt  = Move_CVT;
7532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
7535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Round( (FT_Byte)exc->GS.round_state );
7536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
7538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.opcode = CUR.code[CUR.IP];
7540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7541aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( "  " ));
7542aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( opcode_name[CUR.opcode] ));
7543aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( "\n" ));
7544aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
7545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
7546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
754741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        if ( CUR.IP + 1 >= CUR.codeSize )
7548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorCodeOverflow_;
7549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
7551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP + CUR.length > CUR.codeSize )
7554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto LErrorCodeOverflow_;
7555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* First, let's check for empty stack and overflow */
7557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
7558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `args' is the top of the stack once arguments have been popped. */
7560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* One can also interpret it as the index of the last argument.    */
7561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 0 )
7562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7563aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        FT_UShort  i;
7564aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
7565aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
7566aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7567aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        {
7568aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.error = TT_Err_Too_Few_Arguments;
7569aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          goto LErrorLabel_;
7570aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        }
7571aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
7572aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* push zeroes onto the stack */
7573aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
7574aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.stack[i] = 0;
7575aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
7576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
7579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `new_top' is the new top of the stack, after the instruction's */
7581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* execution.  `top' will be set to `new_top' after the `switch'  */
7582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* statement.                                                     */
7583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.new_top > CUR.stackSize )
7584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.error = TT_Err_Stack_Overflow;
7586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto LErrorLabel_;
7587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.step_ins = TRUE;
7590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.error    = TT_Err_Ok;
7591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
7593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Long*  args   = CUR.stack + CUR.args;
7596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Byte   opcode = CUR.opcode;
7597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  ARRAY_BOUND_ERROR
7600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref
7601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( opcode )
7604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x00:  /* SVTCA y  */
7606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x01:  /* SVTCA x  */
7607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x02:  /* SPvTCA y */
7608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x03:  /* SPvTCA x */
7609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x04:  /* SFvTCA y */
7610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x05:  /* SFvTCA x */
7611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
7612aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner            FT_Short  AA, BB;
7613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            AA = (FT_Short)( ( opcode & 1 ) << 14 );
7616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            BB = (FT_Short)( AA ^ 0x4000 );
7617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( opcode < 4 )
7619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
7620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.projVector.x = AA;
7621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.projVector.y = BB;
7622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.dualVector.x = AA;
7624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.dualVector.y = BB;
7625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
7626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            else
7627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
7628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              GUESS_VECTOR( projVector );
7629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
7630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( ( opcode & 2 ) == 0 )
7632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
7633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.freeVector.x = AA;
7634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.freeVector.y = BB;
7635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
7636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            else
7637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
7638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              GUESS_VECTOR( freeVector );
7639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
7640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            COMPUTE_Funcs();
7642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
7643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x06:  /* SPvTL // */
7646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x07:  /* SPvTL +  */
7647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SPVTL
7648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x08:  /* SFvTL // */
7651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x09:  /* SFvTL +  */
7652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVTL
7653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0A:  /* SPvFS */
7656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SPVFS
7657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0B:  /* SFvFS */
7660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVFS
7661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0C:  /* GPV */
7664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GPV
7665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0D:  /* GFV */
7668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GFV
7669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0E:  /* SFvTPv */
7672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVTPV
7673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0F:  /* ISECT  */
7676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ISECT( EXEC_ARG_ args );
7677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x10:  /* SRP0 */
7680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP0
7681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x11:  /* SRP1 */
7684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP1
7685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x12:  /* SRP2 */
7688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP2
7689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x13:  /* SZP0 */
7692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP0( EXEC_ARG_ args );
7693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x14:  /* SZP1 */
7696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP1( EXEC_ARG_ args );
7697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x15:  /* SZP2 */
7700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP2( EXEC_ARG_ args );
7701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x16:  /* SZPS */
7704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZPS( EXEC_ARG_ args );
7705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x17:  /* SLOOP */
7708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SLOOP
7709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x18:  /* RTG */
7712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTG
7713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x19:  /* RTHG */
7716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTHG
7717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1A:  /* SMD */
7720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SMD
7721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1B:  /* ELSE */
7724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ELSE( EXEC_ARG_ args );
7725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1C:  /* JMPR */
7728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JMPR
7729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1D:  /* SCVTCI */
7732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SCVTCI
7733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1E:  /* SSWCI */
7736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SSWCI
7737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1F:  /* SSW */
7740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SSW
7741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x20:  /* DUP */
7744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DUP
7745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x21:  /* POP */
7748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* nothing :-) */
7749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x22:  /* CLEAR */
7752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CLEAR
7753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x23:  /* SWAP */
7756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SWAP
7757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x24:  /* DEPTH */
7760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DEPTH
7761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x25:  /* CINDEX */
7764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CINDEX
7765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x26:  /* MINDEX */
7768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MINDEX( EXEC_ARG_ args );
7769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x27:  /* ALIGNPTS */
7772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ALIGNPTS( EXEC_ARG_ args );
7773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x28:  /* ???? */
7776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
7777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x29:  /* UTP */
7780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UTP( EXEC_ARG_ args );
7781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2A:  /* LOOPCALL */
7784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_LOOPCALL( EXEC_ARG_ args );
7785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2B:  /* CALL */
7788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_CALL( EXEC_ARG_ args );
7789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2C:  /* FDEF */
7792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FDEF( EXEC_ARG_ args );
7793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2D:  /* ENDF */
7796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ENDF( EXEC_ARG_ args );
7797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2E:  /* MDAP */
7800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2F:  /* MDAP */
7801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MDAP( EXEC_ARG_ args );
7802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x30:  /* IUP */
7806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x31:  /* IUP */
7807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IUP( EXEC_ARG_ args );
7808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x32:  /* SHP */
7811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x33:  /* SHP */
7812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHP( EXEC_ARG_ args );
7813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x34:  /* SHC */
7816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x35:  /* SHC */
7817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHC( EXEC_ARG_ args );
7818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x36:  /* SHZ */
7821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x37:  /* SHZ */
7822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHZ( EXEC_ARG_ args );
7823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x38:  /* SHPIX */
7826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHPIX( EXEC_ARG_ args );
7827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x39:  /* IP    */
7830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IP( EXEC_ARG_ args );
7831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3A:  /* MSIRP */
7834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3B:  /* MSIRP */
7835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MSIRP( EXEC_ARG_ args );
7836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3C:  /* AlignRP */
7839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ALIGNRP( EXEC_ARG_ args );
7840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3D:  /* RTDG */
7843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTDG
7844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3E:  /* MIAP */
7847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3F:  /* MIAP */
7848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MIAP( EXEC_ARG_ args );
7849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x40:  /* NPUSHB */
7852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_NPUSHB( EXEC_ARG_ args );
7853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x41:  /* NPUSHW */
7856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_NPUSHW( EXEC_ARG_ args );
7857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x42:  /* WS */
7860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WS
7861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Set_Invalid_Ref:
7864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            CUR.error = TT_Err_Invalid_Reference;
7865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x43:  /* RS */
7868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RS
7869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x44:  /* WCVTP */
7872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WCVTP
7873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x45:  /* RCVT */
7876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RCVT
7877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x46:  /* GC */
7880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x47:  /* GC */
7881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_GC( EXEC_ARG_ args );
7882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x48:  /* SCFS */
7885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCFS( EXEC_ARG_ args );
7886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x49:  /* MD */
7889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4A:  /* MD */
7890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MD( EXEC_ARG_ args );
7891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4B:  /* MPPEM */
7894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MPPEM
7895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4C:  /* MPS */
7898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MPS
7899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4D:  /* FLIPON */
7902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLIPON
7903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4E:  /* FLIPOFF */
7906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLIPOFF
7907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4F:  /* DEBUG */
7910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DEBUG
7911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x50:  /* LT */
7914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_LT
7915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x51:  /* LTEQ */
7918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_LTEQ
7919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x52:  /* GT */
7922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GT
7923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x53:  /* GTEQ */
7926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GTEQ
7927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x54:  /* EQ */
7930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_EQ
7931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x55:  /* NEQ */
7934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NEQ
7935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x56:  /* ODD */
7938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ODD
7939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x57:  /* EVEN */
7942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_EVEN
7943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x58:  /* IF */
7946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IF( EXEC_ARG_ args );
7947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x59:  /* EIF */
7950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* do nothing */
7951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5A:  /* AND */
7954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_AND
7955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5B:  /* OR */
7958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_OR
7959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5C:  /* NOT */
7962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NOT
7963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5D:  /* DELTAP1 */
7966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAP( EXEC_ARG_ args );
7967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5E:  /* SDB */
7970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SDB
7971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5F:  /* SDS */
7974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SDS
7975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x60:  /* ADD */
7978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ADD
7979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x61:  /* SUB */
7982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SUB
7983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x62:  /* DIV */
7986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DIV
7987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x63:  /* MUL */
7990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MUL
7991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x64:  /* ABS */
7994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ABS
7995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x65:  /* NEG */
7998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NEG
7999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x66:  /* FLOOR */
8002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLOOR
8003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x67:  /* CEILING */
8006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CEILING
8007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x68:  /* ROUND */
8010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x69:  /* ROUND */
8011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6A:  /* ROUND */
8012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6B:  /* ROUND */
8013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ROUND
8014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6C:  /* NROUND */
8017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6D:  /* NROUND */
8018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6E:  /* NRRUND */
8019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6F:  /* NROUND */
8020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NROUND
8021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x70:  /* WCVTF */
8024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WCVTF
8025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x71:  /* DELTAP2 */
8028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x72:  /* DELTAP3 */
8029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAP( EXEC_ARG_ args );
8030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x73:  /* DELTAC0 */
8033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x74:  /* DELTAC1 */
8034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x75:  /* DELTAC2 */
8035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAC( EXEC_ARG_ args );
8036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x76:  /* SROUND */
8039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SROUND
8040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x77:  /* S45Round */
8043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_S45ROUND
8044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x78:  /* JROT */
8047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JROT
8048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x79:  /* JROF */
8051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JROF
8052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7A:  /* ROFF */
8055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ROFF
8056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7B:  /* ???? */
8059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7C:  /* RUTG */
8063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RUTG
8064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7D:  /* RDTG */
8067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RDTG
8068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7E:  /* SANGW */
8071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7F:  /* AA    */
8072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* nothing - obsolete */
8073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x80:  /* FLIPPT */
8076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPPT( EXEC_ARG_ args );
8077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x81:  /* FLIPRGON */
8080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPRGON( EXEC_ARG_ args );
8081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x82:  /* FLIPRGOFF */
8084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPRGOFF( EXEC_ARG_ args );
8085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x83:  /* UNKNOWN */
8088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x84:  /* UNKNOWN */
8089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x85:  /* SCANCTRL */
8093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCANCTRL( EXEC_ARG_ args );
8094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x86:  /* SDPVTL */
8097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x87:  /* SDPVTL */
8098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SDPVTL( EXEC_ARG_ args );
8099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x88:  /* GETINFO */
8102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_GETINFO( EXEC_ARG_ args );
8103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x89:  /* IDEF */
8106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IDEF( EXEC_ARG_ args );
8107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8A:  /* ROLL */
8110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ROLL( EXEC_ARG_ args );
8111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8B:  /* MAX */
8114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MAX
8115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8C:  /* MIN */
8118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MIN
8119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8D:  /* SCANTYPE */
8122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCANTYPE( EXEC_ARG_ args );
8123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8E:  /* INSTCTRL */
8126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_INSTCTRL( EXEC_ARG_ args );
8127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8F:
8130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
8134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( opcode >= 0xE0 )
8135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_MIRP( EXEC_ARG_ args );
8136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xC0 )
8137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_MDRP( EXEC_ARG_ args );
8138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xB8 )
8139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_PUSHW( EXEC_ARG_ args );
8140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xB0 )
8141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_PUSHB( EXEC_ARG_ args );
8142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
8143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_UNKNOWN( EXEC_ARG_ args );
8144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
8149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
8151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
8153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.error != TT_Err_Ok )
8155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.error )
8157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case TT_Err_Invalid_Opcode: /* looking for redefined instructions */
8159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
8160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            TT_DefRecord*  def   = CUR.IDefs;
8161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            TT_DefRecord*  limit = def + CUR.numIDefs;
8162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            for ( ; def < limit; def++ )
8165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( def->active && CUR.opcode == (FT_Byte)def->opc )
8167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
8168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                TT_CallRec*  callrec;
8169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                if ( CUR.callTop >= CUR.callSize )
8172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                {
8173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  CUR.error = TT_Err_Invalid_Reference;
8174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  goto LErrorLabel_;
8175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                }
8176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec = &CUR.callStack[CUR.callTop];
8178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Caller_Range = CUR.curRange;
8180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Caller_IP    = CUR.IP + 1;
8181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Cur_Count    = 1;
8182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Cur_Restart  = def->start;
818341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                callrec->Cur_End      = def->end;
8184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
8186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  goto LErrorLabel_;
8187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                goto LSuiteLabel_;
8189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
8190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
8192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Invalid_Opcode;
8194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
8197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;   /* Unreachable code warning suppression.             */
8198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   /* Leave to remind in case a later change the editor */
8199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   /* to consider break;                                */
8200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
8203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
8206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
8207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.top = CUR.new_top;
8212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.step_ins )
8214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.IP += CUR.length;
8215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* increment instruction counter and check if we didn't */
8217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* run this program for too long (e.g. infinite loops). */
8218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
8219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return TT_Err_Execution_Too_Long;
8220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LSuiteLabel_:
8222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP >= CUR.codeSize )
8223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.callTop > 0 )
8225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.error = TT_Err_Code_Overflow;
8227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
8230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LNo_Error_;
8231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( !CUR.instruction_trap );
8233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LNo_Error_:
8235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
8237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *exc = cur;
8238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return TT_Err_Ok;
8241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LErrorCodeOverflow_:
8243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.error = TT_Err_Code_Overflow;
8244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LErrorLabel_:
8246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
8248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *exc = cur;
8249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
82517f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* If any errors have occurred, function tables may be broken. */
82527f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* Force a re-execution of `prep' and `fpgm' tables if no      */
82537f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* bytecode debugger is run.                                   */
82547f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    if ( CUR.error && !CUR.instruction_trap )
82557f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
82567f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_TRACE1(( "  The interpreter returned error 0x%x\n", CUR.error ));
825741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      exc->size->cvt_ready      = FALSE;
82587f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
82597f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
8260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.error;
8261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
8262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */
8265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
8268