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/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  Copyright 1996-2013                                                    */
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
28727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_TRUETYPE_DRIVER_H
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttinterp.h"
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "tterrors.h"
32727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "ttsubpix.h"
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_ttinterp
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* In order to detect infinite loops in the code, we set up a counter    */
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* within the run loop.  A single stroke of interpretation is now        */
51727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* limited to a maximum number of opcodes defined below.                 */
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MAX_RUNNABLE_OPCODES  1000000L
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* There are two kinds of implementations:                               */
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* a. static implementation                                              */
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The current execution context is a static variable, which fields   */
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    are accessed directly by the interpreter during execution.  The    */
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    context is named `cur'.                                            */
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This version is non-reentrant, of course.                          */
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* b. indirect implementation                                            */
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The current execution context is passed to _each_ function as its  */
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    first argument, and each field is thus accessed indirectly.        */
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This version is fully re-entrant.                                  */
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The idea is that an indirect implementation may be slower to execute  */
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* on low-end processors that are used in some systems (like 386s or     */
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* even 486s).                                                           */
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* As a consequence, the indirect implementation is now the default, as  */
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* its performance costs can be considered negligible in our context.    */
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note, however, that we kept the same source with macros because:      */
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - The code is kept very close in design to the Pascal code used for   */
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   development.                                                        */
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - It's much more readable that way!                                   */
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* - It's still open to experimentation and tuning.                      */
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER     /* indirect implementation */
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR  (*exc)                             /* see ttobjs.h */
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This macro is used whenever `exec' is unused in a function, to avoid  */
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* stupid warnings from pedantic compilers.                              */
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_EXEC  FT_UNUSED( exc )
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else                                           /* static implementation */
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR  cur
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_EXEC  int  __dummy = __dummy
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_ExecContextRec  cur;   /* static exec. context variable */
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* apparently, we have a _lot_ of direct indexing when accessing  */
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the static `cur', which makes the code bigger (due to all the  */
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* four bytes addresses).                                         */
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The instruction argument stack.                                       */
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_ARG  EXEC_OP_ FT_Long*  args    /* see ttobjs.h for EXEC_OP_ */
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* This macro is used whenever `args' is unused in a function, to avoid  */
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* stupid warnings from pedantic compilers.                              */
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_ARG  FT_UNUSED_EXEC; FT_UNUSED( args )
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define SUBPIXEL_HINTING                                                    \
136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          ( ((TT_Driver)FT_FACE_DRIVER( CUR.face ))->interpreter_version == \
137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            TT_INTERPRETER_VERSION_38 )
138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* increase readability of the code.                                     */
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SKIP_Code() \
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          SkipCode( EXEC_ARG )
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GET_ShortIns() \
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          GetShortIns( EXEC_ARG )
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define NORMalize( x, y, v ) \
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Normalize( EXEC_ARG_ x, y, v )
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SET_SuperRound( scale, flags ) \
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          SetSuperRound( EXEC_ARG_ scale, flags )
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ROUND_None( d, c ) \
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Round_None( EXEC_ARG_ d, c )
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_Goto_CodeRange( range, ip ) \
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move( z, p, d ) \
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move( EXEC_ARG_ z, p, d )
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move_orig( z, p, d ) \
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move_orig( EXEC_ARG_ z, p, d )
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_round( d, c ) \
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_round( EXEC_ARG_ d, c )
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_read_cvt( index ) \
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_read_cvt( EXEC_ARG_ index )
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_write_cvt( index, val ) \
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_write_cvt( EXEC_ARG_ index, val )
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move_cvt( index, val ) \
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_move_cvt( EXEC_ARG_ index, val )
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CURRENT_Ratio() \
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Current_Ratio( EXEC_ARG )
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CURRENT_Ppem() \
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Current_Ppem( EXEC_ARG )
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Ppem() \
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Cur_PPEM( EXEC_ARG )
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_SxVTL( a, b, c, d ) \
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SxVTL( EXEC_ARG_ a, b, c, d )
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Funcs() \
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Compute_Funcs( EXEC_ARG )
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Round( a ) \
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Compute_Round( EXEC_ARG_ a )
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Point_Displacement( a, b, c, d ) \
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MOVE_Zp2_Point( a, b, c, t ) \
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_project( v1, v2 )  \
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_dualproj( v1, v2 )  \
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_fast_project( v ) \
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_fast_dualproj( v ) \
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Instruction dispatch function, as used by the interpreter.            */
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void  (*TInstruction_Function)( INS_ARG );
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  /* Two simple bounds-checking macros.                                    */
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )
234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*************************************************************************/
237727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*                                                                       */
238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* This macro computes (a*2^14)/b and complements TT_MulFix14.           */
239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*                                                                       */
240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define TT_DivFix14( a, b ) \
241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          FT_DivFix( a, (b) << 2 )
242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  SUCCESS
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SUCCESS  0
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FAILURE
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FAILURE  1
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GUESS_VECTOR( V )                                         \
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  if ( CUR.face->unpatented_hinting )                             \
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                                               \
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GUESS_VECTOR( V )
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                        CODERANGE FUNCTIONS                            */
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Goto_CodeRange                                                  */
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Switches to a new code range (updates the code related elements in */
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    `exec', and `IP').                                                 */
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    range :: The new execution code range.                             */
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    IP    :: The new IP in the new code range.                         */
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec  :: The target execution context.                             */
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Goto_CodeRange( TT_ExecContext  exec,
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Int          range,
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Long         IP )
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CodeRange*  coderange;
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( range >= 1 && range <= 3 );
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    coderange = &exec->codeRangeTable[range - 1];
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( coderange->base != NULL );
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: Because the last instruction of a program may be a CALL */
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       which will return to the first byte *after* the code    */
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       range, we test for IP <= Size instead of IP < Size.     */
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                               */
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( (FT_ULong)IP <= coderange->size );
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->code     = coderange->base;
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeSize = coderange->size;
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->IP       = IP;
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->curRange = range;
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
313727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Set_CodeRange                                                   */
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets a code range.                                                 */
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    range  :: The code range index.                                    */
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    base   :: The new code base.                                       */
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    length :: The range size in bytes.                                 */
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec   :: The target execution context.                            */
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Set_CodeRange( TT_ExecContext  exec,
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Int          range,
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    void*           base,
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Long         length )
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( range >= 1 && range <= 3 );
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].size = length;
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
349727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Clear_CodeRange                                                 */
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Clears a code range.                                               */
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    range :: The code range index.                                     */
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec  :: The target execution context.                             */
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Does not set the Error variable.                                   */
372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Clear_CodeRange( TT_ExecContext  exec,
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Int          range )
376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( range >= 1 && range <= 3 );
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].base = NULL;
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->codeRangeTable[range - 1].size = 0;
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                   EXECUTION CONTEXT ROUTINES                          */
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Done_Context                                                    */
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Destroys a given context.                                          */
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec   :: A handle to the target execution context.                */
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory :: A handle to the parent memory object.                    */
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Done_Context( TT_ExecContext  exec )
414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = exec->memory;
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* points zone */
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxPoints   = 0;
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxContours = 0;
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* free stack */
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec->stack );
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stackSize = 0;
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* free call stack */
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec->callStack );
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callSize = 0;
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callTop  = 0;
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* free glyph code range */
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec->glyphIns );
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphSize = 0;
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->size = NULL;
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->face = NULL;
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( exec );
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
440727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Init_Context                                                       */
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Initializes a context object.                                      */
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory :: A handle to the parent memory object.                    */
454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec   :: A handle to the target execution context.                */
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Init_Context( TT_ExecContext  exec,
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                FT_Memory       memory )
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->memory   = memory;
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callSize = 32;
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail_Memory;
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* all values in the context are set to 0 already, but this is */
477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* here as a remainder                                         */
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxPoints   = 0;
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->maxContours = 0;
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stackSize = 0;
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphSize = 0;
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stack     = NULL;
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphIns  = NULL;
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->face = NULL;
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->size = NULL;
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail_Memory:
4937f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_Done_Context( exec );
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Update_Max                                                         */
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Checks the size of a buffer and reallocates it if necessary.       */
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    memory     :: A handle to the parent memory object.                */
510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    multiplier :: The size in bytes of each element in the buffer.     */
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    new_max    :: The new capacity (size) of the buffer.               */
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size       :: The address of the buffer's current size expressed   */
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                  in elements.                                         */
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    buff       :: The address of the buffer base pointer.              */
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
524aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  FT_LOCAL_DEF( FT_Error )
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Update_Max( FT_Memory  memory,
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              FT_ULong*  size,
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              FT_Long    multiplier,
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              void*      _pbuff,
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              FT_ULong   new_max )
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    void**    pbuff = (void**)_pbuff;
533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( *size < new_max )
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *size = new_max;
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Load_Context                                                    */
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Prepare an execution context for glyph hinting.                    */
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    face :: A handle to the source face object.                        */
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size :: A handle to the source size object.                        */
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec :: A handle to the target execution context.                  */
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Load_Context( TT_ExecContext  exec,
570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_Face         face,
571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_Size         size )
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int          i;
574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong        tmp;
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_MaxProfile*  maxp;
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error        error;
577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->face = face;
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    maxp       = &face->max_profile;
581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->size = size;
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( size )
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->numFDefs   = size->num_function_defs;
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxFDefs   = size->max_function_defs;
587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->numIDefs   = size->num_instruction_defs;
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxIDefs   = size->max_instruction_defs;
589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->FDefs      = size->function_defs;
590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->IDefs      = size->instruction_defs;
591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->tt_metrics = size->ttmetrics;
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->metrics    = size->metrics;
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxFunc    = size->max_func;
595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->maxIns     = size->max_ins;
596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        exec->codeRangeTable[i] = size->codeRangeTable[i];
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* set graphics state */
601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->GS = size->GS;
602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->cvtSize = size->cvt_size;
604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->cvt     = size->cvt;
605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->storeSize = size->storage_size;
607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->storage   = size->storage;
608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      exec->twilight  = size->twilight;
6107f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
6117f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      /* In case of multi-threading it can happen that the old size object */
6127f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      /* no longer exists, thus we must clear all glyph zone references.   */
6137f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
6147f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      exec->zp1 = exec->zp0;
6157f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      exec->zp2 = exec->zp0;
616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: We reserve a little more elements on the stack to deal safely */
619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */
620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tmp = exec->stackSize;
621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = Update_Max( exec->memory,
622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        &tmp,
623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        sizeof ( FT_F26Dot6 ),
624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        (void*)&exec->stack,
625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        maxp->maxStackElements + 32 );
626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->stackSize = (FT_UInt)tmp;
627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    tmp = exec->glyphSize;
631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = Update_Max( exec->memory,
632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        &tmp,
633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        sizeof ( FT_Byte ),
634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        (void*)&exec->glyphIns,
635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        maxp->maxSizeOfInstructions );
636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->glyphSize = (FT_UShort)tmp;
637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->pts.n_points   = 0;
641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->pts.n_contours = 0;
642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp1 = exec->pts;
644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp2 = exec->pts;
645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp0 = exec->pts;
646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->instruction_trap = FALSE;
648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
649727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Save_Context                                                    */
657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Saves the code ranges in a `size' object.                          */
660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec :: A handle to the source execution context.                  */
663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    size :: A handle to the target size object.                        */
666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Save_Context( TT_ExecContext  exec,
675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   TT_Size         size )
676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  i;
678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
680aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* XXX: Will probably disappear soon with all the code range */
681aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*      management, which is now rather obsolete.            */
682aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                           */
683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->num_function_defs    = exec->numFDefs;
684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->num_instruction_defs = exec->numIDefs;
685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->max_func = exec->maxFunc;
687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    size->max_ins  = exec->maxIns;
688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      size->codeRangeTable[i] = exec->codeRangeTable[i];
691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
692727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    TT_Run_Context                                                     */
700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Executes one or more instructions in the execution context.        */
703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    debug :: A Boolean flag.  If set, the function sets some internal  */
706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*             variables and returns immediately, otherwise TT_RunIns()  */
707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*             is called.                                                */
708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*             This is commented out currently.                          */
710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    exec  :: A handle to the target execution context.                 */
713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /*    TrueType error code.  0 means success.                             */
716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Only the glyph loader and debugger should call this function.      */
719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_Run_Context( TT_ExecContext  exec,
722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  FT_Bool         debug )
723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error  error;
725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
72741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )
728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           != FT_Err_Ok )
729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp0 = exec->pts;
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp1 = exec->pts;
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->zp2 = exec->pts;
734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.gep0 = 1;
736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.gep1 = 1;
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.gep2 = 1;
738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.projVector.x = 0x4000;
740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.projVector.y = 0x0000;
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.freeVector = exec->GS.projVector;
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.dualVector = exec->GS.projVector;
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.both_x_axis = TRUE;
747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.round_state = 1;
750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->GS.loop        = 1;
751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some glyphs leave something on the stack. so we clean it */
753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* before a new execution.                                  */
754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->top     = 0;
755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec->callTop = 0;
756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( debug );
759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return exec->face->interpreter( exec );
761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !debug )
763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return TT_RunIns( exec );
764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
765727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_Err_Ok;
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* The default value for `scan_control' is documented as FALSE in the */
7710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* TrueType specification.  This is confusing since it implies a      */
7720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* Boolean value.  However, this is not the case, thus both the       */
7730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* default values of our `scan_type' and `scan_control' fields (which */
7740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* the documentation's `scan_control' variable is split into) are     */
7750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project  /* zero.                                                              */
7760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const TT_GraphicsState  tt_default_graphics_state =
778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    0, 0, 0,
780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    { 0x4000, 0 },
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    { 0x4000, 0 },
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    { 0x4000, 0 },
783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TRUE,
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 64, 1,
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TRUE, 68, 0, 0, 9, 3,
7900a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    0, FALSE, 0, 1, 1, 1
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ttinterp.h */
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( TT_ExecContext )
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_New_Context( TT_Driver  driver )
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_ExecContext  exec;
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory       memory;
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    memory = driver->root.root.memory;
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    exec   = driver->context;
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !driver->context )
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Error  error;
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* allocate object */
812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( exec ) )
813295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        goto Fail;
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
815295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      /* initialize it; in case of error this deallocates `exec' too */
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = Init_Context( exec, memory );
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* store it into the driver */
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      driver->context = exec;
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return driver->context;
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
827295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return NULL;
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Before an opcode is executed, the interpreter verifies that there are */
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* table.                                                                */
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* For each opcode, the first column gives the number of arguments that  */
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* are popped from the stack; the second one gives the number of those   */
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* that are pushed in result.                                            */
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcodes which have a varying number of parameters in the data stream  */
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* to zero.                                                              */
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  PACK
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define PACK( x, y )  ( ( x << 4 ) | y )
851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Byte  Pop_Push_Count[256] =
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* opcodes are gathered in groups of 16 */
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* please keep the spaces as they are   */
858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  y  */  PACK( 0, 0 ),
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  x  */  PACK( 0, 0 ),
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA y  */  PACK( 0, 0 ),
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA x  */  PACK( 0, 0 ),
863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA y  */  PACK( 0, 0 ),
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA x  */  PACK( 0, 0 ),
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL //  */  PACK( 2, 0 ),
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL +   */  PACK( 2, 0 ),
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL //  */  PACK( 2, 0 ),
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL +   */  PACK( 2, 0 ),
869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvFS     */  PACK( 2, 0 ),
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvFS     */  PACK( 2, 0 ),
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GPV       */  PACK( 0, 2 ),
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GFV       */  PACK( 0, 2 ),
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTPv    */  PACK( 0, 0 ),
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ISECT     */  PACK( 5, 0 ),
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP0      */  PACK( 1, 0 ),
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP1      */  PACK( 1, 0 ),
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP2      */  PACK( 1, 0 ),
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP0      */  PACK( 1, 0 ),
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP1      */  PACK( 1, 0 ),
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP2      */  PACK( 1, 0 ),
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZPS      */  PACK( 1, 0 ),
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SLOOP     */  PACK( 1, 0 ),
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTG       */  PACK( 0, 0 ),
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTHG      */  PACK( 0, 0 ),
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SMD       */  PACK( 1, 0 ),
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ELSE      */  PACK( 0, 0 ),
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JMPR      */  PACK( 1, 0 ),
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCvTCi    */  PACK( 1, 0 ),
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSwCi     */  PACK( 1, 0 ),
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSW       */  PACK( 1, 0 ),
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DUP       */  PACK( 1, 2 ),
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  POP       */  PACK( 1, 0 ),
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CLEAR     */  PACK( 0, 0 ),
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SWAP      */  PACK( 2, 2 ),
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEPTH     */  PACK( 0, 1 ),
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CINDEX    */  PACK( 1, 1 ),
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MINDEX    */  PACK( 1, 0 ),
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignPTS  */  PACK( 2, 0 ),
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$28   */  PACK( 0, 0 ),
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  UTP       */  PACK( 1, 0 ),
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LOOPCALL  */  PACK( 2, 0 ),
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CALL      */  PACK( 1, 0 ),
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FDEF      */  PACK( 1, 0 ),
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ENDF      */  PACK( 0, 0 ),
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[0]   */  PACK( 1, 0 ),
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[1]   */  PACK( 1, 0 ),
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[0]    */  PACK( 0, 0 ),
911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[1]    */  PACK( 0, 0 ),
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[0]    */  PACK( 0, 0 ),
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[1]    */  PACK( 0, 0 ),
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[0]    */  PACK( 1, 0 ),
915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[1]    */  PACK( 1, 0 ),
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[0]    */  PACK( 1, 0 ),
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[1]    */  PACK( 1, 0 ),
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHPIX     */  PACK( 1, 0 ),
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IP        */  PACK( 0, 0 ),
920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[0]  */  PACK( 2, 0 ),
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[1]  */  PACK( 2, 0 ),
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignRP   */  PACK( 0, 0 ),
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTDG      */  PACK( 0, 0 ),
924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[0]   */  PACK( 2, 0 ),
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[1]   */  PACK( 2, 0 ),
926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushB    */  PACK( 0, 0 ),
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushW    */  PACK( 0, 0 ),
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WS        */  PACK( 2, 0 ),
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RS        */  PACK( 1, 1 ),
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtP     */  PACK( 2, 0 ),
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RCvt      */  PACK( 1, 1 ),
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[0]     */  PACK( 1, 1 ),
934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[1]     */  PACK( 1, 1 ),
935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCFS      */  PACK( 2, 0 ),
936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[0]     */  PACK( 2, 1 ),
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[1]     */  PACK( 2, 1 ),
938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPPEM     */  PACK( 0, 1 ),
939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPS       */  PACK( 0, 1 ),
940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipON    */  PACK( 0, 0 ),
941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipOFF   */  PACK( 0, 0 ),
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEBUG     */  PACK( 1, 0 ),
943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LT        */  PACK( 2, 1 ),
945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LTEQ      */  PACK( 2, 1 ),
946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GT        */  PACK( 2, 1 ),
947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GTEQ      */  PACK( 2, 1 ),
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EQ        */  PACK( 2, 1 ),
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEQ       */  PACK( 2, 1 ),
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ODD       */  PACK( 1, 1 ),
951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EVEN      */  PACK( 1, 1 ),
952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IF        */  PACK( 1, 0 ),
953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EIF       */  PACK( 0, 0 ),
954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AND       */  PACK( 2, 1 ),
955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  OR        */  PACK( 2, 1 ),
956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NOT       */  PACK( 1, 1 ),
957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP1   */  PACK( 1, 0 ),
958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDB       */  PACK( 1, 0 ),
959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDS       */  PACK( 1, 0 ),
960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ADD       */  PACK( 2, 1 ),
962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SUB       */  PACK( 2, 1 ),
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DIV       */  PACK( 2, 1 ),
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MUL       */  PACK( 2, 1 ),
965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ABS       */  PACK( 1, 1 ),
966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEG       */  PACK( 1, 1 ),
967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FLOOR     */  PACK( 1, 1 ),
968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CEILING   */  PACK( 1, 1 ),
969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[0]  */  PACK( 1, 1 ),
970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[1]  */  PACK( 1, 1 ),
971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[2]  */  PACK( 1, 1 ),
972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[3]  */  PACK( 1, 1 ),
973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[0] */  PACK( 1, 1 ),
974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[1] */  PACK( 1, 1 ),
975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[2] */  PACK( 1, 1 ),
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[3] */  PACK( 1, 1 ),
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtF     */  PACK( 2, 0 ),
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP2   */  PACK( 1, 0 ),
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP3   */  PACK( 1, 0 ),
981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[0] */ PACK( 1, 0 ),
982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[1] */ PACK( 1, 0 ),
983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[2] */ PACK( 1, 0 ),
984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SROUND    */  PACK( 1, 0 ),
985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  S45Round  */  PACK( 1, 0 ),
986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROT      */  PACK( 2, 0 ),
987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROF      */  PACK( 2, 0 ),
988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROFF      */  PACK( 0, 0 ),
989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$7B   */  PACK( 0, 0 ),
990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RUTG      */  PACK( 0, 0 ),
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RDTG      */  PACK( 0, 0 ),
992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SANGW     */  PACK( 1, 0 ),
993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AA        */  PACK( 1, 0 ),
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipPT    */  PACK( 0, 0 ),
996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgON  */  PACK( 2, 0 ),
997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgOFF */  PACK( 2, 0 ),
998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$83   */  PACK( 0, 0 ),
999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$84   */  PACK( 0, 0 ),
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanCTRL  */  PACK( 1, 0 ),
1001aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*  SDPVTL[0] */  PACK( 2, 0 ),
1002aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*  SDPVTL[1] */  PACK( 2, 0 ),
1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GetINFO   */  PACK( 1, 1 ),
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IDEF      */  PACK( 1, 0 ),
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROLL      */  PACK( 3, 3 ),
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MAX       */  PACK( 2, 1 ),
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIN       */  PACK( 2, 1 ),
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanTYPE  */  PACK( 1, 0 ),
1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  InstCTRL  */  PACK( 2, 0 ),
1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$8F   */  PACK( 0, 0 ),
1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$90  */   PACK( 0, 0 ),
1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$91  */   PACK( 0, 0 ),
1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$92  */   PACK( 0, 0 ),
1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$93  */   PACK( 0, 0 ),
1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$94  */   PACK( 0, 0 ),
1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$95  */   PACK( 0, 0 ),
1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$96  */   PACK( 0, 0 ),
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$97  */   PACK( 0, 0 ),
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$98  */   PACK( 0, 0 ),
1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$99  */   PACK( 0, 0 ),
1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9A  */   PACK( 0, 0 ),
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9B  */   PACK( 0, 0 ),
1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9C  */   PACK( 0, 0 ),
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9D  */   PACK( 0, 0 ),
1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9E  */   PACK( 0, 0 ),
1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9F  */   PACK( 0, 0 ),
1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A0  */   PACK( 0, 0 ),
1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A1  */   PACK( 0, 0 ),
1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A2  */   PACK( 0, 0 ),
1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A3  */   PACK( 0, 0 ),
1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A4  */   PACK( 0, 0 ),
1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A5  */   PACK( 0, 0 ),
1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A6  */   PACK( 0, 0 ),
1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A7  */   PACK( 0, 0 ),
1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A8  */   PACK( 0, 0 ),
1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A9  */   PACK( 0, 0 ),
1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AA  */   PACK( 0, 0 ),
1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AB  */   PACK( 0, 0 ),
1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AC  */   PACK( 0, 0 ),
1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AD  */   PACK( 0, 0 ),
1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AE  */   PACK( 0, 0 ),
1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AF  */   PACK( 0, 0 ),
1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[0]  */  PACK( 0, 1 ),
1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[1]  */  PACK( 0, 2 ),
1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[2]  */  PACK( 0, 3 ),
1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[3]  */  PACK( 0, 4 ),
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[4]  */  PACK( 0, 5 ),
1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[5]  */  PACK( 0, 6 ),
1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[6]  */  PACK( 0, 7 ),
1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[7]  */  PACK( 0, 8 ),
1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[0]  */  PACK( 0, 1 ),
1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[1]  */  PACK( 0, 2 ),
1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[2]  */  PACK( 0, 3 ),
1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[3]  */  PACK( 0, 4 ),
1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[4]  */  PACK( 0, 5 ),
1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[5]  */  PACK( 0, 6 ),
1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[6]  */  PACK( 0, 7 ),
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[7]  */  PACK( 0, 8 ),
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[00]  */  PACK( 1, 0 ),
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[01]  */  PACK( 1, 0 ),
1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[02]  */  PACK( 1, 0 ),
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[03]  */  PACK( 1, 0 ),
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[04]  */  PACK( 1, 0 ),
1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[05]  */  PACK( 1, 0 ),
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[06]  */  PACK( 1, 0 ),
1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[07]  */  PACK( 1, 0 ),
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[08]  */  PACK( 1, 0 ),
1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[09]  */  PACK( 1, 0 ),
1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[10]  */  PACK( 1, 0 ),
1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[11]  */  PACK( 1, 0 ),
1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[12]  */  PACK( 1, 0 ),
1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[13]  */  PACK( 1, 0 ),
1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[14]  */  PACK( 1, 0 ),
1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[15]  */  PACK( 1, 0 ),
1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[16]  */  PACK( 1, 0 ),
1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[17]  */  PACK( 1, 0 ),
1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[18]  */  PACK( 1, 0 ),
1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[19]  */  PACK( 1, 0 ),
1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[20]  */  PACK( 1, 0 ),
1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[21]  */  PACK( 1, 0 ),
1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[22]  */  PACK( 1, 0 ),
1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[23]  */  PACK( 1, 0 ),
1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[24]  */  PACK( 1, 0 ),
1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[25]  */  PACK( 1, 0 ),
1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[26]  */  PACK( 1, 0 ),
1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[27]  */  PACK( 1, 0 ),
1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[28]  */  PACK( 1, 0 ),
1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[29]  */  PACK( 1, 0 ),
1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[30]  */  PACK( 1, 0 ),
1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[31]  */  PACK( 1, 0 ),
1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[00]  */  PACK( 2, 0 ),
1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[01]  */  PACK( 2, 0 ),
1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[02]  */  PACK( 2, 0 ),
1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[03]  */  PACK( 2, 0 ),
1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[04]  */  PACK( 2, 0 ),
1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[05]  */  PACK( 2, 0 ),
1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[06]  */  PACK( 2, 0 ),
1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[07]  */  PACK( 2, 0 ),
1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[08]  */  PACK( 2, 0 ),
1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[09]  */  PACK( 2, 0 ),
1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[10]  */  PACK( 2, 0 ),
1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[11]  */  PACK( 2, 0 ),
1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[12]  */  PACK( 2, 0 ),
1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[13]  */  PACK( 2, 0 ),
1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[14]  */  PACK( 2, 0 ),
1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[15]  */  PACK( 2, 0 ),
1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[16]  */  PACK( 2, 0 ),
1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[17]  */  PACK( 2, 0 ),
1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[18]  */  PACK( 2, 0 ),
1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[19]  */  PACK( 2, 0 ),
1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[20]  */  PACK( 2, 0 ),
1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[21]  */  PACK( 2, 0 ),
1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[22]  */  PACK( 2, 0 ),
1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[23]  */  PACK( 2, 0 ),
1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[24]  */  PACK( 2, 0 ),
1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[25]  */  PACK( 2, 0 ),
1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[26]  */  PACK( 2, 0 ),
1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[27]  */  PACK( 2, 0 ),
1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[28]  */  PACK( 2, 0 ),
1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[29]  */  PACK( 2, 0 ),
1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[30]  */  PACK( 2, 0 ),
1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[31]  */  PACK( 2, 0 )
1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_DEBUG_LEVEL_TRACE
1134aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1135aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  static
1136aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  const char*  const opcode_name[256] =
1137aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  {
1138aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SVTCA y",
1139aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SVTCA x",
1140aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTCA y",
1141aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTCA x",
1142aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTCA y",
1143aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTCA x",
1144aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTL ||",
1145aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTL +",
1146aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTL ||",
1147aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTL +",
1148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvFS",
1149aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvFS",
1150aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GPV",
1151aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GFV",
1152aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTPv",
1153aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ISECT",
1154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP0",
1156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP1",
1157aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP2",
1158aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP0",
1159aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP1",
1160aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP2",
1161aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZPS",
1162aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SLOOP",
1163aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTG",
1164aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTHG",
1165aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SMD",
1166aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ELSE",
1167aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JMPR",
1168aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SCvTCi",
1169aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SSwCi",
1170aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SSW",
1171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1172aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DUP",
1173aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "POP",
1174aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CLEAR",
1175aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SWAP",
1176aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DEPTH",
1177aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CINDEX",
1178aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MINDEX",
1179aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AlignPTS",
1180aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$28",
1181aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "UTP",
1182aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LOOPCALL",
1183aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CALL",
1184aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FDEF",
1185aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ENDF",
1186aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDAP[0]",
1187aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDAP[1]",
1188aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1189aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IUP[0]",
1190aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IUP[1]",
1191aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHP[0]",
1192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHP[1]",
1193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHC[0]",
1194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHC[1]",
1195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHZ[0]",
1196aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHZ[1]",
1197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHPIX",
1198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IP",
1199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MSIRP[0]",
1200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MSIRP[1]",
1201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AlignRP",
1202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTDG",
1203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIAP[0]",
1204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIAP[1]",
1205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NPushB",
1207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NPushW",
1208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WS",
1209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RS",
1210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WCvtP",
1211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RCvt",
1212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GC[0]",
1213aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GC[1]",
1214aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SCFS",
1215aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MD[0]",
1216aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MD[1]",
1217aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MPPEM",
1218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MPS",
1219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipON",
1220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipOFF",
1221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DEBUG",
1222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LT",
1224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LTEQ",
1225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GT",
1226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GTEQ",
1227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EQ",
1228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NEQ",
1229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ODD",
1230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EVEN",
1231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IF",
1232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EIF",
1233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AND",
1234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "OR",
1235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NOT",
1236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP1",
1237aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDB",
1238aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDS",
1239aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ADD",
1241aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SUB",
1242aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DIV",
1243aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MUL",
1244aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ABS",
1245aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NEG",
1246aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FLOOR",
1247aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CEILING",
1248aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[0]",
1249aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[1]",
1250aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[2]",
1251aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[3]",
1252aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[0]",
1253aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[1]",
1254aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[2]",
1255aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[3]",
1256aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1257aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WCvtF",
1258aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP2",
1259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP3",
1260aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[0]",
1261aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[1]",
1262aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[2]",
1263aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SROUND",
1264aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "S45Round",
1265aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JROT",
1266aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JROF",
1267aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROFF",
1268aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$7B",
1269aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RUTG",
1270aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RDTG",
1271aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SANGW",
1272aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AA",
1273aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1274aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipPT",
1275aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipRgON",
1276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipRgOFF",
1277aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$83",
1278aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$84",
1279aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ScanCTRL",
1280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDVPTL[0]",
1281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDVPTL[1]",
1282aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GetINFO",
1283aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IDEF",
1284aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROLL",
1285aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MAX",
1286aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIN",
1287aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ScanTYPE",
1288aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "InstCTRL",
1289aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$8F",
1290aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1291aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$90",
1292aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$91",
1293aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$92",
1294aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$93",
1295aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$94",
1296aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$95",
1297aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$96",
1298aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$97",
1299aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$98",
1300aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$99",
1301aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9A",
1302aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9B",
1303aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9C",
1304aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9D",
1305aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9E",
1306aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9F",
1307aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A0",
1309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A1",
1310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A2",
1311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A3",
1312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A4",
1313aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A5",
1314aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A6",
1315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A7",
1316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A8",
1317aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A9",
1318aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AA",
1319aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AB",
1320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AC",
1321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AD",
1322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AE",
1323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AF",
1324aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1325aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[0]",
1326aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[1]",
1327aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[2]",
1328aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[3]",
1329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[4]",
1330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[5]",
1331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[6]",
1332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[7]",
1333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[0]",
1334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[1]",
1335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[2]",
1336aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[3]",
1337aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[4]",
1338aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[5]",
1339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[6]",
1340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[7]",
1341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[00]",
1343aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[01]",
1344aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[02]",
1345aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[03]",
1346aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[04]",
1347aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[05]",
1348aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[06]",
1349aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[07]",
1350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[08]",
1351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[09]",
1352aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[10]",
1353aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[11]",
1354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[12]",
1355aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[13]",
1356aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[14]",
1357aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[15]",
1358aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1359aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[16]",
1360aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[17]",
1361aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[18]",
1362aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[19]",
1363aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[20]",
1364aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[21]",
1365aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[22]",
1366aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[23]",
1367aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[24]",
1368aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[25]",
1369aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[26]",
1370aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[27]",
1371aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[28]",
1372aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[29]",
1373aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[30]",
1374aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[31]",
1375aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1376aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[00]",
1377aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[01]",
1378aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[02]",
1379aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[03]",
1380aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[04]",
1381aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[05]",
1382aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[06]",
1383aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[07]",
1384aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[08]",
1385aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[09]",
1386aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[10]",
1387aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[11]",
1388aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[12]",
1389aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[13]",
1390aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[14]",
1391aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[15]",
1392aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1393aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[16]",
1394aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[17]",
1395aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[18]",
1396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[19]",
1397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[20]",
1398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[21]",
1399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[22]",
1400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[23]",
1401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[24]",
1402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[25]",
1403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[26]",
1404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[27]",
1405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[28]",
1406aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[29]",
1407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[30]",
1408aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[31]"
1409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  };
1410aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif /* FT_DEBUG_LEVEL_TRACE */
1412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Char  opcode_length[256] =
1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
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
1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
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
1427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,
1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1
1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
1437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef PACK
1439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1
1441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_MulFix14( FT_Int32  a,
1444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    b )
1445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   sign;
1447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  ah, al, mid, lo, hi;
1448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sign = a ^ b;
1451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( a < 0 )
1453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      a = -a;
1454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( b < 0 )
1455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      b = -b;
1456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
1458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    al = (FT_UInt32)( a & 0xFFFFU );
1459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo    = al * b;
1461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid   = ah * b;
1462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi    = mid >> 16;
1463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
1464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo   += mid;
1465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( lo < mid )
1466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      hi += 1;
1467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid = ( lo >> 14 ) | ( hi << 18 );
1469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
1471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
1474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* compute (a*b)/2^14 with maximum accuracy and rounding */
1476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_MulFix14( FT_Int32  a,
1478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    b )
1479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   m, s, hi;
1481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  l, lo;
1482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ax*bx as 64-bit value */
1485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l  = (FT_UInt32)( ( a & 0xFFFFU ) * b );
1486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m  = ( a >> 16 ) * b;
1487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    lo = l + ( (FT_UInt32)m << 16 );
1489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
1490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* divide the result by 2^14 with rounding */
1492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    s   = hi >> 31;
1493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + (FT_UInt32)s;
1494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += s + ( l < lo );
1495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo  = l;
1496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + 0x2000U;
1498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += l < lo;
1499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
1501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
1506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_DotFix14( FT_Int32  ax,
1508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int32  ay,
1509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    bx,
1510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    by )
1511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   m, s, hi1, hi2, hi;
1513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  l, lo1, lo2, lo;
1514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ax*bx as 64-bit value */
1517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
1518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m = ( ax >> 16 ) * bx;
1519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    lo1 = l + ( (FT_UInt32)m << 16 );
1521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
1522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ay*by as 64-bit value */
1524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
1525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m = ( ay >> 16 ) * by;
1526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    lo2 = l + ( (FT_UInt32)m << 16 );
1528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
1529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* add them */
1531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = lo1 + lo2;
1532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = hi1 + hi2 + ( lo < lo1 );
1533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* divide the result by 2^14 with rounding */
1535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    s   = hi >> 31;
1536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + (FT_UInt32)s;
1537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += s + ( l < lo );
1538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo  = l;
1539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + 0x2000U;
1541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += ( l < lo );
1542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
1544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Current_Ratio                                                      */
1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns the current aspect ratio scaling factor depending on the   */
1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    projection vector's state and device resolutions.                  */
1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */
1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Long
1560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Current_Ratio( EXEC_OP )
1561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !CUR.tt_metrics.ratio )
1563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.face->unpatented_hinting )
1566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.both_x_axis )
1568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
1569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
1571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.projVector.y == 0 )
1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
1577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( CUR.GS.projVector.x == 0 )
1579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
1580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1583727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          FT_F26Dot6  x, y;
1584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          x = TT_MulFix14( CUR.tt_metrics.x_ratio,
1587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                           CUR.GS.projVector.x );
1588727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          y = TT_MulFix14( CUR.tt_metrics.y_ratio,
1589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                           CUR.GS.projVector.y );
1590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.tt_metrics.ratio = FT_Hypot( x, y );
1591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.tt_metrics.ratio;
1595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Long
1599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Current_Ppem( EXEC_OP )
1600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1601727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );
1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Functions related to the control value table (CVT).                   */
1608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_F26Dot6 )
1613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Read_CVT( EXEC_OP_ FT_ULong  idx )
1614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.cvt[idx];
1616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_F26Dot6 )
1620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )
1621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );
1623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Write_CVT( EXEC_OP_ FT_ULong    idx,
1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_F26Dot6  value )
1629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] = value;
1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
1636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  value )
1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
1639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_CVT( EXEC_OP_ FT_ULong    idx,
1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_F26Dot6  value )
1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] += value;
1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
1652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  value )
1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
1655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    GetShortIns                                                        */
1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns a short integer taken from the instruction stream at       */
1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    address IP.                                                        */
1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Short read at code[IP].                                            */
1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This one could become a macro.                                     */
1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Short
1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  GetShortIns( EXEC_OP )
1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Reading a byte stream so there is no endianess (DaveP) */
1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += 2;
1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         CUR.code[CUR.IP - 1]      );
1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Ins_Goto_CodeRange                                                 */
1687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Goes to a certain code range in the instruction stream.            */
1690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    aRange :: The index of the code range.                             */
1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    aIP    :: The new IP address in the code range.                    */
1695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS or FAILURE.                                                */
1698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
1700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,
1701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_ULong  aIP )
1702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CodeRange*  range;
1704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( aRange < 1 || aRange > 3 )
1707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Bad_Argument );
1709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    range = &CUR.codeRangeTable[aRange - 1];
1713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( range->base == NULL )     /* invalid coderange */
1715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Invalid_CodeRange );
1717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: Because the last instruction of a program may be a CALL */
1721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       which will return to the first byte *after* the code    */
172241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*       range, we test for aIP <= Size, instead of aIP < Size.  */
1723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( aIP > range->size )
1725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Code_Overflow );
1727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.code     = range->base;
1731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.codeSize = range->size;
1732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP       = aIP;
1733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.curRange = aRange;
1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
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  /*    Direct_Move                                                        */
1743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Moves a point by a given distance along the freedom vector.  The   */
1746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point will be `touched'.                                           */
1747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point    :: The index of the point to move.                        */
1750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance :: The distance to apply.                                 */
1752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
1754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    zone     :: The affected glyph zone.                               */
1755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,
1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_UShort     point,
1759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_F26Dot6    distance )
1760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  v;
1762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
1766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.x;
1769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
1773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !SUBPIXEL_HINTING                                     ||
1774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( !CUR.ignore_x_mode                                ||
1775727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
1776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
1777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
1778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
1780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.y;
1783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1786727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
1787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
1789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Direct_Move_Orig                                                   */
1797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Moves the *original* position of a point by a given distance along */
1800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the freedom vector.  Obviously, the point will not be `touched'.   */
1801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point    :: The index of the point to move.                        */
1804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance :: The distance to apply.                                 */
1806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
1808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    zone     :: The affected glyph zone.                               */
1809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,
1812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_UShort     point,
1813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_F26Dot6    distance )
1814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  v;
1816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
1820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.x;
1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1825727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
1826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.y;
1828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1830727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
1831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Special versions of Direct_Move()                                     */
1837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The following versions are used whenever both vectors are both      */
1839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
1840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,
1846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UShort     point,
1847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6    distance )
1848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1851727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
1852727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !SUBPIXEL_HINTING  ||
1853727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !CUR.ignore_x_mode )
1854727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
1855727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->cur[point].x += distance;
1856727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
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
1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,
1863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UShort     point,
1864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6    distance )
1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->cur[point].y += distance;
1869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;
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  /* Special versions of Direct_Move_Orig()                                */
1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The following versions are used whenever both vectors are both      */
1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,
1885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UShort     point,
1886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6    distance )
1887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->org[point].x += distance;
1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,
1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UShort     point,
1897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6    distance )
1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->org[point].y += distance;
1902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_None                                                         */
1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Does not round, but adds engine compensation.                      */
1912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance (not) to round.                       */
1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The compensated distance.                                          */
1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The TrueType specification says very few about the relationship    */
1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    between rounding and engine compensation.  However, it seems from  */
1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the description of super round that we should add the compensation */
1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    before rounding.                                                   */
1926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
1928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_None( EXEC_OP_ FT_F26Dot6  distance,
1929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_F26Dot6  compensation )
1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
1932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation;
1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
1941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1942aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    else
1943aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    {
1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance - compensation;
1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
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  /* <Function>                                                            */
1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Grid                                                      */
1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to grid after adding engine compensation.             */
1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
1962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
1964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
1967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
1969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6  compensation )
1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
1973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 32;
1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
1982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
1984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
1986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -FT_PIX_ROUND( compensation - distance );
1988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
1989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
1990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return  val;
1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Half_Grid                                                 */
2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to half grid after adding engine compensation.        */
2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,
2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  compensation )
2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = FT_PIX_FLOOR( distance + compensation ) + 32;
2024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Down_To_Grid                                                 */
2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value down to grid after adding engine compensation.        */
2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  compensation )
2057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation;
2066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( compensation - distance ) & -64 );
2074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Up_To_Grid                                                   */
2086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value up to grid after adding engine compensation.          */
2089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_F26Dot6  compensation )
2101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 63;
2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2117727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      val = -FT_PIX_CEIL( compensation - distance );
2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Double_Grid                                               */
2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to double grid after adding engine compensation.      */
2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,
2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 FT_F26Dot6  compensation )
2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6 val;
2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 16;
2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~31;
2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -FT_PAD_ROUND( compensation - distance, 32 );
2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Super                                                        */
2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Super-rounds value to grid after adding engine compensation.       */
2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The TrueType specification says very few about the relationship    */
2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    between rounding and engine compensation.  However, it seems from  */
2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the description of super round that we should add the compensation */
2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    before rounding.                                                   */
2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Super( EXEC_OP_ FT_F26Dot6  distance,
2194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_F26Dot6  compensation )
2195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = ( distance - CUR.phase + CUR.threshold + compensation ) &
2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              -CUR.period;
2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val += CUR.phase;
2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               -CUR.period );
2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val -= CUR.phase;
2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Super_45                                                     */
2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Super-rounds value to grid after adding engine compensation.       */
2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    There is a separate function for Round_Super_45() as we may need   */
2238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    greater precision.                                                 */
2239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,
2242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  compensation )
2243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                CUR.period ) * CUR.period;
2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val += CUR.phase;
2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.period ) * CUR.period );
2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val -= CUR.phase;
2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Compute_Round                                                      */
2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets the rounding mode.                                            */
2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    round_mode :: The rounding mode to be used.                        */
2278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Round( EXEC_OP_ FT_Byte  round_mode )
2281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( round_mode )
2283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Off:
2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_None;
2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Grid:
2289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Grid;
2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Up_To_Grid:
2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
2294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Down_To_Grid:
2297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
2298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Half_Grid:
2301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
2302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Double_Grid:
2305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
2306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Super:
2309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Super;
2310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Super_45:
2313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Super_45;
2314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SetSuperRound                                                      */
2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets Super Round parameters.                                       */
2326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2328727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*    GridPeriod :: The grid period.                                     */
2329727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*                                                                       */
2330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*    selector   :: The SROUND opcode.                                   */
2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,
2334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_Long     selector )
2335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)( selector & 0xC0 ) )
2337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0:
2339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod / 2;
2340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x40:
2343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod;
2344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x80:
2347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod * 2;
2348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* This opcode is reserved, but... */
2351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0xC0:
2353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod;
2354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)( selector & 0x30 ) )
2358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
2360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = 0;
2361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x10:
2364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period / 4;
2365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x20:
2368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period / 2;
2369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x30:
2372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period * 3 / 4;
2373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( selector & 0x0F ) == 0 )
2377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.threshold = CUR.period - 1;
2378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
2380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.period    /= 256;
2382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.phase     /= 256;
2383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.threshold /= 256;
2384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project                                                            */
2391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of vector given by (v2-v1) along the       */
2394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    current projection vector.                                         */
2395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project( EXEC_OP_ FT_Pos  dx,
2405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Pos  dy )
2406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
2409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2411295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
2412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.projVector.x,
2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.projVector.y );
2414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Dual_Project                                                       */
2421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    current dual vector.                                               */
2425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Dual_Project( EXEC_OP_ FT_Pos  dx,
2435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_Pos  dy )
2436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2437295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
2438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.dualVector.x,
2439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.dualVector.y );
2440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project_x                                                          */
2447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    horizontal axis.                                                   */
2451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project_x( EXEC_OP_ FT_Pos  dx,
2461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pos  dy )
2462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( dy );
2465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return dx;
2467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project_y                                                          */
2474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    vertical axis.                                                     */
2478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project_y( EXEC_OP_ FT_Pos  dx,
2488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pos  dy )
2489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( dx );
2492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return dy;
2494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Compute_Funcs                                                      */
2501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection and movement function pointers according   */
2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    to the current graphics state.                                     */
2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Funcs( EXEC_OP )
2508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
2511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* If both vectors point rightwards along the x axis, set             */
2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `both-x-axis' true, otherwise set it false.  The x values only     */
2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* need be tested because the vector has been normalised to a unit    */
2515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* vector of length 0x4000 = unity.                                   */
2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      CUR.GS.freeVector.x == 0x4000 );
2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Throw away projection and freedom vector information */
2520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* because the patents don't allow them to be stored.   */
2521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* The relevant US Patents are 5155805 and 5325479.     */
2522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.projVector.x = 0;
2523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.projVector.y = 0;
2524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.freeVector.x = 0;
2525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.freeVector.y = 0;
2526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project   = Project_x;
2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = Direct_Move_X;
2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = Direct_Move_Orig_X;
2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project   = Project_y;
2536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = Direct_Move_Y;
2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = Direct_Move_Orig_Y;
2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.dualVector.x == 0x4000 )
2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_dualproj = Project_x;
2542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else if ( CUR.GS.dualVector.y == 0x4000 )
2543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_dualproj = Project_y;
2544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_dualproj = Dual_Project;
2546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Force recalculation of cached aspect ratio */
2548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.tt_metrics.ratio = 0;
2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
2551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
2553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x == 0x4000 )
2555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = CUR.GS.projVector.x;
2556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( CUR.GS.freeVector.y == 0x4000 )
2557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = CUR.GS.projVector.y;
2558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +
2560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>
2561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    14;
2562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.projVector.x == 0x4000 )
2564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_project = (TT_Project_Func)Project_x;
2565727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( CUR.GS.projVector.y == 0x4000 )
2566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_project = (TT_Project_Func)Project_y;
2567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2568727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_project = (TT_Project_Func)Project;
2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.dualVector.x == 0x4000 )
2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_dualproj = (TT_Project_Func)Project_x;
2572727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( CUR.GS.dualVector.y == 0x4000 )
2573727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_dualproj = (TT_Project_Func)Project_y;
2574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2575727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_dualproj = (TT_Project_Func)Dual_Project;
2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_move      = (TT_Move_Func)Direct_Move;
2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2580727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( CUR.F_dot_P == 0x4000L )
2581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.freeVector.x == 0x4000 )
2583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = (TT_Move_Func)Direct_Move_X;
2585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
2586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else if ( CUR.GS.freeVector.y == 0x4000 )
2588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_move      = (TT_Move_Func)Direct_Move_Y;
2590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
2591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* at small sizes, F_dot_P can become too small, resulting   */
2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* in overflows and `spikes' in a number of glyphs like `w'. */
2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2597727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( FT_ABS( CUR.F_dot_P ) < 0x400L )
2598727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = 0x4000L;
2599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Disable cached aspect ratio */
2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.tt_metrics.ratio = 0;
2602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Normalize                                                          */
2609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Norms a vector.                                                    */
2612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Vx :: The horizontal input vector coordinate.                      */
2615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Vy :: The vertical input vector coordinate.                        */
2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Output>                                                              */
2618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    R  :: The normed unit vector.                                      */
2619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns FAILURE if a vector parameter is zero.                     */
2622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */
2625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    R is undefined.                                                    */
2626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
2628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Normalize( EXEC_OP_ FT_F26Dot6      Vx,
2629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_F26Dot6      Vy,
2630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UnitVector*  R )
2631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  W;
2633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )
2638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( Vx == 0 && Vy == 0 )
2640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
2642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      to normalize the vector (0,0).  Return immediately. */
2643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
2644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      Vx *= 0x4000;
2647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      Vy *= 0x4000;
2648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    W = FT_Hypot( Vx, Vy );
2651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
2653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
2654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Here we start with the implementation of the various opcodes.         */
2662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
2667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,
2668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UShort       aIdx2,
2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Int          aOpc,
2670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UnitVector*  Vec )
2671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long     A, B, C;
2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  p1;
2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  p2;
2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( aIdx2, CUR.zp1.n_points ) )
2679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
2681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
2683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = CUR.zp1.cur + aIdx2;
2686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = CUR.zp2.cur + aIdx1;
2687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = p1->x - p2->x;
2689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = p1->y - p2->y;
2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2691aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* If p1 == p2, SPVTL and SFVTL behave the same as */
2692aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* SPVTCA[X] and SFVTCA[X], respectively.          */
2693aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                 */
2694aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Confirmed by Greg Hitchcock.                    */
2695aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
2696aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( A == 0 && B == 0 )
2697aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
2698aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      A    = 0x4000;
2699aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      aOpc = 0;
2700aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
2701aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
2702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( aOpc & 1 ) != 0 )
2703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
2705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
2706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
2707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, Vec );
2710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* When not using the big switch statements, the interpreter uses a */
2716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* call table defined later below in this source.  Each opcode must */
2717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* thus have a corresponding function, even trivial ones.           */
2718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                  */
2719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* They are all defined there.                                      */
2720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SVTCA                            \
2722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.x = A;                \
2730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.x = A;                \
2731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.x = A;                \
2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.y = B;                \
2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.y = B;                \
2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.y = B;                \
2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTCA                           \
2742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.x = A;                \
2750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.x = A;                \
2751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.y = B;                \
2753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.y = B;                \
2754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );             \
2756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTCA                           \
2762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.x = A;                \
2770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.y = B;                \
2771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );             \
2773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTL                                      \
2779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( INS_SxVTL( (FT_UShort)args[1],               \
2780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    (FT_UShort)args[0],               \
2781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    CUR.opcode,                       \
2782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    &CUR.GS.projVector ) == SUCCESS ) \
2783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                                 \
2784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.dualVector = CUR.GS.projVector;          \
2785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      GUESS_VECTOR( freeVector );                     \
2786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      COMPUTE_Funcs();                                \
2787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTL                                      \
2791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( INS_SxVTL( (FT_UShort)args[1],               \
2792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    (FT_UShort)args[0],               \
2793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    CUR.opcode,                       \
2794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    &CUR.GS.freeVector ) == SUCCESS ) \
2795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                                 \
2796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      GUESS_VECTOR( projVector );                     \
2797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      COMPUTE_Funcs();                                \
2798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTPV                          \
2802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );            \
2803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector = CUR.GS.projVector; \
2804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
2805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVFS                                \
2808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                             \
2809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  S;                                \
2810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   X, Y;                             \
2811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Only use low 16bits, then sign extend */ \
2814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[1];                      \
2815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Y = (FT_Long)S;                             \
2816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[0];                      \
2817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    X = (FT_Long)S;                             \
2818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( X, Y, &CUR.GS.projVector );      \
2820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector = CUR.GS.projVector;      \
2822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );                 \
2823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                            \
2824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVFS                                \
2828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                             \
2829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  S;                                \
2830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   X, Y;                             \
2831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Only use low 16bits, then sign extend */ \
2834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[1];                      \
2835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Y = (FT_Long)S;                             \
2836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[0];                      \
2837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    X = S;                                      \
2838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( X, Y, &CUR.GS.freeVector );      \
2840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );                 \
2841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                            \
2842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV                                   \
2847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )          \
2848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
2850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
2851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }                                            \
2852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                         \
2853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.projVector.x;             \
2855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.projVector.y;             \
2856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
2858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV                                   \
2859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.GS.projVector.x;               \
2860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = CUR.GS.projVector.y;
2861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV                                   \
2866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )          \
2867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
2869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
2870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }                                            \
2871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                         \
2872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.freeVector.x;             \
2874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.freeVector.y;             \
2875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
2877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV                                   \
2878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.GS.freeVector.x;               \
2879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = CUR.GS.freeVector.y;
2880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP0                      \
2884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = (FT_UShort)args[0];
2885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP1                      \
2888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = (FT_UShort)args[0];
2889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP2                      \
2892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = (FT_UShort)args[0];
2893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTHG                                         \
2896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Half_Grid;         \
2897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
2898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTG                                     \
2901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Grid;         \
2902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Grid;
2903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTDG                                           \
2906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Double_Grid;         \
2907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
2908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RUTG                                       \
2911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Up_To_Grid;         \
2912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
2913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RDTG                                         \
2916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Down_To_Grid;         \
2917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
2918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROFF                                 \
2921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Off;          \
2922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_None;
2923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SROUND                                \
2926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SET_SuperRound( 0x4000, args[0] );           \
2927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Super;         \
2928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Super;
2929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_S45ROUND                                 \
2932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SET_SuperRound( 0x2D41, args[0] );              \
2933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Super_45;         \
2934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Super_45;
2935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2937727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_SLOOP                            \
2938727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( args[0] < 0 )                      \
2939727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Bad_Argument ); \
2940727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else                                    \
2941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop = args[0];
2942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SMD                         \
2945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.minimum_distance = args[0];
2946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SCVTCI                                     \
2949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
2950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SSWCI                                     \
2953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
2954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2956727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_SSW                                                     \
2957727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.GS.single_width_value = FT_MulFix( args[0],                \
2958727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                           CUR.tt_metrics.scale );
2959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPON            \
2962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.auto_flip = TRUE;
2963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPOFF            \
2966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.auto_flip = FALSE;
2967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDB                             \
2970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.delta_base = (FT_Short)args[0];
2971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDS                              \
2974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.delta_shift = (FT_Short)args[0];
2975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MD  /* nothing */
2978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPPEM              \
2981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CURRENT_Ppem();
2982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note: The pointSize should be irrelevant in a given font program; */
2985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       we thus decide to return only the ppem.                     */
2986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
2987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS                       \
2989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.metrics.pointSize;
2990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
2992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS                \
2994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CURRENT_Ppem();
2995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */
2997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DUP         \
3000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = args[0];
3001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CLEAR     \
3004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = 0;
3005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SWAP        \
3008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                    \
3009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  L;        \
3010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       \
3011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       \
3012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L       = args[0]; \
3013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = args[1]; \
3014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = L;       \
3015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DEPTH       \
3019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.top;
3020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3022727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_CINDEX                                  \
3023727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  {                                                \
3024727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Long  L;                                    \
3025727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                   \
3026727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                   \
3027727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    L = args[0];                                   \
3028727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                   \
3029727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( L <= 0 || L > CUR.args )                  \
3030727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {                                              \
3031727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.pedantic_hinting )                  \
3032727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference ); \
3033727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      args[0] = 0;                                 \
3034727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }                                              \
3035727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else                                           \
3036727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      args[0] = CUR.stack[CUR.args - L];           \
3037aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  }
3038aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3039aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
304041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JROT                                                   \
304141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( args[1] != 0 )                                           \
304241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    {                                                             \
304341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( args[0] == 0 && CUR.args == 0 )                        \
3044727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                     \
304541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.IP += args[0];                                          \
304641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( CUR.IP < 0                                          || \
304741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier           ( CUR.callTop > 0                                 &&   \
304841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
3049727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                     \
305041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.step_ins = FALSE;                                       \
3051aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
3052aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3053aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
305441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JMPR                                                 \
305541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( args[0] == 0 && CUR.args == 0 )                        \
3056727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Bad_Argument );                     \
305741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    CUR.IP += args[0];                                          \
305841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.IP < 0                                          || \
305941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier         ( CUR.callTop > 0                                 &&   \
306041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier           CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
3061727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Bad_Argument );                     \
3062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
3063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
306541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JROF                                                   \
306641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( args[1] == 0 )                                           \
306741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    {                                                             \
306841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( args[0] == 0 && CUR.args == 0 )                        \
3069727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                     \
307041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.IP += args[0];                                          \
307141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      if ( CUR.IP < 0                                          || \
307241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier           ( CUR.callTop > 0                                 &&   \
307341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
3074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                     \
307541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.step_ins = FALSE;                                       \
3076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LT                        \
3080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] < args[1] );
3081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LTEQ                       \
3084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] <= args[1] );
3085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GT                        \
3088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] > args[1] );
3089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GTEQ                       \
3092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] >= args[1] );
3093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EQ                         \
3096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] == args[1] );
3097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEQ                        \
3100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] != args[1] );
3101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ODD                                                  \
3104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
3105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EVEN                                                \
3108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
3109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_AND                        \
3112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] && args[1] );
3113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_OR                         \
3116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] || args[1] );
3117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NOT          \
3120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = !args[0];
3121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ADD          \
3124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] += args[1];
3125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SUB          \
3128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] -= args[1];
3129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DIV                                               \
3132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] == 0 )                                      \
3133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Divide_By_Zero );                \
3134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                                     \
3135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );
3136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MUL                                    \
3139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    args[0] = FT_MulDiv( args[0], args[1], 64L );
3140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ABS                   \
3143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_ABS( args[0] );
3144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEG          \
3147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = -args[0];
3148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLOOR    \
3151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_PIX_FLOOR( args[0] );
3152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CEILING                    \
3155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_PIX_CEIL( args[0] );
3156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3157727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
3158727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3159727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_RS                                             \
3160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   {                                                      \
3161727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     FT_ULong  I = (FT_ULong)args[0];                     \
3162727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                          \
3163727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                          \
3164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     if ( BOUNDSL( I, CUR.storeSize ) )                   \
3165727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     {                                                    \
3166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       if ( CUR.pedantic_hinting )                        \
3167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ARRAY_BOUND_ERROR;                               \
3168727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       else                                               \
3169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         args[0] = 0;                                     \
3170727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     }                                                    \
3171727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     else                                                 \
3172727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     {                                                    \
3173727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       /* subpixel hinting - avoid Typeman Dstroke and */ \
3174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       /* IStroke and Vacuform rounds                  */ \
3175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                          \
3176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       if ( SUBPIXEL_HINTING                           && \
3177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            CUR.ignore_x_mode                          && \
3178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            ( ( I == 24                            &&     \
3179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                ( CUR.face->sph_found_func_flags &        \
3180727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  ( SPH_FDEF_SPACING_1 |                  \
3181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    SPH_FDEF_SPACING_2 )         ) ) ||   \
3182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              ( I == 22                      &&           \
3183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                ( CUR.sph_in_func_flags    &              \
3184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  SPH_FDEF_TYPEMAN_STROKES ) )       ||   \
3185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              ( I == 8                             &&     \
3186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                ( CUR.face->sph_found_func_flags &        \
3187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  SPH_FDEF_VACUFORM_ROUND_1      ) &&     \
3188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.iup_called                   ) ) )  \
3189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         args[0] = 0;                                     \
3190727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       else                                               \
3191727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         args[0] = CUR.storage[I];                        \
3192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     }                                                    \
3193727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   }
3194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
3196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_RS                           \
3198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich   {                                    \
3199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     FT_ULong  I = (FT_ULong)args[0];   \
3200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.storeSize ) ) \
3203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     {                                  \
3204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       if ( CUR.pedantic_hinting )      \
3205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       {                                \
3206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         ARRAY_BOUND_ERROR;             \
3207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       }                                \
3208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       else                             \
3209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         args[0] = 0;                   \
3210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     }                                  \
3211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     else                               \
3212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       args[0] = CUR.storage[I];        \
3213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
3216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_WS                           \
3219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich   {                                    \
3220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     FT_ULong  I = (FT_ULong)args[0];   \
3221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.storeSize ) ) \
3224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     {                                  \
3225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       if ( CUR.pedantic_hinting )      \
3226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       {                                \
3227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         ARRAY_BOUND_ERROR;             \
3228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       }                                \
3229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     }                                  \
3230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     else                               \
3231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       CUR.storage[I] = args[1];        \
3232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RCVT                          \
3236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                     \
3237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];    \
3238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )    \
3241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                   \
3242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )       \
3243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                 \
3244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;              \
3245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                 \
3246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       else                              \
3247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         args[0] = 0;                    \
3248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                   \
3249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                \
3250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       args[0] = CUR_Func_read_cvt( I ); \
3251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTP                         \
3255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                     \
3256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];    \
3257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )    \
3260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                   \
3261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )       \
3262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                 \
3263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;              \
3264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                 \
3265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                   \
3266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                \
3267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       CUR_Func_write_cvt( I, args[1] ); \
3268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTF                                                \
3272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                                            \
3273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];                           \
3274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                                \
3275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                                \
3276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )                           \
3277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                                          \
3278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )                              \
3279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                                        \
3280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;                                     \
3281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                                        \
3282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                                          \
3283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                                       \
3284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \
3285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_DEBUG                          \
3289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Debug_OpCode );
3290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROUND                                                   \
3293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR_Func_round(                                      \
3294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                args[0],                                           \
3295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
3296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NROUND                                                            \
3299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ROUND_None( args[0],                                           \
3300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
3301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MAX               \
3304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] > args[0] ) \
3305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = args[1];
3306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MIN               \
3309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] < args[0] ) \
3310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = args[1];
3311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
3314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  ARRAY_BOUND_ERROR
3317727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define ARRAY_BOUND_ERROR                        \
3318727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {                                            \
3319727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Invalid_Reference ); \
3320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return;                                    \
3321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */
3327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x00-0x01                                               */
3328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SVTCA( INS_ARG )
3332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SVTCA
3334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */
3340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x02-0x03                                               */
3341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVTCA( INS_ARG )
3345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVTCA
3347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */
3353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x04-0x05                                               */
3354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTCA( INS_ARG )
3358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTCA
3360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVTL[a]:     Set PVector To Line                                     */
3366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x06-0x07                                               */
3367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
3368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVTL( INS_ARG )
3371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVTL
3373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTL[a]:     Set FVector To Line                                     */
3379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x08-0x09                                               */
3380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
3381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTL( INS_ARG )
3384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTL
3386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTPV[]:     Set FVector To PVector                                  */
3392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0E                                                    */
3393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTPV( INS_ARG )
3397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTPV
3399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVFS[]:      Set PVector From Stack                                  */
3405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0A                                                    */
3406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f2.14 f2.14 -->                                         */
3407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVFS( INS_ARG )
3410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVFS
3412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVFS[]:      Set FVector From Stack                                  */
3418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0B                                                    */
3419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f2.14 f2.14 -->                                         */
3420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVFS( INS_ARG )
3423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVFS
3425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GPV[]:        Get Projection Vector                                   */
3431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0C                                                    */
3432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        ef2.14 --> ef2.14                                       */
3433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GPV( INS_ARG )
3436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GPV
3438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GFV[]:        Get Freedom Vector                                      */
3443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0D                                                    */
3444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        ef2.14 --> ef2.14                                       */
3445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GFV( INS_ARG )
3448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GFV
3450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP0[]:       Set Reference Point 0                                   */
3456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x10                                                    */
3457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP0( INS_ARG )
3461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP0
3463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP1[]:       Set Reference Point 1                                   */
3469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x11                                                    */
3470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP1( INS_ARG )
3474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP1
3476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP2[]:       Set Reference Point 2                                   */
3482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x12                                                    */
3483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP2( INS_ARG )
3487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP2
3489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTHG[]:       Round To Half Grid                                      */
3495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x19                                                    */
3496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTHG( INS_ARG )
3500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTHG
3502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTG[]:        Round To Grid                                           */
3508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x18                                                    */
3509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTG( INS_ARG )
3513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTG
3515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTDG[]:       Round To Double Grid                                    */
3520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3D                                                    */
3521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTDG( INS_ARG )
3525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTDG
3527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RUTG[]:       Round Up To Grid                                        */
3532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7C                                                    */
3533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RUTG( INS_ARG )
3537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RUTG
3539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RDTG[]:       Round Down To Grid                                      */
3545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7D                                                    */
3546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RDTG( INS_ARG )
3550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RDTG
3552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROFF[]:       Round OFF                                               */
3558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7A                                                    */
3559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROFF( INS_ARG )
3563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ROFF
3565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SROUND[]:     Super ROUND                                             */
3571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x76                                                    */
3572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        Eint8 -->                                               */
3573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SROUND( INS_ARG )
3576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SROUND
3578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* S45ROUND[]:   Super ROUND 45 degrees                                  */
3584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x77                                                    */
3585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_S45ROUND( INS_ARG )
3589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_S45ROUND
3591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SLOOP[]:      Set LOOP variable                                       */
3597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x17                                                    */
3598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? -->                                              */
3599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SLOOP( INS_ARG )
3602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SLOOP
3604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SMD[]:        Set Minimum Distance                                    */
3610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1A                                                    */
3611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SMD( INS_ARG )
3615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SMD
3617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCVTCI[]:     Set Control Value Table Cut In                          */
3623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1D                                                    */
3624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCVTCI( INS_ARG )
3628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SCVTCI
3630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SSWCI[]:      Set Single Width Cut In                                 */
3636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1E                                                    */
3637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SSWCI( INS_ARG )
3641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SSWCI
3643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SSW[]:        Set Single Width                                        */
3649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1F                                                    */
3650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? -->                                              */
3651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SSW( INS_ARG )
3654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SSW
3656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPON[]:     Set auto-FLIP to ON                                     */
3662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4D                                                    */
3663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPON( INS_ARG )
3667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLIPON
3669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
3675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4E                                                    */
3676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack: -->                                                            */
3677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPOFF( INS_ARG )
3680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLIPOFF
3682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SANGW[]:      Set ANGle Weight                                        */
3688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7E                                                    */
3689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SANGW( INS_ARG )
3693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* instruction not supported anymore */
3695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDB[]:        Set Delta Base                                          */
3701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5E                                                    */
3702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDB( INS_ARG )
3706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SDB
3708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDS[]:        Set Delta Shift                                         */
3714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5F                                                    */
3715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDS( INS_ARG )
3719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SDS
3721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MPPEM[]:      Measure Pixel Per EM                                    */
3727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4B                                                    */
3728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> Euint16                                             */
3729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MPPEM( INS_ARG )
3732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MPPEM
3734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MPS[]:        Measure Point Size                                      */
3740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4C                                                    */
3741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> Euint16                                             */
3742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MPS( INS_ARG )
3745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MPS
3747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DUP[]:        DUPlicate the top stack's element                       */
3753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x20                                                    */
3754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt --> StkElt StkElt                                */
3755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DUP( INS_ARG )
3758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DUP
3760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* POP[]:        POP the stack's top element                             */
3766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x21                                                    */
3767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt -->                                              */
3768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_POP( INS_ARG )
3771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CLEAR[]:      CLEAR the entire stack                                  */
3779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x22                                                    */
3780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt... -->                                           */
3781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CLEAR( INS_ARG )
3784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CLEAR
3786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SWAP[]:       SWAP the stack's top two elements                       */
3792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x23                                                    */
3793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        2 * StkElt --> 2 * StkElt                               */
3794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SWAP( INS_ARG )
3797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SWAP
3799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEPTH[]:      return the stack DEPTH                                  */
3805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x24                                                    */
3806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32                                              */
3807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DEPTH( INS_ARG )
3810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DEPTH
3812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CINDEX[]:     Copy INDEXed element                                    */
3818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x25                                                    */
3819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 --> StkElt                                        */
3820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CINDEX( INS_ARG )
3823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CINDEX
3825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EIF[]:        End IF                                                  */
3831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x59                                                    */
3832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EIF( INS_ARG )
3836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JROT[]:       Jump Relative On True                                   */
3844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x78                                                    */
3845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt int32 -->                                        */
3846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JROT( INS_ARG )
3849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JROT
3851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JMPR[]:       JuMP Relative                                           */
3857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1C                                                    */
3858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 -->                                               */
3859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JMPR( INS_ARG )
3862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JMPR
3864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JROF[]:       Jump Relative On False                                  */
3870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x79                                                    */
3871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt int32 -->                                        */
3872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JROF( INS_ARG )
3875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JROF
3877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LT[]:         Less Than                                               */
3883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x50                                                    */
3884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
3885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LT( INS_ARG )
3888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_LT
3890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LTEQ[]:       Less Than or EQual                                      */
3896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x51                                                    */
3897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
3898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LTEQ( INS_ARG )
3901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_LTEQ
3903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GT[]:         Greater Than                                            */
3909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x52                                                    */
3910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
3911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GT( INS_ARG )
3914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GT
3916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GTEQ[]:       Greater Than or EQual                                   */
3922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x53                                                    */
3923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
3924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GTEQ( INS_ARG )
3927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GTEQ
3929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EQ[]:         EQual                                                   */
3935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x54                                                    */
3936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt StkElt --> bool                                  */
3937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EQ( INS_ARG )
3940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_EQ
3942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NEQ[]:        Not EQual                                               */
3948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x55                                                    */
3949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt StkElt --> bool                                  */
3950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NEQ( INS_ARG )
3953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NEQ
3955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ODD[]:        Is ODD                                                  */
3961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x56                                                    */
3962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> bool                                          */
3963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ODD( INS_ARG )
3966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ODD
3968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EVEN[]:       Is EVEN                                                 */
3974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x57                                                    */
3975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> bool                                          */
3976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EVEN( INS_ARG )
3979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_EVEN
3981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* AND[]:        logical AND                                             */
3987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5A                                                    */
3988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> uint32                                */
3989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_AND( INS_ARG )
3992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_AND
3994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* OR[]:         logical OR                                              */
4000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5B                                                    */
4001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> uint32                                */
4002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_OR( INS_ARG )
4005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_OR
4007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NOT[]:        logical NOT                                             */
4013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5C                                                    */
4014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt --> uint32                                       */
4015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NOT( INS_ARG )
4018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NOT
4020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ADD[]:        ADD                                                     */
4026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x60                                                    */
4027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ADD( INS_ARG )
4031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ADD
4033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SUB[]:        SUBtract                                                */
4039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x61                                                    */
4040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SUB( INS_ARG )
4044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SUB
4046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DIV[]:        DIVide                                                  */
4052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x62                                                    */
4053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DIV( INS_ARG )
4057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DIV
4059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MUL[]:        MULtiply                                                */
4065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x63                                                    */
4066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MUL( INS_ARG )
4070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MUL
4072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ABS[]:        ABSolute value                                          */
4078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x64                                                    */
4079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ABS( INS_ARG )
4083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ABS
4085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NEG[]:        NEGate                                                  */
4091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x65                                                    */
4092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack: f26.6 --> f26.6                                                */
4093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NEG( INS_ARG )
4096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NEG
4098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLOOR[]:      FLOOR                                                   */
4104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x66                                                    */
4105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLOOR( INS_ARG )
4109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLOOR
4111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CEILING[]:    CEILING                                                 */
4117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x67                                                    */
4118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CEILING( INS_ARG )
4122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CEILING
4124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RS[]:         Read Store                                              */
4130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x43                                                    */
4131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> uint32                                       */
4132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RS( INS_ARG )
4135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RS
4137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WS[]:         Write Store                                             */
4143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x42                                                    */
4144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
4145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WS( INS_ARG )
4148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WS
4150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WCVTP[]:      Write CVT in Pixel units                                */
4156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x44                                                    */
4157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
4158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WCVTP( INS_ARG )
4161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WCVTP
4163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WCVTF[]:      Write CVT in Funits                                     */
4169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x70                                                    */
4170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
4171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WCVTF( INS_ARG )
4174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WCVTF
4176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RCVT[]:       Read CVT                                                */
4182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x45                                                    */
4183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> f26.6                                        */
4184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RCVT( INS_ARG )
4187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RCVT
4189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* AA[]:         Adjust Angle                                            */
4195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7F                                                    */
4196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_AA( INS_ARG )
4200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* intentionally no longer supported */
4202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEBUG[]:      DEBUG.  Unsupported.                                    */
4208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4F                                                    */
4209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note: The original instruction pops a value from the stack.           */
4212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DEBUG( INS_ARG )
4215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DEBUG
4217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROUND[ab]:    ROUND value                                             */
4223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x68-0x6B                                               */
4224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROUND( INS_ARG )
4228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ROUND
4230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NROUND[ab]:   No ROUNDing of value                                    */
4236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x6C-0x6F                                               */
4237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NROUND( INS_ARG )
4241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NROUND
4243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MAX[]:        MAXimum                                                 */
4249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x68                                                    */
4250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> int32                                 */
4251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MAX( INS_ARG )
4254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MAX
4256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIN[]:        MINimum                                                 */
4262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x69                                                    */
4263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> int32                                 */
4264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIN( INS_ARG )
4267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MIN
4269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
4273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The following functions are called as is within the switch statement. */
4278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MINDEX[]:     Move INDEXed element                                    */
4285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x26                                                    */
4286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? --> StkElt                                       */
4287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MINDEX( INS_ARG )
4290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  L, K;
4292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = args[0];
4295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( L <= 0 || L > CUR.args )
4297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4298aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
4299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
4300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4301aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    else
4302aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
4303aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      K = CUR.stack[CUR.args - L];
4304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4305aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],
4306aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     &CUR.stack[CUR.args - L + 1],
4307aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     ( L - 1 ) );
4308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4309aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.stack[CUR.args - 1] = K;
4310aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
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  /*                                                                       */
4316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROLL[]:       ROLL top three elements                                 */
4317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8A                                                    */
4318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        3 * StkElt --> 3 * StkElt                               */
4319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROLL( INS_ARG )
4322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  A, B, C;
4324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
4326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = args[2];
4329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = args[1];
4330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    C = args[0];
4331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[2] = C;
4333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = A;
4334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = B;
4335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING THE FLOW OF CONTROL                                          */
4341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
4343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
4348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  SkipCode( EXEC_OP )
4349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += CUR.length;
4351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.IP < CUR.codeSize )
4353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.opcode = CUR.code[CUR.IP];
4355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.length = opcode_length[CUR.opcode];
4357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.length < 0 )
4358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
435941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        if ( CUR.IP + 1 >= CUR.codeSize )
4360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail_Overflow;
4361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
4362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP + CUR.length <= CUR.codeSize )
4365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
4366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail_Overflow:
4369727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Code_Overflow );
4370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FAILURE;
4371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IF[]:         IF test                                                 */
4377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x58                                                    */
4378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt -->                                              */
4379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IF( INS_ARG )
4382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int   nIfs;
4384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool  Out;
4385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] != 0 )
4388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nIfs = 1;
4391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Out = 0;
4392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
4394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( SKIP_Code() == FAILURE )
4396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x58:      /* IF */
4401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs++;
4402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x1B:      /* ELSE */
4405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Out = FT_BOOL( nIfs == 1 );
4406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x59:      /* EIF */
4409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs--;
4410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Out = FT_BOOL( nIfs == 0 );
4411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( Out == 0 );
4414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ELSE[]:       ELSE                                                    */
4420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1B                                                    */
4421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
4422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ELSE( INS_ARG )
4425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  nIfs;
4427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
4429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nIfs = 1;
4432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
4434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( SKIP_Code() == FAILURE )
4436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x58:    /* IF */
4441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs++;
4442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x59:    /* EIF */
4445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs--;
4446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( nIfs != 0 );
4449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */
4455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
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  /*************************************************************************/
4462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FDEF[]:       Function DEFinition                                     */
4464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2C                                                    */
4465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FDEF( INS_ARG )
4469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       n;
4471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  rec;
4472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit;
4473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* arguments to opcodes are skipped by `SKIP_Code' */
4476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Byte    opcode_pattern[9][12] = {
4477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #0 inline delta function 1 */
4478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x4B, /* PPEM    */
4480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x53, /* GTEQ    */
4481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x4B, /* PPEM    */
4483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x51, /* LTEQ    */
4484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x5A, /* AND     */
4485727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58, /* IF      */
4486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x38, /*   SHPIX */
4487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x1B, /* ELSE    */
4488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x59  /* EIF     */
4491727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #1 inline delta function 2 */
4493727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x4B, /* PPEM    */
4495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x54, /* EQ      */
4496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58, /* IF      */
4497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x38, /*   SHPIX */
4498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x1B, /* ELSE    */
4499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x59  /* EIF     */
4502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #2 diagonal stroke function */
4504727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4507727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4508727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   1     */
4509727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x60, /* ADD     */
4510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x46, /* GC_cur  */
4511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   64    */
4513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x42  /* WS      */
4515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #3 VacuFormRound function */
4517727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4518727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x45, /* RCVT    */
4519727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x46, /* GC_cur  */
4521727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x60, /* ADD     */
4522727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4523727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0  /* PUSHB_1 */
4524727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   38    */
4525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4526727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #4 TTFautohint bytecode (old) */
4527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4528727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4529727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x64, /* ABS     */
4530727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4531727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   32    */
4532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x60, /* ADD     */
4533727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x66, /* FLOOR   */
4534727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4535727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0  /* PUSHB_1 */
4536727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4537727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #5 spacing function 1 */
4538727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4539727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x01, /* SVTCA_x */
4540727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4541727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   24    */
4542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x43, /* RS      */
4543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58  /* IF      */
4544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #6 spacing function 2 */
4546727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4547727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x01, /* SVTCA_x */
4548727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x18, /* RTG     */
4549727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4550727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   24    */
4551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x43, /* RS      */
4552727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58  /* IF      */
4553727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #7 TypeMan Talk DiagEndCtrl function */
4555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x01, /* SVTCA_x */
4557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4558727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   3     */
4560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x25, /* CINDEX  */
4561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4562727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #8 TypeMan Talk Align */
4563727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4564727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x06, /* SPVTL   */
4565727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x7D, /* RDTG    */
4566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4567727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               };
4568727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_patterns   = 9;
4569727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_pointer[9] = {  0, 0, 0, 0, 0, 0, 0, 0, 0 };
4570727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_size[9]    = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
4571727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  i;
4572727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4573727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some font programs are broken enough to redefine functions! */
4576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We will then parse the current table.                       */
4577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec   = CUR.FDefs;
4579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = rec + CUR.numFDefs;
4580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    n     = args[0];
4581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; rec < limit; rec++ )
4583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( rec->opc == n )
4585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( rec == limit )
4589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check that there is enough room for new functions */
4591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.numFDefs >= CUR.maxFDefs )
4592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4593727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Too_Many_Function_Defs );
4594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.numFDefs++;
4597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* Although FDEF takes unsigned 32-bit integer,  */
4600295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* func # must be within unsigned 16-bit integer */
4601295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( n > 0xFFFFU )
4602295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
4603727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Too_Many_Function_Defs );
4604295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
4605295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
4606295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
4607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->range          = CUR.curRange;
4608727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->opc            = (FT_UInt16)n;
4609727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->start          = CUR.IP + 1;
4610727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->active         = TRUE;
4611727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->inline_delta   = FALSE;
4612727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->sph_fdef_flags = 0x0000;
4613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n > CUR.maxFunc )
4615295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.maxFunc = (FT_UInt16)n;
4616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4618727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* We don't know for sure these are typeman functions, */
4619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* however they are only active when RS 22 is called   */
4620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( n >= 64 && n <= 66 )
4621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
4622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
4623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now skip the whole function definition. */
4625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We don't allow nested IDEFS & FDEFs.    */
4626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( SKIP_Code() == SUCCESS )
4628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4630727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4631727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4632727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING )
4633727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
4634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        for ( i = 0; i < opcode_patterns; i++ )
4635727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
4636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( opcode_pointer[i] < opcode_size[i]                 &&
4637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
4638727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
4639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] += 1;
4640727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4641727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( opcode_pointer[i] == opcode_size[i] )
4642727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
4643727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              FT_TRACE7(( "sph: Function %d, opcode ptrn: %d, %s %s\n",
4644727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          i, n,
4645727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.family_name,
4646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.style_name ));
4647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4648727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              switch ( i )
4649727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              {
4650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 0:
4651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_1;
4652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
4653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4654727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4655727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 1:
4656727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_2;
4657727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
4658727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4659727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 2:
4661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  /* needs to be implemented still */
4664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 58:
4665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_DIAGONAL_STROKE;
4666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
4667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 3:
4671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4673727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 0:
4674727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_VACUFORM_ROUND_1;
4675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
4676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4677727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4678727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4679727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 4:
4680727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* probably not necessary to detect anymore */
4681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                rec->sph_fdef_flags            |= SPH_FDEF_TTFAUTOHINT_1;
4682727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
4683727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4685727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 5:
4686727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4687727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4688727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 0:
4689727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 1:
4690727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 2:
4691727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 4:
4692727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 7:
4693727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 8:
4694727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_1;
4695727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
4696727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 6:
4700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4702727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 0:
4703727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 1:
4704727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 2:
4705727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 4:
4706727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 7:
4707727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 8:
4708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_2;
4709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
4710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4711727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4713727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               case 7:
4714727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4715727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 break;
4717727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               case 8:
4719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0
4720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
4723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 break;
4724727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              }
4725727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              opcode_pointer[i] = 0;
4726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
4727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
4728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
4730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] = 0;
4731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
4732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Set sph_compatibility_mode only when deltas are detected */
4734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.face->sph_compatibility_mode =
4735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
4736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
4737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
4738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x89:    /* IDEF */
4744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2C:    /* FDEF */
4745727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Nested_DEFS );
4746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2D:   /* ENDF */
474941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        rec->end = CUR.IP;
4750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ENDF[]:       END Function definition                                 */
4759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2D                                                    */
4760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
4761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ENDF( INS_ARG )
4764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*  pRec;
4766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
4768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.sph_in_func_flags = 0x0000;
4772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */
4775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( ENDF_In_Exec_Stream );
4777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.callTop--;
4781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pRec = &CUR.callStack[CUR.callTop];
4783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pRec->Cur_Count--;
4785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
4787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pRec->Cur_Count > 0 )
4789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.callTop++;
4791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.IP = pRec->Cur_Restart;
4792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
4794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Loop through the current function */
4795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      INS_Goto_CodeRange( pRec->Caller_Range,
4796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          pRec->Caller_IP );
4797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Exit the current call frame.                      */
4799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: If the last instruction of a program is a   */
4801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       CALL or LOOPCALL, the return address is     */
4802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       always out of the code range.  This is a    */
4803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       valid address, and it is why we do not test */
4804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       the result of Ins_Goto_CodeRange() here!    */
4805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CALL[]:       CALL function                                           */
4811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2B                                                    */
4812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
4813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CALL( INS_ARG )
4816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       F;
4818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*    pCrec;
4819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first of all, check the index */
4823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    F = args[0];
4825aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
4826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Except for some old Apple fonts, all functions in a TrueType */
4829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* font are defined in increasing order, starting from 0.  This */
4830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* means that we normally have                                  */
4831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
4833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
4834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If this isn't true, we need to look up the function table.   */
4836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def = CUR.FDefs + F;
4838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
4839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look up the FDefs table */
4841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_DefRecord*  limit;
4842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      def   = CUR.FDefs;
4845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      limit = def + CUR.numFDefs;
4846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( def < limit && def->opc != F )
4848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        def++;
4849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def == limit )
4851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
4852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that the function is active */
4855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !def->active )
4856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4858727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4859727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                              &&
4860727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                             &&
4861727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( ( CUR.iup_called                                        &&
4862727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
4863727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 )       ) )
4864727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
4865727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
4866727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.sph_in_func_flags = def->sph_fdef_flags;
4867727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4868727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check the call stack */
4870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop >= CUR.callSize )
4871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4872727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
4873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec = CUR.callStack + CUR.callTop;
4877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Caller_Range = CUR.curRange;
4879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Caller_IP    = CUR.IP + 1;
4880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Cur_Count    = 1;
4881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Cur_Restart  = def->start;
488241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    pCrec->Cur_End      = def->end;
4883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.callTop++;
4885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    INS_Goto_CodeRange( def->range,
4887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        def->start );
4888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
4890727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
4892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
4894727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Invalid_Reference );
4895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LOOPCALL[]:   LOOP and CALL function                                  */
4901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2A                                                    */
4902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? Eint16? -->                                     */
4903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LOOPCALL( INS_ARG )
4906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       F;
4908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*    pCrec;
4909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first of all, check the index */
4913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    F = args[1];
4914aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
4915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Except for some old Apple fonts, all functions in a TrueType */
4918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* font are defined in increasing order, starting from 0.  This */
4919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* means that we normally have                                  */
4920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
4922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
4923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If this isn't true, we need to look up the function table.   */
4925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def = CUR.FDefs + F;
4927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
4928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look up the FDefs table */
4930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_DefRecord*  limit;
4931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      def   = CUR.FDefs;
4934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      limit = def + CUR.numFDefs;
4935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( def < limit && def->opc != F )
4937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        def++;
4938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def == limit )
4940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
4941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that the function is active */
4944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !def->active )
4945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4947727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4948727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                    &&
4949727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                   &&
4950727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
4951727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
4952727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
4953727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.sph_in_func_flags = def->sph_fdef_flags;
4954727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4955727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check stack */
4957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop >= CUR.callSize )
4958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4959727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
4960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] > 0 )
4964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec = CUR.callStack + CUR.callTop;
4966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Caller_Range = CUR.curRange;
4968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Caller_IP    = CUR.IP + 1;
4969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Cur_Count    = (FT_Int)args[0];
4970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Cur_Restart  = def->start;
497141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      pCrec->Cur_End      = def->end;
4972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.callTop++;
4974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      INS_Goto_CodeRange( def->range, def->start );
4976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.step_ins = FALSE;
4978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4979727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
4981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
4983727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Invalid_Reference );
4984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IDEF[]:       Instruction DEFinition                                  */
4990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x89                                                    */
4991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        Eint8 -->                                               */
4992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IDEF( INS_ARG )
4995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit;
4998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  First of all, look for the same function in our table */
5001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def   = CUR.IDefs;
5003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = def + CUR.numIDefs;
5004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; def < limit; def++ )
5006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def->opc == (FT_ULong)args[0] )
5007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
5008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( def == limit )
5010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check that there is enough room for a new instruction */
5012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.numIDefs >= CUR.maxIDefs )
5013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5014727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Too_Many_Instruction_Defs );
5015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
5016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.numIDefs++;
5018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5020295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* opcode must be unsigned 8-bit integer */
5021295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( 0 > args[0] || args[0] > 0x00FF )
5022295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
5023727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Too_Many_Instruction_Defs );
5024295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
5025295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
5026295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
5027295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    def->opc    = (FT_Byte)args[0];
5028aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    def->start  = CUR.IP + 1;
5029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def->range  = CUR.curRange;
5030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def->active = TRUE;
5031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( (FT_ULong)args[0] > CUR.maxIns )
5033295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.maxIns = (FT_Byte)args[0];
5034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now skip the whole function definition. */
5036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We don't allow nested IDEFs & FDEFs.    */
5037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( SKIP_Code() == SUCCESS )
5039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
5041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x89:   /* IDEF */
5043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2C:   /* FDEF */
5044727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Nested_DEFS );
5045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
5046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2D:   /* ENDF */
5047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
5048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */
5056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
5058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NPUSHB[]:     PUSH N Bytes                                            */
5065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x40                                                    */
5066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32...                                           */
5067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NPUSHB( INS_ARG )
5070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)CUR.code[CUR.IP + 1];
5075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 1; K <= L; K++ )
5083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K - 1] = CUR.code[CUR.IP + K + 1];
5084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top += L;
5086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NPUSHW[]:     PUSH N Words                                            */
5092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x41                                                    */
5093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> int32...                                            */
5094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NPUSHW( INS_ARG )
5097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)CUR.code[CUR.IP + 1];
5102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5105727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += 2;
5110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 0; K < L; K++ )
5112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K] = GET_ShortIns();
5113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
5115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top += L;
5116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHB[abc]:   PUSH Bytes                                              */
5122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xB0-0xB7                                               */
5123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32...                                           */
5124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_PUSHB( INS_ARG )
5127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
5132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 1; K <= L; K++ )
5140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K - 1] = CUR.code[CUR.IP + K];
5141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHW[abc]:   PUSH Words                                              */
5147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xB8-0xBF                                               */
5148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> int32...                                            */
5149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_PUSHW( INS_ARG )
5152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
5157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP++;
5165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 0; K < L; K++ )
5167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K] = GET_ShortIns();
5168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
5170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING THE GRAPHICS STATE                                           */
5176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Instructions appear in the specs' order.                             */
5178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GC[a]:        Get Coordinate projected onto                           */
5185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x46-0x47                                               */
5186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> f26.6                                        */
5187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
518841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */
518941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*      along the dual projection vector!                                */
5190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GC( INS_ARG )
5193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    L;
5195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  R;
5196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_ULong)args[0];
5199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( L, CUR.zp2.n_points ) )
5201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5203727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5204aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      R = 0;
5205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.opcode & 1 )
5209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        R = CUR_fast_dualproj( &CUR.zp2.org[L] );
5210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        R = CUR_fast_project( &CUR.zp2.cur[L] );
5212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = R;
5215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCFS[]:       Set Coordinate From Stack                               */
5221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x48                                                    */
5222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
5223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Formula:                                                              */
5225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */
5227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCFS( INS_ARG )
5230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    K;
5232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L;
5233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.zp2.n_points ) )
5238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = CUR_fast_project( &CUR.zp2.cur[L] );
5245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp2, L, args[1] - K );
5247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5248aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
5249aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
5250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep2 == 0 )
5251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.org[L] = CUR.zp2.cur[L];
5252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MD[a]:        Measure Distance                                        */
5258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x49-0x4A                                               */
5259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> f26.6                                 */
5260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
526141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */
526241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                    the dual projection vector.                        */
5263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
526441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */
526541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                      0 => measure distance in original outline        */
526641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                      1 => measure distance in grid-fitted outline     */
5267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
526841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */
5269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MD( INS_ARG )
5272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   K, L;
5274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  D;
5275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( L, CUR.zp0.n_points ) ||
5281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDS( K, CUR.zp1.n_points ) )
5282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      D = 0;
5286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.opcode & 1 )
5290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
5291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
529327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra        /* XXX: UNDOCUMENTED: twilight zone special case */
5294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
529527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
5296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
529727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec1 = CUR.zp0.org + L;
529827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec2 = CUR.zp1.org + K;
529927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
530027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
5301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          D = CUR_Func_dualproj( vec1, vec2 );
5302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
5304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
530527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec1 = CUR.zp0.orus + L;
530627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec2 = CUR.zp1.orus + K;
5307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
530927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
531027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          {
531127811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            /* this should be faster */
531227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = CUR_Func_dualproj( vec1, vec2 );
5313727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            D = FT_MulFix( D, CUR.metrics.x_scale );
531427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          }
531527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          else
531627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          {
531727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            FT_Vector  vec;
531827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
5319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
5321727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
532227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
532327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = CUR_fast_dualproj( &vec );
532427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          }
5325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5329727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
5330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
5331727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                       &&
5332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode && FT_ABS( D ) == 64 )
5333727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      D += 1;
5334727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
5335727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = D;
5337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDPVTL[a]:    Set Dual PVector to Line                                */
5343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x86-0x87                                               */
5344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDPVTL( INS_ARG )
5348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    A, B, C;
5350aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */
5351aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Int     aOpc = CUR.opcode;
5352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = (FT_UShort)args[1];
5355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = (FT_UShort)args[0];
5356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( p2, CUR.zp1.n_points ) ||
5358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( p1, CUR.zp2.n_points ) )
5359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5361727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector* v1 = CUR.zp1.org + p2;
5367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector* v2 = CUR.zp2.org + p1;
5368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = v1->x - v2->x;
5371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = v1->y - v2->y;
5372aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
5373aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* If v1 == v2, SDPVTL behaves the same as */
5374aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* SVTCA[X], respectively.                 */
5375aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /*                                         */
5376aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* Confirmed by Greg Hitchcock.            */
5377aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
5378aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( A == 0 && B == 0 )
5379aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
5380aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        A    = 0x4000;
5381aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        aOpc = 0;
5382aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
5383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5385aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( ( aOpc & 1 ) != 0 )
5386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
5388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
5389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
5390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, &CUR.GS.dualVector );
5393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  v1 = CUR.zp1.cur + p2;
5396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  v2 = CUR.zp2.cur + p1;
5397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = v1->x - v2->x;
5400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = v1->y - v2->y;
5401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5402727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( A == 0 && B == 0 )
5403727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
5404727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        A    = 0x4000;
5405727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        aOpc = 0;
5406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
5407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5409aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( ( aOpc & 1 ) != 0 )
5410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
5412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
5413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
5414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, &CUR.GS.projVector );
5417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );
5419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
5421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP0[]:       Set Zone Pointer 0                                      */
5427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x13                                                    */
5428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP0( INS_ARG )
5432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.twilight;
5437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.pts;
5441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5445727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep0 = (FT_UShort)args[0];
5450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP1[]:       Set Zone Pointer 1                                      */
5456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x14                                                    */
5457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP1( INS_ARG )
5461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1 = CUR.twilight;
5466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1 = CUR.pts;
5470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep1 = (FT_UShort)args[0];
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  /* SZP2[]:       Set Zone Pointer 2                                      */
5485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x15                                                    */
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_SZP2( INS_ARG )
5490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2 = CUR.twilight;
5495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2 = CUR.pts;
5499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep2 = (FT_UShort)args[0];
5508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZPS[]:       Set Zone PointerS                                       */
5514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x16                                                    */
5515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZPS( INS_ARG )
5519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.twilight;
5524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.pts;
5528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp1 = CUR.zp0;
5537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp2 = CUR.zp0;
5538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep0 = (FT_UShort)args[0];
5540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep1 = (FT_UShort)args[0];
5541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep2 = (FT_UShort)args[0];
5542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* INSTCTRL[]:   INSTruction ConTRoL                                     */
5548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8e                                                    */
5549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 int32 -->                                         */
5550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_INSTCTRL( INS_ARG )
5553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  K, L;
5555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = args[1];
5558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = args[0];
5559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( K < 1 || K > 2 )
5561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5563727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( L != 0 )
5568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        L = K;
5569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.instruct_control = FT_BOOL(
5571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
5572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCANCTRL[]:   SCAN ConTRoL                                            */
5578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x85                                                    */
5579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
5580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCANCTRL( INS_ARG )
5583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  A;
5585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Get Threshold */
5588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Int)( args[0] & 0xFF );
5589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( A == 0xFF )
5591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( A == 0 )
5596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
56010a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
5602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
5605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
5608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
56100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
5611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
5614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
5617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCANTYPE[]:   SCAN TYPE                                               */
5624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8D                                                    */
5625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
5626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCANTYPE( INS_ARG )
5629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
56300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( args[0] >= 0 )
5631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_type = (FT_Int)args[0];
5632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING OUTLINES                                                     */
5638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
5640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPPT[]:     FLIP PoinT                                              */
5647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x80                                                    */
5648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
5649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPPT( INS_ARG )
5652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  point;
5654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
5656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
5659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5660aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Too_Few_Arguments );
5662aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.pts.n_points ) )
5672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
5676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
5681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
5683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5685aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
5686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
5687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
5688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPRGON[]:   FLIP RanGe ON                                           */
5694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x81                                                    */
5695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPRGON( INS_ARG )
5699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  I, K, L;
5701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( K, CUR.pts.n_points ) ||
5707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( L, CUR.pts.n_points ) )
5708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( I = L; I <= K; I++ )
5715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
5716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPRGOFF:    FLIP RanGe OFF                                          */
5722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x82                                                    */
5723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPRGOFF( INS_ARG )
5727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  I, K, L;
5729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( K, CUR.pts.n_points ) ||
5735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( L, CUR.pts.n_points ) )
5736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( I = L; I <= K; I++ )
5743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
5744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
5748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,
5749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6*   y,
5750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       TT_GlyphZone  zone,
5751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_UShort*    refp )
5752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_GlyphZoneRec  zp;
5754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        p;
5755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6       d;
5756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.opcode & 1 )
5759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zp = CUR.zp0;
5761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      p  = CUR.GS.rp1;
5762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zp = CUR.zp1;
5766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      p  = CUR.GS.rp2;
5767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( p, zp.n_points ) )
5770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *refp = 0;
5774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
5775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *zone = zp;
5778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *refp = p;
5779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    d = CUR_Func_project( zp.cur + p, zp.org + p );
5781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *x = d;
5788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *y = 0;
5789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *x = 0;
5793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *y = d;
5794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5799727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );
5800727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );
5801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
5804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,
5809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  dx,
5810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  dy,
5811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Bool     touch )
5812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.cur[point].x += dx;
5819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( touch )
5820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
5821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.cur[point].y += dy;
5825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( touch )
5826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
5827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x != 0 )
5833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x += dx;
5835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( touch )
5836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
5837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.y != 0 )
5840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y += dy;
5842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( touch )
5843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
5844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHP[a]:       SHift Point by the last point                           */
5851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x32-0x33                                               */
5852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
5853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHP( INS_ARG )
5856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_GlyphZoneRec  zp;
5858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        refp;
5859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6       dx,
5861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     dy;
5862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        point;
5863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
5865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
5868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5869aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5870727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5871aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
5883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5886727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
5887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5891727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
5892727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* doesn't follow Cleartype spec but produces better result */
5893727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING  &&
5894727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode )
5895727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        MOVE_Zp2_Point( point, 0, dy, TRUE );
5896727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
5897727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
5898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( point, dx, dy, TRUE );
5899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
5901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5903aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
5904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
5905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
5906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHC[a]:       SHift Contour                                           */
5912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x34-35                                                 */
5913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
591541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */
591641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*               contour in the twilight zone, namely contour number     */
5917727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*               zero which includes all points of it.                   */
591841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                                                                       */
5919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHC( INS_ARG )
5921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
592241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    TT_GlyphZoneRec  zp;
592341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        refp;
592441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_F26Dot6       dx, dy;
5925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
592641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Short         contour, bounds;
592741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        start, limit, i;
5928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    contour = (FT_UShort)args[0];
593141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
5932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
593341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( BOUNDS( contour, bounds ) )
5934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5936727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( contour == 0 )
594441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      start = 0;
5945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
594641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
594741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.zp2.first_point );
5948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
594941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* we use the number of points if in the twilight zone */
595041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.GS.gep2 == 0 )
595141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = CUR.zp2.n_points;
595241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    else
595341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)( CUR.zp2.contours[contour] -
595441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.zp2.first_point + 1 );
5955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
595641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    for ( i = start; i < limit; i++ )
5957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( zp.cur != CUR.zp2.cur || refp != i )
5959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( i, dx, dy, TRUE );
5960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHZ[a]:       SHift Zone                                              */
5967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x36-37                                                 */
5968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHZ( INS_ARG )
5972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5973aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    TT_GlyphZoneRec  zp;
5974aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UShort        refp;
5975aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_F26Dot6       dx,
5976aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     dy;
5977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
597841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        limit, i;
5979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( args[0], 2 ) )
5982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5984727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
599141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
599241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      Twilight zone has no real contours, so use `n_points'. */
599341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      Normal zone's `n_points' includes phantoms, so must    */
599441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      use end of last contour.                               */
599541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.GS.gep2 == 0 )
599641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)CUR.zp2.n_points;
5997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 )
599841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
5999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
600041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = 0;
6001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
600341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    for ( i = 0; i < limit; i++ )
6004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( zp.cur != CUR.zp2.cur || refp != i )
6006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( i, dx, dy, FALSE );
6007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHPIX[]:      SHift points by a PIXel amount                          */
6014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x38                                                    */
6015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32... -->                                     */
6016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHPIX( INS_ARG )
6019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx, dy;
6021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6022727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6023727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int      B1, B2;
6024727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop + 1 )
6028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6029aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
6030727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6031aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
6035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
6036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
6038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6039727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        dx = (FT_UInt32)args[0];
6040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dy = 0;
6041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dx = 0;
6045727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        dy = (FT_UInt32)args[0];
6046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
6050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6051295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
6052295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
6053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
6056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
6058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
6060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
6062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
6064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
6066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
6067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6070727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6071727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
6072727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*  If not using ignore_x_mode rendering, allow ZP2 move.          */
6073727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*  If inline deltas aren't allowed, skip ZP2 move.                */
6074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*  If using ignore_x_mode rendering, allow ZP2 point move if:     */
6075727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - freedom vector is y and sph_compatibility_mode is off       */
6076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - the glyph is composite and the move is in the Y direction   */
6077727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - the glyph is specifically set to allow SHPIX moves          */
6078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - the move is on a previously Y-touched point                 */
6079727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6080727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( SUBPIXEL_HINTING  &&
6081727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             CUR.ignore_x_mode )
6082727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
6083727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* save point for later comparison */
6084727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( CUR.GS.freeVector.y != 0 )
6085727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            B1 = CUR.zp2.cur[point].y;
6086727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
6087727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            B1 = CUR.zp2.cur[point].x;
6088727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6089727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( !CUR.face->sph_compatibility_mode &&
6090727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               CUR.GS.freeVector.y != 0          )
6091727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
6092727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            MOVE_Zp2_Point( point, dx, dy, TRUE );
6093727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6094727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* save new point */
6095727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.GS.freeVector.y != 0 )
6096727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
6097727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              B2 = CUR.zp2.cur[point].y;
6098727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6099727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* reverse any disallowed moves */
6100727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
6101727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( B1 & 63 ) != 0                                          &&
6102727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( B2 & 63 ) != 0                                          &&
6103727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    B1 != B2                                                 )
6104727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                MOVE_Zp2_Point( point, -dx, -dy, TRUE );
6105727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
6106727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
6107727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else if ( CUR.face->sph_compatibility_mode )
6108727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
6109727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
6110727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
6111727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              dx = FT_PIX_ROUND( B1 + dx ) - B1;
6112727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              dy = FT_PIX_ROUND( B1 + dy ) - B1;
6113727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
6114727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6115727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* skip post-iup deltas */
6116727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.iup_called                                          &&
6117727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
6118727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
6119727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              goto Skip;
6120727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6121727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
6122727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||
6123727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )   ||
6124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX )     )   )
6125727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              MOVE_Zp2_Point( point, 0, dy, TRUE );
6126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6127727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* save new point */
6128727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.GS.freeVector.y != 0 )
6129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
6130727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              B2 = CUR.zp2.cur[point].y;
6131727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6132727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* reverse any disallowed moves */
6133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( ( B1 & 63 ) == 0 &&
6134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( B2 & 63 ) != 0 &&
6135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   B1 != B2         )
6136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                MOVE_Zp2_Point( point, 0, -dy, TRUE );
6137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
6138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
6139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
6140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            MOVE_Zp2_Point( point, dx, dy, TRUE );
6141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
6142727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        else
6143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          MOVE_Zp2_Point( point, dx, dy, TRUE );
6144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
6145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    Skip:
6147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( point, dx, dy, TRUE );
6151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
6155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6157aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */
6166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3A-0x3B                                               */
6167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
6168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MSIRP( INS_ARG )
6171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  control_value_cutin;
6177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING )
6180727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      control_value_cutin = CUR.GS.control_value_cutin;
6182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode                                 &&
6184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0                          &&
6185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        control_value_cutin = 0;
6187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6197727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6201aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
6202aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
6203aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( CUR.GS.gep1 == 0 )
6204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
6206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR_Func_move_orig( &CUR.zp1, point, args[1] );
6207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.cur[point] = CUR.zp1.org[point];
6208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_project( CUR.zp1.cur + point,
6211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp0.cur + CUR.GS.rp0 );
6212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6213727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* subpixel hinting - make MSIRP respect CVT cut-in; */
6215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                    &&
6216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                   &&
6217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                            &&
6218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         FT_ABS( distance - args[1] ) >= control_value_cutin )
6219727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      distance = args[1];
6220727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6221727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, args[1] - distance );
6223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )
6228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MDAP[a]:      Move Direct Absolute Point                              */
6235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2E-0x2F                                               */
6236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MDAP( INS_ARG )
6240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  cur_dist;
6243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  distance;
6244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point, CUR.zp0.n_points ) )
6249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )
6256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
6258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING         &&
6260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode        &&
6261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0 )
6262727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = ROUND_None(
6263727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     cur_dist,
6264727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     CUR.tt_metrics.compensations[0] ) - cur_dist;
6265727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6266727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6267727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = CUR_Func_round(
6268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     cur_dist,
6269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     CUR.tt_metrics.compensations[0] ) - cur_dist;
6270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = 0;
6273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, point, distance );
6275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = point;
6277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = point;
6278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIAP[a]:      Move Indirect Absolute Point                            */
6284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3E-0x3F                                               */
6285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
6286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIAP( INS_ARG )
6289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    cvtEntry;
6291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6292727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  distance;
6293727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  org_dist;
6294727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  control_value_cutin;
6295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6297727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    control_value_cutin = CUR.GS.control_value_cutin;
6298727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    cvtEntry            = (FT_ULong)args[1];
6299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    point               = (FT_UShort)args[0];
6300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                  &&
6303727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                 &&
6304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                          &&
6305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.y == 0                          &&
6306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      control_value_cutin = 0;
6308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( point,     CUR.zp0.n_points ) ||
6311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDSL( cvtEntry, CUR.cvtSize )      )
6312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6314727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6315aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6318aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!                                                      */
6319aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6320aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* The behaviour of an MIAP instruction is quite different when used  */
6321aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* in the twilight zone.                                              */
6322aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6323aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* First, no control value cut-in test is performed as it would fail  */
6324aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */
6325aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* zp0.point, is set to the absolute, unrounded distance found in the */
6326aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* CVT.                                                               */
6327aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6328aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* This is used in the CVT programs of the Microsoft fonts Arial,     */
6329aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Times, etc., in order to re-adjust some key font heights.  It      */
6330aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* allows the use of the IP instruction in the twilight zone, which   */
6331aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* otherwise would be invalid according to the specification.         */
6332aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6333aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* We implement it with a special sequence for the twilight zone.     */
6334aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* This is a bad hack, but it seems to work.                          */
6335aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6336aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Confirmed by Greg Hitchcock.                                       */
6337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_read_cvt( cvtEntry );
6339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */
6341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6342727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6343727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
6344727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Determined via experimentation and may be incorrect...         */
6345727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !SUBPIXEL_HINTING                     ||
6346727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( !CUR.ignore_x_mode                ||
6347727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             !CUR.face->sph_compatibility_mode ) )
6348727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6349727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
6350727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                            CUR.GS.freeVector.x );
6351aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
6352aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                          CUR.GS.freeVector.y ),
6353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0.cur[point]   = CUR.zp0.org[point];
6354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6355727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                              &&
6357727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                             &&
6358727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
6359727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         distance > 0                                  &&
6360727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.y != 0                      )
6361727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      distance = 0;
6362727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
6365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cut-in flag */
6367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6368727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( FT_ABS( distance - org_dist ) > control_value_cutin )
6369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        distance = org_dist;
6370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING         &&
6373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode        &&
6374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0 )
6375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = ROUND_None( distance,
6376727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                               CUR.tt_metrics.compensations[0] );
6377727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6378727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6379727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = CUR_Func_round( distance,
6380727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                   CUR.tt_metrics.compensations[0] );
6381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, point, distance - org_dist );
6384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6385aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = point;
6387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = point;
6388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MDRP[abcde]:  Move Direct Relative Point                              */
6394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xC0-0xDF                                               */
6395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MDRP( INS_ARG )
6399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  org_dist, distance, minimum_distance;
6402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6404727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    minimum_distance = CUR.GS.minimum_distance;
6405727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6407727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                  &&
6408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                 &&
6409727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                          &&
6410727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6411727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      minimum_distance = 0;
6412727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6413727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6420727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6421aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: Is there some undocumented feature while in the */
6425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      twilight zone?                                  */
6426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED: twilight zone special case */
6428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
6430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec1 = &CUR.zp1.org[point];
6432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];
6433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      org_dist = CUR_Func_dualproj( vec1, vec2 );
6436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec1 = &CUR.zp1.orus[point];
6440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];
6441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
6444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this should be faster */
6446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( vec1, vec2 );
6447727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );
6448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Vector  vec;
6452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6454727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
6455727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
6456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_fast_dualproj( &vec );
6458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* single width cut-in test */
6462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
6464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         CUR.GS.single_width_cutin )
6465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR.GS.single_width_value;
6468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = -CUR.GS.single_width_value;
6470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* round flag */
6473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 4 ) != 0 )
6475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING         &&
6478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode        &&
6479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0 )
6480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = ROUND_None(
6481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     org_dist,
6482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     CUR.tt_metrics.compensations[CUR.opcode & 3] );
6483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round(
6486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   org_dist,
6487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = ROUND_None(
6491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   org_dist,
6492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* minimum distance flag */
6495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 8 ) != 0 )
6497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance < minimum_distance )
6501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = minimum_distance;
6502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance > -minimum_distance )
6506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = -minimum_distance;
6507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* now move the point */
6511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_Func_project( CUR.zp1.cur + point,
6513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp0.cur + CUR.GS.rp0 );
6514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, distance - org_dist );
6516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6517aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 16 ) != 0 )
6522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIRP[abcde]:  Move Indirect Relative Point                            */
6529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xE0-0xFF                                               */
6530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? uint32 -->                                       */
6531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIRP( INS_ARG )
6534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    cvtEntry;
6537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  cvt_dist,
6539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                distance,
6540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                cur_dist,
6541727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                org_dist,
6542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                control_value_cutin,
6543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                minimum_distance;
6544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int      B1;
6546727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int      B2;
6547727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Bool     reverse_move = FALSE;
6548727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6549727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6550727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    minimum_distance    = CUR.GS.minimum_distance;
6552727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    control_value_cutin = CUR.GS.control_value_cutin;
6553727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    point               = (FT_UShort)args[0];
6554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    cvtEntry            = (FT_ULong)( args[1] + 1 );
6555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                  &&
6558727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                 &&
6559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                          &&
6560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      control_value_cutin = minimum_distance = 0;
6562727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
6565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6567aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDSL( cvtEntry,  CUR.cvtSize + 1 )  ||
6568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6571727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6572aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !cvtEntry )
6576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cvt_dist = 0;
6577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
6579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* single width test */
6581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
6583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         CUR.GS.single_width_cutin )
6584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( cvt_dist >= 0 )
6586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist =  CUR.GS.single_width_value;
6587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist = -CUR.GS.single_width_value;
6589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6591aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
6592aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
6593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep1 == 0 )
6594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
6596295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             TT_MulFix14( (FT_UInt32)cvt_dist,
6597295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                          CUR.GS.freeVector.x );
6598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
6599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             TT_MulFix14( (FT_UInt32)cvt_dist,
6600295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                          CUR.GS.freeVector.y );
660141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.zp1.cur[point]   = CUR.zp1.org[point];
6602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
6605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  &CUR.zp0.org[CUR.GS.rp0] );
6606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
6607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  &CUR.zp0.cur[CUR.GS.rp0] );
6608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* auto-flip test */
6610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.auto_flip )
6612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( org_dist ^ cvt_dist ) < 0 )
6614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist = -cvt_dist;
6615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6618727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                         &&
6619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                        &&
6620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.y != 0                                 &&
6621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
6622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( cur_dist < -64 )
6624727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        cvt_dist -= 16;
6625727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else if ( cur_dist > 64 && cur_dist < 84 )
6626727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        cvt_dist += 32;
6627727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6628727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6630727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* control value cut-in and round */
6631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 4 ) != 0 )
6633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
6635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      refer to the same zone.                                  */
6636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.gep0 == CUR.GS.gep1 )
6638aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
6639aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* XXX: According to Greg Hitchcock, the following wording is */
6640aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      the right one:                                        */
6641aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*                                                            */
6642aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        When the absolute difference between the value in   */
6643aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        the table [CVT] and the measurement directly from   */
6644aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        the outline is _greater_ than the cut_in value, the */
6645aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        outline measurement is used.                        */
6646aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*                                                            */
6647aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      This is from `instgly.doc'.  The description in       */
6648aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
6649aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      it implies `>=' instead of `>'.                       */
6650aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
6651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
6652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cvt_dist = org_dist;
6653aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
6654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round(
6656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   cvt_dist,
6657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* do cvt cut-in always in MIRP for sph */
6664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING           &&
6665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode          &&
6666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.gep0 == CUR.GS.gep1 )
6667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
6668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
6669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          cvt_dist = org_dist;
6670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
6671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = ROUND_None(
6674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   cvt_dist,
6675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* minimum distance test */
6679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 8 ) != 0 )
6681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance < minimum_distance )
6685727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = minimum_distance;
6686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6689727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance > -minimum_distance )
6690727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = -minimum_distance;
6691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6694727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6695727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING )
6696727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      B1 = CUR.zp1.cur[point].y;
6698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Round moves if necessary */
6700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode                                          &&
6701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.y != 0                                   &&
6702727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )
6703727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
6704727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6705727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode                                      &&
6706727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.y != 0                               &&
6707727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.opcode & 16 ) == 0                               &&
6708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.opcode & 8 ) == 0                                &&
6709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
6710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance += 64;
6711727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6713727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
6715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6717727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING )
6718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      B2 = CUR.zp1.cur[point].y;
6720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Reverse move if necessary */
6722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode )
6723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
6724727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( CUR.face->sph_compatibility_mode                          &&
6725727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             CUR.GS.freeVector.y != 0                                  &&
6726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B1 & 63 ) == 0                                          &&
6727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B2 & 63 ) != 0                                          )
6728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          reverse_move = TRUE;
6729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
6731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             CUR.GS.freeVector.y != 0                                  &&
6732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B2 & 63 ) != 0                                          &&
6733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B1 & 63 ) != 0                                          )
6734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          reverse_move = TRUE;
6735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
6736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( reverse_move )
6738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );
6739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6741727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6742727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6743aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 16 ) != 0 )
6747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ALIGNRP[]:    ALIGN Relative Point                                    */
6756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3C                                                    */
6757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32... -->                                    */
6758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ALIGNRP( INS_ARG )
6761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
6766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6768727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6769727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                         &&
6770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                        &&
6771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.iup_called                                           &&
6772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
6773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Invalid_Reference );
6775727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
6776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6778727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop ||
6780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6783727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6784aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
6788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
6790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
6792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp1.n_points ) )
6794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
6796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6797727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
6798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
6799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        distance = CUR_Func_project( CUR.zp1.cur + point,
6804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     CUR.zp0.cur + CUR.GS.rp0 );
6805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR_Func_move( &CUR.zp1, point, -distance );
6807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
6810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6812aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ISECT[]:      moves point to InterSECTion                             */
6821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0F                                                    */
6822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        5 * uint32 -->                                          */
6823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ISECT( INS_ARG )
6826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point,
6828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                a0, a1,
6829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                b0, b1;
6830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6831727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  discriminant, dotproduct;
6832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx,  dy,
6834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                dax, day,
6835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                dbx, dby;
6836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
6838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector   R;
6840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a0 = (FT_UShort)args[1];
6845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a1 = (FT_UShort)args[2];
6846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b0 = (FT_UShort)args[3];
6847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b1 = (FT_UShort)args[4];
6848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( b0, CUR.zp0.n_points )  ||
6850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( b1, CUR.zp0.n_points )  ||
6851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( a0, CUR.zp1.n_points )  ||
6852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( a1, CUR.zp1.n_points )  ||
6853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( point, CUR.zp2.n_points ) )
6854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6856727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6860727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Cramer's rule */
6861727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
6863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
6864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
6866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
6867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
6869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
6870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
6872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6873727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
6874727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   FT_MulDiv( day, dbx, 0x40 );
6875727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +
6876727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   FT_MulDiv( day, dby, 0x40 );
6877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6878727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* The discriminant above is actually a cross product of vectors     */
6879727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* da and db. Together with the dot product, they can be used as     */
6880727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* surrogates for sine and cosine of the angle between the vectors.  */
6881727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Indeed,                                                           */
6882727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*       dotproduct   = |da||db|cos(angle)                           */
6883727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*       discriminant = |da||db|sin(angle)     .                     */
6884727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* We use these equations to reject grazing intersections by         */
6885727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
6886727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
6887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6888727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
6889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6890727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      R.x = FT_MulDiv( val, dax, discriminant );
6891727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      R.y = FT_MulDiv( val, day, discriminant );
6892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
6894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
6895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* else, take the middle of the middles of A and B */
6899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
6901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp1.cur[a1].x +
6902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b0].x +
6903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b1].x ) / 4;
6904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
6905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp1.cur[a1].y +
6906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b0].y +
6907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b1].y ) / 4;
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  /*************************************************************************/
6913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ALIGNPTS[]:   ALIGN PoinTS                                            */
6915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x27                                                    */
6916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
6917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ALIGNPTS( INS_ARG )
6920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   p1, p2;
6922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = (FT_UShort)args[0];
6926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = (FT_UShort)args[1];
6927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6928aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( p1, CUR.zp1.n_points ) ||
6929aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDS( p2, CUR.zp0.n_points ) )
6930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6932727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_project( CUR.zp0.cur + p2,
6937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp1.cur + p1 ) / 2;
6938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, p1, distance );
6940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, p2, -distance );
6941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IP[]:         Interpolate Point                                       */
6947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x39                                                    */
6948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
6949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SOMETIMES, DUMBER CODE IS BETTER CODE */
6952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IP( INS_ARG )
6955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  old_range, cur_range;
6957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orus_base;
6958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  cur_base;
6959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int      twilight;
6960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
6962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
6965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6966aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
6967727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6968aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*
6972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * We need to deal in a special way with the twilight zone.
6973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
6974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * for every n.
6975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
6976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
6977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
6979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6981727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6982aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( twilight )
6986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus_base = &CUR.zp0.org[CUR.GS.rp1];
6987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus_base = &CUR.zp0.orus[CUR.GS.rp1];
6989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur_base = &CUR.zp0.cur[CUR.GS.rp1];
6991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: There are some glyphs in some braindead but popular */
6993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
6994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      calling IP[] with bad values of rp[12].             */
6995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      Do something sane when this odd thing happens.      */
6996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
6997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
6998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      old_range = 0;
7000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_range = 0;
7001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( twilight )
7005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
7006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       orus_base );
700741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
7008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
7009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       orus_base );
701041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else
701141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      {
701241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_Vector  vec;
701341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
701441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
7015727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
701641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.x_scale );
7017727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
701841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.y_scale );
701941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
702041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        old_range = CUR_fast_dualproj( &vec );
702141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      }
7022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
7024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
7027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];
7029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_F26Dot6  org_dist, cur_dist, new_dist;
7030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check point bounds */
7033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
7034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7037727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
7038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        continue;
7041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( twilight )
7044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
704541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
7046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
704741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else
704841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      {
704941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_Vector  vec;
705041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
705141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
7052727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,
705341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.x_scale );
7054727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,
705541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.y_scale );
705641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
705741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        org_dist = CUR_fast_dualproj( &vec );
705841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      }
7059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );
7061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist )
7063727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
7064727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( old_range )
7065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          new_dist = FT_MulDiv( org_dist, cur_range, old_range );
7066727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        else
7067727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
7068727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* This is the same as what MS does for the invalid case:  */
7069727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                                                         */
7070727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*   delta = (Original_Pt - Original_RP1) -                */
7071727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*           (Current_Pt - Current_RP1)                    */
7072727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                                                         */
7073727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* In FreeType speak:                                      */
7074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                                                         */
7075727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*   new_dist = cur_dist -                                 */
7076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*              org_dist - cur_dist;                       */
7077727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          new_dist = -org_dist;
7079727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
7080727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
7081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        new_dist = 0;
7083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
7085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7086aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
7087aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
7089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* UTP[a]:       UnTouch Point                                           */
7096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x29                                                    */
7097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
7098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_UTP( INS_ARG )
7101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  point;
7103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte    mask;
7104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
7107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point, CUR.zp0.n_points ) )
7109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
7111727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
7112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mask = 0xFF;
7116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x != 0 )
7118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask &= ~FT_CURVE_TAG_TOUCH_X;
7119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.y != 0 )
7121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask &= ~FT_CURVE_TAG_TOUCH_Y;
7122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp0.tags[point] &= mask;
7124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Local variables for Ins_IUP: */
7128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  IUP_WorkerRec_
7129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orgs;   /* original and current coordinate */
7131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  curs;   /* arrays                          */
7132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orus;
7133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     max_points;
7134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } IUP_WorkerRec, *IUP_Worker;
7136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  _iup_worker_shift( IUP_Worker  worker,
7140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p1,
7141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p2,
7142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p )
7143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     i;
7145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx;
7146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dx = worker->curs[p].x - worker->orgs[p].x;
7149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( dx != 0 )
7150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i < p; i++ )
7152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x += dx;
7153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p + 1; i <= p2; i++ )
7155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x += dx;
7156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  _iup_worker_interpolate( IUP_Worker  worker,
7162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     p1,
7163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     p2,
7164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     ref1,
7165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     ref2 )
7166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     i;
7168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;
7169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( p1 > p2 )
7172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( ref1, worker->max_points ) ||
7175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( ref2, worker->max_points ) )
7176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    orus1 = worker->orus[ref1].x;
7179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    orus2 = worker->orus[ref2].x;
7180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( orus1 > orus2 )
7182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_F26Dot6  tmp_o;
7184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt     tmp_r;
7185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tmp_o = orus1;
7188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus1 = orus2;
7189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus2 = tmp_o;
7190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tmp_r = ref1;
7192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ref1  = ref2;
7193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ref2  = tmp_r;
7194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org1   = worker->orgs[ref1].x;
7197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org2   = worker->orgs[ref2].x;
7198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    delta1 = worker->curs[ref1].x - org1;
7199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    delta2 = worker->curs[ref2].x - org2;
7200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( orus1 == orus2 )
7202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* simple shift of untouched points */
7204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i <= p2; i++ )
7205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_F26Dot6  x = worker->orgs[i].x;
7207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( x <= org1 )
7210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta1;
7211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
7212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta2;
7213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x = x;
7215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Fixed  scale       = 0;
7220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Bool   scale_valid = 0;
7221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* interpolation */
7224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i <= p2; i++ )
7225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_F26Dot6  x = worker->orgs[i].x;
7227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( x <= org1 )
7230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta1;
7231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( x >= org2 )
7233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta2;
7234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
7236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !scale_valid )
7238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
7239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            scale_valid = 1;
7240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            scale       = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),
7241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                     orus2 - orus1 );
7242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
7243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x = ( org1 + delta1 ) +
7245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              FT_MulFix( worker->orus[i].x - orus1, scale );
7246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x = x;
7248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IUP[a]:       Interpolate Untouched Points                            */
7256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x30-0x31                                               */
7257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
7258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IUP( INS_ARG )
7261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    IUP_WorkerRec  V;
7263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte        mask;
7264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   first_point;   /* first point of contour        */
7266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   end_point;     /* end point (last+1) of contour */
7267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   first_touched; /* first touched point in contour   */
7269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   cur_touched;   /* current touched point in contour */
7270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   point;         /* current point   */
7272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  contour;       /* current contour */
7273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
7275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* ignore empty outlines */
7278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.pts.n_contours == 0 )
7279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.opcode & 1 )
7282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask   = FT_CURVE_TAG_TOUCH_X;
7284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orgs = CUR.pts.org;
7285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.curs = CUR.pts.cur;
7286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orus = CUR.pts.orus;
7287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask   = FT_CURVE_TAG_TOUCH_Y;
7291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
7292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
7293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
7294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    V.max_points = CUR.pts.n_points;
7296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    contour = 0;
7298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point   = 0;
7299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING  &&
7302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode )
7303727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
7304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.iup_called = TRUE;
7305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
7306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return;
7307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
7308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7309727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
7311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;
7313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      first_point = point;
7314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( BOUNDS ( end_point, CUR.pts.n_points ) )
7316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        end_point = CUR.pts.n_points - 1;
7317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
7319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        point++;
7320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( point <= end_point )
7322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        first_touched = point;
7324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cur_touched   = point;
7325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        point++;
7327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( point <= end_point )
7329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( ( CUR.pts.tags[point] & mask ) != 0 )
7331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
73327f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner            _iup_worker_interpolate( &V,
73337f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     cur_touched + 1,
73347f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     point - 1,
73357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     cur_touched,
73367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     point );
7337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cur_touched = point;
7338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
7339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          point++;
7341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cur_touched == first_touched )
7344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          _iup_worker_shift( &V, first_point, end_point, cur_touched );
7345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
7346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          _iup_worker_interpolate( &V,
7348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (FT_UShort)( cur_touched + 1 ),
7349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   end_point,
7350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   cur_touched,
7351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   first_touched );
7352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( first_touched > 0 )
7354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            _iup_worker_interpolate( &V,
7355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_point,
7356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_touched - 1,
7357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     cur_touched,
7358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_touched );
7359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      contour++;
7362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( contour < CUR.pts.n_contours );
7363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */
7369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5D,0x71,0x72                                          */
7370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 (2 * uint32)... -->                              */
7371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DELTAP( INS_ARG )
7374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   k, nump;
7376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  A;
7377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   C;
7378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    B;
7379727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7380727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  B1, B2;
7381727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7383727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                        &&
7384727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                       &&
7385727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.iup_called                                          &&
7386727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
7387727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
7388727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
7392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Delta hinting is covered by US Patent 5159668. */
7393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
7394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Long  n = args[0] * 2;
7396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < n )
7399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7400aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7402aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        n = CUR.args;
7403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= n;
7406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args;
7407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
7410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
7412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   than once, thus UShort isn't enough */
7413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( k = 1; k <= nump; k++ )
7415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 2 )
7417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7418aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7419727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7420aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
7421aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        goto Fail;
7422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= 2;
7425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = (FT_UShort)CUR.stack[CUR.args + 1];
7427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = CUR.stack[CUR.args];
7428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* XXX: Because some popular fonts contain some invalid DeltaP */
7430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      instructions, we simply ignore them when the stacked   */
7431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      point reference is off limit, rather than returning an */
7432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      error.  As a delta instruction doesn't change a glyph  */
7433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      in great ways, this shouldn't be a problem.            */
7434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !BOUNDS( A, CUR.zp0.n_points ) )
7436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C = ( (FT_ULong)B & 0xF0 ) >> 4;
7438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.opcode )
7440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5D:
7442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x71:
7445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 16;
7446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x72:
7449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 32;
7450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C += CUR.GS.delta_base;
7454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CURRENT_Ppem() == (FT_Long)C )
7456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = ( (FT_ULong)B & 0xF ) - 8;
7458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( B >= 0 )
7459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            B++;
7460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = B * 64 / ( 1L << CUR.GS.delta_shift );
7461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7462727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7463727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7464727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( SUBPIXEL_HINTING )
7465727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
7466727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /*
7467727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  Allow delta move if
7468727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *
7469727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  - not using ignore_x_mode rendering
7470727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  - glyph is specifically set to allow it
7471727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  - glyph is composite and freedom vector is not subpixel
7472727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *    vector
7473727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             */
7474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( !CUR.ignore_x_mode                                   ||
7475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
7476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 ( CUR.is_composite && CUR.GS.freeVector.y != 0 )     )
7477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              CUR_Func_move( &CUR.zp0, A, B );
7478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* Otherwise apply subpixel hinting and */
7480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* compatibility mode rules             */
7481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            else if ( CUR.ignore_x_mode )
7482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
7483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( CUR.GS.freeVector.y != 0 )
7484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                B1 = CUR.zp0.cur[A].y;
7485727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              else
7486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                B1 = CUR.zp0.cur[A].x;
7487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0
7489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Standard Subpixel Hinting: Allow y move.       */
7490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* This messes up dejavu and may not be needed... */
7491727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( !CUR.face->sph_compatibility_mode &&
7492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   CUR.GS.freeVector.y != 0          )
7493727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR_Func_move( &CUR.zp0, A, B );
7494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              else
7495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* 0 */
7496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Compatibility Mode: Allow x or y move if point touched in */
7498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Y direction.                                              */
7499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( CUR.face->sph_compatibility_mode                      &&
7500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
7501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              {
7502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* save the y value of the point now; compare after move */
7503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                B1 = CUR.zp0.cur[A].y;
7504727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
7506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  B = FT_PIX_ROUND( B1 + B ) - B1;
7507727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7508727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* Allow delta move if using sph_compatibility_mode,   */
7509727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* IUP has not been called, and point is touched on Y. */
7510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                if ( !CUR.iup_called                            &&
7511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
7512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR_Func_move( &CUR.zp0, A, B );
7513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              }
7514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              B2 = CUR.zp0.cur[A].y;
7516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7517727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Reverse this move if it results in a disallowed move */
7518727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( CUR.GS.freeVector.y != 0                           &&
7519727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( ( CUR.face->sph_compatibility_mode           &&
7520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B1 & 63 ) == 0                           &&
7521727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B2 & 63 ) != 0                           ) ||
7522727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     ( ( CUR.sph_tweak_flags                    &
7523727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
7524727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B1 & 63 ) != 0                           &&
7525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B2 & 63 ) != 0                           ) ) )
7526727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR_Func_move( &CUR.zp0, A, -B );
7527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
7528727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
7529727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
7530727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7531727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            CUR_Func_move( &CUR.zp0, A, B );
7533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7537727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
7538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7540aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */
7548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x73,0x74,0x75                                          */
7549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 (2 * uint32)... -->                              */
7550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DELTAC( INS_ARG )
7553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  nump, k;
7555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  A, C;
7556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   B;
7557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
7560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Delta hinting is covered by US Patent 5159668. */
7561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
7562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Long  n = args[0] * 2;
7564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < n )
7567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7568aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7569727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7570aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        n = CUR.args;
7571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= n;
7574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args;
7575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
7578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nump = (FT_ULong)args[0];
7580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( k = 1; k <= nump; k++ )
7582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 2 )
7584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7585aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7587aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
7588aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        goto Fail;
7589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= 2;
7592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = (FT_ULong)CUR.stack[CUR.args + 1];
7594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = CUR.stack[CUR.args];
7595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7596aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( BOUNDSL( A, CUR.cvtSize ) )
7597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7600727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
7601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C = ( (FT_ULong)B & 0xF0 ) >> 4;
7607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.opcode )
7609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x73:
7611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x74:
7614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 16;
7615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x75:
7618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 32;
7619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C += CUR.GS.delta_base;
7623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CURRENT_Ppem() == (FT_Long)C )
7625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = ( (FT_ULong)B & 0xF ) - 8;
7627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( B >= 0 )
7628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            B++;
7629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = B * 64 / ( 1L << CUR.GS.delta_shift );
7630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR_Func_move_cvt( A, B );
7632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7636aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MISC. INSTRUCTIONS                                                    */
7644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GETINFO[]:    GET INFOrmation                                         */
7651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x88                                                    */
7652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> uint32                                       */
7653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GETINFO( INS_ARG )
7656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  K;
7658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = 0;
7661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* RASTERIZER VERSION           */
7665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  0             */
7666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 0-7           */
7667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING     &&
7669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( args[0] & 1 ) != 0 &&
7670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode    )
7671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
7672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      K = CUR.rasterizer_version;
7673727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_TRACE7(( "Setting rasterizer version %d\n",
7674727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.rasterizer_version ));
7675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
7676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
7677727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7678727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( ( args[0] & 1 ) != 0 )
7679727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        K = TT_INTERPRETER_VERSION_35;
7680727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7682727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* GLYPH ROTATED                */
7683727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  1             */
7684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 8             */
7685727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
7687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 0x80;
7688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7689727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7690727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* GLYPH STRETCHED              */
7691727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  2             */
7692727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 9             */
7693727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
7695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 1 << 8;
7696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* HINTING FOR GRAYSCALE        */
7699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  5             */
7700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 12            */
7701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
7703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 1 << 12;
7704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7705727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7706727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7707727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                    &&
7708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                   &&
7709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 )
7710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
7711727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /********************************/
7712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* HINTING FOR GRAYSCALE        */
7713727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Selector Bit:  5             */
7714727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Return Bit(s): 12            */
7715727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /*                              */
7716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting )
7717727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        K |= 1 << 12;
7718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /********************************/
7720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* HINTING FOR SUBPIXEL         */
7721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Selector Bit:  6             */
7722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Return Bit(s): 13            */
7723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /*                              */
7724727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( ( args[0] & 64 ) != 0        &&
7725727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.subpixel_hinting         &&
7726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.rasterizer_version >= 37 )
7727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
7728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        K |= 1 << 13;
7729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* the stuff below is irrelevant if subpixel_hinting is not set */
7731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /********************************/
7733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* COMPATIBLE WIDTHS ENABLED    */
7734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Selector Bit:  7             */
7735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Return Bit(s): 14            */
7736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*                              */
7737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Functionality still needs to be added */
7738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )
7739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          K |= 1 << 14;
7740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7741727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /********************************/
7742727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* SYMMETRICAL SMOOTHING        */
7743727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Selector Bit:  8             */
7744727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Return Bit(s): 15            */
7745727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*                              */
7746727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Functionality still needs to be added */
7747727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )
7748727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          K |= 1 << 15;
7749727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7750727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /********************************/
7751727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* HINTING FOR BGR?             */
7752727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Selector Bit:  9             */
7753727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Return Bit(s): 16            */
7754727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*                              */
7755727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Functionality still needs to be added */
7756727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( args[0] & 512 ) != 0 && CUR.bgr )
7757727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          K |= 1 << 16;
7758727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7759727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( CUR.rasterizer_version >= 38 )
7760727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
7761727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /********************************/
7762727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* SUBPIXEL POSITIONED?         */
7763727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* Selector Bit:  10            */
7764727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* Return Bit(s): 17            */
7765727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                              */
7766727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* Functionality still needs to be added */
7767727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )
7768727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            K |= 1 << 17;
7769727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
7770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
7771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
7772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = K;
7776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_UNKNOWN( INS_ARG )
7781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def   = CUR.IDefs;
7783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit = def + CUR.numIDefs;
7784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
7786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; def < limit; def++ )
7789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( (FT_Byte)def->opc == CUR.opcode && def->active )
7791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        TT_CallRec*  call;
7793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.callTop >= CUR.callSize )
7796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7797727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Stack_Overflow );
7798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call = CUR.callStack + CUR.callTop++;
7802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Caller_Range = CUR.curRange;
7804aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        call->Caller_IP    = CUR.IP + 1;
7805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Cur_Count    = 1;
7806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Cur_Restart  = def->start;
780741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        call->Cur_End      = def->end;
7808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        INS_Goto_CodeRange( def->range, def->start );
7810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.step_ins = FALSE;
7812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
7813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7816727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Invalid_Opcode );
7817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
7821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
7824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TInstruction_Function  Instruct_Dispatch[256] =
7825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Opcodes are gathered in groups of 16. */
7827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Please keep the spaces as they are.   */
7828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  y  */  Ins_SVTCA,
7830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  x  */  Ins_SVTCA,
7831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA y  */  Ins_SPVTCA,
7832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA x  */  Ins_SPVTCA,
7833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA y  */  Ins_SFVTCA,
7834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA x  */  Ins_SFVTCA,
7835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL //  */  Ins_SPVTL,
7836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL +   */  Ins_SPVTL,
7837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL //  */  Ins_SFVTL,
7838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL +   */  Ins_SFVTL,
7839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvFS     */  Ins_SPVFS,
7840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvFS     */  Ins_SFVFS,
7841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GPV       */  Ins_GPV,
7842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GFV       */  Ins_GFV,
7843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTPv    */  Ins_SFVTPV,
7844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ISECT     */  Ins_ISECT,
7845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP0      */  Ins_SRP0,
7847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP1      */  Ins_SRP1,
7848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP2      */  Ins_SRP2,
7849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP0      */  Ins_SZP0,
7850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP1      */  Ins_SZP1,
7851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP2      */  Ins_SZP2,
7852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZPS      */  Ins_SZPS,
7853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SLOOP     */  Ins_SLOOP,
7854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTG       */  Ins_RTG,
7855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTHG      */  Ins_RTHG,
7856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SMD       */  Ins_SMD,
7857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ELSE      */  Ins_ELSE,
7858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JMPR      */  Ins_JMPR,
7859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCvTCi    */  Ins_SCVTCI,
7860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSwCi     */  Ins_SSWCI,
7861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSW       */  Ins_SSW,
7862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DUP       */  Ins_DUP,
7864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  POP       */  Ins_POP,
7865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CLEAR     */  Ins_CLEAR,
7866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SWAP      */  Ins_SWAP,
7867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEPTH     */  Ins_DEPTH,
7868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CINDEX    */  Ins_CINDEX,
7869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MINDEX    */  Ins_MINDEX,
7870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignPTS  */  Ins_ALIGNPTS,
7871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x28  */  Ins_UNKNOWN,
7872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  UTP       */  Ins_UTP,
7873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LOOPCALL  */  Ins_LOOPCALL,
7874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CALL      */  Ins_CALL,
7875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FDEF      */  Ins_FDEF,
7876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ENDF      */  Ins_ENDF,
7877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[0]   */  Ins_MDAP,
7878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[1]   */  Ins_MDAP,
7879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[0]    */  Ins_IUP,
7881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[1]    */  Ins_IUP,
7882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[0]    */  Ins_SHP,
7883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[1]    */  Ins_SHP,
7884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[0]    */  Ins_SHC,
7885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[1]    */  Ins_SHC,
7886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[0]    */  Ins_SHZ,
7887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[1]    */  Ins_SHZ,
7888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHPIX     */  Ins_SHPIX,
7889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IP        */  Ins_IP,
7890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[0]  */  Ins_MSIRP,
7891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[1]  */  Ins_MSIRP,
7892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignRP   */  Ins_ALIGNRP,
7893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTDG      */  Ins_RTDG,
7894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[0]   */  Ins_MIAP,
7895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[1]   */  Ins_MIAP,
7896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushB    */  Ins_NPUSHB,
7898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushW    */  Ins_NPUSHW,
7899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WS        */  Ins_WS,
7900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RS        */  Ins_RS,
7901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtP     */  Ins_WCVTP,
7902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RCvt      */  Ins_RCVT,
7903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[0]     */  Ins_GC,
7904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[1]     */  Ins_GC,
7905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCFS      */  Ins_SCFS,
7906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[0]     */  Ins_MD,
7907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[1]     */  Ins_MD,
7908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPPEM     */  Ins_MPPEM,
7909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPS       */  Ins_MPS,
7910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipON    */  Ins_FLIPON,
7911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipOFF   */  Ins_FLIPOFF,
7912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEBUG     */  Ins_DEBUG,
7913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LT        */  Ins_LT,
7915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LTEQ      */  Ins_LTEQ,
7916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GT        */  Ins_GT,
7917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GTEQ      */  Ins_GTEQ,
7918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EQ        */  Ins_EQ,
7919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEQ       */  Ins_NEQ,
7920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ODD       */  Ins_ODD,
7921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EVEN      */  Ins_EVEN,
7922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IF        */  Ins_IF,
7923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EIF       */  Ins_EIF,
7924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AND       */  Ins_AND,
7925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  OR        */  Ins_OR,
7926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NOT       */  Ins_NOT,
7927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP1   */  Ins_DELTAP,
7928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDB       */  Ins_SDB,
7929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDS       */  Ins_SDS,
7930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ADD       */  Ins_ADD,
7932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SUB       */  Ins_SUB,
7933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DIV       */  Ins_DIV,
7934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MUL       */  Ins_MUL,
7935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ABS       */  Ins_ABS,
7936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEG       */  Ins_NEG,
7937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FLOOR     */  Ins_FLOOR,
7938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CEILING   */  Ins_CEILING,
7939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[0]  */  Ins_ROUND,
7940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[1]  */  Ins_ROUND,
7941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[2]  */  Ins_ROUND,
7942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[3]  */  Ins_ROUND,
7943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[0] */  Ins_NROUND,
7944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[1] */  Ins_NROUND,
7945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[2] */  Ins_NROUND,
7946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[3] */  Ins_NROUND,
7947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtF     */  Ins_WCVTF,
7949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP2   */  Ins_DELTAP,
7950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP3   */  Ins_DELTAP,
7951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[0] */ Ins_DELTAC,
7952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[1] */ Ins_DELTAC,
7953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[2] */ Ins_DELTAC,
7954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SROUND    */  Ins_SROUND,
7955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  S45Round  */  Ins_S45ROUND,
7956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROT      */  Ins_JROT,
7957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROF      */  Ins_JROF,
7958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROFF      */  Ins_ROFF,
7959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x7B  */  Ins_UNKNOWN,
7960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RUTG      */  Ins_RUTG,
7961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RDTG      */  Ins_RDTG,
7962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SANGW     */  Ins_SANGW,
7963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AA        */  Ins_AA,
7964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipPT    */  Ins_FLIPPT,
7966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgON  */  Ins_FLIPRGON,
7967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgOFF */  Ins_FLIPRGOFF,
7968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x83  */  Ins_UNKNOWN,
7969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x84  */  Ins_UNKNOWN,
7970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanCTRL  */  Ins_SCANCTRL,
7971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDPVTL[0] */  Ins_SDPVTL,
7972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDPVTL[1] */  Ins_SDPVTL,
7973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GetINFO   */  Ins_GETINFO,
7974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IDEF      */  Ins_IDEF,
7975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROLL      */  Ins_ROLL,
7976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MAX       */  Ins_MAX,
7977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIN       */  Ins_MIN,
7978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanTYPE  */  Ins_SCANTYPE,
7979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  InstCTRL  */  Ins_INSTCTRL,
7980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x8F  */  Ins_UNKNOWN,
7981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x90  */   Ins_UNKNOWN,
7983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x91  */   Ins_UNKNOWN,
7984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x92  */   Ins_UNKNOWN,
7985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x93  */   Ins_UNKNOWN,
7986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x94  */   Ins_UNKNOWN,
7987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x95  */   Ins_UNKNOWN,
7988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x96  */   Ins_UNKNOWN,
7989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x97  */   Ins_UNKNOWN,
7990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x98  */   Ins_UNKNOWN,
7991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x99  */   Ins_UNKNOWN,
7992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9A  */   Ins_UNKNOWN,
7993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9B  */   Ins_UNKNOWN,
7994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9C  */   Ins_UNKNOWN,
7995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9D  */   Ins_UNKNOWN,
7996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9E  */   Ins_UNKNOWN,
7997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9F  */   Ins_UNKNOWN,
7998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA0  */   Ins_UNKNOWN,
8000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA1  */   Ins_UNKNOWN,
8001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA2  */   Ins_UNKNOWN,
8002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA3  */   Ins_UNKNOWN,
8003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA4  */   Ins_UNKNOWN,
8004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA5  */   Ins_UNKNOWN,
8005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA6  */   Ins_UNKNOWN,
8006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA7  */   Ins_UNKNOWN,
8007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA8  */   Ins_UNKNOWN,
8008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA9  */   Ins_UNKNOWN,
8009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAA  */   Ins_UNKNOWN,
8010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAB  */   Ins_UNKNOWN,
8011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAC  */   Ins_UNKNOWN,
8012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAD  */   Ins_UNKNOWN,
8013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAE  */   Ins_UNKNOWN,
8014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAF  */   Ins_UNKNOWN,
8015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[0]  */  Ins_PUSHB,
8017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[1]  */  Ins_PUSHB,
8018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[2]  */  Ins_PUSHB,
8019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[3]  */  Ins_PUSHB,
8020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[4]  */  Ins_PUSHB,
8021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[5]  */  Ins_PUSHB,
8022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[6]  */  Ins_PUSHB,
8023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[7]  */  Ins_PUSHB,
8024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[0]  */  Ins_PUSHW,
8025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[1]  */  Ins_PUSHW,
8026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[2]  */  Ins_PUSHW,
8027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[3]  */  Ins_PUSHW,
8028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[4]  */  Ins_PUSHW,
8029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[5]  */  Ins_PUSHW,
8030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[6]  */  Ins_PUSHW,
8031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[7]  */  Ins_PUSHW,
8032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[00]  */  Ins_MDRP,
8034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[01]  */  Ins_MDRP,
8035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[02]  */  Ins_MDRP,
8036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[03]  */  Ins_MDRP,
8037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[04]  */  Ins_MDRP,
8038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[05]  */  Ins_MDRP,
8039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[06]  */  Ins_MDRP,
8040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[07]  */  Ins_MDRP,
8041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[08]  */  Ins_MDRP,
8042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[09]  */  Ins_MDRP,
8043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[10]  */  Ins_MDRP,
8044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[11]  */  Ins_MDRP,
8045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[12]  */  Ins_MDRP,
8046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[13]  */  Ins_MDRP,
8047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[14]  */  Ins_MDRP,
8048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[15]  */  Ins_MDRP,
8049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[16]  */  Ins_MDRP,
8051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[17]  */  Ins_MDRP,
8052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[18]  */  Ins_MDRP,
8053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[19]  */  Ins_MDRP,
8054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[20]  */  Ins_MDRP,
8055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[21]  */  Ins_MDRP,
8056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[22]  */  Ins_MDRP,
8057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[23]  */  Ins_MDRP,
8058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[24]  */  Ins_MDRP,
8059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[25]  */  Ins_MDRP,
8060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[26]  */  Ins_MDRP,
8061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[27]  */  Ins_MDRP,
8062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[28]  */  Ins_MDRP,
8063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[29]  */  Ins_MDRP,
8064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[30]  */  Ins_MDRP,
8065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[31]  */  Ins_MDRP,
8066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[00]  */  Ins_MIRP,
8068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[01]  */  Ins_MIRP,
8069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[02]  */  Ins_MIRP,
8070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[03]  */  Ins_MIRP,
8071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[04]  */  Ins_MIRP,
8072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[05]  */  Ins_MIRP,
8073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[06]  */  Ins_MIRP,
8074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[07]  */  Ins_MIRP,
8075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[08]  */  Ins_MIRP,
8076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[09]  */  Ins_MIRP,
8077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[10]  */  Ins_MIRP,
8078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[11]  */  Ins_MIRP,
8079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[12]  */  Ins_MIRP,
8080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[13]  */  Ins_MIRP,
8081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[14]  */  Ins_MIRP,
8082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[15]  */  Ins_MIRP,
8083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[16]  */  Ins_MIRP,
8085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[17]  */  Ins_MIRP,
8086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[18]  */  Ins_MIRP,
8087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[19]  */  Ins_MIRP,
8088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[20]  */  Ins_MIRP,
8089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[21]  */  Ins_MIRP,
8090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[22]  */  Ins_MIRP,
8091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[23]  */  Ins_MIRP,
8092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[24]  */  Ins_MIRP,
8093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[25]  */  Ins_MIRP,
8094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[26]  */  Ins_MIRP,
8095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[27]  */  Ins_MIRP,
8096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[28]  */  Ins_MIRP,
8097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[29]  */  Ins_MIRP,
8098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[30]  */  Ins_MIRP,
8099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[31]  */  Ins_MIRP
8100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
8101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
8104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
8107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RUN                                                                   */
8109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  This function executes a run of opcodes.  It will exit in the        */
8111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  following cases:                                                     */
8112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - Errors (in which case it returns FALSE).                           */
8114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - Reaching the end of the main code range (returns TRUE).            */
8116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Reaching the end of a code range within a function call is an      */
8117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    error.                                                             */
8118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */
8120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    is set to TRUE (returns TRUE).                                     */
8121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */
8123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  an instruction trap or a normal termination.                         */
8124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */
8127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        behaviour is unsupported; here a DEBUG opcode is always an     */
8128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        error.                                                         */
8129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */
8132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Instructions appear in the specification's order.                    */
8134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
8136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ttinterp.h */
8139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( FT_Error )
8141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_RunIns( TT_ExecContext  exc )
8142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
8143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Long    ins_counter = 0;  /* executed instructions counter */
8144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  i;
8145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
8147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Byte    opcode_pattern[1][2] = {
8148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  /* #8 TypeMan Talk Align */
8149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  {
8150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    0x06, /* SPVTL   */
8151727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    0x7D, /* RDTG    */
8152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  },
8153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                };
8154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_patterns   = 1;
8155727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_pointer[1] = { 0 };
8156727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_size[1]    = { 1 };
8157727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
8158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
8161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur = *exc;
8162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
8165727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.iup_called = FALSE;
8166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
8167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set CVT functions */
8169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.tt_metrics.ratio = 0;
8170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
8171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* non-square pixels, use the stretched routines */
8173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_read_cvt  = Read_CVT_Stretched;
8174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_write_cvt = Write_CVT_Stretched;
8175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_move_cvt  = Move_CVT_Stretched;
8176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
8177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
8178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* square pixels, use normal routines */
8180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_read_cvt  = Read_CVT;
8181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_write_cvt = Write_CVT;
8182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_move_cvt  = Move_CVT;
8183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
8184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
8186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Round( (FT_Byte)exc->GS.round_state );
8187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
8189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.opcode = CUR.code[CUR.IP];
8191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( "  " ));
8193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( opcode_name[CUR.opcode] ));
8194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( "\n" ));
8195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
8196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
8197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
819841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        if ( CUR.IP + 1 >= CUR.codeSize )
8199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorCodeOverflow_;
8200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
8202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP + CUR.length > CUR.codeSize )
8205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto LErrorCodeOverflow_;
8206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* First, let's check for empty stack and overflow */
8208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
8209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `args' is the top of the stack once arguments have been popped. */
8211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* One can also interpret it as the index of the last argument.    */
8212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 0 )
8213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8214aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
8215aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        {
8216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
8217aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          goto LErrorLabel_;
8218aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        }
8219aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
8220aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* push zeroes onto the stack */
8221aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
8222aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.stack[i] = 0;
8223aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
8224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
8227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `new_top' is the new top of the stack, after the instruction's */
8229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* execution.  `top' will be set to `new_top' after the `switch'  */
8230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* statement.                                                     */
8231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.new_top > CUR.stackSize )
8232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8233727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Stack_Overflow );
8234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto LErrorLabel_;
8235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.step_ins = TRUE;
8238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error    = FT_Err_Ok;
8239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
8241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING )
8243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
8244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        for ( i = 0; i < opcode_patterns; i++ )
8245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
8246727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( opcode_pointer[i] < opcode_size[i]                 &&
8247727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
8248727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
8249727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] += 1;
8250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( opcode_pointer[i] == opcode_size[i] )
8252727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
8253727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              FT_TRACE7(( "sph: opcode ptrn: %d, %s %s\n",
8254727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          i,
8255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.family_name,
8256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.style_name ));
8257727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              switch ( i )
8259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              {
8260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 0:
8261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
8262727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              }
8263727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              opcode_pointer[i] = 0;
8264727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
8265727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
8266727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
8267727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] = 0;
8268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
8269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
8270727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
8272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
8274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Long*  args   = CUR.stack + CUR.args;
8277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Byte   opcode = CUR.opcode;
8278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  ARRAY_BOUND_ERROR
8281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref
8282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( opcode )
8285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x00:  /* SVTCA y  */
8287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x01:  /* SVTCA x  */
8288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x02:  /* SPvTCA y */
8289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x03:  /* SPvTCA x */
8290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x04:  /* SFvTCA y */
8291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x05:  /* SFvTCA x */
8292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
8293aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner            FT_Short  AA, BB;
8294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            AA = (FT_Short)( ( opcode & 1 ) << 14 );
8297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            BB = (FT_Short)( AA ^ 0x4000 );
8298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( opcode < 4 )
8300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.projVector.x = AA;
8302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.projVector.y = BB;
8303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.dualVector.x = AA;
8305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.dualVector.y = BB;
8306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            else
8308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              GUESS_VECTOR( projVector );
8310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( ( opcode & 2 ) == 0 )
8313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.freeVector.x = AA;
8315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.freeVector.y = BB;
8316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            else
8318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              GUESS_VECTOR( freeVector );
8320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            COMPUTE_Funcs();
8323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
8324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x06:  /* SPvTL // */
8327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x07:  /* SPvTL +  */
8328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SPVTL
8329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x08:  /* SFvTL // */
8332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x09:  /* SFvTL +  */
8333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVTL
8334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0A:  /* SPvFS */
8337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SPVFS
8338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0B:  /* SFvFS */
8341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVFS
8342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0C:  /* GPV */
8345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GPV
8346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0D:  /* GFV */
8349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GFV
8350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0E:  /* SFvTPv */
8353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVTPV
8354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0F:  /* ISECT  */
8357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ISECT( EXEC_ARG_ args );
8358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x10:  /* SRP0 */
8361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP0
8362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x11:  /* SRP1 */
8365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP1
8366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x12:  /* SRP2 */
8369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP2
8370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x13:  /* SZP0 */
8373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP0( EXEC_ARG_ args );
8374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x14:  /* SZP1 */
8377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP1( EXEC_ARG_ args );
8378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x15:  /* SZP2 */
8381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP2( EXEC_ARG_ args );
8382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x16:  /* SZPS */
8385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZPS( EXEC_ARG_ args );
8386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x17:  /* SLOOP */
8389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SLOOP
8390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x18:  /* RTG */
8393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTG
8394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x19:  /* RTHG */
8397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTHG
8398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1A:  /* SMD */
8401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SMD
8402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1B:  /* ELSE */
8405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ELSE( EXEC_ARG_ args );
8406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1C:  /* JMPR */
8409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JMPR
8410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1D:  /* SCVTCI */
8413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SCVTCI
8414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1E:  /* SSWCI */
8417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SSWCI
8418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1F:  /* SSW */
8421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SSW
8422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x20:  /* DUP */
8425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DUP
8426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x21:  /* POP */
8429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* nothing :-) */
8430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x22:  /* CLEAR */
8433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CLEAR
8434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x23:  /* SWAP */
8437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SWAP
8438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x24:  /* DEPTH */
8441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DEPTH
8442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x25:  /* CINDEX */
8445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CINDEX
8446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x26:  /* MINDEX */
8449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MINDEX( EXEC_ARG_ args );
8450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x27:  /* ALIGNPTS */
8453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ALIGNPTS( EXEC_ARG_ args );
8454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x28:  /* ???? */
8457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x29:  /* UTP */
8461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UTP( EXEC_ARG_ args );
8462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2A:  /* LOOPCALL */
8465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_LOOPCALL( EXEC_ARG_ args );
8466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2B:  /* CALL */
8469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_CALL( EXEC_ARG_ args );
8470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2C:  /* FDEF */
8473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FDEF( EXEC_ARG_ args );
8474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2D:  /* ENDF */
8477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ENDF( EXEC_ARG_ args );
8478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2E:  /* MDAP */
8481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2F:  /* MDAP */
8482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MDAP( EXEC_ARG_ args );
8483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x30:  /* IUP */
8486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x31:  /* IUP */
8487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IUP( EXEC_ARG_ args );
8488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x32:  /* SHP */
8491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x33:  /* SHP */
8492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHP( EXEC_ARG_ args );
8493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x34:  /* SHC */
8496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x35:  /* SHC */
8497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHC( EXEC_ARG_ args );
8498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x36:  /* SHZ */
8501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x37:  /* SHZ */
8502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHZ( EXEC_ARG_ args );
8503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x38:  /* SHPIX */
8506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHPIX( EXEC_ARG_ args );
8507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x39:  /* IP    */
8510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IP( EXEC_ARG_ args );
8511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3A:  /* MSIRP */
8514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3B:  /* MSIRP */
8515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MSIRP( EXEC_ARG_ args );
8516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3C:  /* AlignRP */
8519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ALIGNRP( EXEC_ARG_ args );
8520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3D:  /* RTDG */
8523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTDG
8524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3E:  /* MIAP */
8527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3F:  /* MIAP */
8528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MIAP( EXEC_ARG_ args );
8529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x40:  /* NPUSHB */
8532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_NPUSHB( EXEC_ARG_ args );
8533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x41:  /* NPUSHW */
8536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_NPUSHW( EXEC_ARG_ args );
8537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x42:  /* WS */
8540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WS
8541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Set_Invalid_Ref:
8544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            CUR.error = FT_THROW( Invalid_Reference );
8545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x43:  /* RS */
8548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RS
8549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x44:  /* WCVTP */
8552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WCVTP
8553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x45:  /* RCVT */
8556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RCVT
8557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x46:  /* GC */
8560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x47:  /* GC */
8561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_GC( EXEC_ARG_ args );
8562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x48:  /* SCFS */
8565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCFS( EXEC_ARG_ args );
8566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x49:  /* MD */
8569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4A:  /* MD */
8570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MD( EXEC_ARG_ args );
8571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4B:  /* MPPEM */
8574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MPPEM
8575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4C:  /* MPS */
8578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MPS
8579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4D:  /* FLIPON */
8582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLIPON
8583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4E:  /* FLIPOFF */
8586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLIPOFF
8587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4F:  /* DEBUG */
8590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DEBUG
8591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x50:  /* LT */
8594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_LT
8595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x51:  /* LTEQ */
8598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_LTEQ
8599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x52:  /* GT */
8602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GT
8603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x53:  /* GTEQ */
8606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GTEQ
8607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x54:  /* EQ */
8610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_EQ
8611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x55:  /* NEQ */
8614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NEQ
8615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x56:  /* ODD */
8618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ODD
8619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x57:  /* EVEN */
8622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_EVEN
8623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x58:  /* IF */
8626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IF( EXEC_ARG_ args );
8627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x59:  /* EIF */
8630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* do nothing */
8631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5A:  /* AND */
8634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_AND
8635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5B:  /* OR */
8638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_OR
8639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5C:  /* NOT */
8642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NOT
8643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5D:  /* DELTAP1 */
8646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAP( EXEC_ARG_ args );
8647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5E:  /* SDB */
8650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SDB
8651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5F:  /* SDS */
8654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SDS
8655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x60:  /* ADD */
8658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ADD
8659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x61:  /* SUB */
8662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SUB
8663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x62:  /* DIV */
8666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DIV
8667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x63:  /* MUL */
8670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MUL
8671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x64:  /* ABS */
8674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ABS
8675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x65:  /* NEG */
8678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NEG
8679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x66:  /* FLOOR */
8682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLOOR
8683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x67:  /* CEILING */
8686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CEILING
8687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x68:  /* ROUND */
8690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x69:  /* ROUND */
8691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6A:  /* ROUND */
8692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6B:  /* ROUND */
8693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ROUND
8694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6C:  /* NROUND */
8697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6D:  /* NROUND */
8698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6E:  /* NRRUND */
8699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6F:  /* NROUND */
8700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NROUND
8701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x70:  /* WCVTF */
8704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WCVTF
8705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x71:  /* DELTAP2 */
8708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x72:  /* DELTAP3 */
8709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAP( EXEC_ARG_ args );
8710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x73:  /* DELTAC0 */
8713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x74:  /* DELTAC1 */
8714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x75:  /* DELTAC2 */
8715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAC( EXEC_ARG_ args );
8716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x76:  /* SROUND */
8719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SROUND
8720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x77:  /* S45Round */
8723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_S45ROUND
8724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x78:  /* JROT */
8727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JROT
8728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x79:  /* JROF */
8731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JROF
8732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7A:  /* ROFF */
8735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ROFF
8736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7B:  /* ???? */
8739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7C:  /* RUTG */
8743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RUTG
8744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7D:  /* RDTG */
8747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RDTG
8748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7E:  /* SANGW */
8751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7F:  /* AA    */
8752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* nothing - obsolete */
8753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x80:  /* FLIPPT */
8756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPPT( EXEC_ARG_ args );
8757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x81:  /* FLIPRGON */
8760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPRGON( EXEC_ARG_ args );
8761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x82:  /* FLIPRGOFF */
8764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPRGOFF( EXEC_ARG_ args );
8765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x83:  /* UNKNOWN */
8768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x84:  /* UNKNOWN */
8769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x85:  /* SCANCTRL */
8773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCANCTRL( EXEC_ARG_ args );
8774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x86:  /* SDPVTL */
8777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x87:  /* SDPVTL */
8778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SDPVTL( EXEC_ARG_ args );
8779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x88:  /* GETINFO */
8782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_GETINFO( EXEC_ARG_ args );
8783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x89:  /* IDEF */
8786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IDEF( EXEC_ARG_ args );
8787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8A:  /* ROLL */
8790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ROLL( EXEC_ARG_ args );
8791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8B:  /* MAX */
8794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MAX
8795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8C:  /* MIN */
8798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MIN
8799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8D:  /* SCANTYPE */
8802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCANTYPE( EXEC_ARG_ args );
8803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8E:  /* INSTCTRL */
8806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_INSTCTRL( EXEC_ARG_ args );
8807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8F:
8810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
8814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( opcode >= 0xE0 )
8815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_MIRP( EXEC_ARG_ args );
8816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xC0 )
8817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_MDRP( EXEC_ARG_ args );
8818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xB8 )
8819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_PUSHW( EXEC_ARG_ args );
8820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xB0 )
8821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_PUSHB( EXEC_ARG_ args );
8822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
8823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_UNKNOWN( EXEC_ARG_ args );
8824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
8829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
8831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
8833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8834727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.error )
8835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.error )
8837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* looking for redefined instructions */
8839727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        case FT_ERR( Invalid_Opcode ):
8840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
8841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            TT_DefRecord*  def   = CUR.IDefs;
8842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            TT_DefRecord*  limit = def + CUR.numIDefs;
8843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            for ( ; def < limit; def++ )
8846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( def->active && CUR.opcode == (FT_Byte)def->opc )
8848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
8849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                TT_CallRec*  callrec;
8850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                if ( CUR.callTop >= CUR.callSize )
8853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                {
8854727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.error = FT_THROW( Invalid_Reference );
8855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  goto LErrorLabel_;
8856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                }
8857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec = &CUR.callStack[CUR.callTop];
8859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Caller_Range = CUR.curRange;
8861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Caller_IP    = CUR.IP + 1;
8862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Cur_Count    = 1;
8863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Cur_Restart  = def->start;
886441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                callrec->Cur_End      = def->end;
8865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
8867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  goto LErrorLabel_;
8868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                goto LSuiteLabel_;
8870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
8871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
8873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8874727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Opcode );
8875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
8878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;   /* Unreachable code warning suppression.             */
8879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   /* Leave to remind in case a later change the editor */
8880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   /* to consider break;                                */
8881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
8884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
8887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
8888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.top = CUR.new_top;
8893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.step_ins )
8895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.IP += CUR.length;
8896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* increment instruction counter and check if we didn't */
8898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* run this program for too long (e.g. infinite loops). */
8899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
8900727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_THROW( Execution_Too_Long );
8901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LSuiteLabel_:
8903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP >= CUR.codeSize )
8904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.callTop > 0 )
8906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8907727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Code_Overflow );
8908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
8911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LNo_Error_;
8912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( !CUR.instruction_trap );
8914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LNo_Error_:
8916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
8918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *exc = cur;
8919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8921727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
8922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LErrorCodeOverflow_:
8924727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Code_Overflow );
8925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LErrorLabel_:
8927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
8929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *exc = cur;
8930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
89327f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* If any errors have occurred, function tables may be broken. */
89337f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* Force a re-execution of `prep' and `fpgm' tables if no      */
89347f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* bytecode debugger is run.                                   */
89357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    if ( CUR.error && !CUR.instruction_trap )
89367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
89377f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_TRACE1(( "  The interpreter returned error 0x%x\n", CUR.error ));
893841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      exc->size->cvt_ready      = FALSE;
89397f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
89407f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
8941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.error;
8942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
8943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */
8946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
8949