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/*                                                                         */
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/*  Copyright 1996-2014                                                    */
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  {
7999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_Memory  memory = driver->root.root.memory;
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !driver->context )
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      FT_Error        error;
8059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      TT_ExecContext  exec;
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* allocate object */
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_NEW( exec ) )
810295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner        goto Fail;
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
812295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      /* initialize it; in case of error this deallocates `exec' too */
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = Init_Context( exec, memory );
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* store it into the driver */
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      driver->context = exec;
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return driver->context;
822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
824295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return NULL;
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Before an opcode is executed, the interpreter verifies that there are */
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* table.                                                                */
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* For each opcode, the first column gives the number of arguments that  */
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* are popped from the stack; the second one gives the number of those   */
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* that are pushed in result.                                            */
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcodes which have a varying number of parameters in the data stream  */
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */
841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* to zero.                                                              */
842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  PACK
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define PACK( x, y )  ( ( x << 4 ) | y )
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Byte  Pop_Push_Count[256] =
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* opcodes are gathered in groups of 16 */
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* please keep the spaces as they are   */
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  y  */  PACK( 0, 0 ),
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  x  */  PACK( 0, 0 ),
858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA y  */  PACK( 0, 0 ),
859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA x  */  PACK( 0, 0 ),
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA y  */  PACK( 0, 0 ),
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA x  */  PACK( 0, 0 ),
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL //  */  PACK( 2, 0 ),
863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL +   */  PACK( 2, 0 ),
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL //  */  PACK( 2, 0 ),
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL +   */  PACK( 2, 0 ),
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvFS     */  PACK( 2, 0 ),
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvFS     */  PACK( 2, 0 ),
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GPV       */  PACK( 0, 2 ),
869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GFV       */  PACK( 0, 2 ),
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTPv    */  PACK( 0, 0 ),
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ISECT     */  PACK( 5, 0 ),
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP0      */  PACK( 1, 0 ),
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP1      */  PACK( 1, 0 ),
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP2      */  PACK( 1, 0 ),
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP0      */  PACK( 1, 0 ),
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP1      */  PACK( 1, 0 ),
878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP2      */  PACK( 1, 0 ),
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZPS      */  PACK( 1, 0 ),
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SLOOP     */  PACK( 1, 0 ),
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTG       */  PACK( 0, 0 ),
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTHG      */  PACK( 0, 0 ),
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SMD       */  PACK( 1, 0 ),
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ELSE      */  PACK( 0, 0 ),
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JMPR      */  PACK( 1, 0 ),
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCvTCi    */  PACK( 1, 0 ),
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSwCi     */  PACK( 1, 0 ),
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSW       */  PACK( 1, 0 ),
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DUP       */  PACK( 1, 2 ),
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  POP       */  PACK( 1, 0 ),
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CLEAR     */  PACK( 0, 0 ),
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SWAP      */  PACK( 2, 2 ),
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEPTH     */  PACK( 0, 1 ),
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CINDEX    */  PACK( 1, 1 ),
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MINDEX    */  PACK( 1, 0 ),
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignPTS  */  PACK( 2, 0 ),
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$28   */  PACK( 0, 0 ),
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  UTP       */  PACK( 1, 0 ),
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LOOPCALL  */  PACK( 2, 0 ),
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CALL      */  PACK( 1, 0 ),
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FDEF      */  PACK( 1, 0 ),
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ENDF      */  PACK( 0, 0 ),
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[0]   */  PACK( 1, 0 ),
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[1]   */  PACK( 1, 0 ),
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[0]    */  PACK( 0, 0 ),
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[1]    */  PACK( 0, 0 ),
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[0]    */  PACK( 0, 0 ),
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[1]    */  PACK( 0, 0 ),
911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[0]    */  PACK( 1, 0 ),
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[1]    */  PACK( 1, 0 ),
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[0]    */  PACK( 1, 0 ),
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[1]    */  PACK( 1, 0 ),
915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHPIX     */  PACK( 1, 0 ),
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IP        */  PACK( 0, 0 ),
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[0]  */  PACK( 2, 0 ),
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[1]  */  PACK( 2, 0 ),
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignRP   */  PACK( 0, 0 ),
920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTDG      */  PACK( 0, 0 ),
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[0]   */  PACK( 2, 0 ),
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[1]   */  PACK( 2, 0 ),
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushB    */  PACK( 0, 0 ),
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushW    */  PACK( 0, 0 ),
926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WS        */  PACK( 2, 0 ),
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RS        */  PACK( 1, 1 ),
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtP     */  PACK( 2, 0 ),
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RCvt      */  PACK( 1, 1 ),
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[0]     */  PACK( 1, 1 ),
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[1]     */  PACK( 1, 1 ),
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCFS      */  PACK( 2, 0 ),
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[0]     */  PACK( 2, 1 ),
934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[1]     */  PACK( 2, 1 ),
935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPPEM     */  PACK( 0, 1 ),
936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPS       */  PACK( 0, 1 ),
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipON    */  PACK( 0, 0 ),
938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipOFF   */  PACK( 0, 0 ),
939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEBUG     */  PACK( 1, 0 ),
940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LT        */  PACK( 2, 1 ),
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LTEQ      */  PACK( 2, 1 ),
943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GT        */  PACK( 2, 1 ),
944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GTEQ      */  PACK( 2, 1 ),
945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EQ        */  PACK( 2, 1 ),
946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEQ       */  PACK( 2, 1 ),
947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ODD       */  PACK( 1, 1 ),
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EVEN      */  PACK( 1, 1 ),
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IF        */  PACK( 1, 0 ),
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EIF       */  PACK( 0, 0 ),
951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AND       */  PACK( 2, 1 ),
952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  OR        */  PACK( 2, 1 ),
953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NOT       */  PACK( 1, 1 ),
954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP1   */  PACK( 1, 0 ),
955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDB       */  PACK( 1, 0 ),
956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDS       */  PACK( 1, 0 ),
957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ADD       */  PACK( 2, 1 ),
959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SUB       */  PACK( 2, 1 ),
960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DIV       */  PACK( 2, 1 ),
961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MUL       */  PACK( 2, 1 ),
962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ABS       */  PACK( 1, 1 ),
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEG       */  PACK( 1, 1 ),
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FLOOR     */  PACK( 1, 1 ),
965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CEILING   */  PACK( 1, 1 ),
966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[0]  */  PACK( 1, 1 ),
967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[1]  */  PACK( 1, 1 ),
968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[2]  */  PACK( 1, 1 ),
969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[3]  */  PACK( 1, 1 ),
970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[0] */  PACK( 1, 1 ),
971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[1] */  PACK( 1, 1 ),
972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[2] */  PACK( 1, 1 ),
973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[3] */  PACK( 1, 1 ),
974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtF     */  PACK( 2, 0 ),
976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP2   */  PACK( 1, 0 ),
977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP3   */  PACK( 1, 0 ),
978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[0] */ PACK( 1, 0 ),
979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[1] */ PACK( 1, 0 ),
980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[2] */ PACK( 1, 0 ),
981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SROUND    */  PACK( 1, 0 ),
982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  S45Round  */  PACK( 1, 0 ),
983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROT      */  PACK( 2, 0 ),
984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROF      */  PACK( 2, 0 ),
985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROFF      */  PACK( 0, 0 ),
986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$7B   */  PACK( 0, 0 ),
987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RUTG      */  PACK( 0, 0 ),
988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RDTG      */  PACK( 0, 0 ),
989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SANGW     */  PACK( 1, 0 ),
990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AA        */  PACK( 1, 0 ),
991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipPT    */  PACK( 0, 0 ),
993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgON  */  PACK( 2, 0 ),
994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgOFF */  PACK( 2, 0 ),
995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$83   */  PACK( 0, 0 ),
996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$84   */  PACK( 0, 0 ),
997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanCTRL  */  PACK( 1, 0 ),
998aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*  SDPVTL[0] */  PACK( 2, 0 ),
999aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*  SDPVTL[1] */  PACK( 2, 0 ),
1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GetINFO   */  PACK( 1, 1 ),
1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IDEF      */  PACK( 1, 0 ),
1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROLL      */  PACK( 3, 3 ),
1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MAX       */  PACK( 2, 1 ),
1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIN       */  PACK( 2, 1 ),
1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanTYPE  */  PACK( 1, 0 ),
1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  InstCTRL  */  PACK( 2, 0 ),
1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$8F   */  PACK( 0, 0 ),
1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$90  */   PACK( 0, 0 ),
1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$91  */   PACK( 0, 0 ),
1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$92  */   PACK( 0, 0 ),
1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$93  */   PACK( 0, 0 ),
1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$94  */   PACK( 0, 0 ),
1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$95  */   PACK( 0, 0 ),
1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$96  */   PACK( 0, 0 ),
1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$97  */   PACK( 0, 0 ),
1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$98  */   PACK( 0, 0 ),
1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$99  */   PACK( 0, 0 ),
1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9A  */   PACK( 0, 0 ),
1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9B  */   PACK( 0, 0 ),
1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9C  */   PACK( 0, 0 ),
1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9D  */   PACK( 0, 0 ),
1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9E  */   PACK( 0, 0 ),
1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$9F  */   PACK( 0, 0 ),
1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A0  */   PACK( 0, 0 ),
1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A1  */   PACK( 0, 0 ),
1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A2  */   PACK( 0, 0 ),
1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A3  */   PACK( 0, 0 ),
1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A4  */   PACK( 0, 0 ),
1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A5  */   PACK( 0, 0 ),
1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A6  */   PACK( 0, 0 ),
1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A7  */   PACK( 0, 0 ),
1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A8  */   PACK( 0, 0 ),
1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$A9  */   PACK( 0, 0 ),
1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AA  */   PACK( 0, 0 ),
1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AB  */   PACK( 0, 0 ),
1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AC  */   PACK( 0, 0 ),
1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AD  */   PACK( 0, 0 ),
1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AE  */   PACK( 0, 0 ),
1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_$AF  */   PACK( 0, 0 ),
1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[0]  */  PACK( 0, 1 ),
1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[1]  */  PACK( 0, 2 ),
1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[2]  */  PACK( 0, 3 ),
1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[3]  */  PACK( 0, 4 ),
1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[4]  */  PACK( 0, 5 ),
1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[5]  */  PACK( 0, 6 ),
1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[6]  */  PACK( 0, 7 ),
1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[7]  */  PACK( 0, 8 ),
1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[0]  */  PACK( 0, 1 ),
1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[1]  */  PACK( 0, 2 ),
1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[2]  */  PACK( 0, 3 ),
1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[3]  */  PACK( 0, 4 ),
1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[4]  */  PACK( 0, 5 ),
1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[5]  */  PACK( 0, 6 ),
1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[6]  */  PACK( 0, 7 ),
1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[7]  */  PACK( 0, 8 ),
1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[00]  */  PACK( 1, 0 ),
1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[01]  */  PACK( 1, 0 ),
1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[02]  */  PACK( 1, 0 ),
1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[03]  */  PACK( 1, 0 ),
1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[04]  */  PACK( 1, 0 ),
1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[05]  */  PACK( 1, 0 ),
1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[06]  */  PACK( 1, 0 ),
1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[07]  */  PACK( 1, 0 ),
1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[08]  */  PACK( 1, 0 ),
1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[09]  */  PACK( 1, 0 ),
1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[10]  */  PACK( 1, 0 ),
1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[11]  */  PACK( 1, 0 ),
1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[12]  */  PACK( 1, 0 ),
1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[13]  */  PACK( 1, 0 ),
1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[14]  */  PACK( 1, 0 ),
1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[15]  */  PACK( 1, 0 ),
1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[16]  */  PACK( 1, 0 ),
1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[17]  */  PACK( 1, 0 ),
1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[18]  */  PACK( 1, 0 ),
1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[19]  */  PACK( 1, 0 ),
1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[20]  */  PACK( 1, 0 ),
1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[21]  */  PACK( 1, 0 ),
1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[22]  */  PACK( 1, 0 ),
1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[23]  */  PACK( 1, 0 ),
1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[24]  */  PACK( 1, 0 ),
1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[25]  */  PACK( 1, 0 ),
1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[26]  */  PACK( 1, 0 ),
1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[27]  */  PACK( 1, 0 ),
1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[28]  */  PACK( 1, 0 ),
1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[29]  */  PACK( 1, 0 ),
1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[30]  */  PACK( 1, 0 ),
1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[31]  */  PACK( 1, 0 ),
1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[00]  */  PACK( 2, 0 ),
1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[01]  */  PACK( 2, 0 ),
1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[02]  */  PACK( 2, 0 ),
1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[03]  */  PACK( 2, 0 ),
1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[04]  */  PACK( 2, 0 ),
1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[05]  */  PACK( 2, 0 ),
1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[06]  */  PACK( 2, 0 ),
1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[07]  */  PACK( 2, 0 ),
1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[08]  */  PACK( 2, 0 ),
1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[09]  */  PACK( 2, 0 ),
1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[10]  */  PACK( 2, 0 ),
1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[11]  */  PACK( 2, 0 ),
1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[12]  */  PACK( 2, 0 ),
1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[13]  */  PACK( 2, 0 ),
1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[14]  */  PACK( 2, 0 ),
1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[15]  */  PACK( 2, 0 ),
1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[16]  */  PACK( 2, 0 ),
1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[17]  */  PACK( 2, 0 ),
1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[18]  */  PACK( 2, 0 ),
1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[19]  */  PACK( 2, 0 ),
1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[20]  */  PACK( 2, 0 ),
1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[21]  */  PACK( 2, 0 ),
1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[22]  */  PACK( 2, 0 ),
1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[23]  */  PACK( 2, 0 ),
1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[24]  */  PACK( 2, 0 ),
1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[25]  */  PACK( 2, 0 ),
1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[26]  */  PACK( 2, 0 ),
1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[27]  */  PACK( 2, 0 ),
1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[28]  */  PACK( 2, 0 ),
1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[29]  */  PACK( 2, 0 ),
1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[30]  */  PACK( 2, 0 ),
1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[31]  */  PACK( 2, 0 )
1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1130aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_DEBUG_LEVEL_TRACE
1131aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1132aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  static
1133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  const char*  const opcode_name[256] =
1134aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  {
1135aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SVTCA y",
1136aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SVTCA x",
1137aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTCA y",
1138aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTCA x",
1139aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTCA y",
1140aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTCA x",
1141aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTL ||",
1142aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvTL +",
1143aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTL ||",
1144aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTL +",
1145aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SPvFS",
1146aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvFS",
1147aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GPV",
1148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GFV",
1149aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SFvTPv",
1150aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ISECT",
1151aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1152aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP0",
1153aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP1",
1154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SRP2",
1155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP0",
1156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP1",
1157aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZP2",
1158aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SZPS",
1159aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SLOOP",
1160aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTG",
1161aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTHG",
1162aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SMD",
1163aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ELSE",
1164aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JMPR",
1165aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SCvTCi",
1166aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SSwCi",
1167aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SSW",
1168aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1169aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DUP",
1170aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "POP",
1171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CLEAR",
1172aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SWAP",
1173aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DEPTH",
1174aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CINDEX",
1175aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MINDEX",
1176aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AlignPTS",
1177aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$28",
1178aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "UTP",
1179aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LOOPCALL",
1180aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CALL",
1181aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FDEF",
1182aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ENDF",
1183aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDAP[0]",
1184aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDAP[1]",
1185aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1186aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IUP[0]",
1187aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IUP[1]",
1188aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHP[0]",
1189aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHP[1]",
1190aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHC[0]",
1191aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHC[1]",
1192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHZ[0]",
1193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHZ[1]",
1194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SHPIX",
1195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IP",
1196aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MSIRP[0]",
1197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MSIRP[1]",
1198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AlignRP",
1199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RTDG",
1200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIAP[0]",
1201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIAP[1]",
1202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NPushB",
1204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NPushW",
1205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WS",
1206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RS",
1207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WCvtP",
1208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RCvt",
1209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GC[0]",
1210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GC[1]",
1211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SCFS",
1212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MD[0]",
1213aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MD[1]",
1214aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MPPEM",
1215aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MPS",
1216aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipON",
1217aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipOFF",
1218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DEBUG",
1219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LT",
1221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "LTEQ",
1222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GT",
1223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GTEQ",
1224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EQ",
1225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NEQ",
1226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ODD",
1227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EVEN",
1228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IF",
1229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "EIF",
1230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AND",
1231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "OR",
1232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NOT",
1233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP1",
1234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDB",
1235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDS",
1236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1237aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ADD",
1238aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SUB",
1239aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DIV",
1240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MUL",
1241aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ABS",
1242aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NEG",
1243aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FLOOR",
1244aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "CEILING",
1245aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[0]",
1246aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[1]",
1247aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[2]",
1248aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROUND[3]",
1249aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[0]",
1250aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[1]",
1251aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[2]",
1252aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "NROUND[3]",
1253aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1254aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "WCvtF",
1255aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP2",
1256aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaP3",
1257aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[0]",
1258aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[1]",
1259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "DeltaCn[2]",
1260aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SROUND",
1261aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "S45Round",
1262aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JROT",
1263aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "JROF",
1264aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROFF",
1265aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$7B",
1266aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RUTG",
1267aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "RDTG",
1268aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SANGW",
1269aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "AA",
1270aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1271aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipPT",
1272aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipRgON",
1273aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "FlipRgOFF",
1274aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$83",
1275aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$84",
1276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ScanCTRL",
1277aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDVPTL[0]",
1278aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "SDVPTL[1]",
1279aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "GetINFO",
1280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "IDEF",
1281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ROLL",
1282aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MAX",
1283aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIN",
1284aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "ScanTYPE",
1285aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "InstCTRL",
1286aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$8F",
1287aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1288aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$90",
1289aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$91",
1290aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$92",
1291aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$93",
1292aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$94",
1293aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$95",
1294aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$96",
1295aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$97",
1296aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$98",
1297aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$99",
1298aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9A",
1299aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9B",
1300aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9C",
1301aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9D",
1302aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9E",
1303aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$9F",
1304aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1305aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A0",
1306aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A1",
1307aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A2",
1308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A3",
1309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A4",
1310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A5",
1311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A6",
1312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A7",
1313aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A8",
1314aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$A9",
1315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AA",
1316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AB",
1317aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AC",
1318aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AD",
1319aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AE",
1320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "INS_$AF",
1321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[0]",
1323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[1]",
1324aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[2]",
1325aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[3]",
1326aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[4]",
1327aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[5]",
1328aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[6]",
1329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushB[7]",
1330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[0]",
1331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[1]",
1332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[2]",
1333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[3]",
1334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[4]",
1335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[5]",
1336aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[6]",
1337aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "PushW[7]",
1338aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[00]",
1340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[01]",
1341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[02]",
1342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[03]",
1343aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[04]",
1344aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[05]",
1345aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[06]",
1346aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[07]",
1347aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[08]",
1348aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[09]",
1349aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[10]",
1350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[11]",
1351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[12]",
1352aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[13]",
1353aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[14]",
1354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[15]",
1355aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1356aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[16]",
1357aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[17]",
1358aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[18]",
1359aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[19]",
1360aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[20]",
1361aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[21]",
1362aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[22]",
1363aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[23]",
1364aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[24]",
1365aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[25]",
1366aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[26]",
1367aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[27]",
1368aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[28]",
1369aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[29]",
1370aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[30]",
1371aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MDRP[31]",
1372aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1373aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[00]",
1374aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[01]",
1375aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[02]",
1376aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[03]",
1377aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[04]",
1378aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[05]",
1379aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[06]",
1380aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[07]",
1381aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[08]",
1382aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[09]",
1383aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[10]",
1384aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[11]",
1385aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[12]",
1386aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[13]",
1387aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[14]",
1388aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[15]",
1389aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1390aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[16]",
1391aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[17]",
1392aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[18]",
1393aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[19]",
1394aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[20]",
1395aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[21]",
1396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[22]",
1397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[23]",
1398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[24]",
1399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[25]",
1400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[26]",
1401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[27]",
1402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[28]",
1403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[29]",
1404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[30]",
1405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    "MIRP[31]"
1406aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich  };
1407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1408aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif /* FT_DEBUG_LEVEL_TRACE */
1409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1410aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
1411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
1412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  const FT_Char  opcode_length[256] =
1413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   -1,-2, 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    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,
1428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
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    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
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  };
1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef PACK
1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1437ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1438ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
1439ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1440ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( __arm__ )                                 && \
1441ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ( defined( __thumb2__ ) || !defined( __thumb__ ) )
1442ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1443ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define TT_MulFix14  TT_MulFix14_arm
1444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1446ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  TT_MulFix14_arm( FT_Int32  a,
1447ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                   FT_Int    b )
1448ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
1449ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    register FT_Int32  t, t2;
1450ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1451ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1452ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( __CC_ARM ) || defined( __ARMCC__ )
1453ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1454ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    __asm
1455ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    {
1456ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
1457ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
1458ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      add   a,  a,  #0x2000         /* a  += 0x2000 */
1459ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      adds  t2, t2, a               /* t2 += a */
1460ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      adc   t,  t,  #0              /* t  += carry */
1461ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      mov   a,  t2, lsr #14         /* a   = t2 >> 14 */
1462ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      orr   a,  a,  t,  lsl #18     /* a  |= t << 18 */
1463ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    }
1464ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1465ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#elif defined( __GNUC__ )
1466ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1467ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    __asm__ __volatile__ (
1468ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
1469ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
14709c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#if defined( __clang__ ) && defined( __thumb2__ )
1471ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "add.w  %0, %0, #0x2000\n\t"      /* %0 += 0x2000 */
1472ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#else
1473ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "add    %0, %0, #0x2000\n\t"      /* %0 += 0x2000 */
1474ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif
1475ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
1476ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "adc    %2, %2, #0\n\t"           /* %2 += carry */
1477ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "mov    %0, %1, lsr #14\n\t"      /* %0  = %1 >> 16 */
1478ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      "orr    %0, %0, %2, lsl #18\n\t"  /* %0 |= %2 << 16 */
1479ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      : "=r"(a), "=&r"(t2), "=&r"(t)
1480ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      : "r"(a), "r"(b)
1481ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      : "cc" );
1482ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1483ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif
1484ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1485ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    return a;
1486ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  }
1487ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1488ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */
1489ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1490ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
1491ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1492ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1493ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( __GNUC__ )                              && \
1494ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ( defined( __i386__ ) || defined( __x86_64__ ) )
1495ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1496ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define TT_MulFix14  TT_MulFix14_long_long
1497ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1498ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* Temporarily disable the warning that C90 doesn't support `long long'. */
1499ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
1500ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma GCC diagnostic push
1501ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif
1502ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma GCC diagnostic ignored "-Wlong-long"
1503ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1504ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* This is declared `noinline' because inlining the function results */
1505ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* in slower code.  The `pure' attribute indicates that the result   */
1506ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* only depends on the parameters.                                   */
1507ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  static __attribute__(( noinline ))
1508ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease         __attribute__(( pure )) FT_Int32
1509ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  TT_MulFix14_long_long( FT_Int32  a,
1510ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                         FT_Int    b )
1511ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
1512ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1513ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    long long  ret = (long long)a * b;
1514ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1515ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    /* The following line assumes that right shifting of signed values */
1516ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    /* will actually preserve the sign bit.  The exact behaviour is    */
1517ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    /* undefined, but this is true on x86 and x86_64.                  */
1518ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    long long  tmp = ret >> 63;
1519ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1520ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1521ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ret += 0x2000 + tmp;
1522ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1523ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    return (FT_Int32)( ret >> 14 );
1524ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  }
1525ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1526ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
1527ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma GCC diagnostic pop
1528ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif
1529ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1530ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */
1531ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1532ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1533ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef TT_MulFix14
1534ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1535ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* Compute (a*b)/2^14 with maximum accuracy and rounding.  */
1536ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* This is optimized to be faster than calling FT_MulFix() */
1537ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* for platforms where sizeof(int) == 2.                   */
1538ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  static FT_Int32
1539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_MulFix14( FT_Int32  a,
1540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    b )
1541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   sign;
1543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  ah, al, mid, lo, hi;
1544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    sign = a ^ b;
1547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( a < 0 )
1549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      a = -a;
1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( b < 0 )
1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      b = -b;
1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    al = (FT_UInt32)( a & 0xFFFFU );
1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo    = al * b;
1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid   = ah * b;
1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi    = mid >> 16;
1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
1560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo   += mid;
1561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( lo < mid )
1562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      hi += 1;
1563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mid = ( lo >> 14 ) | ( hi << 18 );
1565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
1567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1569ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif  /* !TT_MulFix14 */
1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1572ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( __GNUC__ )        && \
1573ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ( defined( __i386__ )   ||    \
1574ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      defined( __x86_64__ ) ||    \
1575ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      defined( __arm__ )    )
1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1577ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define TT_DotFix14  TT_DotFix14_long_long
1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1579ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
1580ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma GCC diagnostic push
1581ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif
1582ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma GCC diagnostic ignored "-Wlong-long"
1583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1584ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  static __attribute__(( pure )) FT_Int32
1585ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  TT_DotFix14_long_long( FT_Int32  ax,
1586ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                         FT_Int32  ay,
1587ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                         FT_Int    bx,
1588ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                         FT_Int    by )
1589ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
1590ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    /* Temporarily disable the warning that C90 doesn't support */
1591ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    /* `long long'.                                             */
1592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1593ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    long long  temp1 = (long long)ax * bx;
1594ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    long long  temp2 = (long long)ay * by;
1595ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1596ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1597ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    temp1 += temp2;
1598ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    temp2  = temp1 >> 63;
1599ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    temp1 += 0x2000 + temp2;
1600ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1601ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    return (FT_Int32)( temp1 >> 14 );
1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1604ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1605ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
1606ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#pragma GCC diagnostic pop
1607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1609ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */
1610ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1611ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
1612ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef TT_DotFix14
1613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1614727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
1615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Int32
1616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_DotFix14( FT_Int32  ax,
1617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int32  ay,
1618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    bx,
1619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Int    by )
1620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int32   m, s, hi1, hi2, hi;
1622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32  l, lo1, lo2, lo;
1623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ax*bx as 64-bit value */
1626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
1627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m = ( ax >> 16 ) * bx;
1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    lo1 = l + ( (FT_UInt32)m << 16 );
1630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* compute ay*by as 64-bit value */
1633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    m = ( ay >> 16 ) * by;
1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    lo2 = l + ( (FT_UInt32)m << 16 );
1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
1638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* add them */
1640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo = lo1 + lo2;
1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi = hi1 + hi2 + ( lo < lo1 );
1642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* divide the result by 2^14 with rounding */
1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    s   = hi >> 31;
1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + (FT_UInt32)s;
1646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += s + ( l < lo );
1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    lo  = l;
1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    l   = lo + 0x2000U;
1650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    hi += ( l < lo );
1651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1655ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* TT_DotFix14 */
1656ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
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  /*    Current_Ratio                                                      */
1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns the current aspect ratio scaling factor depending on the   */
1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    projection vector's state and device resolutions.                  */
1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */
1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Long
1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Current_Ratio( EXEC_OP )
1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !CUR.tt_metrics.ratio )
1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.face->unpatented_hinting )
1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.both_x_axis )
1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
1686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.GS.projVector.y == 0 )
1687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
1688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( CUR.GS.projVector.x == 0 )
1690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
1691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
1694727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          FT_F26Dot6  x, y;
1695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          x = TT_MulFix14( CUR.tt_metrics.x_ratio,
1698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                           CUR.GS.projVector.x );
1699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          y = TT_MulFix14( CUR.tt_metrics.y_ratio,
1700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                           CUR.GS.projVector.y );
1701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.tt_metrics.ratio = FT_Hypot( x, y );
1702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
1703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
1704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.tt_metrics.ratio;
1706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Long
1710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Current_Ppem( EXEC_OP )
1711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );
1713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Functions related to the control value table (CVT).                   */
1719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_F26Dot6 )
1724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Read_CVT( EXEC_OP_ FT_ULong  idx )
1725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.cvt[idx];
1727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( FT_F26Dot6 )
1731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )
1732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );
1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Write_CVT( EXEC_OP_ FT_ULong    idx,
1739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_F26Dot6  value )
1740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] = value;
1742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
1747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                FT_F26Dot6  value )
1748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
1750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_CVT( EXEC_OP_ FT_ULong    idx,
1755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_F26Dot6  value )
1756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] += value;
1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( void )
1762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
1763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  value )
1764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
1766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    GetShortIns                                                        */
1773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns a short integer taken from the instruction stream at       */
1776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    address IP.                                                        */
1777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Short read at code[IP].                                            */
1780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
1782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    This one could become a macro.                                     */
1783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Short
1785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  GetShortIns( EXEC_OP )
1786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Reading a byte stream so there is no endianess (DaveP) */
1788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += 2;
1789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
1790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         CUR.code[CUR.IP - 1]      );
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  /*                                                                       */
1796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Ins_Goto_CodeRange                                                 */
1798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Goes to a certain code range in the instruction stream.            */
1801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    aRange :: The index of the code range.                             */
1804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    aIP    :: The new IP address in the code range.                    */
1806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
1808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SUCCESS or FAILURE.                                                */
1809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
1811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,
1812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_ULong  aIP )
1813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CodeRange*  range;
1815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( aRange < 1 || aRange > 3 )
1818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1819727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Bad_Argument );
1820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    range = &CUR.codeRangeTable[aRange - 1];
1824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( range->base == NULL )     /* invalid coderange */
1826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1827727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Invalid_CodeRange );
1828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: Because the last instruction of a program may be a CALL */
1832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       which will return to the first byte *after* the code    */
183341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*       range, we test for aIP <= Size, instead of aIP < Size.  */
1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( aIP > range->size )
1836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1837727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Code_Overflow );
1838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
1839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.code     = range->base;
1842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.codeSize = range->size;
1843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP       = aIP;
1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.curRange = aRange;
1845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
1847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
1853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Direct_Move                                                        */
1854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Moves a point by a given distance along the freedom vector.  The   */
1857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point will be `touched'.                                           */
1858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point    :: The index of the point to move.                        */
1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance :: The distance to apply.                                 */
1863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    zone     :: The affected glyph zone.                               */
1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,
1869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_UShort     point,
1870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_F26Dot6    distance )
1871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  v;
1873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.x;
1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1883727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
1884727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !SUBPIXEL_HINTING                                     ||
1885727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( !CUR.ignore_x_mode                                ||
1886727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
1887727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
1888727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.y;
1894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
1897727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
1901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
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  /* <Function>                                                            */
1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Direct_Move_Orig                                                   */
1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Moves the *original* position of a point by a given distance along */
1911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the freedom vector.  Obviously, the point will not be `touched'.   */
1912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    point    :: The index of the point to move.                        */
1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance :: The distance to apply.                                 */
1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <InOut>                                                               */
1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    zone     :: The affected glyph zone.                               */
1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,
1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_UShort     point,
1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_F26Dot6    distance )
1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  v;
1927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
1931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
1932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.x;
1934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1936727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    v = CUR.GS.freeVector.y;
1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( v != 0 )
1941727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
1942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Special versions of Direct_Move()                                     */
1948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The following versions are used whenever both vectors are both      */
1950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
1951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,
1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UShort     point,
1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6    distance )
1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1962727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
1963727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( !SUBPIXEL_HINTING  ||
1964727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !CUR.ignore_x_mode )
1965727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
1966727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      zone->cur[point].x += distance;
1967727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
1968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
1969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,
1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_UShort     point,
1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6    distance )
1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->cur[point].y += distance;
1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;
1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
1982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Special versions of Direct_Move_Orig()                                */
1987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   The following versions are used whenever both vectors are both      */
1989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
1990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
1991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,
1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UShort     point,
1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6    distance )
1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->org[point].x += distance;
2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,
2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_UShort     point,
2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6    distance )
2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    zone->org[point].y += distance;
2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_None                                                         */
2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Does not round, but adds engine compensation.                      */
2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance (not) to round.                       */
2026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The compensated distance.                                          */
2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The TrueType specification says very few about the relationship    */
2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    between rounding and engine compensation.  However, it seems from  */
2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the description of super round that we should add the compensation */
2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    before rounding.                                                   */
2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_None( EXEC_OP_ FT_F26Dot6  distance,
2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_F26Dot6  compensation )
2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation;
2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2053aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    else
2054aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    {
2055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance - compensation;
2056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Grid                                                      */
2067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to grid after adding engine compensation.             */
2070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_F26Dot6  compensation )
2082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 32;
2091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -FT_PIX_ROUND( compensation - distance );
2099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return  val;
2104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Half_Grid                                                 */
2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to half grid after adding engine compensation.        */
2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,
2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  compensation )
2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = FT_PIX_FLOOR( distance + compensation ) + 32;
2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Down_To_Grid                                                 */
2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value down to grid after adding engine compensation.        */
2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               FT_F26Dot6  compensation )
2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation;
2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( compensation - distance ) & -64 );
2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Up_To_Grid                                                   */
2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value up to grid after adding engine compensation.          */
2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                             FT_F26Dot6  compensation )
2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 63;
2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~63;
2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2228727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      val = -FT_PIX_CEIL( compensation - distance );
2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_To_Double_Grid                                               */
2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounds value to double grid after adding engine compensation.      */
2244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,
2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 FT_F26Dot6  compensation )
2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6 val;
2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = distance + compensation + 16;
2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val > 0 )
2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val &= ~31;
2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -FT_PAD_ROUND( compensation - distance, 32 );
2273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Super                                                        */
2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Super-rounds value to grid after adding engine compensation.       */
2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The TrueType specification says very few about the relationship    */
2299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    between rounding and engine compensation.  However, it seems from  */
2300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    the description of super round that we should add the compensation */
2301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    before rounding.                                                   */
2302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Super( EXEC_OP_ FT_F26Dot6  distance,
2305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        FT_F26Dot6  compensation )
2306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = ( distance - CUR.phase + CUR.threshold + compensation ) &
2313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              -CUR.period;
2314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val += CUR.phase;
2317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               -CUR.period );
2322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val -= CUR.phase;
2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Round_Super_45                                                     */
2335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Super-rounds value to grid after adding engine compensation.       */
2338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    distance     :: The distance to round.                             */
2341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    compensation :: The engine compensation.                           */
2343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Rounded distance.                                                  */
2346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    There is a separate function for Round_Super_45() as we may need   */
2349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    greater precision.                                                 */
2350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,
2353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  compensation )
2354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
2356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( distance >= 0 )
2359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
2361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                CUR.period ) * CUR.period;
2362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( distance && val < 0 )
2363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val += CUR.phase;
2365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
2369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.period ) * CUR.period );
2370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val > 0 )
2371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val = 0;
2372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      val -= CUR.phase;
2373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return val;
2376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Compute_Round                                                      */
2383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets the rounding mode.                                            */
2386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    round_mode :: The rounding mode to be used.                        */
2389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Round( EXEC_OP_ FT_Byte  round_mode )
2392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( round_mode )
2394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Off:
2396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_None;
2397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Grid:
2400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Grid;
2401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Up_To_Grid:
2404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
2405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Down_To_Grid:
2408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
2409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Half_Grid:
2412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_To_Double_Grid:
2416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
2417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Super:
2420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Super;
2421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case TT_Round_Super_45:
2424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_round = (TT_Round_Func)Round_Super_45;
2425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    SetSuperRound                                                      */
2434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Sets Super Round parameters.                                       */
2437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2439727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*    GridPeriod :: The grid period.                                     */
2440727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*                                                                       */
2441727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*    selector   :: The SROUND opcode.                                   */
2442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,
2445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          FT_Long     selector )
2446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)( selector & 0xC0 ) )
2448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0:
2450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod / 2;
2451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x40:
2454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod;
2455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x80:
2458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod * 2;
2459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* This opcode is reserved, but... */
2462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0xC0:
2464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.period = GridPeriod;
2465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
2466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)( selector & 0x30 ) )
2469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
2471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = 0;
2472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x10:
2475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period / 4;
2476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x20:
2479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period / 2;
2480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0x30:
2483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.phase = CUR.period * 3 / 4;
2484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
2485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( selector & 0x0F ) == 0 )
2488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.threshold = CUR.period - 1;
2489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
2491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.period    /= 256;
2493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.phase     /= 256;
2494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.threshold /= 256;
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  /*                                                                       */
2500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project                                                            */
2502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of vector given by (v2-v1) along the       */
2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    current projection vector.                                         */
2506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project( EXEC_OP_ FT_Pos  dx,
2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    FT_Pos  dy )
2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ASSERT( !CUR.face->unpatented_hinting );
2520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2522295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
2523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.projVector.x,
2524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.projVector.y );
2525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Dual_Project                                                       */
2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    current dual vector.                                               */
2536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Dual_Project( EXEC_OP_ FT_Pos  dx,
2546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                         FT_Pos  dy )
2547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2548295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.dualVector.x,
2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        CUR.GS.dualVector.y );
2551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project_x                                                          */
2558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    horizontal axis.                                                   */
2562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project_x( EXEC_OP_ FT_Pos  dx,
2572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pos  dy )
2573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( dy );
2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return dx;
2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Project_y                                                          */
2585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection of the vector given by (v2-v1) along the   */
2588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    vertical axis.                                                     */
2589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v1 :: First input vector.                                          */
2592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    v2 :: Second input vector.                                         */
2593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    The distance in F26dot6 format.                                    */
2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_F26Dot6
2598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Project_y( EXEC_OP_ FT_Pos  dx,
2599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Pos  dy )
2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED( dx );
2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return dy;
2605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Compute_Funcs                                                      */
2612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Computes the projection and movement function pointers according   */
2615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    to the current graphics state.                                     */
2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
2618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Funcs( EXEC_OP )
2619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
2622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* If both vectors point rightwards along the x axis, set             */
2624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `both-x-axis' true, otherwise set it false.  The x values only     */
2625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* need be tested because the vector has been normalised to a unit    */
2626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* vector of length 0x4000 = unity.                                   */
2627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
2628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                      CUR.GS.freeVector.x == 0x4000 );
2629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Throw away projection and freedom vector information */
2631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* because the patents don't allow them to be stored.   */
2632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* The relevant US Patents are 5155805 and 5325479.     */
2633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.projVector.x = 0;
2634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.projVector.y = 0;
2635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.freeVector.x = 0;
2636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.freeVector.y = 0;
2637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
2639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project   = Project_x;
2641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = Direct_Move_X;
2642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = Direct_Move_Orig_X;
2643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_project   = Project_y;
2647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = Direct_Move_Y;
2648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = Direct_Move_Orig_Y;
2649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.dualVector.x == 0x4000 )
2652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_dualproj = Project_x;
2653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else if ( CUR.GS.dualVector.y == 0x4000 )
2654727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_dualproj = Project_y;
2655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
2656727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_dualproj = Dual_Project;
2657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Force recalculation of cached aspect ratio */
2659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.tt_metrics.ratio = 0;
2660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
2662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x == 0x4000 )
2666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = CUR.GS.projVector.x;
2667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( CUR.GS.freeVector.y == 0x4000 )
2668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = CUR.GS.projVector.y;
2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +
2671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>
2672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    14;
2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.projVector.x == 0x4000 )
2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_project = (TT_Project_Func)Project_x;
2676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( CUR.GS.projVector.y == 0x4000 )
2677727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_project = (TT_Project_Func)Project_y;
2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2679727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_project = (TT_Project_Func)Project;
2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.dualVector.x == 0x4000 )
2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_dualproj = (TT_Project_Func)Project_x;
2683727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else if ( CUR.GS.dualVector.y == 0x4000 )
2684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_dualproj = (TT_Project_Func)Project_y;
2685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
2686727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.func_dualproj = (TT_Project_Func)Dual_Project;
2687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_move      = (TT_Move_Func)Direct_Move;
2689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2691727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( CUR.F_dot_P == 0x4000L )
2692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.freeVector.x == 0x4000 )
2694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move      = (TT_Move_Func)Direct_Move_X;
2696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
2697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else if ( CUR.GS.freeVector.y == 0x4000 )
2699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_move      = (TT_Move_Func)Direct_Move_Y;
2701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
2702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* at small sizes, F_dot_P can become too small, resulting   */
2706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* in overflows and `spikes' in a number of glyphs like `w'. */
2707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( FT_ABS( CUR.F_dot_P ) < 0x400L )
2709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.F_dot_P = 0x4000L;
2710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Disable cached aspect ratio */
2712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.tt_metrics.ratio = 0;
2713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
2719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Normalize                                                          */
2720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
2722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Norms a vector.                                                    */
2723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
2725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Vx :: The horizontal input vector coordinate.                      */
2726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Vy :: The vertical input vector coordinate.                        */
2727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Output>                                                              */
2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    R  :: The normed unit vector.                                      */
2730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Returns FAILURE if a vector parameter is zero.                     */
2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Note>                                                                */
2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */
2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    R is undefined.                                                    */
2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Normalize( EXEC_OP_ FT_F26Dot6      Vx,
2740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_F26Dot6      Vy,
2741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UnitVector*  R )
2742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  W;
2744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
2746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2748727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )
2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2750727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( Vx == 0 && Vy == 0 )
2751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
2752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
2753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /*      to normalize the vector (0,0).  Return immediately. */
2754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
2755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
2756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2757727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      Vx *= 0x4000;
2758727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      Vy *= 0x4000;
2759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2761727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    W = FT_Hypot( Vx, Vy );
2762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2763727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
2764727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
2765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Here we start with the implementation of the various opcodes.         */
2773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
2774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
2775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
2778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,
2779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UShort       aIdx2,
2780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_Int          aOpc,
2781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      FT_UnitVector*  Vec )
2782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
2783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long     A, B, C;
2784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  p1;
2785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  p2;
2786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
2789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( aIdx2, CUR.zp1.n_points ) )
2790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
2792727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
2793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
2794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = CUR.zp1.cur + aIdx2;
2797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = CUR.zp2.cur + aIdx1;
2798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = p1->x - p2->x;
2800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = p1->y - p2->y;
2801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2802aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* If p1 == p2, SPVTL and SFVTL behave the same as */
2803aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* SPVTCA[X] and SFVTCA[X], respectively.          */
2804aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                 */
2805aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Confirmed by Greg Hitchcock.                    */
2806aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
2807aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( A == 0 && B == 0 )
2808aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
2809aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      A    = 0x4000;
2810aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      aOpc = 0;
2811aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
2812aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
2813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( aOpc & 1 ) != 0 )
2814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
2815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
2816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
2817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
2818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, Vec );
2821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
2823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* When not using the big switch statements, the interpreter uses a */
2827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* call table defined later below in this source.  Each opcode must */
2828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* thus have a corresponding function, even trivial ones.           */
2829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                  */
2830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* They are all defined there.                                      */
2831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SVTCA                            \
2833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.x = A;                \
2841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.x = A;                \
2842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.x = A;                \
2843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.y = B;                \
2845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.y = B;                \
2846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.y = B;                \
2847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTCA                           \
2853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.x = A;                \
2861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.x = A;                \
2862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.projVector.y = B;                \
2864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector.y = B;                \
2865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );             \
2867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTCA                           \
2873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                         \
2874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  A, B;                         \
2875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
2878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = A ^ (FT_Short)0x4000;               \
2879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.x = A;                \
2881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector.y = B;                \
2882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );             \
2884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                            \
2885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                        \
2886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTL                                      \
2890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( INS_SxVTL( (FT_UShort)args[1],               \
2891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    (FT_UShort)args[0],               \
2892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    CUR.opcode,                       \
2893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    &CUR.GS.projVector ) == SUCCESS ) \
2894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                                 \
2895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.dualVector = CUR.GS.projVector;          \
2896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      GUESS_VECTOR( freeVector );                     \
2897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      COMPUTE_Funcs();                                \
2898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTL                                      \
2902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( INS_SxVTL( (FT_UShort)args[1],               \
2903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    (FT_UShort)args[0],               \
2904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    CUR.opcode,                       \
2905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                    &CUR.GS.freeVector ) == SUCCESS ) \
2906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                                 \
2907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      GUESS_VECTOR( projVector );                     \
2908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      COMPUTE_Funcs();                                \
2909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTPV                          \
2913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );            \
2914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.freeVector = CUR.GS.projVector; \
2915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
2916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVFS                                \
2919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                             \
2920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  S;                                \
2921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   X, Y;                             \
2922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Only use low 16bits, then sign extend */ \
2925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[1];                      \
2926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Y = (FT_Long)S;                             \
2927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[0];                      \
2928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    X = (FT_Long)S;                             \
2929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( X, Y, &CUR.GS.projVector );      \
2931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.dualVector = CUR.GS.projVector;      \
2933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );                 \
2934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                            \
2935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVFS                                \
2939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                                             \
2940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  S;                                \
2941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   X, Y;                             \
2942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Only use low 16bits, then sign extend */ \
2945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[1];                      \
2946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Y = (FT_Long)S;                             \
2947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    S = (FT_Short)args[0];                      \
2948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    X = S;                                      \
2949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
2950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( X, Y, &CUR.GS.freeVector );      \
2951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( projVector );                 \
2952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();                            \
2953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
2954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV                                   \
2958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )          \
2959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
2961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
2962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }                                            \
2963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                         \
2964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.projVector.x;             \
2966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.projVector.y;             \
2967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
2969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV                                   \
2970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.GS.projVector.x;               \
2971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = CUR.GS.projVector.y;
2972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
2976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV                                   \
2977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )          \
2978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
2980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
2981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }                                            \
2982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                         \
2983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {                                            \
2984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = CUR.GS.freeVector.x;             \
2985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[1] = CUR.GS.freeVector.y;             \
2986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
2987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
2988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV                                   \
2989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.GS.freeVector.x;               \
2990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = CUR.GS.freeVector.y;
2991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
2992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP0                      \
2995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = (FT_UShort)args[0];
2996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP1                      \
2999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = (FT_UShort)args[0];
3000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP2                      \
3003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = (FT_UShort)args[0];
3004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTHG                                         \
3007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Half_Grid;         \
3008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
3009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTG                                     \
3012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Grid;         \
3013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Grid;
3014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTDG                                           \
3017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_To_Double_Grid;         \
3018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
3019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RUTG                                       \
3022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Up_To_Grid;         \
3023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
3024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RDTG                                         \
3027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Down_To_Grid;         \
3028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
3029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROFF                                 \
3032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Off;          \
3033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_None;
3034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SROUND                                \
3037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SET_SuperRound( 0x4000, args[0] );           \
3038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Super;         \
3039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Super;
3040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_S45ROUND                                 \
3043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    SET_SuperRound( 0x2D41, args[0] );              \
3044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.round_state = TT_Round_Super_45;         \
3045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.func_round = (TT_Round_Func)Round_Super_45;
3046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3048727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_SLOOP                            \
3049727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( args[0] < 0 )                      \
3050727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Bad_Argument ); \
3051727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else                                    \
3052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop = args[0];
3053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SMD                         \
3056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.minimum_distance = args[0];
3057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SCVTCI                                     \
3060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
3061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SSWCI                                     \
3064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
3065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3067727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_SSW                                                     \
3068727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.GS.single_width_value = FT_MulFix( args[0],                \
3069727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                           CUR.tt_metrics.scale );
3070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPON            \
3073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.auto_flip = TRUE;
3074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPOFF            \
3077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.auto_flip = FALSE;
3078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDB                             \
3081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.delta_base = (FT_Short)args[0];
3082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDS                              \
3085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.delta_shift = (FT_Short)args[0];
3086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MD  /* nothing */
3089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPPEM              \
3092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CURRENT_Ppem();
3093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note: The pointSize should be irrelevant in a given font program; */
3096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*       we thus decide to return only the ppem.                     */
3097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
3098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS                       \
3100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.metrics.pointSize;
3101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
3103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS                \
3105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CURRENT_Ppem();
3106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */
3108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DUP         \
3111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = args[0];
3112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CLEAR     \
3115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = 0;
3116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SWAP        \
3119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {                    \
3120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  L;        \
3121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       \
3122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       \
3123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L       = args[0]; \
3124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = args[1]; \
3125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = L;       \
3126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DEPTH       \
3130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR.top;
3131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_CINDEX                                  \
3134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  {                                                \
3135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Long  L;                                    \
3136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                   \
3137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                   \
3138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    L = args[0];                                   \
3139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                   \
3140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( L <= 0 || L > CUR.args )                  \
3141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {                                              \
3142727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.pedantic_hinting )                  \
3143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference ); \
3144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      args[0] = 0;                                 \
3145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }                                              \
3146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else                                           \
3147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      args[0] = CUR.stack[CUR.args - L];           \
3148aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  }
3149aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3150aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define DO_JROT                                                    \
3152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    if ( args[1] != 0 )                                            \
3153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    {                                                              \
3154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      if ( args[0] == 0 && CUR.args == 0 )                         \
3155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                      \
3156ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.IP += args[0];                                           \
3157ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      if ( CUR.IP < 0                                           || \
3158ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease           ( CUR.callTop > 0                                  &&   \
3159ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease             CUR.IP > CUR.callStack[CUR.callTop - 1].Def->end ) )  \
3160ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                      \
3161ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.step_ins = FALSE;                                        \
3162aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
3163aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3164aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
3165ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define DO_JMPR                                                  \
3166ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    if ( args[0] == 0 && CUR.args == 0 )                         \
3167ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.error = FT_THROW( Bad_Argument );                      \
3168ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    CUR.IP += args[0];                                           \
3169ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    if ( CUR.IP < 0                                           || \
3170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease         ( CUR.callTop > 0                                  &&   \
3171ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease           CUR.IP > CUR.callStack[CUR.callTop - 1].Def->end ) )  \
3172ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.error = FT_THROW( Bad_Argument );                      \
3173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
3174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define DO_JROF                                                    \
3177ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    if ( args[1] == 0 )                                            \
3178ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    {                                                              \
3179ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      if ( args[0] == 0 && CUR.args == 0 )                         \
3180ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                      \
3181ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.IP += args[0];                                           \
3182ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      if ( CUR.IP < 0                                           || \
3183ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease           ( CUR.callTop > 0                                  &&   \
3184ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease             CUR.IP > CUR.callStack[CUR.callTop - 1].Def->end ) )  \
3185ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        CUR.error = FT_THROW( Bad_Argument );                      \
3186ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.step_ins = FALSE;                                        \
3187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LT                        \
3191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] < args[1] );
3192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LTEQ                       \
3195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] <= args[1] );
3196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GT                        \
3199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] > args[1] );
3200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GTEQ                       \
3203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] >= args[1] );
3204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EQ                         \
3207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] == args[1] );
3208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEQ                        \
3211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] != args[1] );
3212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ODD                                                  \
3215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
3216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EVEN                                                \
3219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
3220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_AND                        \
3223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] && args[1] );
3224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_OR                         \
3227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ( args[0] || args[1] );
3228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NOT          \
3231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = !args[0];
3232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ADD          \
3235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] += args[1];
3236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SUB          \
3239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] -= args[1];
3240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DIV                                               \
3243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] == 0 )                                      \
3244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Divide_By_Zero );                \
3245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else                                                     \
3246727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );
3247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MUL                                    \
3250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    args[0] = FT_MulDiv( args[0], args[1], 64L );
3251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ABS                   \
3254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_ABS( args[0] );
3255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEG          \
3258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = -args[0];
3259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLOOR    \
3262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_PIX_FLOOR( args[0] );
3263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CEILING                    \
3266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = FT_PIX_CEIL( args[0] );
3267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
3269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3270727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_RS                                             \
3271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   {                                                      \
3272727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     FT_ULong  I = (FT_ULong)args[0];                     \
3273727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                          \
3274727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                          \
3275727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     if ( BOUNDSL( I, CUR.storeSize ) )                   \
3276727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     {                                                    \
3277727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       if ( CUR.pedantic_hinting )                        \
3278727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ARRAY_BOUND_ERROR;                               \
3279727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       else                                               \
3280727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         args[0] = 0;                                     \
3281727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     }                                                    \
3282727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     else                                                 \
3283727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     {                                                    \
3284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       /* subpixel hinting - avoid Typeman Dstroke and */ \
3285727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       /* IStroke and Vacuform rounds                  */ \
3286727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                                          \
3287727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       if ( SUBPIXEL_HINTING                           && \
3288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            CUR.ignore_x_mode                          && \
3289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            ( ( I == 24                            &&     \
3290727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                ( CUR.face->sph_found_func_flags &        \
3291727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  ( SPH_FDEF_SPACING_1 |                  \
3292727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    SPH_FDEF_SPACING_2 )         ) ) ||   \
3293727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              ( I == 22                      &&           \
3294727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                ( CUR.sph_in_func_flags    &              \
3295727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  SPH_FDEF_TYPEMAN_STROKES ) )       ||   \
3296727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              ( I == 8                             &&     \
3297727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                ( CUR.face->sph_found_func_flags &        \
3298727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  SPH_FDEF_VACUFORM_ROUND_1      ) &&     \
3299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.iup_called                   ) ) )  \
3300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         args[0] = 0;                                     \
3301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       else                                               \
3302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         args[0] = CUR.storage[I];                        \
3303727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease     }                                                    \
3304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease   }
3305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
3307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_RS                           \
3309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich   {                                    \
3310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     FT_ULong  I = (FT_ULong)args[0];   \
3311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3313aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.storeSize ) ) \
3314aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     {                                  \
3315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       if ( CUR.pedantic_hinting )      \
3316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       {                                \
3317aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         ARRAY_BOUND_ERROR;             \
3318aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       }                                \
3319aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       else                             \
3320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         args[0] = 0;                   \
3321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     }                                  \
3322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     else                               \
3323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       args[0] = CUR.storage[I];        \
3324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3326727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
3327727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
3328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_WS                           \
3330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich   {                                    \
3331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     FT_ULong  I = (FT_ULong)args[0];   \
3332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                                        \
3334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.storeSize ) ) \
3335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     {                                  \
3336aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       if ( CUR.pedantic_hinting )      \
3337aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       {                                \
3338aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         ARRAY_BOUND_ERROR;             \
3339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       }                                \
3340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     }                                  \
3341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     else                               \
3342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich       CUR.storage[I] = args[1];        \
3343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RCVT                          \
3347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                     \
3348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];    \
3349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )    \
3352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                   \
3353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )       \
3354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                 \
3355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;              \
3356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                 \
3357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       else                              \
3358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         args[0] = 0;                    \
3359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                   \
3360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                \
3361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       args[0] = CUR_Func_read_cvt( I ); \
3362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTP                         \
3366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                     \
3367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];    \
3368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                         \
3370aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )    \
3371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                   \
3372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )       \
3373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                 \
3374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;              \
3375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                 \
3376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                   \
3377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                \
3378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       CUR_Func_write_cvt( I, args[1] ); \
3379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTF                                                \
3383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   {                                                            \
3384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     FT_ULong  I = (FT_ULong)args[0];                           \
3385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                                \
3386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                                \
3387aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich     if ( BOUNDSL( I, CUR.cvtSize ) )                           \
3388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     {                                                          \
3389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       if ( CUR.pedantic_hinting )                              \
3390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       {                                                        \
3391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ARRAY_BOUND_ERROR;                                     \
3392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project       }                                                        \
3393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     }                                                          \
3394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     else                                                       \
3395727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease       CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \
3396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   }
3397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3399727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_DEBUG                          \
3400727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Debug_OpCode );
3401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROUND                                                   \
3404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = CUR_Func_round(                                      \
3405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                args[0],                                           \
3406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
3407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NROUND                                                            \
3410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = ROUND_None( args[0],                                           \
3411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
3412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MAX               \
3415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] > args[0] ) \
3416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = args[1];
3417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MIN               \
3420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[1] < args[0] ) \
3421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[0] = args[1];
3422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
3425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  ARRAY_BOUND_ERROR
3428727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define ARRAY_BOUND_ERROR                        \
3429727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {                                            \
3430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Invalid_Reference ); \
3431727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return;                                    \
3432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
3433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */
3438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x00-0x01                                               */
3439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SVTCA( INS_ARG )
3443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SVTCA
3445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */
3451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x02-0x03                                               */
3452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVTCA( INS_ARG )
3456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVTCA
3458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */
3464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x04-0x05                                               */
3465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTCA( INS_ARG )
3469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTCA
3471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVTL[a]:     Set PVector To Line                                     */
3477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x06-0x07                                               */
3478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
3479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVTL( INS_ARG )
3482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVTL
3484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTL[a]:     Set FVector To Line                                     */
3490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x08-0x09                                               */
3491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
3492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTL( INS_ARG )
3495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTL
3497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVTPV[]:     Set FVector To PVector                                  */
3503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0E                                                    */
3504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVTPV( INS_ARG )
3508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVTPV
3510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SPVFS[]:      Set PVector From Stack                                  */
3516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0A                                                    */
3517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f2.14 f2.14 -->                                         */
3518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SPVFS( INS_ARG )
3521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SPVFS
3523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SFVFS[]:      Set FVector From Stack                                  */
3529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0B                                                    */
3530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f2.14 f2.14 -->                                         */
3531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SFVFS( INS_ARG )
3534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SFVFS
3536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GPV[]:        Get Projection Vector                                   */
3542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0C                                                    */
3543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        ef2.14 --> ef2.14                                       */
3544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GPV( INS_ARG )
3547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GPV
3549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GFV[]:        Get Freedom Vector                                      */
3554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0D                                                    */
3555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        ef2.14 --> ef2.14                                       */
3556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GFV( INS_ARG )
3559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GFV
3561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP0[]:       Set Reference Point 0                                   */
3567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x10                                                    */
3568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP0( INS_ARG )
3572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP0
3574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP1[]:       Set Reference Point 1                                   */
3580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x11                                                    */
3581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP1( INS_ARG )
3585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP1
3587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SRP2[]:       Set Reference Point 2                                   */
3593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x12                                                    */
3594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SRP2( INS_ARG )
3598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SRP2
3600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTHG[]:       Round To Half Grid                                      */
3606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x19                                                    */
3607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTHG( INS_ARG )
3611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTHG
3613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTG[]:        Round To Grid                                           */
3619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x18                                                    */
3620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTG( INS_ARG )
3624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTG
3626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RTDG[]:       Round To Double Grid                                    */
3631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3D                                                    */
3632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RTDG( INS_ARG )
3636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RTDG
3638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RUTG[]:       Round Up To Grid                                        */
3643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7C                                                    */
3644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RUTG( INS_ARG )
3648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RUTG
3650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RDTG[]:       Round Down To Grid                                      */
3656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7D                                                    */
3657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RDTG( INS_ARG )
3661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RDTG
3663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROFF[]:       Round OFF                                               */
3669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7A                                                    */
3670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROFF( INS_ARG )
3674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ROFF
3676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SROUND[]:     Super ROUND                                             */
3682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x76                                                    */
3683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        Eint8 -->                                               */
3684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SROUND( INS_ARG )
3687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SROUND
3689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* S45ROUND[]:   Super ROUND 45 degrees                                  */
3695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x77                                                    */
3696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_S45ROUND( INS_ARG )
3700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_S45ROUND
3702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SLOOP[]:      Set LOOP variable                                       */
3708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x17                                                    */
3709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? -->                                              */
3710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SLOOP( INS_ARG )
3713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SLOOP
3715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SMD[]:        Set Minimum Distance                                    */
3721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1A                                                    */
3722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SMD( INS_ARG )
3726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SMD
3728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCVTCI[]:     Set Control Value Table Cut In                          */
3734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1D                                                    */
3735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCVTCI( INS_ARG )
3739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SCVTCI
3741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SSWCI[]:      Set Single Width Cut In                                 */
3747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1E                                                    */
3748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 -->                                               */
3749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SSWCI( INS_ARG )
3752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SSWCI
3754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SSW[]:        Set Single Width                                        */
3760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1F                                                    */
3761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? -->                                              */
3762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SSW( INS_ARG )
3765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SSW
3767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPON[]:     Set auto-FLIP to ON                                     */
3773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4D                                                    */
3774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPON( INS_ARG )
3778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLIPON
3780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
3786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4E                                                    */
3787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack: -->                                                            */
3788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPOFF( INS_ARG )
3791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLIPOFF
3793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SANGW[]:      Set ANGle Weight                                        */
3799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7E                                                    */
3800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SANGW( INS_ARG )
3804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* instruction not supported anymore */
3806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDB[]:        Set Delta Base                                          */
3812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5E                                                    */
3813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDB( INS_ARG )
3817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SDB
3819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDS[]:        Set Delta Shift                                         */
3825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5F                                                    */
3826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
3827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDS( INS_ARG )
3830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SDS
3832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MPPEM[]:      Measure Pixel Per EM                                    */
3838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4B                                                    */
3839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> Euint16                                             */
3840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MPPEM( INS_ARG )
3843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MPPEM
3845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MPS[]:        Measure Point Size                                      */
3851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4C                                                    */
3852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> Euint16                                             */
3853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MPS( INS_ARG )
3856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MPS
3858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DUP[]:        DUPlicate the top stack's element                       */
3864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x20                                                    */
3865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt --> StkElt StkElt                                */
3866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DUP( INS_ARG )
3869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DUP
3871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* POP[]:        POP the stack's top element                             */
3877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x21                                                    */
3878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt -->                                              */
3879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_POP( INS_ARG )
3882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CLEAR[]:      CLEAR the entire stack                                  */
3890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x22                                                    */
3891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt... -->                                           */
3892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CLEAR( INS_ARG )
3895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CLEAR
3897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SWAP[]:       SWAP the stack's top two elements                       */
3903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x23                                                    */
3904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        2 * StkElt --> 2 * StkElt                               */
3905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SWAP( INS_ARG )
3908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SWAP
3910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEPTH[]:      return the stack DEPTH                                  */
3916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x24                                                    */
3917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32                                              */
3918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DEPTH( INS_ARG )
3921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DEPTH
3923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CINDEX[]:     Copy INDEXed element                                    */
3929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x25                                                    */
3930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 --> StkElt                                        */
3931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CINDEX( INS_ARG )
3934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CINDEX
3936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EIF[]:        End IF                                                  */
3942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x59                                                    */
3943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
3944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EIF( INS_ARG )
3947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* nothing to do */
3949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JROT[]:       Jump Relative On True                                   */
3955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x78                                                    */
3956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt int32 -->                                        */
3957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JROT( INS_ARG )
3960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JROT
3962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JMPR[]:       JuMP Relative                                           */
3968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1C                                                    */
3969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 -->                                               */
3970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JMPR( INS_ARG )
3973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JMPR
3975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* JROF[]:       Jump Relative On False                                  */
3981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x79                                                    */
3982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt int32 -->                                        */
3983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_JROF( INS_ARG )
3986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
3987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_JROF
3988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
3989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
3992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LT[]:         Less Than                                               */
3994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x50                                                    */
3995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
3996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
3997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
3998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LT( INS_ARG )
3999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_LT
4001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LTEQ[]:       Less Than or EQual                                      */
4007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x51                                                    */
4008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LTEQ( INS_ARG )
4012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_LTEQ
4014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GT[]:         Greater Than                                            */
4020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x52                                                    */
4021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GT( INS_ARG )
4025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GT
4027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GTEQ[]:       Greater Than or EQual                                   */
4033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x53                                                    */
4034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> bool                                  */
4035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GTEQ( INS_ARG )
4038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_GTEQ
4040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EQ[]:         EQual                                                   */
4046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x54                                                    */
4047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt StkElt --> bool                                  */
4048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EQ( INS_ARG )
4051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_EQ
4053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NEQ[]:        Not EQual                                               */
4059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x55                                                    */
4060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt StkElt --> bool                                  */
4061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NEQ( INS_ARG )
4064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NEQ
4066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ODD[]:        Is ODD                                                  */
4072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x56                                                    */
4073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> bool                                          */
4074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ODD( INS_ARG )
4077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ODD
4079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* EVEN[]:       Is EVEN                                                 */
4085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x57                                                    */
4086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> bool                                          */
4087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_EVEN( INS_ARG )
4090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_EVEN
4092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* AND[]:        logical AND                                             */
4098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5A                                                    */
4099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> uint32                                */
4100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_AND( INS_ARG )
4103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_AND
4105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* OR[]:         logical OR                                              */
4111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5B                                                    */
4112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> uint32                                */
4113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_OR( INS_ARG )
4116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_OR
4118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NOT[]:        logical NOT                                             */
4124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5C                                                    */
4125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt --> uint32                                       */
4126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NOT( INS_ARG )
4129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NOT
4131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ADD[]:        ADD                                                     */
4137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x60                                                    */
4138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ADD( INS_ARG )
4142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ADD
4144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SUB[]:        SUBtract                                                */
4150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x61                                                    */
4151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SUB( INS_ARG )
4155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_SUB
4157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DIV[]:        DIVide                                                  */
4163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x62                                                    */
4164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DIV( INS_ARG )
4168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DIV
4170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MUL[]:        MULtiply                                                */
4176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x63                                                    */
4177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 f26.6 --> f26.6                                   */
4178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MUL( INS_ARG )
4181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MUL
4183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ABS[]:        ABSolute value                                          */
4189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x64                                                    */
4190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ABS( INS_ARG )
4194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ABS
4196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NEG[]:        NEGate                                                  */
4202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x65                                                    */
4203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack: f26.6 --> f26.6                                                */
4204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NEG( INS_ARG )
4207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NEG
4209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLOOR[]:      FLOOR                                                   */
4215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x66                                                    */
4216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLOOR( INS_ARG )
4220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_FLOOR
4222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CEILING[]:    CEILING                                                 */
4228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x67                                                    */
4229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CEILING( INS_ARG )
4233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_CEILING
4235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RS[]:         Read Store                                              */
4241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x43                                                    */
4242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> uint32                                       */
4243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RS( INS_ARG )
4246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RS
4248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WS[]:         Write Store                                             */
4254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x42                                                    */
4255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
4256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WS( INS_ARG )
4259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WS
4261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WCVTP[]:      Write CVT in Pixel units                                */
4267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x44                                                    */
4268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
4269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WCVTP( INS_ARG )
4272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WCVTP
4274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* WCVTF[]:      Write CVT in Funits                                     */
4280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x70                                                    */
4281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
4282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_WCVTF( INS_ARG )
4285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_WCVTF
4287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RCVT[]:       Read CVT                                                */
4293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x45                                                    */
4294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> f26.6                                        */
4295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_RCVT( INS_ARG )
4298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_RCVT
4300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* AA[]:         Adjust Angle                                            */
4306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x7F                                                    */
4307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_AA( INS_ARG )
4311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* intentionally no longer supported */
4313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEBUG[]:      DEBUG.  Unsupported.                                    */
4319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x4F                                                    */
4320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Note: The original instruction pops a value from the stack.           */
4323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DEBUG( INS_ARG )
4326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_DEBUG
4328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROUND[ab]:    ROUND value                                             */
4334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x68-0x6B                                               */
4335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROUND( INS_ARG )
4339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_ROUND
4341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NROUND[ab]:   No ROUNDing of value                                    */
4347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x6C-0x6F                                               */
4348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 --> f26.6                                         */
4349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NROUND( INS_ARG )
4352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_NROUND
4354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MAX[]:        MAXimum                                                 */
4360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x68                                                    */
4361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> int32                                 */
4362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MAX( INS_ARG )
4365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MAX
4367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIN[]:        MINimum                                                 */
4373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x69                                                    */
4374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? int32? --> int32                                 */
4375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIN( INS_ARG )
4378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    DO_MIN
4380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
4384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The following functions are called as is within the switch statement. */
4389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MINDEX[]:     Move INDEXed element                                    */
4396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x26                                                    */
4397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? --> StkElt                                       */
4398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MINDEX( INS_ARG )
4401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  L, K;
4403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = args[0];
4406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( L <= 0 || L > CUR.args )
4408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4409aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
4410727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
4411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4412aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    else
4413aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    {
4414aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      K = CUR.stack[CUR.args - L];
4415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4416aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],
4417aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     &CUR.stack[CUR.args - L + 1],
4418aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                     ( L - 1 ) );
4419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4420aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.stack[CUR.args - 1] = K;
4421aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
4422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ROLL[]:       ROLL top three elements                                 */
4428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8A                                                    */
4429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        3 * StkElt --> 3 * StkElt                               */
4430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ROLL( INS_ARG )
4433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  A, B, C;
4435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_EXEC;
4437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = args[2];
4440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    B = args[1];
4441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    C = args[0];
4442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[2] = C;
4444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[1] = A;
4445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = B;
4446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING THE FLOW OF CONTROL                                          */
4452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
4454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
4459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  SkipCode( EXEC_OP )
4460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += CUR.length;
4462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.IP < CUR.codeSize )
4464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.opcode = CUR.code[CUR.IP];
4466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.length = opcode_length[CUR.opcode];
4468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.length < 0 )
4469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
447041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        if ( CUR.IP + 1 >= CUR.codeSize )
4471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail_Overflow;
4472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
4473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP + CUR.length <= CUR.codeSize )
4476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return SUCCESS;
4477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail_Overflow:
4480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Code_Overflow );
4481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return FAILURE;
4482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IF[]:         IF test                                                 */
4488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x58                                                    */
4489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        StkElt -->                                              */
4490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IF( INS_ARG )
4493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int   nIfs;
4495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Bool  Out;
4496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] != 0 )
4499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nIfs = 1;
4502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    Out = 0;
4503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
4505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( SKIP_Code() == FAILURE )
4507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x58:      /* IF */
4512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs++;
4513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x1B:      /* ELSE */
4516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Out = FT_BOOL( nIfs == 1 );
4517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x59:      /* EIF */
4520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs--;
4521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        Out = FT_BOOL( nIfs == 0 );
4522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( Out == 0 );
4525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ELSE[]:       ELSE                                                    */
4531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x1B                                                    */
4532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
4533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ELSE( INS_ARG )
4536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  nIfs;
4538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
4540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nIfs = 1;
4543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
4545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( SKIP_Code() == FAILURE )
4547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x58:    /* IF */
4552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs++;
4553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x59:    /* EIF */
4556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        nIfs--;
4557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( nIfs != 0 );
4560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */
4566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
4568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FDEF[]:       Function DEFinition                                     */
4575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2C                                                    */
4576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
4577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FDEF( INS_ARG )
4580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       n;
4582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  rec;
4583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit;
4584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4585727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* arguments to opcodes are skipped by `SKIP_Code' */
4587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Byte    opcode_pattern[9][12] = {
4588727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #0 inline delta function 1 */
4589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x4B, /* PPEM    */
4591727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x53, /* GTEQ    */
4592727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4593727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x4B, /* PPEM    */
4594727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x51, /* LTEQ    */
4595727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x5A, /* AND     */
4596727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58, /* IF      */
4597727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x38, /*   SHPIX */
4598727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x1B, /* ELSE    */
4599727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4600727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4601727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x59  /* EIF     */
4602727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4603727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #1 inline delta function 2 */
4604727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4605727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x4B, /* PPEM    */
4606727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x54, /* EQ      */
4607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58, /* IF      */
4608727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x38, /*   SHPIX */
4609727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x1B, /* ELSE    */
4610727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4611727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x21, /*   POP   */
4612727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x59  /* EIF     */
4613727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4614727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #2 diagonal stroke function */
4615727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4616727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4618727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   1     */
4620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x60, /* ADD     */
4621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x46, /* GC_cur  */
4622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   64    */
4624727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4625727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x42  /* WS      */
4626727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4627727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #3 VacuFormRound function */
4628727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x45, /* RCVT    */
4630727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4631727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x46, /* GC_cur  */
4632727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x60, /* ADD     */
4633727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0  /* PUSHB_1 */
4635727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   38    */
4636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #4 TTFautohint bytecode (old) */
4638727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4640727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x64, /* ABS     */
4641727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4642727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   32    */
4643727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x60, /* ADD     */
4644727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x66, /* FLOOR   */
4645727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x23, /* SWAP    */
4646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0  /* PUSHB_1 */
4647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4648727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #5 spacing function 1 */
4649727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x01, /* SVTCA_x */
4651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   24    */
4653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x43, /* RS      */
4654727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58  /* IF      */
4655727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4656727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #6 spacing function 2 */
4657727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4658727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x01, /* SVTCA_x */
4659727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x18, /* RTG     */
4660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   24    */
4662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x43, /* RS      */
4663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x58  /* IF      */
4664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #7 TypeMan Talk DiagEndCtrl function */
4666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x01, /* SVTCA_x */
4668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x20, /* DUP     */
4669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0xB0, /* PUSHB_1 */
4670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         /*   3     */
4671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x25, /* CINDEX  */
4672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4673727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 /* #8 TypeMan Talk Align */
4674727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 {
4675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x06, /* SPVTL   */
4676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   0x7D, /* RDTG    */
4677727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 },
4678727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               };
4679727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_patterns   = 9;
4680727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_pointer[9] = {  0, 0, 0, 0, 0, 0, 0, 0, 0 };
4681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_size[9]    = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
4682727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  i;
4683727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* some font programs are broken enough to redefine functions! */
4687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We will then parse the current table.                       */
4688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    rec   = CUR.FDefs;
4690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = rec + CUR.numFDefs;
4691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    n     = args[0];
4692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; rec < limit; rec++ )
4694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( rec->opc == n )
4696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
4697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( rec == limit )
4700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check that there is enough room for new functions */
4702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.numFDefs >= CUR.maxFDefs )
4703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4704727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Too_Many_Function_Defs );
4705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.numFDefs++;
4708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4710295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* Although FDEF takes unsigned 32-bit integer,  */
4711295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* func # must be within unsigned 16-bit integer */
4712295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( n > 0xFFFFU )
4713295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
4714727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Too_Many_Function_Defs );
4715295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
4716295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
4717295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
4718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->range          = CUR.curRange;
4719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->opc            = (FT_UInt16)n;
4720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->start          = CUR.IP + 1;
4721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->active         = TRUE;
4722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->inline_delta   = FALSE;
4723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    rec->sph_fdef_flags = 0x0000;
4724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n > CUR.maxFunc )
4726295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.maxFunc = (FT_UInt16)n;
4727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* We don't know for sure these are typeman functions, */
4730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* however they are only active when RS 22 is called   */
4731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( n >= 64 && n <= 66 )
4732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
4733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
4734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now skip the whole function definition. */
4736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We don't allow nested IDEFS & FDEFs.    */
4737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( SKIP_Code() == SUCCESS )
4739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4741727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4742727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4743727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING )
4744727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
4745727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        for ( i = 0; i < opcode_patterns; i++ )
4746727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
4747727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( opcode_pointer[i] < opcode_size[i]                 &&
4748727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
4749727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
4750727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] += 1;
4751727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4752727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( opcode_pointer[i] == opcode_size[i] )
4753727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
4754727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              FT_TRACE7(( "sph: Function %d, opcode ptrn: %d, %s %s\n",
4755727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          i, n,
4756727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.family_name,
4757727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.style_name ));
4758727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4759727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              switch ( i )
4760727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              {
4761727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 0:
4762727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_1;
4763727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
4764727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4765727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4766727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 1:
4767727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_2;
4768727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
4769727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 2:
4772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  /* needs to be implemented still */
4775727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 58:
4776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_DIAGONAL_STROKE;
4777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
4778727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4779727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4780727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4781727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 3:
4782727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4783727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4784727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 0:
4785727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_VACUFORM_ROUND_1;
4786727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
4787727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4788727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4789727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4790727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 4:
4791727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* probably not necessary to detect anymore */
4792727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                rec->sph_fdef_flags            |= SPH_FDEF_TTFAUTOHINT_1;
4793727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
4794727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4795727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4796727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 5:
4797727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4798727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4799727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 0:
4800727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 1:
4801727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 2:
4802727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 4:
4803727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 7:
4804727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 8:
4805727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_1;
4806727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
4807727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4808727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4809727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4810727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 6:
4811727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                switch ( n )
4812727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                {
4813727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 0:
4814727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 1:
4815727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 2:
4816727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 4:
4817727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 7:
4818727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                case 8:
4819727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_2;
4820727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
4821727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                }
4822727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
4823727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4824727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               case 7:
4825727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4826727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4827727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 break;
4828727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4829727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               case 8:
4830727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0
4831727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4832727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
4833727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
4834727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 break;
4835727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              }
4836727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              opcode_pointer[i] = 0;
4837727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
4838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
4839727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4840727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
4841727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] = 0;
4842727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
4843727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4844727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Set sph_compatibility_mode only when deltas are detected */
4845727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.face->sph_compatibility_mode =
4846727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
4847727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
4848727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
4849727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4850727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4851727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
4853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
4854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x89:    /* IDEF */
4855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2C:    /* FDEF */
4856727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Nested_DEFS );
4857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2D:   /* ENDF */
486041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        rec->end = CUR.IP;
4861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
4862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
4863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ENDF[]:       END Function definition                                 */
4870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2D                                                    */
4871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
4872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ENDF( INS_ARG )
4875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*  pRec;
4877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
4879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4881727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4882727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.sph_in_func_flags = 0x0000;
4883727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4884727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */
4886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4887727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( ENDF_In_Exec_Stream );
4888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.callTop--;
4892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pRec = &CUR.callStack[CUR.callTop];
4894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pRec->Cur_Count--;
4896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
4898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( pRec->Cur_Count > 0 )
4900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.callTop++;
4902ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      CUR.IP = pRec->Def->start;
4903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
4905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* Loop through the current function */
4906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      INS_Goto_CodeRange( pRec->Caller_Range,
4907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          pRec->Caller_IP );
4908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Exit the current call frame.                      */
4910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* NOTE: If the last instruction of a program is a   */
4912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       CALL or LOOPCALL, the return address is     */
4913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       always out of the code range.  This is a    */
4914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       valid address, and it is why we do not test */
4915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*       the result of Ins_Goto_CodeRange() here!    */
4916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
4917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
4920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* CALL[]:       CALL function                                           */
4922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2B                                                    */
4923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
4924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
4925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
4926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_CALL( INS_ARG )
4927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
4928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       F;
4929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*    pCrec;
4930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
4931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first of all, check the index */
4934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    F = args[0];
4936aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
4937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Except for some old Apple fonts, all functions in a TrueType */
4940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* font are defined in increasing order, starting from 0.  This */
4941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* means that we normally have                                  */
4942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
4944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
4945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
4946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If this isn't true, we need to look up the function table.   */
4947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def = CUR.FDefs + F;
4949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
4950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look up the FDefs table */
4952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_DefRecord*  limit;
4953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      def   = CUR.FDefs;
4956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      limit = def + CUR.numFDefs;
4957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( def < limit && def->opc != F )
4959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        def++;
4960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def == limit )
4962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
4963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that the function is active */
4966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !def->active )
4967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
4968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4969727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
4970727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                              &&
4971727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                             &&
4972727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( ( CUR.iup_called                                        &&
4973727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
4974727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 )       ) )
4975727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
4976727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
4977727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.sph_in_func_flags = def->sph_fdef_flags;
4978727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
4979727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
4980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check the call stack */
4981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop >= CUR.callSize )
4982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
4983727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
4984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
4985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
4986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec = CUR.callStack + CUR.callTop;
4988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Caller_Range = CUR.curRange;
4990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Caller_IP    = CUR.IP + 1;
4991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    pCrec->Cur_Count    = 1;
4992ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    pCrec->Def          = def;
4993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.callTop++;
4995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    INS_Goto_CodeRange( def->range,
4997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        def->start );
4998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
4999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
5000727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
5002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
5004727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Invalid_Reference );
5005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* LOOPCALL[]:   LOOP and CALL function                                  */
5011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2A                                                    */
5012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? Eint16? -->                                     */
5013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_LOOPCALL( INS_ARG )
5016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong       F;
5018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_CallRec*    pCrec;
5019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
5020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* first of all, check the index */
5023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    F = args[1];
5024aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
5025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
5026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Except for some old Apple fonts, all functions in a TrueType */
5028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* font are defined in increasing order, starting from 0.  This */
5029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* means that we normally have                                  */
5030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
5031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
5032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
5033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*                                                              */
5034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* If this isn't true, we need to look up the function table.   */
5035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def = CUR.FDefs + F;
5037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
5038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* look up the FDefs table */
5040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      TT_DefRecord*  limit;
5041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      def   = CUR.FDefs;
5044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      limit = def + CUR.numFDefs;
5045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( def < limit && def->opc != F )
5047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        def++;
5048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def == limit )
5050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
5051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check that the function is active */
5054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !def->active )
5055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
5056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5057727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
5058727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                    &&
5059727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                   &&
5060727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
5061727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
5062727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
5063727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.sph_in_func_flags = def->sph_fdef_flags;
5064727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
5065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* check stack */
5067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.callTop >= CUR.callSize )
5068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5069727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( args[0] > 0 )
5074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec = CUR.callStack + CUR.callTop;
5076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Caller_Range = CUR.curRange;
5078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Caller_IP    = CUR.IP + 1;
5079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      pCrec->Cur_Count    = (FT_Int)args[0];
5080ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      pCrec->Def          = def;
5081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.callTop++;
5083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      INS_Goto_CodeRange( def->range, def->start );
5085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.step_ins = FALSE;
5087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5088727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return;
5090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
5092727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Invalid_Reference );
5093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IDEF[]:       Instruction DEFinition                                  */
5099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x89                                                    */
5100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        Eint8 -->                                               */
5101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IDEF( INS_ARG )
5104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def;
5106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit;
5107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  First of all, look for the same function in our table */
5110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def   = CUR.IDefs;
5112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    limit = def + CUR.numIDefs;
5113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; def < limit; def++ )
5115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( def->opc == (FT_ULong)args[0] )
5116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
5117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( def == limit )
5119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check that there is enough room for a new instruction */
5121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.numIDefs >= CUR.maxIDefs )
5122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5123727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Too_Many_Instruction_Defs );
5124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
5125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.numIDefs++;
5127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5129295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    /* opcode must be unsigned 8-bit integer */
5130295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    if ( 0 > args[0] || args[0] > 0x00FF )
5131295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    {
5132727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Too_Many_Instruction_Defs );
5133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      return;
5134295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    }
5135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
5136295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    def->opc    = (FT_Byte)args[0];
5137aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    def->start  = CUR.IP + 1;
5138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def->range  = CUR.curRange;
5139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    def->active = TRUE;
5140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( (FT_ULong)args[0] > CUR.maxIns )
5142295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      CUR.maxIns = (FT_Byte)args[0];
5143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Now skip the whole function definition. */
5145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* We don't allow nested IDEFs & FDEFs.    */
5146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( SKIP_Code() == SUCCESS )
5148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( CUR.opcode )
5150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x89:   /* IDEF */
5152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2C:   /* FDEF */
5153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Nested_DEFS );
5154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
5155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case 0x2D:   /* ENDF */
5156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
5157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */
5165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
5167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NPUSHB[]:     PUSH N Bytes                                            */
5174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x40                                                    */
5175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32...                                           */
5176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NPUSHB( INS_ARG )
5179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)CUR.code[CUR.IP + 1];
5184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 1; K <= L; K++ )
5192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K - 1] = CUR.code[CUR.IP + K + 1];
5193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top += L;
5195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* NPUSHW[]:     PUSH N Words                                            */
5201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x41                                                    */
5202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> int32...                                            */
5203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_NPUSHW( INS_ARG )
5206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)CUR.code[CUR.IP + 1];
5211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP += 2;
5219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 0; K < L; K++ )
5221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K] = GET_ShortIns();
5222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
5224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top += L;
5225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHB[abc]:   PUSH Bytes                                              */
5231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xB0-0xB7                                               */
5232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> uint32...                                           */
5233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_PUSHB( INS_ARG )
5236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
5241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 1; K <= L; K++ )
5249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K - 1] = CUR.code[CUR.IP + K];
5250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* PUSHW[abc]:   PUSH Words                                              */
5256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xB8-0xBF                                               */
5257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        --> int32...                                            */
5258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_PUSHW( INS_ARG )
5261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L, K;
5263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
5266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
5268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Stack_Overflow );
5270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.IP++;
5274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( K = 0; K < L; K++ )
5276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      args[K] = GET_ShortIns();
5277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.step_ins = FALSE;
5279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING THE GRAPHICS STATE                                           */
5285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Instructions appear in the specs' order.                             */
5287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GC[a]:        Get Coordinate projected onto                           */
5294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x46-0x47                                               */
5295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> f26.6                                        */
5296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
529741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */
529841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*      along the dual projection vector!                                */
5299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GC( INS_ARG )
5302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    L;
5304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  R;
5305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_ULong)args[0];
5308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDSL( L, CUR.zp2.n_points ) )
5310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5312727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5313aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      R = 0;
5314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.opcode & 1 )
5318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        R = CUR_fast_dualproj( &CUR.zp2.org[L] );
5319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        R = CUR_fast_project( &CUR.zp2.cur[L] );
5321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = R;
5324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCFS[]:       Set Coordinate From Stack                               */
5330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x48                                                    */
5331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
5332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Formula:                                                              */
5334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */
5336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCFS( INS_ARG )
5339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    K;
5341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  L;
5342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( L, CUR.zp2.n_points ) )
5347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5349727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = CUR_fast_project( &CUR.zp2.cur[L] );
5354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp2, L, args[1] - K );
5356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5357aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
5358aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
5359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep2 == 0 )
5360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.org[L] = CUR.zp2.cur[L];
5361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MD[a]:        Measure Distance                                        */
5367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x49-0x4A                                               */
5368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 --> f26.6                                 */
5369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
537041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */
537141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                    the dual projection vector.                        */
5372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
537341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */
537441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                      0 => measure distance in original outline        */
537541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                      1 => measure distance in grid-fitted outline     */
5376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
537741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */
5378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MD( INS_ARG )
5381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   K, L;
5383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  D;
5384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5389aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( L, CUR.zp0.n_points ) ||
5390aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDS( K, CUR.zp1.n_points ) )
5391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5393727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      D = 0;
5395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.opcode & 1 )
5399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
5400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
540227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra        /* XXX: UNDOCUMENTED: twilight zone special case */
5403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
540427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
5405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
540627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec1 = CUR.zp0.org + L;
540727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec2 = CUR.zp1.org + K;
540827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
540927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
5410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          D = CUR_Func_dualproj( vec1, vec2 );
5411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
5413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
541427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec1 = CUR.zp0.orus + L;
541527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          FT_Vector*  vec2 = CUR.zp1.orus + K;
5416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
541827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
541927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          {
542027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            /* this should be faster */
542127811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = CUR_Func_dualproj( vec1, vec2 );
5422727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            D = FT_MulFix( D, CUR.metrics.x_scale );
542327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          }
542427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          else
542527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          {
542627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            FT_Vector  vec;
542727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
5428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5429727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
5430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
543127811904d8de0ce5591417812ca31163bf5aad60Geremy Condra
543227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra            D = CUR_fast_dualproj( &vec );
543327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra          }
5434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5438727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
5439727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
5440727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                       &&
5441727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode && FT_ABS( D ) == 64 )
5442727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      D += 1;
5443727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
5444727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = D;
5446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SDPVTL[a]:    Set Dual PVector to Line                                */
5452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x86-0x87                                               */
5453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SDPVTL( INS_ARG )
5457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    A, B, C;
5459aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */
5460aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FT_Int     aOpc = CUR.opcode;
5461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = (FT_UShort)args[1];
5464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = (FT_UShort)args[0];
5465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( p2, CUR.zp1.n_points ) ||
5467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( p1, CUR.zp2.n_points ) )
5468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5470727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector* v1 = CUR.zp1.org + p2;
5476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector* v2 = CUR.zp2.org + p1;
5477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = v1->x - v2->x;
5480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = v1->y - v2->y;
5481aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
5482aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* If v1 == v2, SDPVTL behaves the same as */
5483aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* SVTCA[X], respectively.                 */
5484aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /*                                         */
5485aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      /* Confirmed by Greg Hitchcock.            */
5486aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
5487aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( A == 0 && B == 0 )
5488aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
5489aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        A    = 0x4000;
5490aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        aOpc = 0;
5491aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
5492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5494aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( ( aOpc & 1 ) != 0 )
5495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
5497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
5498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
5499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, &CUR.GS.dualVector );
5502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  v1 = CUR.zp1.cur + p2;
5505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  v2 = CUR.zp2.cur + p1;
5506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = v1->x - v2->x;
5509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = v1->y - v2->y;
5510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
5511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( A == 0 && B == 0 )
5512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
5513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        A    = 0x4000;
5514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        aOpc = 0;
5515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
5516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5518aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( ( aOpc & 1 ) != 0 )
5519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      C =  B;   /* counter clockwise rotation */
5521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B =  A;
5522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = -C;
5523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NORMalize( A, B, &CUR.GS.projVector );
5526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    GUESS_VECTOR( freeVector );
5528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
5530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP0[]:       Set Zone Pointer 0                                      */
5536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x13                                                    */
5537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP0( INS_ARG )
5541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.twilight;
5546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.pts;
5550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep0 = (FT_UShort)args[0];
5559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP1[]:       Set Zone Pointer 1                                      */
5565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x14                                                    */
5566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP1( INS_ARG )
5570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1 = CUR.twilight;
5575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1 = CUR.pts;
5579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5583727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep1 = (FT_UShort)args[0];
5588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SZP2[]:       Set Zone Pointer 2                                      */
5594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x15                                                    */
5595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZP2( INS_ARG )
5599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2 = CUR.twilight;
5604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2 = CUR.pts;
5608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5612727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep2 = (FT_UShort)args[0];
5617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
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  /* SZPS[]:       Set Zone PointerS                                       */
5623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x16                                                    */
5624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
5625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SZPS( INS_ARG )
5628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    switch ( (FT_Int)args[0] )
5630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 0:
5632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.twilight;
5633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    case 1:
5636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0 = CUR.pts;
5637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      break;
5638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    default:
5640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5641727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp1 = CUR.zp0;
5646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp2 = CUR.zp0;
5647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep0 = (FT_UShort)args[0];
5649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep1 = (FT_UShort)args[0];
5650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.gep2 = (FT_UShort)args[0];
5651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* INSTCTRL[]:   INSTruction ConTRoL                                     */
5657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8e                                                    */
5658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32 int32 -->                                         */
5659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_INSTCTRL( INS_ARG )
5662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  K, L;
5664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = args[1];
5667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = args[0];
5668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( K < 1 || K > 2 )
5670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( L != 0 )
5677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        L = K;
5678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.instruct_control = FT_BOOL(
5680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
5681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCANCTRL[]:   SCAN ConTRoL                                            */
5687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x85                                                    */
5688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
5689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCANCTRL( INS_ARG )
5692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int  A;
5694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Get Threshold */
5697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    A = (FT_Int)( args[0] & 0xFF );
5698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( A == 0xFF )
5700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( A == 0 )
5705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
57100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
5711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
5714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
5717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = TRUE;
5718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
57190a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
5720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
5723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
5726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_control = FALSE;
5727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SCANTYPE[]:   SCAN TYPE                                               */
5733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x8D                                                    */
5734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32? -->                                             */
5735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SCANTYPE( INS_ARG )
5738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
57390a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( args[0] >= 0 )
5740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.scan_type = (FT_Int)args[0];
5741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MANAGING OUTLINES                                                     */
5747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*   Instructions appear in the specification's order.                   */
5749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPPT[]:     FLIP PoinT                                              */
5756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x80                                                    */
5757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
5758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPPT( INS_ARG )
5761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  point;
5763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
5765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
5768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5769aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Too_Few_Arguments );
5771aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.pts.n_points ) )
5781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5784727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
5785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
5790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
5792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5794aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
5795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
5796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
5797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPRGON[]:   FLIP RanGe ON                                           */
5803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x81                                                    */
5804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPRGON( INS_ARG )
5808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  I, K, L;
5810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( K, CUR.pts.n_points ) ||
5816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( L, CUR.pts.n_points ) )
5817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5819727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( I = L; I <= K; I++ )
5824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
5825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* FLIPRGOFF:    FLIP RanGe OFF                                          */
5831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x82                                                    */
5832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
5833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_FLIPRGOFF( INS_ARG )
5836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  I, K, L;
5838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = (FT_UShort)args[1];
5841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    L = (FT_UShort)args[0];
5842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( K, CUR.pts.n_points ) ||
5844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( L, CUR.pts.n_points ) )
5845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5847727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( I = L; I <= K; I++ )
5852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
5853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Bool
5857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,
5858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_F26Dot6*   y,
5859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       TT_GlyphZone  zone,
5860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       FT_UShort*    refp )
5861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_GlyphZoneRec  zp;
5863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        p;
5864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6       d;
5865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.opcode & 1 )
5868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zp = CUR.zp0;
5870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      p  = CUR.GS.rp1;
5871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      zp = CUR.zp1;
5875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      p  = CUR.GS.rp2;
5876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( p, zp.n_points ) )
5879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
5881727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *refp = 0;
5883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return FAILURE;
5884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *zone = zp;
5887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *refp = p;
5888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    d = CUR_Func_project( zp.cur + p, zp.org + p );
5890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *x = d;
5897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *y = 0;
5898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *x = 0;
5902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        *y = d;
5903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
5906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5908727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );
5909727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );
5910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return SUCCESS;
5913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,
5918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  dx,
5919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_F26Dot6  dy,
5920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_Bool     touch )
5921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
5923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
5924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
5926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.cur[point].x += dx;
5928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( touch )
5929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
5930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
5932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.cur[point].y += dy;
5934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( touch )
5935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
5936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
5940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x != 0 )
5942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x += dx;
5944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( touch )
5945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
5946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.y != 0 )
5949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y += dy;
5951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( touch )
5952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
5953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
5955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
5958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHP[a]:       SHift Point by the last point                           */
5960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x32-0x33                                               */
5961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
5962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
5963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
5964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHP( INS_ARG )
5965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
5966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_GlyphZoneRec  zp;
5967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        refp;
5968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6       dx,
5970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     dy;
5971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort        point;
5972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
5974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
5977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5978aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
5979727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
5980aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
5981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
5982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
5984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
5985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
5987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
5988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
5989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
5990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
5991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
5992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
5993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
5994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
5995727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
5996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
5997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
5998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
5999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6000727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6001727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* doesn't follow Cleartype spec but produces better result */
6002727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING  &&
6003727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode )
6004727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        MOVE_Zp2_Point( point, 0, dy, TRUE );
6005727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6006727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( point, dx, dy, TRUE );
6008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
6010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6012aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHC[a]:       SHift Contour                                           */
6021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x34-35                                                 */
6022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
602441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */
602541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*               contour in the twilight zone, namely contour number     */
6026727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  /*               zero which includes all points of it.                   */
602741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier  /*                                                                       */
6028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHC( INS_ARG )
6030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
603141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    TT_GlyphZoneRec  zp;
603241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        refp;
603341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_F26Dot6       dx, dy;
6034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
603541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_Short         contour, bounds;
603641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        start, limit, i;
6037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    contour = (FT_UShort)args[0];
604041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
6041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
604241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( BOUNDS( contour, bounds ) )
6043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6045727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
6050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( contour == 0 )
605341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      start = 0;
6054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
605541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
605641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.zp2.first_point );
6057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
605841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* we use the number of points if in the twilight zone */
605941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.GS.gep2 == 0 )
606041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = CUR.zp2.n_points;
606141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    else
606241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)( CUR.zp2.contours[contour] -
606341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.zp2.first_point + 1 );
6064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
606541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    for ( i = start; i < limit; i++ )
6066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( zp.cur != CUR.zp2.cur || refp != i )
6068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( i, dx, dy, TRUE );
6069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHZ[a]:       SHift Zone                                              */
6076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x36-37                                                 */
6077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHZ( INS_ARG )
6081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6082aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    TT_GlyphZoneRec  zp;
6083aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_UShort        refp;
6084aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    FT_F26Dot6       dx,
6085aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich                     dy;
6086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
608741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    FT_UShort        limit, i;
6088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( args[0], 2 ) )
6091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6093727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
6098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
610041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
610141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      Twilight zone has no real contours, so use `n_points'. */
610241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      Normal zone's `n_points' includes phantoms, so must    */
610341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    /*      use end of last contour.                               */
610441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    if ( CUR.GS.gep2 == 0 )
610541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)CUR.zp2.n_points;
6106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 )
610741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
6108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
610941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      limit = 0;
6110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
611241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier    for ( i = 0; i < limit; i++ )
6113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( zp.cur != CUR.zp2.cur || refp != i )
6115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( i, dx, dy, FALSE );
6116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SHPIX[]:      SHift points by a PIXel amount                          */
6123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x38                                                    */
6124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32... -->                                     */
6125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_SHPIX( INS_ARG )
6128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx, dy;
6130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6131727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6132727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Int      B1, B2;
6133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop + 1 )
6137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6138aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
6139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6140aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
6144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
6145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.both_x_axis )
6147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        dx = (FT_UInt32)args[0];
6149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dy = 0;
6150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        dx = 0;
6154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        dy = (FT_UInt32)args[0];
6155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
6159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6160295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
6161295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
6162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
6165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
6167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
6169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
6171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
6173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
6175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
6176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6180727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
6181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*  If not using ignore_x_mode rendering, allow ZP2 move.          */
6182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*  If inline deltas aren't allowed, skip ZP2 move.                */
6183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*  If using ignore_x_mode rendering, allow ZP2 point move if:     */
6184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - freedom vector is y and sph_compatibility_mode is off       */
6185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - the glyph is composite and the move is in the Y direction   */
6186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - the glyph is specifically set to allow SHPIX moves          */
6187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*   - the move is on a previously Y-touched point                 */
6188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( SUBPIXEL_HINTING  &&
6190727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             CUR.ignore_x_mode )
6191727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
6192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* save point for later comparison */
6193727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( CUR.GS.freeVector.y != 0 )
6194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            B1 = CUR.zp2.cur[point].y;
6195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
6196727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            B1 = CUR.zp2.cur[point].x;
6197727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6198727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( !CUR.face->sph_compatibility_mode &&
6199727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               CUR.GS.freeVector.y != 0          )
6200727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
6201727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            MOVE_Zp2_Point( point, dx, dy, TRUE );
6202727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6203727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* save new point */
6204727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.GS.freeVector.y != 0 )
6205727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
6206727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              B2 = CUR.zp2.cur[point].y;
6207727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6208727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* reverse any disallowed moves */
6209727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
6210727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( B1 & 63 ) != 0                                          &&
6211727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( B2 & 63 ) != 0                                          &&
6212727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    B1 != B2                                                 )
6213727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                MOVE_Zp2_Point( point, -dx, -dy, TRUE );
6214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
6215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
6216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else if ( CUR.face->sph_compatibility_mode )
6217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
6218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
6219727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
6220727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              dx = FT_PIX_ROUND( B1 + dx ) - B1;
6221727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              dy = FT_PIX_ROUND( B1 + dy ) - B1;
6222727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
6223727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6224727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* skip post-iup deltas */
6225727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.iup_called                                          &&
6226727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
6227727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
6228727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              goto Skip;
6229727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6230727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
6231727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||
6232727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )   ||
6233727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX )     )   )
6234727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              MOVE_Zp2_Point( point, 0, dy, TRUE );
6235727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* save new point */
6237727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( CUR.GS.freeVector.y != 0 )
6238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
6239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              B2 = CUR.zp2.cur[point].y;
6240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* reverse any disallowed moves */
6242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( ( B1 & 63 ) == 0 &&
6243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( B2 & 63 ) != 0 &&
6244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   B1 != B2         )
6245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                MOVE_Zp2_Point( point, 0, -dy, TRUE );
6246727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
6247727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
6248727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
6249727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            MOVE_Zp2_Point( point, dx, dy, TRUE );
6250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
6251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        else
6252727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          MOVE_Zp2_Point( point, dx, dy, TRUE );
6253727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
6254727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    Skip:
6256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6257727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        MOVE_Zp2_Point( point, dx, dy, TRUE );
6260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6262727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
6264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6266aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */
6275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3A-0x3B                                               */
6276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        f26.6 uint32 -->                                        */
6277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MSIRP( INS_ARG )
6280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6285ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_F26Dot6  control_value_cutin = 0; /* pacify compiler */
6286727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6287727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING )
6289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6290727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      control_value_cutin = CUR.GS.control_value_cutin;
6291727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6292727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode                                 &&
6293727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0                          &&
6294727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6295727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        control_value_cutin = 0;
6296727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6297727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6298727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6310aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
6311aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
6312aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    if ( CUR.GS.gep1 == 0 )
6313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
6315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR_Func_move_orig( &CUR.zp1, point, args[1] );
6316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.cur[point] = CUR.zp1.org[point];
6317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_project( CUR.zp1.cur + point,
6320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp0.cur + CUR.GS.rp0 );
6321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6322727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6323727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* subpixel hinting - make MSIRP respect CVT cut-in; */
6324727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                    &&
6325727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                   &&
6326727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                            &&
6327727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         FT_ABS( distance - args[1] ) >= control_value_cutin )
6328727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      distance = args[1];
6329727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, args[1] - distance );
6332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )
6337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MDAP[a]:      Move Direct Absolute Point                              */
6344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x2E-0x2F                                               */
6345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MDAP( INS_ARG )
6349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6351727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  cur_dist;
6352727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  distance;
6353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point, CUR.zp0.n_points ) )
6358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6360727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 1 ) != 0 )
6365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
6367727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6368727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING         &&
6369727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode        &&
6370727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0 )
6371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = ROUND_None(
6372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     cur_dist,
6373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     CUR.tt_metrics.compensations[0] ) - cur_dist;
6374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6376727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = CUR_Func_round(
6377727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     cur_dist,
6378727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     CUR.tt_metrics.compensations[0] ) - cur_dist;
6379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = 0;
6382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, point, distance );
6384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = point;
6386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = point;
6387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
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  /* MIAP[a]:      Move Indirect Absolute Point                            */
6393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3E-0x3F                                               */
6394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
6395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIAP( INS_ARG )
6398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    cvtEntry;
6400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  distance;
6402727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  org_dist;
6403727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  control_value_cutin;
6404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    control_value_cutin = CUR.GS.control_value_cutin;
6407727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    cvtEntry            = (FT_ULong)args[1];
6408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    point               = (FT_UShort)args[0];
6409727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6410727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6411727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                  &&
6412727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                 &&
6413727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                          &&
6414727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.y == 0                          &&
6415727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6416727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      control_value_cutin = 0;
6417727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6419aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( point,     CUR.zp0.n_points ) ||
6420aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDSL( cvtEntry, CUR.cvtSize )      )
6421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6423727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6424aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6427aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!                                                      */
6428aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6429aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* The behaviour of an MIAP instruction is quite different when used  */
6430aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* in the twilight zone.                                              */
6431aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6432aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* First, no control value cut-in test is performed as it would fail  */
6433aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */
6434aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* zp0.point, is set to the absolute, unrounded distance found in the */
6435aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* CVT.                                                               */
6436aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6437aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* This is used in the CVT programs of the Microsoft fonts Arial,     */
6438aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Times, etc., in order to re-adjust some key font heights.  It      */
6439aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* allows the use of the IP instruction in the twilight zone, which   */
6440aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* otherwise would be invalid according to the specification.         */
6441aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6442aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* We implement it with a special sequence for the twilight zone.     */
6443aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* This is a bad hack, but it seems to work.                          */
6444aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /*                                                                    */
6445aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* Confirmed by Greg Hitchcock.                                       */
6446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_read_cvt( cvtEntry );
6448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */
6450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6451727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6452727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
6453727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Determined via experimentation and may be incorrect...         */
6454727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( !SUBPIXEL_HINTING                     ||
6455727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( !CUR.ignore_x_mode                ||
6456727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             !CUR.face->sph_compatibility_mode ) )
6457727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6458727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
6459727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                            CUR.GS.freeVector.x );
6460aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
6461aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner                                          CUR.GS.freeVector.y ),
6462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp0.cur[point]   = CUR.zp0.org[point];
6463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6464727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6465727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                              &&
6466727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                             &&
6467727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
6468727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         distance > 0                                  &&
6469727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.y != 0                      )
6470727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      distance = 0;
6471727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
6474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cut-in flag */
6476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( FT_ABS( distance - org_dist ) > control_value_cutin )
6478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        distance = org_dist;
6479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING         &&
6482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode        &&
6483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0 )
6484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = ROUND_None( distance,
6485727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                               CUR.tt_metrics.compensations[0] );
6486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = CUR_Func_round( distance,
6489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                   CUR.tt_metrics.compensations[0] );
6490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, point, distance - org_dist );
6493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6494aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp0 = point;
6496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = point;
6497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MDRP[abcde]:  Move Direct Relative Point                              */
6503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xC0-0xDF                                               */
6504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
6505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MDRP( INS_ARG )
6508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  org_dist, distance, minimum_distance;
6511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    minimum_distance = CUR.GS.minimum_distance;
6514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                  &&
6517727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                 &&
6518727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                          &&
6519727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      minimum_distance = 0;
6521727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6522727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6529727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6530aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: Is there some undocumented feature while in the */
6534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      twilight zone?                                  */
6535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED: twilight zone special case */
6537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
6539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec1 = &CUR.zp1.org[point];
6541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];
6542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      org_dist = CUR_Func_dualproj( vec1, vec2 );
6545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec1 = &CUR.zp1.orus[point];
6549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];
6550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
6553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* this should be faster */
6555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( vec1, vec2 );
6556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );
6557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Vector  vec;
6561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6563727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
6564727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
6565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_fast_dualproj( &vec );
6567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* single width cut-in test */
6571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
6573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         CUR.GS.single_width_cutin )
6574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR.GS.single_width_value;
6577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = -CUR.GS.single_width_value;
6579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* round flag */
6582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 4 ) != 0 )
6584727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6585727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING         &&
6587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode        &&
6588727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.x != 0 )
6589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = ROUND_None(
6590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     org_dist,
6591727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     CUR.tt_metrics.compensations[CUR.opcode & 3] );
6592727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else
6593727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif
6594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round(
6595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   org_dist,
6596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6597727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = ROUND_None(
6600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   org_dist,
6601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* minimum distance flag */
6604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 8 ) != 0 )
6606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6609727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance < minimum_distance )
6610727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = minimum_distance;
6611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6614727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance > -minimum_distance )
6615727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = -minimum_distance;
6616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* now move the point */
6620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_Func_project( CUR.zp1.cur + point,
6622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp0.cur + CUR.GS.rp0 );
6623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, distance - org_dist );
6625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6626aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 16 ) != 0 )
6631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MIRP[abcde]:  Move Indirect Relative Point                            */
6638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0xE0-0xFF                                               */
6639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        int32? uint32 -->                                       */
6640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_MIRP( INS_ARG )
6643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong    cvtEntry;
6646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  cvt_dist,
6648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                distance,
6649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                cur_dist,
6650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                org_dist,
6651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                control_value_cutin,
6652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                minimum_distance;
6653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6654ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_Int      B1           = 0; /* pacify compiler */
6655ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_Int      B2           = 0;
6656727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Bool     reverse_move = FALSE;
6657727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6658727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6659727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    minimum_distance    = CUR.GS.minimum_distance;
6661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    control_value_cutin = CUR.GS.control_value_cutin;
6662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    point               = (FT_UShort)args[0];
6663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    cvtEntry            = (FT_ULong)( args[1] + 1 );
6664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                  &&
6667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                 &&
6668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.x != 0                          &&
6669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
6670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      control_value_cutin = minimum_distance = 0;
6671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
6674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
6676aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDSL( cvtEntry,  CUR.cvtSize + 1 )  ||
6677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6680727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6681aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !cvtEntry )
6685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cvt_dist = 0;
6686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
6688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* single width test */
6690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
6692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         CUR.GS.single_width_cutin )
6693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( cvt_dist >= 0 )
6695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist =  CUR.GS.single_width_value;
6696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist = -CUR.GS.single_width_value;
6698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6700aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* UNDOCUMENTED!  The MS rasterizer does that with */
6701aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    /* twilight points (confirmed by Greg Hitchcock)   */
6702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.gep1 == 0 )
6703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
6705295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             TT_MulFix14( (FT_UInt32)cvt_dist,
6706295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                          CUR.GS.freeVector.x );
6707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
6708295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                             TT_MulFix14( (FT_UInt32)cvt_dist,
6709295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                                          CUR.GS.freeVector.y );
671041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      CUR.zp1.cur[point]   = CUR.zp1.org[point];
6711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
6714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  &CUR.zp0.org[CUR.GS.rp0] );
6715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
6716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  &CUR.zp0.cur[CUR.GS.rp0] );
6717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* auto-flip test */
6719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.auto_flip )
6721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( org_dist ^ cvt_dist ) < 0 )
6723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cvt_dist = -cvt_dist;
6724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                         &&
6728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                        &&
6729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.GS.freeVector.y != 0                                 &&
6730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
6731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( cur_dist < -64 )
6733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        cvt_dist -= 16;
6734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      else if ( cur_dist > 64 && cur_dist < 84 )
6735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        cvt_dist += 32;
6736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* control value cut-in and round */
6740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 4 ) != 0 )
6742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
6744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      refer to the same zone.                                  */
6745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.GS.gep0 == CUR.GS.gep1 )
6747aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      {
6748aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* XXX: According to Greg Hitchcock, the following wording is */
6749aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      the right one:                                        */
6750aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*                                                            */
6751aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        When the absolute difference between the value in   */
6752aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        the table [CVT] and the measurement directly from   */
6753aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        the outline is _greater_ than the cut_in value, the */
6754aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*        outline measurement is used.                        */
6755aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*                                                            */
6756aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      This is from `instgly.doc'.  The description in       */
6757aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
6758aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /*      it implies `>=' instead of `>'.                       */
6759aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
6760727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
6761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          cvt_dist = org_dist;
6762aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      }
6763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = CUR_Func_round(
6765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   cvt_dist,
6766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
6769727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* do cvt cut-in always in MIRP for sph */
6773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING           &&
6774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.ignore_x_mode          &&
6775727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.gep0 == CUR.GS.gep1 )
6776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
6777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
6778727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          cvt_dist = org_dist;
6779727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
6780727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6781727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      distance = ROUND_None(
6783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   cvt_dist,
6784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
6785727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* minimum distance test */
6788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 8 ) != 0 )
6790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist >= 0 )
6792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6793727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance < minimum_distance )
6794727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = minimum_distance;
6795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6798727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( distance > -minimum_distance )
6799727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          distance = -minimum_distance;
6800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6803727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6804727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING )
6805727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6806727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      B1 = CUR.zp1.cur[point].y;
6807727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6808727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Round moves if necessary */
6809727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode                                          &&
6810727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.y != 0                                   &&
6811727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )
6812727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
6813727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6814727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode                                      &&
6815727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           CUR.GS.freeVector.y != 0                               &&
6816727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.opcode & 16 ) == 0                               &&
6817727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.opcode & 8 ) == 0                                &&
6818727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease           ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
6819727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        distance += 64;
6820727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6821727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6822727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
6824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6825727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6826727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING )
6827727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6828727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      B2 = CUR.zp1.cur[point].y;
6829727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6830727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      /* Reverse move if necessary */
6831727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.ignore_x_mode )
6832727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
6833727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( CUR.face->sph_compatibility_mode                          &&
6834727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             CUR.GS.freeVector.y != 0                                  &&
6835727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B1 & 63 ) == 0                                          &&
6836727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B2 & 63 ) != 0                                          )
6837727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          reverse_move = TRUE;
6838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6839727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
6840727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             CUR.GS.freeVector.y != 0                                  &&
6841727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B2 & 63 ) != 0                                          &&
6842727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             ( B1 & 63 ) != 0                                          )
6843727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          reverse_move = TRUE;
6844727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
6845727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6846727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( reverse_move )
6847727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );
6848727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6849727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6850727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6851727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6852aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp1 = CUR.GS.rp0;
6854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( CUR.opcode & 16 ) != 0 )
6856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.rp0 = point;
6857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.rp2 = point;
6859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ALIGNRP[]:    ALIGN Relative Point                                    */
6865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x3C                                                    */
6866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32... -->                                    */
6867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ALIGNRP( INS_ARG )
6870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point;
6872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
6873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
6875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6877727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
6878727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                         &&
6879727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                        &&
6880727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.iup_called                                           &&
6881727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
6882727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
6883727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error = FT_THROW( Invalid_Reference );
6884727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
6885727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
6886727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
6887727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop ||
6889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
6890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6892727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6893aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
6894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( CUR.GS.loop > 0 )
6897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args--;
6899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      point = (FT_UShort)CUR.stack[CUR.args];
6901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp1.n_points ) )
6903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
6905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
6906727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
6907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
6908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
6909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
6911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
6912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        distance = CUR_Func_project( CUR.zp1.cur + point,
6913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     CUR.zp0.cur + CUR.GS.rp0 );
6914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR_Func_move( &CUR.zp1, point, -distance );
6916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
6917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.GS.loop--;
6919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6921aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
6922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
6923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
6924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
6925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
6928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ISECT[]:      moves point to InterSECTion                             */
6930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x0F                                                    */
6931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        5 * uint32 -->                                          */
6932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
6933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
6934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ISECT( INS_ARG )
6935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
6936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   point,
6937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                a0, a1,
6938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                b0, b1;
6939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6940727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_F26Dot6  discriminant, dotproduct;
6941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx,  dy,
6943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                dax, day,
6944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                dbx, dby;
6945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  val;
6947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector   R;
6949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
6952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a0 = (FT_UShort)args[1];
6954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    a1 = (FT_UShort)args[2];
6955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b0 = (FT_UShort)args[3];
6956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    b1 = (FT_UShort)args[4];
6957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( b0, CUR.zp0.n_points )  ||
6959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( b1, CUR.zp0.n_points )  ||
6960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( a0, CUR.zp1.n_points )  ||
6961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( a1, CUR.zp1.n_points )  ||
6962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( point, CUR.zp2.n_points ) )
6963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
6965727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
6966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
6967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
6968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6969727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Cramer's rule */
6970727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
6971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
6972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
6973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
6975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
6976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
6978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
6979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
6981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6982727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
6983727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   FT_MulDiv( day, dbx, 0x40 );
6984727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +
6985727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   FT_MulDiv( day, dby, 0x40 );
6986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6987727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* The discriminant above is actually a cross product of vectors     */
6988727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* da and db. Together with the dot product, they can be used as     */
6989727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* surrogates for sine and cosine of the angle between the vectors.  */
6990727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Indeed,                                                           */
6991727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*       dotproduct   = |da||db|cos(angle)                           */
6992727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*       discriminant = |da||db|sin(angle)     .                     */
6993727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* We use these equations to reject grazing intersections by         */
6994727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
6995727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
6996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
6997727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
6998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6999727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      R.x = FT_MulDiv( val, dax, discriminant );
7000727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      R.y = FT_MulDiv( val, day, discriminant );
7001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
7003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
7004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* else, take the middle of the middles of A and B */
7008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
7010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp1.cur[a1].x +
7011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b0].x +
7012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b1].x ) / 4;
7013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
7014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp1.cur[a1].y +
7015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b0].y +
7016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                               CUR.zp0.cur[b1].y ) / 4;
7017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* ALIGNPTS[]:   ALIGN PoinTS                                            */
7024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x27                                                    */
7025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 uint32 -->                                       */
7026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_ALIGNPTS( INS_ARG )
7029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort   p1, p2;
7031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  distance;
7032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p1 = (FT_UShort)args[0];
7035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    p2 = (FT_UShort)args[1];
7036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7037aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    if ( BOUNDS( p1, CUR.zp1.n_points ) ||
7038aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich         BOUNDS( p2, CUR.zp0.n_points ) )
7039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
7041727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
7042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    distance = CUR_Func_project( CUR.zp0.cur + p2,
7046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                 CUR.zp1.cur + p1 ) / 2;
7047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp1, p1, distance );
7049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR_Func_move( &CUR.zp0, p2, -distance );
7050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IP[]:         Interpolate Point                                       */
7056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x39                                                    */
7057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32... -->                                           */
7058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* SOMETIMES, DUMBER CODE IS BETTER CODE */
7061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IP( INS_ARG )
7064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  old_range, cur_range;
7066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orus_base;
7067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  cur_base;
7068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int      twilight;
7069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
7071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.top < CUR.GS.loop )
7074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7075aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      if ( CUR.pedantic_hinting )
7076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
7077aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
7078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*
7081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * We need to deal in a special way with the twilight zone.
7082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
7083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     * for every n.
7084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project     */
7085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
7086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
7088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
7090727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
7091aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner      goto Fail;
7092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( twilight )
7095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus_base = &CUR.zp0.org[CUR.GS.rp1];
7096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus_base = &CUR.zp0.orus[CUR.GS.rp1];
7098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur_base = &CUR.zp0.cur[CUR.GS.rp1];
7100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* XXX: There are some glyphs in some braindead but popular */
7102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
7103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      calling IP[] with bad values of rp[12].             */
7104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*      Do something sane when this odd thing happens.      */
7105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
7106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
7107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      old_range = 0;
7109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_range = 0;
7110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( twilight )
7114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
7115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       orus_base );
711641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
7117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
7118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                       orus_base );
711941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else
712041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      {
712141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_Vector  vec;
712241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
712341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
7124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
712541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.x_scale );
7126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
712741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.y_scale );
712841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
712941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        old_range = CUR_fast_dualproj( &vec );
713041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      }
7131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
7133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
7136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];
7138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_F26Dot6  org_dist, cur_dist, new_dist;
7139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* check point bounds */
7142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( BOUNDS( point, CUR.zp2.n_points ) )
7143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
7147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        continue;
7150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( twilight )
7153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
715441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
7155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
715641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      else
715741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      {
715841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        FT_Vector  vec;
715941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
716041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
7161727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,
716241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.x_scale );
7163727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,
716441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                           CUR.metrics.y_scale );
716541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier
716641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        org_dist = CUR_fast_dualproj( &vec );
716741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier      }
7168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71699c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      cur_dist = CUR_Func_project( &CUR.zp2.cur[point], cur_base );
7170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( org_dist )
7172727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
7173727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( old_range )
7174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          new_dist = FT_MulDiv( org_dist, cur_range, old_range );
7175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        else
7176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
7177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* This is the same as what MS does for the invalid case:  */
7178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                                                         */
7179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*   delta = (Original_Pt - Original_RP1) -                */
71809c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*           (Current_Pt - Current_RP1)         ;          */
7181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                                                         */
7182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* In FreeType speak:                                      */
7183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                                                         */
71849c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*   delta = org_dist - cur_dist          .                */
71859c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*                                                         */
71869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /* We move `point' by `new_dist - cur_dist' after leaving  */
71879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /* this block, thus we have                                */
71889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*                                                         */
71899c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*   new_dist - cur_dist = delta                   ,       */
71909c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*   new_dist - cur_dist = org_dist - cur_dist     ,       */
71919c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          /*              new_dist = org_dist                .       */
7192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
71939c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          new_dist = org_dist;
7194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
7195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
7196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        new_dist = 0;
7198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
7200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7201aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
7202aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.GS.loop = 1;
7204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* UTP[a]:       UnTouch Point                                           */
7211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x29                                                    */
7212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 -->                                              */
7213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_UTP( INS_ARG )
7216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  point;
7218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte    mask;
7219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point = (FT_UShort)args[0];
7222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( point, CUR.zp0.n_points ) )
7224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.pedantic_hinting )
7226727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Invalid_Reference );
7227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    mask = 0xFF;
7231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.x != 0 )
7233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask &= ~FT_CURVE_TAG_TOUCH_X;
7234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.GS.freeVector.y != 0 )
7236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask &= ~FT_CURVE_TAG_TOUCH_Y;
7237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.zp0.tags[point] &= mask;
7239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Local variables for Ins_IUP: */
7243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  IUP_WorkerRec_
7244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orgs;   /* original and current coordinate */
7246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  curs;   /* arrays                          */
7247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Vector*  orus;
7248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     max_points;
7249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } IUP_WorkerRec, *IUP_Worker;
7251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  _iup_worker_shift( IUP_Worker  worker,
7255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p1,
7256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p2,
7257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_UInt     p )
7258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     i;
7260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  dx;
7261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    dx = worker->curs[p].x - worker->orgs[p].x;
7264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( dx != 0 )
7265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i < p; i++ )
7267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x += dx;
7268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p + 1; i <= p2; i++ )
7270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x += dx;
7271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  _iup_worker_interpolate( IUP_Worker  worker,
7277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     p1,
7278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     p2,
7279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     ref1,
7280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     ref2 )
7281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt     i;
7283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;
7284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( p1 > p2 )
7287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( BOUNDS( ref1, worker->max_points ) ||
7290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         BOUNDS( ref2, worker->max_points ) )
7291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    orus1 = worker->orus[ref1].x;
7294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    orus2 = worker->orus[ref2].x;
7295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( orus1 > orus2 )
7297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_F26Dot6  tmp_o;
7299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_UInt     tmp_r;
7300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tmp_o = orus1;
7303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus1 = orus2;
7304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      orus2 = tmp_o;
7305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tmp_r = ref1;
7307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ref1  = ref2;
7308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ref2  = tmp_r;
7309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org1   = worker->orgs[ref1].x;
7312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    org2   = worker->orgs[ref2].x;
7313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    delta1 = worker->curs[ref1].x - org1;
7314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    delta2 = worker->curs[ref2].x - org2;
7315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( orus1 == orus2 )
7317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* simple shift of untouched points */
7319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i <= p2; i++ )
7320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_F26Dot6  x = worker->orgs[i].x;
7322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( x <= org1 )
7325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta1;
7326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
7327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta2;
7328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x = x;
7330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Fixed  scale       = 0;
7335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Bool   scale_valid = 0;
7336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* interpolation */
7339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      for ( i = p1; i <= p2; i++ )
7340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_F26Dot6  x = worker->orgs[i].x;
7342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( x <= org1 )
7345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta1;
7346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else if ( x >= org2 )
7348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x += delta2;
7349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
7351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !scale_valid )
7353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
7354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            scale_valid = 1;
7355727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            scale       = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),
7356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                                     orus2 - orus1 );
7357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
7358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          x = ( org1 + delta1 ) +
7360727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              FT_MulFix( worker->orus[i].x - orus1, scale );
7361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        worker->curs[i].x = x;
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  /*************************************************************************/
7369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* IUP[a]:       Interpolate Untouched Points                            */
7371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x30-0x31                                               */
7372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        -->                                                     */
7373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_IUP( INS_ARG )
7376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    IUP_WorkerRec  V;
7378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte        mask;
7379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   first_point;   /* first point of contour        */
7381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   end_point;     /* end point (last+1) of contour */
7382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   first_touched; /* first touched point in contour   */
7384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   cur_touched;   /* current touched point in contour */
7385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt   point;         /* current point   */
7387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Short  contour;       /* current contour */
7388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
7390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* ignore empty outlines */
7393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.pts.n_contours == 0 )
7394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.opcode & 1 )
7397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask   = FT_CURVE_TAG_TOUCH_X;
7399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orgs = CUR.pts.org;
7400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.curs = CUR.pts.cur;
7401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orus = CUR.pts.orus;
7402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
7404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      mask   = FT_CURVE_TAG_TOUCH_Y;
7406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
7407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
7408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
7409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    V.max_points = CUR.pts.n_points;
7411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    contour = 0;
7413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    point   = 0;
7414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7415727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7416727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING  &&
7417727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode )
7418727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
7419727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.iup_called = TRUE;
7420727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
7421727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return;
7422727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
7423727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7424727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
7426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;
7428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      first_point = point;
7429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7430aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( BOUNDS ( end_point, CUR.pts.n_points ) )
7431aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        end_point = CUR.pts.n_points - 1;
7432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
7434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        point++;
7435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( point <= end_point )
7437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        first_touched = point;
7439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        cur_touched   = point;
7440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        point++;
7442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( point <= end_point )
7444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( ( CUR.pts.tags[point] & mask ) != 0 )
7446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
74477f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner            _iup_worker_interpolate( &V,
74487f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     cur_touched + 1,
74497f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     point - 1,
74507f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     cur_touched,
74517f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner                                     point );
7452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            cur_touched = point;
7453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
7454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          point++;
7456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( cur_touched == first_touched )
7459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          _iup_worker_shift( &V, first_point, end_point, cur_touched );
7460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
7461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          _iup_worker_interpolate( &V,
7463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   (FT_UShort)( cur_touched + 1 ),
7464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   end_point,
7465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   cur_touched,
7466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   first_touched );
7467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( first_touched > 0 )
7469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            _iup_worker_interpolate( &V,
7470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_point,
7471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_touched - 1,
7472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     cur_touched,
7473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                     first_touched );
7474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      contour++;
7477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( contour < CUR.pts.n_contours );
7478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */
7484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x5D,0x71,0x72                                          */
7485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 (2 * uint32)... -->                              */
7486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DELTAP( INS_ARG )
7489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   k, nump;
7491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort  A;
7492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   C;
7493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long    B;
7494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  B1, B2;
7496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                        &&
7499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                       &&
7500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.iup_called                                          &&
7501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
7502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      goto Fail;
7503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
7507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Delta hinting is covered by US Patent 5159668. */
7508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
7509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Long  n = args[0] * 2;
7511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < n )
7514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7515aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7517aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        n = CUR.args;
7518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= n;
7521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args;
7522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
7525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
7527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                   than once, thus UShort isn't enough */
7528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( k = 1; k <= nump; k++ )
7530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 2 )
7532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7533aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7534727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7535aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
7536aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        goto Fail;
7537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= 2;
7540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = (FT_UShort)CUR.stack[CUR.args + 1];
7542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = CUR.stack[CUR.args];
7543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* XXX: Because some popular fonts contain some invalid DeltaP */
7545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      instructions, we simply ignore them when the stacked   */
7546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      point reference is off limit, rather than returning an */
7547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      error.  As a delta instruction doesn't change a glyph  */
7548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /*      in great ways, this shouldn't be a problem.            */
7549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !BOUNDS( A, CUR.zp0.n_points ) )
7551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C = ( (FT_ULong)B & 0xF0 ) >> 4;
7553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.opcode )
7555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5D:
7557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x71:
7560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 16;
7561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x72:
7564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 32;
7565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C += CUR.GS.delta_base;
7569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CURRENT_Ppem() == (FT_Long)C )
7571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = ( (FT_ULong)B & 0xF ) - 8;
7573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( B >= 0 )
7574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            B++;
7575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = B * 64 / ( 1L << CUR.GS.delta_shift );
7576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7577727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7578727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7579727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( SUBPIXEL_HINTING )
7580727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
7581727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /*
7582727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  Allow delta move if
7583727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *
7584727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  - not using ignore_x_mode rendering
7585727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  - glyph is specifically set to allow it
7586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *  - glyph is composite and freedom vector is not subpixel
7587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             *    vector
7588727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease             */
7589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( !CUR.ignore_x_mode                                   ||
7590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
7591727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                 ( CUR.is_composite && CUR.GS.freeVector.y != 0 )     )
7592727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              CUR_Func_move( &CUR.zp0, A, B );
7593727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7594727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* Otherwise apply subpixel hinting and */
7595727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            /* compatibility mode rules             */
7596727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            else if ( CUR.ignore_x_mode )
7597727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
7598727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( CUR.GS.freeVector.y != 0 )
75999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                B1 = (FT_UShort)CUR.zp0.cur[A].y;
7600727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              else
76019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                B1 = (FT_UShort)CUR.zp0.cur[A].x;
7602727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7603727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0
7604727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Standard Subpixel Hinting: Allow y move.       */
7605727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* This messes up dejavu and may not be needed... */
7606727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( !CUR.face->sph_compatibility_mode &&
7607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   CUR.GS.freeVector.y != 0          )
7608727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR_Func_move( &CUR.zp0, A, B );
7609727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              else
7610727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* 0 */
7611727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7612727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Compatibility Mode: Allow x or y move if point touched in */
7613727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Y direction.                                              */
7614727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( CUR.face->sph_compatibility_mode                      &&
7615727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
7616727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              {
7617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* save the y value of the point now; compare after move */
76189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                B1 = (FT_UShort)CUR.zp0.cur[A].y;
7619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
7621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  B = FT_PIX_ROUND( B1 + B ) - B1;
7622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* Allow delta move if using sph_compatibility_mode,   */
7624727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                /* IUP has not been called, and point is touched on Y. */
7625727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                if ( !CUR.iup_called                            &&
7626727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
7627727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR_Func_move( &CUR.zp0, A, B );
7628727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              }
7629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
76309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod              B2 = (FT_UShort)CUR.zp0.cur[A].y;
7631727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7632727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              /* Reverse this move if it results in a disallowed move */
7633727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              if ( CUR.GS.freeVector.y != 0                           &&
7634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                   ( ( CUR.face->sph_compatibility_mode           &&
7635727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B1 & 63 ) == 0                           &&
7636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B2 & 63 ) != 0                           ) ||
7637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                     ( ( CUR.sph_tweak_flags                    &
7638727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                         SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
7639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B1 & 63 ) != 0                           &&
7640727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                       ( B2 & 63 ) != 0                           ) ) )
7641727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                CUR_Func_move( &CUR.zp0, A, -B );
7642727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
7643727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
7644727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
7645727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            CUR_Func_move( &CUR.zp0, A, B );
7648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
7653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7655aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */
7663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x73,0x74,0x75                                          */
7664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 (2 * uint32)... -->                              */
7665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_DELTAC( INS_ARG )
7668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  nump, k;
7670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  A, C;
7671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long   B;
7672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
7675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Delta hinting is covered by US Patent 5159668. */
7676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.face->unpatented_hinting )
7677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Long  n = args[0] * 2;
7679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < n )
7682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7683aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7685aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        n = CUR.args;
7686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= n;
7689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args;
7690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return;
7691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
7693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    nump = (FT_ULong)args[0];
7695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( k = 1; k <= nump; k++ )
7697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 2 )
7699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7700aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
7701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
7702aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
7703aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        goto Fail;
7704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args -= 2;
7707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      A = (FT_ULong)CUR.stack[CUR.args + 1];
7709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      B = CUR.stack[CUR.args];
7710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7711aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      if ( BOUNDSL( A, CUR.cvtSize ) )
7712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.pedantic_hinting )
7714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7715727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Reference );
7716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
7720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C = ( (FT_ULong)B & 0xF0 ) >> 4;
7722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.opcode )
7724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x73:
7726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x74:
7729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 16;
7730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x75:
7733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          C += 32;
7734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
7735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        C += CUR.GS.delta_base;
7738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CURRENT_Ppem() == (FT_Long)C )
7740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = ( (FT_ULong)B & 0xF ) - 8;
7742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( B >= 0 )
7743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            B++;
7744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          B = B * 64 / ( 1L << CUR.GS.delta_shift );
7745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          CUR_Func_move_cvt( A, B );
7747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7751aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  Fail:
7752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.new_top = CUR.args;
7753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* MISC. INSTRUCTIONS                                                    */
7759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
7764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* GETINFO[]:    GET INFOrmation                                         */
7766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Opcode range: 0x88                                                    */
7767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* Stack:        uint32 --> uint32                                       */
7768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
7769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_GETINFO( INS_ARG )
7771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Long  K;
7773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    K = 0;
7776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7778727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7779727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* RASTERIZER VERSION           */
7780727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  0             */
7781727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 0-7           */
7782727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7783727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING     &&
7784727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         ( args[0] & 1 ) != 0 &&
7785727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode    )
7786727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
7787727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      K = CUR.rasterizer_version;
7788727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      FT_TRACE7(( "Setting rasterizer version %d\n",
7789727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.rasterizer_version ));
7790727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
7791727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    else
7792727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7793727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( ( args[0] & 1 ) != 0 )
7794727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        K = TT_INTERPRETER_VERSION_35;
7795727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7796727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7797727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* GLYPH ROTATED                */
7798727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  1             */
7799727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 8             */
7800727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
7802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 0x80;
7803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7804727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7805727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* GLYPH STRETCHED              */
7806727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  2             */
7807727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 9             */
7808727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
7810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 1 << 8;
7811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7812727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /********************************/
7813727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* HINTING FOR GRAYSCALE        */
7814727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Selector Bit:  5             */
7815727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /* Return Bit(s): 12            */
7816727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    /*                              */
7817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
7818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      K |= 1 << 12;
7819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7820727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
7821727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7822727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    if ( SUBPIXEL_HINTING                                    &&
7823727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.ignore_x_mode                                   &&
7824727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease         CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 )
7825727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    {
7826727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7827ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      if ( CUR.rasterizer_version >= 37 )
7828ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease      {
7829ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        /********************************/
7830ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        /* HINTING FOR SUBPIXEL         */
7831ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        /* Selector Bit:  6             */
7832ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        /* Return Bit(s): 13            */
7833ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        /*                              */
7834ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        if ( ( args[0] & 64 ) != 0 && CUR.subpixel )
7835ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          K |= 1 << 13;
7836727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7837727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /********************************/
7838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* COMPATIBLE WIDTHS ENABLED    */
7839727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Selector Bit:  7             */
7840727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Return Bit(s): 14            */
7841727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*                              */
7842727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Functionality still needs to be added */
7843727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )
7844727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          K |= 1 << 14;
7845727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7846727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /********************************/
7847727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* SYMMETRICAL SMOOTHING        */
7848727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Selector Bit:  8             */
7849727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Return Bit(s): 15            */
7850727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*                              */
7851727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Functionality still needs to be added */
7852727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )
7853727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          K |= 1 << 15;
7854727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7855727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /********************************/
7856727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* HINTING FOR BGR?             */
7857727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Selector Bit:  9             */
7858727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Return Bit(s): 16            */
7859727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /*                              */
7860727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        /* Functionality still needs to be added */
7861727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( ( args[0] & 512 ) != 0 && CUR.bgr )
7862727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          K |= 1 << 16;
7863727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7864727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        if ( CUR.rasterizer_version >= 38 )
7865727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
7866727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /********************************/
7867727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* SUBPIXEL POSITIONED?         */
7868727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* Selector Bit:  10            */
7869727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* Return Bit(s): 17            */
7870727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /*                              */
7871727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* Functionality still needs to be added */
7872727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )
7873727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            K |= 1 << 17;
7874727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
7875727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
7876727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    }
7877727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7878727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
7879727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
7880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    args[0] = K;
7881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static void
7885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Ins_UNKNOWN( INS_ARG )
7886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  def   = CUR.IDefs;
7888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_DefRecord*  limit = def + CUR.numIDefs;
7889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UNUSED_ARG;
7891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( ; def < limit; def++ )
7894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
7895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( (FT_Byte)def->opc == CUR.opcode && def->active )
7896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
7897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        TT_CallRec*  call;
7898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.callTop >= CUR.callSize )
7901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
7902727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Stack_Overflow );
7903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return;
7904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
7905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call = CUR.callStack + CUR.callTop++;
7907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Caller_Range = CUR.curRange;
7909aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich        call->Caller_IP    = CUR.IP + 1;
7910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        call->Cur_Count    = 1;
7911ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        call->Def          = def;
7912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        INS_Goto_CodeRange( def->range, def->start );
7914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.step_ins = FALSE;
7916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return;
7917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
7918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
7919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7920727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Invalid_Opcode );
7921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
7922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
7925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static
7928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TInstruction_Function  Instruct_Dispatch[256] =
7929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
7930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Opcodes are gathered in groups of 16. */
7931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* Please keep the spaces as they are.   */
7932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  y  */  Ins_SVTCA,
7934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SVTCA  x  */  Ins_SVTCA,
7935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA y  */  Ins_SPVTCA,
7936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTCA x  */  Ins_SPVTCA,
7937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA y  */  Ins_SFVTCA,
7938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTCA x  */  Ins_SFVTCA,
7939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL //  */  Ins_SPVTL,
7940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvTL +   */  Ins_SPVTL,
7941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL //  */  Ins_SFVTL,
7942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTL +   */  Ins_SFVTL,
7943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SPvFS     */  Ins_SPVFS,
7944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvFS     */  Ins_SFVFS,
7945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GPV       */  Ins_GPV,
7946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GFV       */  Ins_GFV,
7947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SFvTPv    */  Ins_SFVTPV,
7948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ISECT     */  Ins_ISECT,
7949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP0      */  Ins_SRP0,
7951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP1      */  Ins_SRP1,
7952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SRP2      */  Ins_SRP2,
7953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP0      */  Ins_SZP0,
7954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP1      */  Ins_SZP1,
7955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZP2      */  Ins_SZP2,
7956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SZPS      */  Ins_SZPS,
7957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SLOOP     */  Ins_SLOOP,
7958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTG       */  Ins_RTG,
7959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTHG      */  Ins_RTHG,
7960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SMD       */  Ins_SMD,
7961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ELSE      */  Ins_ELSE,
7962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JMPR      */  Ins_JMPR,
7963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCvTCi    */  Ins_SCVTCI,
7964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSwCi     */  Ins_SSWCI,
7965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SSW       */  Ins_SSW,
7966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DUP       */  Ins_DUP,
7968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  POP       */  Ins_POP,
7969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CLEAR     */  Ins_CLEAR,
7970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SWAP      */  Ins_SWAP,
7971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEPTH     */  Ins_DEPTH,
7972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CINDEX    */  Ins_CINDEX,
7973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MINDEX    */  Ins_MINDEX,
7974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignPTS  */  Ins_ALIGNPTS,
7975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x28  */  Ins_UNKNOWN,
7976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  UTP       */  Ins_UTP,
7977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LOOPCALL  */  Ins_LOOPCALL,
7978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CALL      */  Ins_CALL,
7979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FDEF      */  Ins_FDEF,
7980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ENDF      */  Ins_ENDF,
7981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[0]   */  Ins_MDAP,
7982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDAP[1]   */  Ins_MDAP,
7983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
7984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[0]    */  Ins_IUP,
7985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IUP[1]    */  Ins_IUP,
7986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[0]    */  Ins_SHP,
7987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHP[1]    */  Ins_SHP,
7988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[0]    */  Ins_SHC,
7989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHC[1]    */  Ins_SHC,
7990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[0]    */  Ins_SHZ,
7991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHZ[1]    */  Ins_SHZ,
7992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SHPIX     */  Ins_SHPIX,
7993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IP        */  Ins_IP,
7994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[0]  */  Ins_MSIRP,
7995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MSIRP[1]  */  Ins_MSIRP,
7996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AlignRP   */  Ins_ALIGNRP,
7997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RTDG      */  Ins_RTDG,
7998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[0]   */  Ins_MIAP,
7999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIAP[1]   */  Ins_MIAP,
8000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushB    */  Ins_NPUSHB,
8002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NPushW    */  Ins_NPUSHW,
8003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WS        */  Ins_WS,
8004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RS        */  Ins_RS,
8005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtP     */  Ins_WCVTP,
8006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RCvt      */  Ins_RCVT,
8007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[0]     */  Ins_GC,
8008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GC[1]     */  Ins_GC,
8009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SCFS      */  Ins_SCFS,
8010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[0]     */  Ins_MD,
8011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MD[1]     */  Ins_MD,
8012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPPEM     */  Ins_MPPEM,
8013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MPS       */  Ins_MPS,
8014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipON    */  Ins_FLIPON,
8015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipOFF   */  Ins_FLIPOFF,
8016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DEBUG     */  Ins_DEBUG,
8017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LT        */  Ins_LT,
8019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  LTEQ      */  Ins_LTEQ,
8020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GT        */  Ins_GT,
8021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GTEQ      */  Ins_GTEQ,
8022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EQ        */  Ins_EQ,
8023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEQ       */  Ins_NEQ,
8024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ODD       */  Ins_ODD,
8025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EVEN      */  Ins_EVEN,
8026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IF        */  Ins_IF,
8027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  EIF       */  Ins_EIF,
8028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AND       */  Ins_AND,
8029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  OR        */  Ins_OR,
8030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NOT       */  Ins_NOT,
8031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP1   */  Ins_DELTAP,
8032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDB       */  Ins_SDB,
8033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDS       */  Ins_SDS,
8034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ADD       */  Ins_ADD,
8036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SUB       */  Ins_SUB,
8037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DIV       */  Ins_DIV,
8038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MUL       */  Ins_MUL,
8039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ABS       */  Ins_ABS,
8040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NEG       */  Ins_NEG,
8041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FLOOR     */  Ins_FLOOR,
8042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  CEILING   */  Ins_CEILING,
8043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[0]  */  Ins_ROUND,
8044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[1]  */  Ins_ROUND,
8045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[2]  */  Ins_ROUND,
8046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROUND[3]  */  Ins_ROUND,
8047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[0] */  Ins_NROUND,
8048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[1] */  Ins_NROUND,
8049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[2] */  Ins_NROUND,
8050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  NROUND[3] */  Ins_NROUND,
8051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  WCvtF     */  Ins_WCVTF,
8053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP2   */  Ins_DELTAP,
8054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaP3   */  Ins_DELTAP,
8055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[0] */ Ins_DELTAC,
8056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[1] */ Ins_DELTAC,
8057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  DeltaCn[2] */ Ins_DELTAC,
8058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SROUND    */  Ins_SROUND,
8059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  S45Round  */  Ins_S45ROUND,
8060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROT      */  Ins_JROT,
8061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  JROF      */  Ins_JROF,
8062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROFF      */  Ins_ROFF,
8063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x7B  */  Ins_UNKNOWN,
8064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RUTG      */  Ins_RUTG,
8065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  RDTG      */  Ins_RDTG,
8066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SANGW     */  Ins_SANGW,
8067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  AA        */  Ins_AA,
8068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipPT    */  Ins_FLIPPT,
8070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgON  */  Ins_FLIPRGON,
8071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  FlipRgOFF */  Ins_FLIPRGOFF,
8072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x83  */  Ins_UNKNOWN,
8073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x84  */  Ins_UNKNOWN,
8074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanCTRL  */  Ins_SCANCTRL,
8075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDPVTL[0] */  Ins_SDPVTL,
8076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  SDPVTL[1] */  Ins_SDPVTL,
8077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  GetINFO   */  Ins_GETINFO,
8078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  IDEF      */  Ins_IDEF,
8079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ROLL      */  Ins_ROLL,
8080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MAX       */  Ins_MAX,
8081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIN       */  Ins_MIN,
8082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  ScanTYPE  */  Ins_SCANTYPE,
8083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  InstCTRL  */  Ins_INSTCTRL,
8084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x8F  */  Ins_UNKNOWN,
8085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x90  */   Ins_UNKNOWN,
8087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x91  */   Ins_UNKNOWN,
8088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x92  */   Ins_UNKNOWN,
8089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x93  */   Ins_UNKNOWN,
8090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x94  */   Ins_UNKNOWN,
8091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x95  */   Ins_UNKNOWN,
8092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x96  */   Ins_UNKNOWN,
8093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x97  */   Ins_UNKNOWN,
8094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x98  */   Ins_UNKNOWN,
8095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x99  */   Ins_UNKNOWN,
8096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9A  */   Ins_UNKNOWN,
8097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9B  */   Ins_UNKNOWN,
8098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9C  */   Ins_UNKNOWN,
8099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9D  */   Ins_UNKNOWN,
8100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9E  */   Ins_UNKNOWN,
8101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0x9F  */   Ins_UNKNOWN,
8102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA0  */   Ins_UNKNOWN,
8104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA1  */   Ins_UNKNOWN,
8105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA2  */   Ins_UNKNOWN,
8106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA3  */   Ins_UNKNOWN,
8107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA4  */   Ins_UNKNOWN,
8108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA5  */   Ins_UNKNOWN,
8109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA6  */   Ins_UNKNOWN,
8110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA7  */   Ins_UNKNOWN,
8111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA8  */   Ins_UNKNOWN,
8112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xA9  */   Ins_UNKNOWN,
8113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAA  */   Ins_UNKNOWN,
8114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAB  */   Ins_UNKNOWN,
8115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAC  */   Ins_UNKNOWN,
8116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAD  */   Ins_UNKNOWN,
8117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAE  */   Ins_UNKNOWN,
8118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  INS_0xAF  */   Ins_UNKNOWN,
8119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[0]  */  Ins_PUSHB,
8121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[1]  */  Ins_PUSHB,
8122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[2]  */  Ins_PUSHB,
8123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[3]  */  Ins_PUSHB,
8124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[4]  */  Ins_PUSHB,
8125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[5]  */  Ins_PUSHB,
8126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[6]  */  Ins_PUSHB,
8127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushB[7]  */  Ins_PUSHB,
8128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[0]  */  Ins_PUSHW,
8129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[1]  */  Ins_PUSHW,
8130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[2]  */  Ins_PUSHW,
8131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[3]  */  Ins_PUSHW,
8132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[4]  */  Ins_PUSHW,
8133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[5]  */  Ins_PUSHW,
8134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[6]  */  Ins_PUSHW,
8135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  PushW[7]  */  Ins_PUSHW,
8136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[00]  */  Ins_MDRP,
8138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[01]  */  Ins_MDRP,
8139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[02]  */  Ins_MDRP,
8140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[03]  */  Ins_MDRP,
8141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[04]  */  Ins_MDRP,
8142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[05]  */  Ins_MDRP,
8143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[06]  */  Ins_MDRP,
8144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[07]  */  Ins_MDRP,
8145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[08]  */  Ins_MDRP,
8146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[09]  */  Ins_MDRP,
8147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[10]  */  Ins_MDRP,
8148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[11]  */  Ins_MDRP,
8149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[12]  */  Ins_MDRP,
8150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[13]  */  Ins_MDRP,
8151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[14]  */  Ins_MDRP,
8152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[15]  */  Ins_MDRP,
8153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[16]  */  Ins_MDRP,
8155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[17]  */  Ins_MDRP,
8156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[18]  */  Ins_MDRP,
8157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[19]  */  Ins_MDRP,
8158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[20]  */  Ins_MDRP,
8159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[21]  */  Ins_MDRP,
8160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[22]  */  Ins_MDRP,
8161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[23]  */  Ins_MDRP,
8162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[24]  */  Ins_MDRP,
8163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[25]  */  Ins_MDRP,
8164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[26]  */  Ins_MDRP,
8165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[27]  */  Ins_MDRP,
8166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[28]  */  Ins_MDRP,
8167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[29]  */  Ins_MDRP,
8168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[30]  */  Ins_MDRP,
8169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MDRP[31]  */  Ins_MDRP,
8170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[00]  */  Ins_MIRP,
8172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[01]  */  Ins_MIRP,
8173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[02]  */  Ins_MIRP,
8174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[03]  */  Ins_MIRP,
8175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[04]  */  Ins_MIRP,
8176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[05]  */  Ins_MIRP,
8177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[06]  */  Ins_MIRP,
8178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[07]  */  Ins_MIRP,
8179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[08]  */  Ins_MIRP,
8180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[09]  */  Ins_MIRP,
8181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[10]  */  Ins_MIRP,
8182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[11]  */  Ins_MIRP,
8183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[12]  */  Ins_MIRP,
8184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[13]  */  Ins_MIRP,
8185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[14]  */  Ins_MIRP,
8186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[15]  */  Ins_MIRP,
8187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[16]  */  Ins_MIRP,
8189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[17]  */  Ins_MIRP,
8190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[18]  */  Ins_MIRP,
8191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[19]  */  Ins_MIRP,
8192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[20]  */  Ins_MIRP,
8193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[21]  */  Ins_MIRP,
8194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[22]  */  Ins_MIRP,
8195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[23]  */  Ins_MIRP,
8196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[24]  */  Ins_MIRP,
8197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[25]  */  Ins_MIRP,
8198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[26]  */  Ins_MIRP,
8199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[27]  */  Ins_MIRP,
8200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[28]  */  Ins_MIRP,
8201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[29]  */  Ins_MIRP,
8202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[30]  */  Ins_MIRP,
8203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /*  MIRP[31]  */  Ins_MIRP
8204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
8205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
8208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
8211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* RUN                                                                   */
8213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  This function executes a run of opcodes.  It will exit in the        */
8215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  following cases:                                                     */
8216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - Errors (in which case it returns FALSE).                           */
8218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - Reaching the end of the main code range (returns TRUE).            */
8220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Reaching the end of a code range within a function call is an      */
8221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    error.                                                             */
8222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */
8224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    is set to TRUE (returns TRUE).                                     */
8225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */
8227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  an instruction trap or a normal termination.                         */
8228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */
8231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        behaviour is unsupported; here a DEBUG opcode is always an     */
8232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*        error.                                                         */
8233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */
8236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  Instructions appear in the specification's order.                    */
8238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
8239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
8240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* documentation is in ttinterp.h */
8243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_EXPORT_DEF( FT_Error )
8245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  TT_RunIns( TT_ExecContext  exc )
8246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
8247727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Long    ins_counter = 0;  /* executed instructions counter */
8248727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  i;
8249727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
8251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Byte    opcode_pattern[1][2] = {
8252727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  /* #8 TypeMan Talk Align */
8253727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  {
8254727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    0x06, /* SPVTL   */
8255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                    0x7D, /* RDTG    */
8256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  },
8257727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                };
8258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_patterns   = 1;
8259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_pointer[1] = { 0 };
8260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_UShort  opcode_size[1]    = { 1 };
8261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
8262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
8265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    cur = *exc;
8266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
8269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.iup_called = FALSE;
8270727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
8271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* set CVT functions */
8273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    CUR.tt_metrics.ratio = 0;
8274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
8275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* non-square pixels, use the stretched routines */
8277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_read_cvt  = Read_CVT_Stretched;
8278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_write_cvt = Write_CVT_Stretched;
8279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_move_cvt  = Move_CVT_Stretched;
8280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
8281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
8282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* square pixels, use normal routines */
8284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_read_cvt  = Read_CVT;
8285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_write_cvt = Write_CVT;
8286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.func_move_cvt  = Move_CVT;
8287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
8288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Funcs();
8290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    COMPUTE_Round( (FT_Byte)exc->GS.round_state );
8291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    do
8293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
8294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.opcode = CUR.code[CUR.IP];
8295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8296aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( "  " ));
8297aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( opcode_name[CUR.opcode] ));
8298aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich      FT_TRACE7(( "\n" ));
8299aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich
8300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
8301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
830241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier        if ( CUR.IP + 1 >= CUR.codeSize )
8303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorCodeOverflow_;
8304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
8306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP + CUR.length > CUR.codeSize )
8309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto LErrorCodeOverflow_;
8310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* First, let's check for empty stack and overflow */
8312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
8313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `args' is the top of the stack once arguments have been popped. */
8315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* One can also interpret it as the index of the last argument.    */
8316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.args < 0 )
8317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8318aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        if ( CUR.pedantic_hinting )
8319aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        {
8320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Too_Few_Arguments );
8321aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          goto LErrorLabel_;
8322aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        }
8323aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
8324aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        /* push zeroes onto the stack */
8325aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
8326aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner          CUR.stack[i] = 0;
8327aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        CUR.args = 0;
8328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
8331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* `new_top' is the new top of the stack, after the instruction's */
8333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* execution.  `top' will be set to `new_top' after the `switch'  */
8334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* statement.                                                     */
8335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.new_top > CUR.stackSize )
8336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8337727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        CUR.error = FT_THROW( Stack_Overflow );
8338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto LErrorLabel_;
8339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.step_ins = TRUE;
8342727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      CUR.error    = FT_Err_Ok;
8343727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8344727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
8345727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8346727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( SUBPIXEL_HINTING )
8347727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      {
8348727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        for ( i = 0; i < opcode_patterns; i++ )
8349727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        {
8350727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          if ( opcode_pointer[i] < opcode_size[i]                 &&
8351727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
8352727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          {
8353727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] += 1;
8354727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8355727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            if ( opcode_pointer[i] == opcode_size[i] )
8356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            {
8357727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              FT_TRACE7(( "sph: opcode ptrn: %d, %s %s\n",
8358727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          i,
8359727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.family_name,
8360727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                          CUR.face->root.style_name ));
8361727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8362727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              switch ( i )
8363727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              {
8364727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              case 0:
8365727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                break;
8366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              }
8367727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease              opcode_pointer[i] = 0;
8368727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            }
8369727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          }
8370727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          else
8371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            opcode_pointer[i] = 0;
8372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        }
8373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      }
8374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
8375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
8376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
8378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Long*  args   = CUR.stack + CUR.args;
8381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_Byte   opcode = CUR.opcode;
8382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  ARRAY_BOUND_ERROR
8385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref
8386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( opcode )
8389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x00:  /* SVTCA y  */
8391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x01:  /* SVTCA x  */
8392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x02:  /* SPvTCA y */
8393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x03:  /* SPvTCA x */
8394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x04:  /* SFvTCA y */
8395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x05:  /* SFvTCA x */
8396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
8397aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner            FT_Short  AA, BB;
8398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            AA = (FT_Short)( ( opcode & 1 ) << 14 );
8401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            BB = (FT_Short)( AA ^ 0x4000 );
8402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( opcode < 4 )
8404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.projVector.x = AA;
8406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.projVector.y = BB;
8407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.dualVector.x = AA;
8409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.dualVector.y = BB;
8410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            else
8412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              GUESS_VECTOR( projVector );
8414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            if ( ( opcode & 2 ) == 0 )
8417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.freeVector.x = AA;
8419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              CUR.GS.freeVector.y = BB;
8420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            else
8422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              GUESS_VECTOR( freeVector );
8424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            COMPUTE_Funcs();
8427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
8428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x06:  /* SPvTL // */
8431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x07:  /* SPvTL +  */
8432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SPVTL
8433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x08:  /* SFvTL // */
8436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x09:  /* SFvTL +  */
8437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVTL
8438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0A:  /* SPvFS */
8441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SPVFS
8442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0B:  /* SFvFS */
8445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVFS
8446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0C:  /* GPV */
8449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GPV
8450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0D:  /* GFV */
8453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GFV
8454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0E:  /* SFvTPv */
8457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SFVTPV
8458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x0F:  /* ISECT  */
8461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ISECT( EXEC_ARG_ args );
8462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x10:  /* SRP0 */
8465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP0
8466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x11:  /* SRP1 */
8469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP1
8470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x12:  /* SRP2 */
8473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SRP2
8474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x13:  /* SZP0 */
8477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP0( EXEC_ARG_ args );
8478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x14:  /* SZP1 */
8481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP1( EXEC_ARG_ args );
8482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x15:  /* SZP2 */
8485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZP2( EXEC_ARG_ args );
8486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x16:  /* SZPS */
8489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SZPS( EXEC_ARG_ args );
8490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x17:  /* SLOOP */
8493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SLOOP
8494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x18:  /* RTG */
8497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTG
8498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x19:  /* RTHG */
8501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTHG
8502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1A:  /* SMD */
8505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SMD
8506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1B:  /* ELSE */
8509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ELSE( EXEC_ARG_ args );
8510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1C:  /* JMPR */
8513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JMPR
8514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1D:  /* SCVTCI */
8517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SCVTCI
8518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1E:  /* SSWCI */
8521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SSWCI
8522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x1F:  /* SSW */
8525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SSW
8526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x20:  /* DUP */
8529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DUP
8530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x21:  /* POP */
8533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* nothing :-) */
8534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x22:  /* CLEAR */
8537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CLEAR
8538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x23:  /* SWAP */
8541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SWAP
8542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x24:  /* DEPTH */
8545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DEPTH
8546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x25:  /* CINDEX */
8549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CINDEX
8550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x26:  /* MINDEX */
8553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MINDEX( EXEC_ARG_ args );
8554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x27:  /* ALIGNPTS */
8557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ALIGNPTS( EXEC_ARG_ args );
8558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x28:  /* ???? */
8561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x29:  /* UTP */
8565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UTP( EXEC_ARG_ args );
8566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2A:  /* LOOPCALL */
8569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_LOOPCALL( EXEC_ARG_ args );
8570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2B:  /* CALL */
8573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_CALL( EXEC_ARG_ args );
8574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2C:  /* FDEF */
8577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FDEF( EXEC_ARG_ args );
8578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2D:  /* ENDF */
8581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ENDF( EXEC_ARG_ args );
8582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2E:  /* MDAP */
8585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x2F:  /* MDAP */
8586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MDAP( EXEC_ARG_ args );
8587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x30:  /* IUP */
8590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x31:  /* IUP */
8591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IUP( EXEC_ARG_ args );
8592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x32:  /* SHP */
8595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x33:  /* SHP */
8596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHP( EXEC_ARG_ args );
8597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x34:  /* SHC */
8600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x35:  /* SHC */
8601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHC( EXEC_ARG_ args );
8602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x36:  /* SHZ */
8605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x37:  /* SHZ */
8606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHZ( EXEC_ARG_ args );
8607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x38:  /* SHPIX */
8610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SHPIX( EXEC_ARG_ args );
8611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x39:  /* IP    */
8614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IP( EXEC_ARG_ args );
8615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3A:  /* MSIRP */
8618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3B:  /* MSIRP */
8619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MSIRP( EXEC_ARG_ args );
8620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3C:  /* AlignRP */
8623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ALIGNRP( EXEC_ARG_ args );
8624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3D:  /* RTDG */
8627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RTDG
8628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3E:  /* MIAP */
8631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x3F:  /* MIAP */
8632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MIAP( EXEC_ARG_ args );
8633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x40:  /* NPUSHB */
8636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_NPUSHB( EXEC_ARG_ args );
8637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x41:  /* NPUSHW */
8640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_NPUSHW( EXEC_ARG_ args );
8641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x42:  /* WS */
8644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WS
8645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Set_Invalid_Ref:
8648727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease            CUR.error = FT_THROW( Invalid_Reference );
8649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x43:  /* RS */
8652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RS
8653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x44:  /* WCVTP */
8656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WCVTP
8657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x45:  /* RCVT */
8660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RCVT
8661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x46:  /* GC */
8664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x47:  /* GC */
8665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_GC( EXEC_ARG_ args );
8666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x48:  /* SCFS */
8669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCFS( EXEC_ARG_ args );
8670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x49:  /* MD */
8673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4A:  /* MD */
8674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_MD( EXEC_ARG_ args );
8675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4B:  /* MPPEM */
8678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MPPEM
8679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4C:  /* MPS */
8682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MPS
8683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4D:  /* FLIPON */
8686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLIPON
8687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4E:  /* FLIPOFF */
8690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLIPOFF
8691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x4F:  /* DEBUG */
8694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DEBUG
8695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x50:  /* LT */
8698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_LT
8699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x51:  /* LTEQ */
8702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_LTEQ
8703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x52:  /* GT */
8706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GT
8707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x53:  /* GTEQ */
8710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_GTEQ
8711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x54:  /* EQ */
8714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_EQ
8715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x55:  /* NEQ */
8718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NEQ
8719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x56:  /* ODD */
8722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ODD
8723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x57:  /* EVEN */
8726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_EVEN
8727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x58:  /* IF */
8730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IF( EXEC_ARG_ args );
8731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x59:  /* EIF */
8734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* do nothing */
8735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5A:  /* AND */
8738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_AND
8739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5B:  /* OR */
8742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_OR
8743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5C:  /* NOT */
8746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NOT
8747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5D:  /* DELTAP1 */
8750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAP( EXEC_ARG_ args );
8751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5E:  /* SDB */
8754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SDB
8755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x5F:  /* SDS */
8758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SDS
8759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x60:  /* ADD */
8762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ADD
8763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x61:  /* SUB */
8766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SUB
8767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x62:  /* DIV */
8770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_DIV
8771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x63:  /* MUL */
8774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MUL
8775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x64:  /* ABS */
8778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ABS
8779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x65:  /* NEG */
8782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NEG
8783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x66:  /* FLOOR */
8786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_FLOOR
8787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x67:  /* CEILING */
8790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_CEILING
8791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x68:  /* ROUND */
8794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x69:  /* ROUND */
8795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6A:  /* ROUND */
8796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6B:  /* ROUND */
8797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ROUND
8798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6C:  /* NROUND */
8801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6D:  /* NROUND */
8802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6E:  /* NRRUND */
8803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x6F:  /* NROUND */
8804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_NROUND
8805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x70:  /* WCVTF */
8808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_WCVTF
8809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x71:  /* DELTAP2 */
8812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x72:  /* DELTAP3 */
8813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAP( EXEC_ARG_ args );
8814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x73:  /* DELTAC0 */
8817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x74:  /* DELTAC1 */
8818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x75:  /* DELTAC2 */
8819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_DELTAC( EXEC_ARG_ args );
8820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x76:  /* SROUND */
8823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_SROUND
8824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x77:  /* S45Round */
8827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_S45ROUND
8828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x78:  /* JROT */
8831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JROT
8832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x79:  /* JROF */
8835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_JROF
8836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7A:  /* ROFF */
8839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_ROFF
8840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7B:  /* ???? */
8843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7C:  /* RUTG */
8847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RUTG
8848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7D:  /* RDTG */
8851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_RDTG
8852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7E:  /* SANGW */
8855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x7F:  /* AA    */
8856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          /* nothing - obsolete */
8857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x80:  /* FLIPPT */
8860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPPT( EXEC_ARG_ args );
8861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x81:  /* FLIPRGON */
8864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPRGON( EXEC_ARG_ args );
8865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x82:  /* FLIPRGOFF */
8868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_FLIPRGOFF( EXEC_ARG_ args );
8869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x83:  /* UNKNOWN */
8872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x84:  /* UNKNOWN */
8873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x85:  /* SCANCTRL */
8877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCANCTRL( EXEC_ARG_ args );
8878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x86:  /* SDPVTL */
8881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x87:  /* SDPVTL */
8882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SDPVTL( EXEC_ARG_ args );
8883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x88:  /* GETINFO */
8886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_GETINFO( EXEC_ARG_ args );
8887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x89:  /* IDEF */
8890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_IDEF( EXEC_ARG_ args );
8891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8A:  /* ROLL */
8894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_ROLL( EXEC_ARG_ args );
8895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8B:  /* MAX */
8898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MAX
8899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8C:  /* MIN */
8902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          DO_MIN
8903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8D:  /* SCANTYPE */
8906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_SCANTYPE( EXEC_ARG_ args );
8907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8E:  /* INSTCTRL */
8910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_INSTCTRL( EXEC_ARG_ args );
8911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        case 0x8F:
8914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          Ins_UNKNOWN( EXEC_ARG_ args );
8915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;
8916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
8918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( opcode >= 0xE0 )
8919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_MIRP( EXEC_ARG_ args );
8920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xC0 )
8921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_MDRP( EXEC_ARG_ args );
8922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xB8 )
8923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_PUSHW( EXEC_ARG_ args );
8924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else if ( opcode >= 0xB0 )
8925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_PUSHB( EXEC_ARG_ args );
8926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
8927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            Ins_UNKNOWN( EXEC_ARG_ args );
8928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else
8933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
8935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
8937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8938727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      if ( CUR.error )
8939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
8940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        switch ( CUR.error )
8941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
8942727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          /* looking for redefined instructions */
8943727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        case FT_ERR( Invalid_Opcode ):
8944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
8945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            TT_DefRecord*  def   = CUR.IDefs;
8946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            TT_DefRecord*  limit = def + CUR.numIDefs;
8947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            for ( ; def < limit; def++ )
8950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            {
8951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              if ( def->active && CUR.opcode == (FT_Byte)def->opc )
8952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              {
8953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                TT_CallRec*  callrec;
8954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                if ( CUR.callTop >= CUR.callSize )
8957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                {
8958727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                  CUR.error = FT_THROW( Invalid_Reference );
8959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  goto LErrorLabel_;
8960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                }
8961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec = &CUR.callStack[CUR.callTop];
8963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Caller_Range = CUR.curRange;
8965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Caller_IP    = CUR.IP + 1;
8966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                callrec->Cur_Count    = 1;
8967ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                callrec->Def          = def;
8968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
8970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  goto LErrorLabel_;
8971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                goto LSuiteLabel_;
8973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project              }
8974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            }
8975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
8976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8977727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Invalid_Opcode );
8978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
8981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          break;   /* Unreachable code warning suppression.             */
8982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   /* Leave to remind in case a later change the editor */
8983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   /* to consider break;                                */
8984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        default:
8987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
8988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
8990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
8991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
8992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
8993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
8994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      CUR.top = CUR.new_top;
8996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
8997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.step_ins )
8998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        CUR.IP += CUR.length;
8999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* increment instruction counter and check if we didn't */
9001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      /* run this program for too long (e.g. infinite loops). */
9002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
9003727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_THROW( Execution_Too_Long );
9004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    LSuiteLabel_:
9006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( CUR.IP >= CUR.codeSize )
9007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
9008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( CUR.callTop > 0 )
9009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
9010727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          CUR.error = FT_THROW( Code_Overflow );
9011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LErrorLabel_;
9012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
9013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
9014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto LNo_Error_;
9015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
9016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    } while ( !CUR.instruction_trap );
9017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LNo_Error_:
9019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
9021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *exc = cur;
9022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
9023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9024727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
9025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LErrorCodeOverflow_:
9027727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    CUR.error = FT_THROW( Code_Overflow );
9028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  LErrorLabel_:
9030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER
9032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *exc = cur;
9033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
9034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
90357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* If any errors have occurred, function tables may be broken. */
90367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* Force a re-execution of `prep' and `fpgm' tables if no      */
90377f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    /* bytecode debugger is run.                                   */
90389c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    if ( CUR.error
90399c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod         && !CUR.instruction_trap
90409c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod         && CUR.curRange == tt_coderange_glyph )
90417f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    {
90427f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner      FT_TRACE1(( "  The interpreter returned error 0x%x\n", CUR.error ));
90439c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      exc->size->bytecode_ready = -1;
90449c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod      exc->size->cvt_ready      = -1;
90457f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner    }
90467f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner
9047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return CUR.error;
9048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
9049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */
9052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
9054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
9055